|
@@ -0,0 +1,144 @@
|
|
|
+import axios, { AxiosInstance } from 'axios'
|
|
|
+import { HttpsProxyAgent } from 'https-proxy-agent'
|
|
|
+import { generateRandomString, getProxyAgent } from './utils'
|
|
|
+import { DBClient } from './singletons'
|
|
|
+import { MnemonicKey } from '@initia/initia.js'
|
|
|
+import xrpl from 'xrpl'
|
|
|
+import { ethers } from 'ethers'
|
|
|
+import { v4 as uuidv4 } from 'uuid'
|
|
|
+import {
|
|
|
+ formatDateTime,
|
|
|
+ getAndroidModel,
|
|
|
+ getAndroidOS,
|
|
|
+ getDeviceId,
|
|
|
+ getIOS,
|
|
|
+ getRawMessage,
|
|
|
+} from './faucet/faucetLunch'
|
|
|
+import { Status } from './models/Status'
|
|
|
+
|
|
|
+export class LunchClient {
|
|
|
+ mnemonic: string
|
|
|
+ axiosClient: AxiosInstance
|
|
|
+ proxyAgent: HttpsProxyAgent<any>
|
|
|
+ key: MnemonicKey
|
|
|
+ constructor(mnemonic: string, useProxy: boolean = true) {
|
|
|
+ this.mnemonic = mnemonic
|
|
|
+ this.proxyAgent = useProxy ? getProxyAgent() : undefined
|
|
|
+ this.key = new MnemonicKey({ mnemonic: mnemonic })
|
|
|
+ }
|
|
|
+
|
|
|
+ async login() {
|
|
|
+ const account = await DBClient.instance.account.findFirst({
|
|
|
+ where: { address: this.key.accAddress },
|
|
|
+ })
|
|
|
+ if (!account.gmail) {
|
|
|
+ account.gmail = `${generateRandomString(8)}@gmail.com`
|
|
|
+ }
|
|
|
+ if (!account.xrpPrivateKey) {
|
|
|
+ account.xrpPrivateKey = xrpl.Wallet.generate().seed
|
|
|
+ }
|
|
|
+ const evmWallet = new ethers.Wallet(this.key.privateKey.toString('hex'))
|
|
|
+ const message = JSON.stringify({
|
|
|
+ signedAt: formatDateTime(new Date()),
|
|
|
+ })
|
|
|
+ const evmSignedMessage = await evmWallet.signMessage(message)
|
|
|
+ const proxyAgent = undefined
|
|
|
+ // let isAndroid = Math.random() > 0.5
|
|
|
+ let isAndroid = false
|
|
|
+ if (account.duid) {
|
|
|
+ isAndroid = !account.duid.includes('-')
|
|
|
+ }
|
|
|
+ if (isAndroid && !account.deviceModel) {
|
|
|
+ account.deviceModel = getAndroidModel()
|
|
|
+ }
|
|
|
+ if (!account.duid) {
|
|
|
+ account.duid = isAndroid
|
|
|
+ ? await getDeviceId(isAndroid, account.deviceModel, proxyAgent)
|
|
|
+ : uuidv4().toUpperCase()
|
|
|
+ }
|
|
|
+ if (!account.deviceOS) {
|
|
|
+ account.deviceOS = isAndroid ? getAndroidOS() : getIOS()
|
|
|
+ }
|
|
|
+ const rawMessage = await getRawMessage(
|
|
|
+ evmWallet.address,
|
|
|
+ message,
|
|
|
+ account.duid,
|
|
|
+ )
|
|
|
+ this.axiosClient = isAndroid
|
|
|
+ ? axios.create({
|
|
|
+ headers: {
|
|
|
+ 'Lunch-Language': 'EN',
|
|
|
+ 'lunch-fiat-currency': 'USD',
|
|
|
+ 'lunch-app-duid': account.duid,
|
|
|
+ 'lunch-app-version': '0.17.3',
|
|
|
+ 'lun-app-build': 46,
|
|
|
+ 'Lunch-Device-Model': account.deviceModel,
|
|
|
+ 'Lunch-Device-OS': account.deviceOS,
|
|
|
+ 'Lunch-Platform': 'Android',
|
|
|
+ 'user-agent': `lunch/0.17.3(46) (Linux; ${account.deviceOS}; ${account.deviceModel} Build/PQ3B.190801.05281822)`,
|
|
|
+ },
|
|
|
+ httpsAgent: proxyAgent,
|
|
|
+ })
|
|
|
+ : axios.create({
|
|
|
+ headers: {
|
|
|
+ 'lunch-language': 'en',
|
|
|
+ 'lunch-app-platform': 'iOS',
|
|
|
+ 'lunch-app-version': '45',
|
|
|
+ 'lunch-fiat-currency': 'USD',
|
|
|
+ 'lunch-app-duid': account.duid,
|
|
|
+ 'user-agent': `Lunch/1.0 (xyz.lunchlunch.app; build:45; ${account.deviceOS}) Alamofire/5.8.0`,
|
|
|
+ },
|
|
|
+ })
|
|
|
+
|
|
|
+ const resp = await this.axiosClient.post(
|
|
|
+ 'https://api.lunchlunch.xyz/v1/auth/sign-in',
|
|
|
+ {
|
|
|
+ walletAddress: evmWallet.address,
|
|
|
+ signedMessage: evmSignedMessage,
|
|
|
+ rawMessage: rawMessage,
|
|
|
+ },
|
|
|
+ )
|
|
|
+ console.log(`${account.address}: sign-in success.`)
|
|
|
+ // register
|
|
|
+ this.axiosClient.defaults.headers[
|
|
|
+ 'authorization'
|
|
|
+ ] = `Bearer ${resp.data.accessToken}`
|
|
|
+ const xrplWallet = xrpl.Wallet.fromSeed(account.xrpPrivateKey)
|
|
|
+ let needRegister = false
|
|
|
+ try {
|
|
|
+ await this.axiosClient.get('https://api.lunchlunch.xyz/v1/member')
|
|
|
+ } catch (e) {
|
|
|
+ if (e.response.status === 404) {
|
|
|
+ needRegister = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (needRegister) {
|
|
|
+ await this.axiosClient.post(
|
|
|
+ 'https://api.lunchlunch.xyz/v1/member/register',
|
|
|
+ {
|
|
|
+ evmWalletAddress: evmWallet.address,
|
|
|
+ initiaWalletAddress: this.key.accAddress,
|
|
|
+ isImportedWallet: true,
|
|
|
+ firstInitiaWalletAddress: this.key.accAddress,
|
|
|
+ email: account.gmail,
|
|
|
+ xrplWalletAddress: xrplWallet.address,
|
|
|
+ },
|
|
|
+ )
|
|
|
+ console.log(`${this.key.accAddress}: register done`)
|
|
|
+ } else {
|
|
|
+ console.log(`${this.key.accAddress}: already registered`)
|
|
|
+ }
|
|
|
+ await DBClient.instance.account.update({
|
|
|
+ where: { id: account.id },
|
|
|
+ data: {
|
|
|
+ status: Status.Fauceted,
|
|
|
+ lastRun: new Date(),
|
|
|
+ xrpPrivateKey: account.xrpPrivateKey,
|
|
|
+ gmail: account.gmail,
|
|
|
+ duid: account.duid,
|
|
|
+ deviceModel: account.deviceModel,
|
|
|
+ deviceOS: account.deviceOS,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|