|
@@ -2,43 +2,92 @@ import {
|
|
|
APIRequester,
|
|
|
bcs,
|
|
|
Coin,
|
|
|
+ Coins,
|
|
|
+ CreateTxOptions,
|
|
|
+ Fee,
|
|
|
Height,
|
|
|
LCDClient,
|
|
|
MnemonicKey,
|
|
|
Msg,
|
|
|
MsgCreateBridge,
|
|
|
+ MsgExecute,
|
|
|
MsgSetBridgeInfo,
|
|
|
MsgTransfer,
|
|
|
Wallet,
|
|
|
} from '@initia/initia.js'
|
|
|
-import { getProxyUrl } from './utils'
|
|
|
+import { generateRandomString, getProxyUrl } from './utils'
|
|
|
+import { HttpsProxyAgent } from 'https-proxy-agent'
|
|
|
+
|
|
|
+const rpcUrl = [
|
|
|
+ 'https://lcd.initiation-1.initia.xyz/',
|
|
|
+ 'https://api-initia-testnet.whispernode.com/',
|
|
|
+ 'https://initia-testnet-lcd.orbitalcommand.io/',
|
|
|
+ 'https://testnet-initia-api.lavenderfive.com/',
|
|
|
+ 'https://api.initiation.test.pfc.zone/',
|
|
|
+]
|
|
|
|
|
|
export abstract class BaseClient {
|
|
|
key: MnemonicKey
|
|
|
lcd: LCDClient
|
|
|
- tur: LCDClient
|
|
|
+ tucana: LCDClient
|
|
|
+ initAi: LCDClient
|
|
|
+ blackWings: LCDClient
|
|
|
wallet: Wallet
|
|
|
+ tucanaWallet: Wallet
|
|
|
protected constructor(mnemonic: string, useProxy: boolean = false) {
|
|
|
this.key = new MnemonicKey({
|
|
|
mnemonic: mnemonic,
|
|
|
})
|
|
|
-
|
|
|
- const requester = new APIRequester(getProxyUrl())
|
|
|
+ const rpc = rpcUrl[Math.floor(Math.random() * rpcUrl.length)]
|
|
|
+ const pass = `test1234_session-${generateRandomString(8)}_lifetime-20m`
|
|
|
+ const proxyAgent = useProxy
|
|
|
+ ? new HttpsProxyAgent(`http://tuxla:${pass}@geo.iproyal.com:12321`)
|
|
|
+ : undefined
|
|
|
+ const requester = new APIRequester(rpc, {
|
|
|
+ httpsAgent: proxyAgent,
|
|
|
+ headers: {
|
|
|
+ 'User-Agent':
|
|
|
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
|
|
|
+ 'Sec-Ch-Ua':
|
|
|
+ '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
|
|
|
+ 'Sec-Ch-Ua-Mobile': '?0',
|
|
|
+ 'Sec-Ch-Ua-Platform': '"Windows"',
|
|
|
+ // Origin: 'https://faucet.testnet.initia.xyz/',
|
|
|
+ // Referer: 'https://faucet.testnet.initia.xyz/',
|
|
|
+ 'Sec-Fetch-Dest': 'empty',
|
|
|
+ 'Sec-Fetch-Mode': 'cors',
|
|
|
+ 'Sec-Fetch-Site': 'same-site',
|
|
|
+ },
|
|
|
+ })
|
|
|
this.lcd = new LCDClient(
|
|
|
- 'https://api.initiation.test.pfc.zone',
|
|
|
+ rpc,
|
|
|
{
|
|
|
chainId: 'initiation-1',
|
|
|
},
|
|
|
useProxy ? requester : null,
|
|
|
)
|
|
|
|
|
|
- this.tur = new LCDClient(
|
|
|
+ this.tucana = new LCDClient(
|
|
|
'https://maze-rest-c9796789-107d-49ab-b6de-059724d2a91d.ue1-prod.newmetric.xyz/',
|
|
|
{
|
|
|
chainId: 'birdee-1',
|
|
|
},
|
|
|
useProxy ? requester : null,
|
|
|
)
|
|
|
+ this.blackWings = new LCDClient(
|
|
|
+ 'https://maze-rest-18bdff44-3aa4-425e-9bc0-06a2afa40af8.ue1-prod.newmetric.xyz/',
|
|
|
+ {
|
|
|
+ chainId: 'birdee-1',
|
|
|
+ },
|
|
|
+ useProxy ? requester : null,
|
|
|
+ )
|
|
|
+ this.initAi = new LCDClient(
|
|
|
+ 'https://maze-rest-617bacff-7d34-4eb8-87f4-ee16fb4e0ac7.ue1-prod.newmetric.xyz/',
|
|
|
+ {
|
|
|
+ chainId: 'birdee-1',
|
|
|
+ },
|
|
|
+ useProxy ? requester : null,
|
|
|
+ )
|
|
|
|
|
|
this.wallet = new Wallet(this.lcd, this.key)
|
|
|
}
|
|
@@ -47,17 +96,34 @@ export abstract class BaseClient {
|
|
|
const signed = await this.wallet.createAndSignTx({
|
|
|
msgs: Array.isArray(msg) ? msg : [msg],
|
|
|
})
|
|
|
- const broadcast = await this.lcd.tx.broadcast(signed)
|
|
|
- console.log(broadcast)
|
|
|
+ const broadcast = await this.lcd.tx.broadcastSync(signed)
|
|
|
+ return broadcast.txhash
|
|
|
+ // console.log(broadcast)
|
|
|
}
|
|
|
|
|
|
async checkBalance() {
|
|
|
const balances = await this.lcd.bank.balance(this.key.accAddress)
|
|
|
+ console.log(JSON.stringify(balances))
|
|
|
return balances[0].toArray()
|
|
|
}
|
|
|
- async checkTurBalance() {
|
|
|
- const balances = await this.tur.bank.balance(this.key.accAddress)
|
|
|
- console.log(JSON.stringify(balances))
|
|
|
+
|
|
|
+ async funded() {
|
|
|
+ const tokens = await this.checkBalance()
|
|
|
+ const uinit = tokens.filter(token => token.denom === 'uinit')[0]
|
|
|
+ console.log(uinit.amount)
|
|
|
+ return Number(uinit.amount) > 0
|
|
|
+ }
|
|
|
+
|
|
|
+ async checkTucanaBalance() {
|
|
|
+ const balances = await this.tucana.bank.balance(this.key.accAddress)
|
|
|
+ const tuc = balances[0].toArray().filter(token => token.denom === 'utuc')[0]
|
|
|
+ return tuc.amount
|
|
|
+ }
|
|
|
+
|
|
|
+ async checkUsdcSwaped() {
|
|
|
+ const tokens = await this.checkBalance()
|
|
|
+ const usdc = tokens.filter(token => token.denom === 'uusdc')[0]
|
|
|
+ return !!usdc
|
|
|
}
|
|
|
|
|
|
async getUsdcAmount() {
|
|
@@ -67,51 +133,139 @@ export abstract class BaseClient {
|
|
|
}
|
|
|
|
|
|
async bridge() {
|
|
|
+ const size = bcs.option(bcs.u64()).serialize(0).toBase64()
|
|
|
+ const balance = await this.checkTucanaBalance()
|
|
|
+ console.log('balance', balance)
|
|
|
+ const randomLimit = 70000 + Math.floor(Math.random() * 1000)
|
|
|
+ const value = Number(balance) - randomLimit
|
|
|
+ const size2 = bcs.option(bcs.u64()).serialize(value.toString()).toBase64()
|
|
|
const msgs = [
|
|
|
new MsgTransfer(
|
|
|
'transfer', // port
|
|
|
'channel-0', // src channel
|
|
|
- new Coin('utuc', 1000000), // amount
|
|
|
+ new Coin('utuc', value), // amount
|
|
|
this.key.accAddress, // sender
|
|
|
- '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
|
|
|
+ '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::mixed_route_swap_to',
|
|
|
// receiver
|
|
|
// you have to provide one of timeout
|
|
|
new Height(0, 0), // timeout height
|
|
|
- '1716264011493000000', // timeout timestamp
|
|
|
- '{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"mixed_route_swap_to","type_args":[],"args":["KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=","AA==","QEIPAAAAAAA=","AbguDwAAAAAA","AAAAAAAAAAAAAAAAIzfL288YfTPUDoedDWdgWzL+KVg="]}}}',
|
|
|
+ ((new Date().valueOf() + 100000) * 1000000).toString(), // timeout timestamp
|
|
|
+ // timeout timestamp
|
|
|
+ `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"mixed_route_swap_to","type_args":[],"args":["KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=","AQIBACBjlv8aKTjnJqzBAbnFQUuAXZpgXAPI4IMk9cDIgH98vA==",${size2},${size},${bcs
|
|
|
+ .address()
|
|
|
+ .serialize(this.key.accAddress)
|
|
|
+ .toBase64()}]}}}`,
|
|
|
),
|
|
|
]
|
|
|
|
|
|
- const signedTx = await this.wallet.createAndSignTx({ msgs })
|
|
|
+ const fee = {
|
|
|
+ amount: [
|
|
|
+ {
|
|
|
+ amount: '62579',
|
|
|
+ denom: 'utuc',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ gasLimit: '417192',
|
|
|
+ granter: '',
|
|
|
+ payer: '',
|
|
|
+ }
|
|
|
+ // 创建 Coins 实例
|
|
|
+ const coin = new Coin('utuc', '70000')
|
|
|
+ const coins = new Coins()
|
|
|
+ coins.add(coin)
|
|
|
+ // 创建 Fee 实例
|
|
|
+ const feeInstance = new Fee(
|
|
|
+ parseInt(fee.gasLimit, 10), // gas_limit
|
|
|
+ coins, // amount
|
|
|
+ fee.payer, // payer (optional)
|
|
|
+ fee.granter, // granter (optional)
|
|
|
+ )
|
|
|
+ const signedTx = await this.tucanaWallet.createAndSignTx({
|
|
|
+ msgs,
|
|
|
+ fee: feeInstance,
|
|
|
+ })
|
|
|
|
|
|
- await this.tur.tx.broadcastSync(signedTx).then(res => console.log(res))
|
|
|
- // send(broadcast) tx
|
|
|
- // await lcd.tx.broadcastSync(signedTx).then(res => console.log(res))
|
|
|
- // {
|
|
|
- // height: 0,
|
|
|
- // txhash: '162AA29DE237BD060EFEFFA862DBD07ECD1C562EBFDD965AD6C34DF856B53DC2',
|
|
|
- // raw_log: '[]'
|
|
|
- // }
|
|
|
+ await this.tucana.tx.broadcastSync(signedTx).then(res => console.log(res))
|
|
|
}
|
|
|
+ async bridge2Blackwings(amount: number) {
|
|
|
+ const size = bcs.option(bcs.u64()).serialize(0).toBase64()
|
|
|
+ const size2 = bcs
|
|
|
+ .u64()
|
|
|
+ .serialize(amount * Math.pow(10, 6))
|
|
|
+ .toBase64()
|
|
|
+ const msg = new MsgExecute(
|
|
|
+ this.key.accAddress,
|
|
|
+ '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
|
|
|
+ 'swap_transfer',
|
|
|
+ 'mixed_route_swap_transfer',
|
|
|
+ [],
|
|
|
+ [
|
|
|
+ 'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
|
|
|
+ 'AQIBACDb8GxIrzmE7G2a6KmqfbsLseeEqpuMSlaBr2YM+FWNfQ==',
|
|
|
+ size2,
|
|
|
+ size,
|
|
|
+ bcs.string().serialize(this.key.accAddress).toBase64(),
|
|
|
+ 'CHRyYW5zZmVy',
|
|
|
+ 'CmNoYW5uZWwtMTM=',
|
|
|
+ 'AA==',
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ const signed = await this.wallet.createAndSignTx({
|
|
|
+ msgs: Array.isArray(msg) ? msg : [msg],
|
|
|
+ feeDenoms: ['uinit'],
|
|
|
+ })
|
|
|
+ const broadcast = await this.lcd.tx.broadcast(signed)
|
|
|
+ console.log(broadcast)
|
|
|
+ }
|
|
|
+ async bridge2Ai(amount: number) {
|
|
|
+ const size = bcs
|
|
|
+ .option(bcs.u64())
|
|
|
+ .serialize(amount * Math.pow(10, 6) * 0.995)
|
|
|
+ .toBase64()
|
|
|
+ const size2 = bcs
|
|
|
+ .u64()
|
|
|
+ .serialize(amount * Math.pow(10, 6))
|
|
|
+ .toBase64()
|
|
|
+ const msg = new MsgExecute(
|
|
|
+ this.key.accAddress,
|
|
|
+ '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
|
|
|
+ 'swap_transfer',
|
|
|
+ 'mixed_route_swap_deposit',
|
|
|
+ [],
|
|
|
+
|
|
|
+ [
|
|
|
+ 'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
|
|
|
+ 'AA==',
|
|
|
+ size2,
|
|
|
+ size,
|
|
|
+ 'BgAAAAAAAAA=',
|
|
|
+ bcs.address().serialize(this.key.accAddress).toBase64(),
|
|
|
+ 'AA==',
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ // [
|
|
|
+ // ('jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
|
|
|
+ // 'AA==',
|
|
|
+ // 'QEIPAAAAAAA=',
|
|
|
+ // 'AbguDwAAAAAA',
|
|
|
+ // 'BgAAAAAAAAA=',
|
|
|
+ // 'AAAAAAAAAAAAAAAAdpKzfgzxKB4sBaUJs11Wa9w+emA=',
|
|
|
+ // 'AA==')
|
|
|
+ // ][
|
|
|
+ // ('jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
|
|
|
+ // 'AA==',
|
|
|
+ // 'gIQeAAAAAAA=',
|
|
|
+ // 'AXBdHgAAAAAA',
|
|
|
+ // 'BgAAAAAAAAA=',
|
|
|
+ // 'AAAAAAAAAAAAAAAAdpKzfgzxKB4sBaUJs11Wa9w+emA=',
|
|
|
+ // 'AA==')
|
|
|
+ // ]
|
|
|
|
|
|
- // const bridgeMsg = new MsgCreateBridge(this.key.accAddress)
|
|
|
- // new MsgSetBridgeInfo(this.key.accAddress, {})
|
|
|
- // {
|
|
|
- // "move": {
|
|
|
- // "message": {
|
|
|
- // "module_address": "0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a",
|
|
|
- // "module_name": "swap_transfer",
|
|
|
- // "function_name": "mixed_route_swap_to",
|
|
|
- // "type_args": [],
|
|
|
- // "args": [
|
|
|
- // "KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=",
|
|
|
- // "AQIBACBjlv8aKTjnJqzBAbnFQUuAXZpgXAPI4IMk9cDIgH98vA==",
|
|
|
- // "QEIPAAAAAAA=",
|
|
|
- // "ASQqBwAAAAAA",
|
|
|
- // "AAAAAAAAAAAAAAAAIzfL288YfTPUDoedDWdgWzL+KVg="
|
|
|
- // ]
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"mixed_route_swap_to","type_args":[],"args":["KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=","AQIBACBjlv8aKTjnJqzBAbnFQUuAXZpgXAPI4IMk9cDIgH98vA==","QEIPAAAAAAA=","ASQqBwAAAAAA","AAAAAAAAAAAAAAAAIzfL288YfTPUDoedDWdgWzL+KVg="]}}}
|
|
|
+ const signed = await this.wallet.createAndSignTx({
|
|
|
+ msgs: Array.isArray(msg) ? msg : [msg],
|
|
|
+ feeDenoms: ['uinit'],
|
|
|
+ })
|
|
|
+ const broadcast = await this.lcd.tx.broadcastSync(signed)
|
|
|
+ console.log(broadcast)
|
|
|
+ }
|
|
|
}
|