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 key: MnemonicKey isLogin: boolean = false 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, }, }) this.isLogin = true } async submitOnchain(txHash: string) { if (!this.isLogin) throw new Error('Please login first') return await this.axiosClient.post( `https://api.lunchlunch.xyz/v1/dish/submit-action/onchain`, { dishId: 7, txHash: txHash, }, ) } async claimEgg(txHash: string) { if (!this.isLogin) throw new Error('Please login first') await this.axiosClient.post( `https://api.lunchlunch.xyz/v1/dish/submit-claim/egg`, { dishId: 7, txHash: txHash, }, ) } async getEggBalance() { if (!this.isLogin) throw new Error('Please login first') const resp = await this.axiosClient.get( 'https://api.lunchlunch.xyz/v1/member/egg/balance', ) return resp.data } }