Quellcode durchsuchen

Merge remote-tracking branch 'origin/main'

Shawn Lu vor 1 Jahr
Ursprung
Commit
7e3c8165f8
11 geänderte Dateien mit 1037 neuen und 155 gelöschten Zeilen
  1. 5 1
      package.json
  2. 77 4
      src/BaseClient.ts
  3. 262 12
      src/InitiaClient.ts
  4. 2 5
      src/InitiaTask.ts
  5. 93 37
      src/JennieModule.ts
  6. 82 41
      src/decodeFunction.ts
  7. 27 4
      src/onchain/finalTask.ts
  8. 23 15
      src/onchain/week3/randomWeek3.ts
  9. 5 2
      src/swapTester.ts
  10. 1 1
      src/utils/index.ts
  11. 460 33
      yarn.lock

+ 5 - 1
package.json

@@ -61,7 +61,10 @@
   },
   "license": "Apache-2.0",
   "dependencies": {
-    "@initia/initia.js": "0.2.7",
+    "@cosmjs/amino": "0.31.3",
+    "@cosmjs/proto-signing": "0.31.3",
+    "@cosmjs/stargate": "0.31.3",
+    "@initia/initia.js": "0.2.9",
     "@prisma/client": "^5.14.0",
     "axios": "^1.6.8",
     "dotenv": "^16.4.5",
@@ -73,6 +76,7 @@
     "prisma": "^5.14.0",
     "random-words": "^2.0.1",
     "shawnlu96-altcha-lib": "0.3.6",
+    "stridejs": "^0.10.0-alpha",
     "tslib": "~2.6.2",
     "useless-helpers": "^0.0.7",
     "uuid": "^9.0.1",

+ 77 - 4
src/BaseClient.ts

@@ -16,7 +16,7 @@ import {
 import { generateRandomString, getAxiosClient } from './utils'
 import { HttpsProxyAgent } from 'https-proxy-agent'
 
-const rpcUrl = [
+export const rpcUrl = [
   'https://lcd.initiation-1.initia.xyz/',
   'https://initia-testnet-lcd.orbitalcommand.io/',
   'https://testnet-initia-api.lavenderfive.com/',
@@ -32,6 +32,7 @@ export abstract class BaseClient {
   blackWings: LCDClient
   noon: LCDClient
   miniMove: LCDClient
+  milkyway:LCDClient
   wallet: Wallet
   tucanaWallet: Wallet
   rpcUrlUsing: string
@@ -228,7 +229,32 @@ export abstract class BaseClient {
       },
       useProxy ? initAiRequester : null,
     )
-
+    const milkywayRequester = new APIRequester(
+      'https://lcd.testnet.milkyway.zone/',
+      {
+        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.milkyway = new LCDClient(
+      'https://lcd.testnet.milkyway.zone/',
+      {
+        chainId: 'glados-1',
+      },
+      useProxy ? milkywayRequester : null,
+    )
     this.wallet = new Wallet(this.lcd, this.key)
   }
 
@@ -653,7 +679,6 @@ export abstract class BaseClient {
     )
     return await this.broadcast(msg)
   }
-
   async newBridge2BlackWings() {
     const random = this.randomAmount(1000000, 1500000)
     const msg = new MsgInitiateTokenDeposit(
@@ -674,7 +699,7 @@ export abstract class BaseClient {
     return await this.broadcast(msg)
   }
   async newBridge2Ai() {
-    const random = this.randomAmount(1800000, 2500000)
+    const random = this.randomAmount(1500000, 2000000)
 
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,
@@ -727,4 +752,52 @@ export abstract class BaseClient {
     )
     return await this.broadcast(msg)
   }
+
+  async questBridge() {
+    const moduleAddress =
+      '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a'
+
+    const moduleName = 'minitswap_router'
+    const functionName = 'swap'
+    const meta = [
+      'PN/ySmqbELsVrt7cVYQkA3UfLHCNKFoEUf2Paq27w5s=',
+      'lyGI4ysszsVX7tmLvqnUKhptwnDakAmSY2Xet8Sdt90=',
+      '3q94txYi6eJFzU4BRaundwETCEiD5/iM04i7qTkyRpM=',
+      '2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=',
+      'MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=',
+      'le4pSgOtvbtbIFFlG38fbLx7XtjDh57R6L4+aa8OG/U=',
+    ]
+    const random = Math.floor(Math.random() * meta.length)
+    const input = [
+      'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+      meta[random],
+      'QEIPAAAAAAA=',
+      bcs.address().serialize(this.key.accAddress).toBase64(),
+      'AQ==',
+      'AA==',
+      'AVg+DwAAAAAA',
+      'AQEAAAAAAAAA',
+    ]
+    const msg = new MsgExecute(
+      this.key.accAddress,
+      moduleAddress,
+      moduleName,
+      functionName,
+      [],
+      input,
+    )
+    return await this.broadcast(msg)
+
+    //   [
+    //   ('jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+    //   'MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=',
+    //   'QEIPAAAAAAA=',
+    //   'AAAAAAAAAAAAAAAAqzPDLM/gn6y5sCVI5Iusim8CTdM=',
+    //   'AQ==',
+    //   'AA==',
+    //   'AVg+DwAAAAAA',
+    //   'AQEAAAAAAAAA')
+    // ]
+  }
+
 }

+ 262 - 12
src/InitiaClient.ts

@@ -6,16 +6,22 @@ import {
   Coins,
   Fee,
   MsgExecute,
+  MsgInitiateTokenWithdrawal,
   MsgSend,
   MsgTransfer,
   Wallet,
 } from '@initia/initia.js'
+
 import polly from 'polly-js'
 import { LunchClient } from './LunchClient'
 import { sleep } from 'useless-helpers'
-import { generateRandomString, getAxiosClient } from './utils'
+import { generateRandomString, getAxiosClient, getProxyAgent } from './utils'
 import { generate } from 'random-words'
 import { HttpsProxyAgent } from 'https-proxy-agent'
+import { getSigningStrideClientOptions, stride } from 'stridejs'
+
+import { DirectSecp256k1HdWallet, OfflineSigner } from '@cosmjs/proto-signing'
+import { logs, SigningStargateClient, StargateClient } from '@cosmjs/stargate'
 
 export class InitiaClient extends InitiaTask {
   constructor(mnemonic: string, useProxy: boolean = false) {
@@ -996,11 +1002,20 @@ export class InitiaClient extends InitiaTask {
     return `worked`
   }
 
+  //tuc addLiquidity
   async week6task2() {
-    const tucBalance = await this.tucana.bank.balanceByDenom(
-      this.key.accAddress,
-      'utuc',
-    )
+    const tucBalance = await polly()
+      .waitAndRetry(5)
+      .executeForPromise(async () => {
+        this.tucana.apiRequester = new APIRequester(
+          'https://maze-rest-c9796789-107d-49ab-b6de-059724d2a91d.ue1-prod.newmetric.xyz/',
+          { httpsAgent: getProxyAgent() },
+        )
+        return await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'utuc',
+        )
+      })
     console.log(tucBalance.amount)
     if (Number(tucBalance.amount) < 2000000) {
       return `tuc`
@@ -1047,6 +1062,7 @@ export class InitiaClient extends InitiaTask {
     //["AAk9AAAAAAA=","64WvP6wAJgs/gCqhuEQ9pXGrKKgjuk08mCVTuXJ2Jd8=","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg=","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]
   }
 
+  //roll dice
   async week6task3() {
     const civiInitBalance = await this.civi.bank.balanceByDenom(
       this.key.accAddress,
@@ -1094,6 +1110,7 @@ export class InitiaClient extends InitiaTask {
     }
   }
 
+  //claim rent
   async week7task1() {
     const uinit = await this.civi.bank.balanceByDenom(
       this.key.accAddress,
@@ -1145,6 +1162,61 @@ export class InitiaClient extends InitiaTask {
     //["AAk9AAAAAAA=","64WvP6wAJgs/gCqhuEQ9pXGrKKgjuk08mCVTuXJ2Jd8=","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg=","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]
   }
 
+  async tucSawap() {
+    //["QjN2ut5dOkhkoWFkOcLyMX6u6bwjsXfcQYH4HOCcV7k=","AQ==","AQ==","QEIPAAAAAAA=","x18BAAAAAAA=","UDsBAAEAAAAAAAAAAAAAAA=="]
+    // ["QjN2ut5dOkhkoWFkOcLyMX6u6bwjsXfcQYH4HOCcV7k=","AQ==","AQ==","QEIPAAAAAAA=","x18BAAAAAAA=","UDsBAAEAAAAAAAAAAAAAAA=="]
+
+    const tucanaWallet = new Wallet(this.tucana, this.wallet.key)
+    const balance = await polly()
+      .waitAndRetry(5)
+      .executeForPromise(async () => {
+        this.tucana.apiRequester = new APIRequester(
+          'https://maze-rest-c9796789-107d-49ab-b6de-059724d2a91d.ue1-prod.newmetric.xyz/',
+          { httpsAgent: getProxyAgent() },
+        )
+        return await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'utuc',
+        )
+      })
+    const amountIn = Math.floor(Number(balance.amount) / 11)
+    const msg = new MsgExecute(
+      this.key.accAddress,
+      '0xB76BF9FDD260B394611E0750A12F5E154BB59A12',
+      'router',
+      'swap',
+      [],
+      [
+        'j8LTay3jxZzXPoM6qxtmd6tSpJCf6vrJE8lzGgHv/sg=',
+        'AQ==',
+        'AQ==',
+        bcs.u64().serialize(amountIn).toBase64(),
+        bcs
+          .u64()
+          .serialize(Math.floor(Math.random() * 200))
+          .toBase64(),
+        'UDsBAAEAAAAAAAAAAAAAAA==',
+      ],
+    )
+    const simulate = await this.tucana.tx.estimateFee(
+      [{ sequenceNumber: await tucanaWallet.sequence() }],
+      {
+        msgs: [msg],
+        feeDenoms: ['utuc'],
+      },
+    )
+    const signed = await tucanaWallet.createAndSignTx({
+      msgs: [msg],
+      fee: new Fee(
+        simulate.gas_limit,
+        new Coins([new Coin('utuc', simulate.amount.toArray()[0].amount)]),
+      ),
+    })
+    await this.tucana.tx.broadcastAsync(signed)
+    return `done`
+  }
+
+  //tuc swap
   async week7task2() {
     // const axios = getAxiosClient(true)
     // const res = await axios.get(
@@ -1154,6 +1226,14 @@ export class InitiaClient extends InitiaTask {
     //   return `noData`
     // }
 
+    const balance = await this.lcd.bank.balanceByDenom(
+      this.key.accAddress,
+      'uinit',
+    )
+
+    if (Number(balance.amount) < 1000000) {
+    }
+
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x8609f642a8ab1c13d661c14d733cab227bba15635a730af2057051b3f2ada3f6',
@@ -1173,7 +1253,7 @@ export class InitiaClient extends InitiaTask {
       await this.broadcast(msg)
       return `done`
     } catch (e) {
-      console.log(e)
+      console.log(e.message)
       return `error`
     }
     // ["FrbuJROsvX9uKlyA1LMdS9QsSwfe5LOLvx2xOzAwk+E=","AA==","AQ==","QEIPAAAAAAA=","5SAPAAAAAAA=","rzMbqDJ/uzWxxP7/AAAAAA=="]
@@ -1181,6 +1261,7 @@ export class InitiaClient extends InitiaTask {
     // ["FrbuJROsvX9uKlyA1LMdS9QsSwfe5LOLvx2xOzAwk+E=","AA==","AQ==","QEIPAAAAAAA=","oyAPAAAAAAA=","rzMbqDJ/uzWxxP7/AAAAAA=="]
   }
 
+  //mint nft
   async week7task3() {
     const aiWallt = new Wallet(this.initAi, this.wallet.key)
 
@@ -1194,12 +1275,12 @@ export class InitiaClient extends InitiaTask {
 
         if (Number(balanceCheck.amount) < 1400000) {
           await this.newBridge2Ai()
-          return true
-        } else {
           return false
+        } else {
+          return true
         }
       })
-    if (balanceChecker) {
+    if (!balanceChecker) {
       return `ai`
     }
 
@@ -1262,7 +1343,7 @@ export class InitiaClient extends InitiaTask {
               },
             },
           )
-          return await this.initAi.tx.estimateFee(
+          const res = await this.initAi.tx.estimateFee(
             [{ sequenceNumber: await aiWallt.sequence() }],
             {
               msgs: [msg],
@@ -1271,6 +1352,7 @@ export class InitiaClient extends InitiaTask {
               ],
             },
           )
+          return res
         })
       const signed = await aiWallt.createAndSignTx({
         msgs: [msg],
@@ -1285,7 +1367,7 @@ export class InitiaClient extends InitiaTask {
         ),
       })
       await this.initAi.tx.broadcastAsync(signed)
-      return `mint`
+      return `done`
       //   ["y/0NIkUSVOcDuguqejyPCsFizyz33v6RVBbrUQxlIbE=","DG1vbmV5IGNvbG9yIA==","AQ=="]
       //   ["y/0NIkUSVOcDuguqejyPCsFizyz33v6RVBbrUQxlIbE=","HmdyZWVuIGNvbG9yIHBva2Vtb24gd2l0aCB0cmVlcw==","AQ=="]
       //   ["awRFigvxT99zEmp3Yfrcwj49k5w3PsQ93z/4SgAFrn8=","BGJlcmE=","AQ=="]
@@ -1329,11 +1411,179 @@ export class InitiaClient extends InitiaTask {
         ),
       })
       await this.initAi.tx.broadcastAsync(signed)
-      return `done`
+      return `burn`
     }
 
     // ["FrbuJROsvX9uKlyA1LMdS9QsSwfe5LOLvx2xOzAwk+E=","AA==","AQ==","QEIPAAAAAAA=","5SAPAAAAAAA=","rzMbqDJ/uzWxxP7/AAAAAA=="]
     // ["FrbuJROsvX9uKlyA1LMdS9QsSwfe5LOLvx2xOzAwk+E=","AA==","AQ==","QEIPAAAAAAA=","pCAPAAAAAAA=","rzMbqDJ/uzWxxP7/AAAAAA=="]
     // ["FrbuJROsvX9uKlyA1LMdS9QsSwfe5LOLvx2xOzAwk+E=","AA==","AQ==","QEIPAAAAAAA=","oyAPAAAAAAA=","rzMbqDJ/uzWxxP7/AAAAAA=="]
   }
+
+  async questTask2() {
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        )
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+    if (Number(l2InitBalance.amount) === 0) {
+      await this.newBridge2Tucana()
+    }
+    const amount = Math.floor(
+      Number(l2InitBalance.amount) / Math.floor(Math.random() * 10 + 5),
+    )
+    const msg = new MsgInitiateTokenWithdrawal(
+      this.key.accAddress,
+      this.key.accAddress,
+      new Coin(
+        'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        amount,
+      ),
+    )
+    const tucWallet = new Wallet(this.tucana, this.wallet.key)
+    const simulate = await this.tucana.tx.estimateFee(
+      [{ sequenceNumber: await tucWallet.sequence() }],
+      {
+        msgs: [msg],
+        feeDenoms: ['utuc'],
+      },
+    )
+    const signed = await tucWallet.createAndSignTx({
+      msgs: [msg],
+      fee: new Fee(
+        simulate.gas_limit,
+        new Coins([new Coin('utuc', simulate.amount.toArray()[0].amount)]),
+      ),
+    })
+    try {
+      await this.tucana.tx.broadcastAsync(signed)
+      return `done`
+    } catch (e) {
+      return `error`
+    }
+  }
+  async questTask3() {
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        )
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+    if (Number(l2InitBalance.amount) === 0) {
+      throw new Error(`need bridge first`)
+    }
+    const amount = Math.floor(
+      Number(l2InitBalance.amount) / Math.floor(Math.random() * 10 + 5),
+    )
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        amount,
+      ),
+      this.key.accAddress,
+      this.key.accAddress,
+      null, // timeout height
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+    )
+    const tucWallet = new Wallet(this.tucana, this.wallet.key)
+    const simulate = await this.tucana.tx.estimateFee(
+      [{ sequenceNumber: await tucWallet.sequence() }],
+      {
+        msgs: [msg],
+        feeDenoms: ['utuc'],
+      },
+    )
+    const signed = await tucWallet.createAndSignTx({
+      msgs: [msg],
+      fee: new Fee(
+        simulate.gas_limit,
+        new Coins([new Coin('utuc', simulate.amount.toArray()[0].amount)]),
+      ),
+    })
+    try {
+      await this.tucana.tx.broadcastAsync(signed)
+      return `done`
+    } catch (e) {
+      return `error`
+    }
+  }
+  async questTask4() {
+    const uinitBalance = await this.milkyway.bank.balanceByDenom(
+      this.key.accAddress,
+      'ibc/37A3FB4FED4CA04ED6D9E5DA36C6D27248645F0E22F585576A1488B8A89C5A50',
+    )
+    if (Number(uinitBalance.amount) < 10) {
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-310',
+        new Coin('uinit', '1000000'),
+        this.key.accAddress,
+        this.key.accAddress,
+        null, // timeout height
+        ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      )
+      await this.broadcast(msg)
+      return `undone`
+    }
+
+    // const wallet = new Wallet(this.milkyway, this.key)
+    const wallet = await DirectSecp256k1HdWallet.fromMnemonic(
+      this.key.mnemonic,
+      { prefix: 'init' },
+    )
+
+    const fee = {
+      gas: '243190',
+      amount: [
+        {
+          amount: '72957',
+          denom: 'umilk',
+        },
+      ],
+    }
+    // const offlineSigner: OfflineSigner = wallet as OfflineSigner
+    const { registry, aminoTypes } = getSigningStrideClientOptions()
+    const client = await SigningStargateClient.connectWithSigner(
+      'https://rpc.testnet.milkyway.zone',
+      wallet,
+      {
+        registry,
+        aminoTypes,
+      },
+    )
+
+    const msgClaimFreeAmount =
+      stride.stakeibc.MessageComposer.withTypeUrl.liquidStake({
+        creator: this.key.accAddress,
+        hostDenom: 'uinit',
+        amount: Math.floor(Number(uinitBalance.amount) / 2).toString(),
+      })
+
+    try {
+      await client.signAndBroadcastSync(
+        this.key.accAddress,
+        [msgClaimFreeAmount],
+        fee,
+      )
+      return `done`
+    } catch (e) {
+      return `error`
+    }
+  }
 }

+ 2 - 5
src/InitiaTask.ts

@@ -34,7 +34,7 @@ export abstract class InitiaTask extends JennieModule {
     //   .parse(Uint8Array.from(Buffer.from('QEtMAAAAAAA=', 'base64')))
     // console.log(amount)
     // return `done`
-    const randomNum = this.randomAmount(1000000, 2000000)
+    const randomNum = this.randomAmount(10000, 200000)
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x1',
@@ -45,10 +45,7 @@ export abstract class InitiaTask extends JennieModule {
         '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=', //liquidityTOken
         'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=', //offerCoin
         bcs.u64().serialize(randomNum).toBase64(), //offerAmount
-        bcs
-          .option(bcs.u64())
-          .serialize(this.randomAmount(1000, 2000))
-          .toBase64(),
+        bcs.option(bcs.u64()).serialize(this.randomAmount(0, 2)).toBase64(),
       ],
     )
     return await this.broadcast(msg)

+ 93 - 37
src/JennieModule.ts

@@ -1,6 +1,8 @@
 import { BaseClient } from './BaseClient'
-import { bcs, Coin, Coins, Fee, MsgExecute } from '@initia/initia.js'
-import { getAxiosClient } from './utils'
+import { APIRequester, bcs, LCDClient, MsgExecute } from '@initia/initia.js'
+import { generateRandomString, getAxiosClient } from './utils'
+import polly from 'polly-js'
+import { HttpsProxyAgent } from 'https-proxy-agent'
 
 export abstract class JennieModule extends BaseClient {
   protected constructor(mnemonic: string, useProxy: boolean = false) {
@@ -8,44 +10,94 @@ export abstract class JennieModule extends BaseClient {
   }
 
   async getXpAmount() {
-    const viewResult = await this.lcd.move.viewFunction(
+    const pass = `test1234_session-${generateRandomString(8)}_lifetime-20m`
+    const proxyAgent = new HttpsProxyAgent(
+      `http://tuxla:${pass}@geo.iproyal.com:12321`,
+    )
+
+    const requester = new APIRequester(this.rpcUrlUsing, {
+      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(
+      this.rpcUrlUsing,
+      {
+        chainId: 'initiation-1',
+      },
+      requester,
+    )
+    return await this.lcd.move.viewFunction(
       '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
       'initia_xp',
       'get_xp_amount',
       undefined,
       [bcs.address().serialize(this.key.accAddress).toBase64()],
     )
-    return viewResult
   }
   async drawFood() {
     const res = await this.claimableXp()
     if (res != `done`) {
       return `needFood`
     }
-    const xp = await this.getXpAmount()
-    if (Number(xp) < 700 && Number(xp) > 200) {
-      const msg = new MsgExecute(
-        this.key.accAddress,
-        '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
-        'jennie',
-        'draw_food',
-        [],
-        ['AQ=='],
-      )
+    const xp = await polly()
+      .waitAndRetry(10)
+      .executeForPromise(async () => {
+        return await this.getXpAmount()
+      })
 
-      return await this.broadcast(msg)
-    } else if (Number(xp) >= 700 && Number(xp) < 1200) {
-      const msg = new MsgExecute(
-        this.key.accAddress,
-        '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
-        'jennie',
-        'draw_food',
-        [],
-        ['Ag=='],
-      )
+    const rep = await polly()
+      .waitAndRetry(15)
+      .executeForPromise(async () => {
+        return await getAxiosClient(true).get(
+          `${this.rpcUrlUsing}initia/move/v1/accounts/${this.key.accAddress}/resources/by_struct_tag?struct_tag=0x9065fda28f52bb14ade545411f02e8e07a9cb4ba::jennie::FoodStore`,
+        )
+      })
+    const store = JSON.parse(rep.data.resource.move_resource)
+    const data = store.data
+    if (Number(data.tier3) > 0 || Number(data.tier2) > 0) {
+      return `done`
+    }
+    // if (Number(xp) < 700 && Number(xp) > 200) {
+    //   const msg = new MsgExecute(
+    //     this.key.accAddress,
+    //     '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+    //     'jennie',
+    //     'draw_food',
+    //     [],
+    //     ['AQ=='],
+    //   )
+    //
+    //   return await this.broadcast(msg)
+    // } else if (Number(xp) >= 700 && Number(xp) < 1200) {
+    //   const msg = new MsgExecute(
+    //     this.key.accAddress,
+    //     '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+    //     'jennie',
+    //     'draw_food',
+    //     [],
+    //     ['Ag=='],
+    //   )
+    //
+    //   return await this.broadcast(msg)
+    // } else
 
-      return await this.broadcast(msg)
-    } else if (Number(xp) >= 1200) {
+    console.log(Number(xp))
+    if (Number(xp) < 1200) {
+      return `undone`
+    }
+    if (Number(xp) >= 1200) {
       const msg = new MsgExecute(
         this.key.accAddress,
         '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
@@ -54,10 +106,9 @@ export abstract class JennieModule extends BaseClient {
         [],
         ['Aw=='],
       )
-
       return await this.broadcast(msg)
     } else {
-      return `done`
+      return `undone`
     }
   }
 
@@ -82,7 +133,7 @@ export abstract class JennieModule extends BaseClient {
     //   [],
     // )
     const kt = Number(viewResult.update_at)
-    const now = 1718765974
+    const now = 1719974755
     // const currentStage = stageInfo.current_stage
     // const stageInternal = stageInfo.stage_interval
     // const stTimestamp = stageInfo.start_timestamp
@@ -101,24 +152,24 @@ export abstract class JennieModule extends BaseClient {
     )
     const store = JSON.parse(rep.data.resource.move_resource)
     const data = store.data
-    if (Number(data.tier2) > 0) {
+    if (Number(data.tier3) > 0) {
       const msg = new MsgExecute(
         this.key.accAddress,
         '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
         'jennie',
         'feed_jennie',
         [],
-        [bcs.u8().serialize(2).toBase64()],
+        [bcs.u8().serialize(3).toBase64()],
       )
       return await this.broadcast(msg)
-    } else if (Number(data.tier3) > 0) {
+    } else if (Number(data.tier2) > 0) {
       const msg = new MsgExecute(
         this.key.accAddress,
         '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
         'jennie',
         'feed_jennie',
         [],
-        [bcs.u8().serialize(3).toBase64()],
+        [bcs.u8().serialize(2).toBase64()],
       )
       return await this.broadcast(msg)
     } else if (Number(data.tier1) > 0) {
@@ -252,10 +303,15 @@ export abstract class JennieModule extends BaseClient {
   }
   async claimableXp() {
     //https://xp-api.initiation-1.initia.xyz/xp/claimable/init1w6ftxlsv7y5putq955ymxh2kd0wru7nqshetka
-    const res = getAxiosClient(true)
-    const data = await res.get(
-      `https://xp-api.initiation-1.initia.xyz/xp/claimable/${this.key.accAddress}`,
-    )
+    const data = await polly()
+      .waitAndRetry(5)
+      .executeForPromise(async () => {
+        const res = getAxiosClient(true)
+
+        return await res.get(
+          `https://xp-api.initiation-1.initia.xyz/xp/claimable/${this.key.accAddress}`,
+        )
+      })
 
     if (data.data.claimable_list.length > 0) {
       const msgs = []

+ 82 - 41
src/decodeFunction.ts

@@ -122,54 +122,95 @@ function parse5(): void {
   // ]
   //0xcbfd0d22451254e703ba0baa7a3c8f0ac162cf2cf7defe915416eb510c6521b1
   //0xcbfd0d22451254e703ba0baa7a3c8f0ac162cf2cf7defe915416eb510c6521b1
+  // const s = [
+  //   'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+  //   'MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=',
+  //   'QEIPAAAAAAA=',
+  //   'AAAAAAAAAAAAAAAAqzPDLM/gn6y5sCVI5Iusim8CTdM=',
+  //   'AQ==',
+  //   'AA==',
+  //   'AVg+DwAAAAAA',
+  //   'AQEAAAAAAAAA',
+  // ] //2BlackWings
+  // 0x8e4733bdabcf7d4afc3d14f0dd46c9bf52fb0fce9e4b996c939e195b8bc891d9
+  // 0x31a4f60ac71ad6f3327472cf1a9855db5d42059c0ab29e16bfb6f212ebac2d1c //疑似不同 chain 的 metadata
+  // 1000000
+  // 0x000000000000000000000000ab33c32ccfe09facb9b02548e48bac8a6f024dd3 //疑似 address
+  // d4 true
+  // d5 null
+  // d6 999000
+  // d7 1
+
+  // const s = [
+  //   'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+  //   'PN/ySmqbELsVrt7cVYQkA3UfLHCNKFoEUf2Paq27w5s=',
+  //   'QEIPAAAAAAA=',
+  //   'AAAAAAAAAAAAAAAAqzPDLM/gn6y5sCVI5Iusim8CTdM=',
+  //   'AQ==',
+  //   'AA==',
+  //   'AVg+DwAAAAAA',
+  //   'AQEAAAAAAAAA',
+  // ] //2Noon-1
+
+  //   0x8e4733bdabcf7d4afc3d14f0dd46c9bf52fb0fce9e4b996c939e195b8bc891d9
+  //   0x3cdff24a6a9b10bb15aededc55842403751f2c708d285a0451fd8f6aadbbc39b
+  //   1000000
+  //   0x000000000000000000000000ab33c32ccfe09facb9b02548e48bac8a6f024dd3
+  //   d4 true
+  //   d5 null
+  //   d6 999000
+  //   d7 1
+
   const s = [
-    'QCzDqo9I8xICLNbNuDICoH4yoxq5QNUeDW+Soq/WbAVxITr1fs+aJpiQuwo3w411O2EogH6qDmVqKSpAAluH2HY=',
+    'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+    'lyGI4ysszsVX7tmLvqnUKhptwnDakAmSY2Xet8Sdt90=',
+    'QEIPAAAAAAA=',
+    'AAAAAAAAAAAAAAAAdnXQI1OzWD3V9Rml0R9tOF89kak=',
+    'AQ==',
+    'AA==',
+    'AVg+DwAAAAAA',
+    'AQEAAAAAAAAA',
   ]
-  // const raw = ['y/0NIkUSVOcDuguqejyPCsFizyz33v6RVBbrUQxlIbE=']
-  const raw = ['Y3f1AmTp33ykyKV9Qtx1MqM94UkyfrAPasD6v8e3ZM8=']
 
   const d0 = bcs
     .object() // type
-    .parse(Uint8Array.from(Buffer.from(raw[0], 'base64')))
+    .parse(Uint8Array.from(Buffer.from(s[0], 'base64')))
 
   console.log(d0)
 
-  // const d1 = bcs
-  //   .vector(bcs.u8()) // type
-  //   .parse(Uint8Array.from(Buffer.from(s[1], 'base64')))
-  // console.log(d1)
-  //
-  // const res = bcs
-  //   .vector(bcs.u8())
-  //   .serialize(
-  //     Buffer.from(
-  //       '3ViG4aV7ED54UmN/QBn2rwhze3muJwLbN+T6sC7uPpo2ev36VsFEZF7oOwj2/qC/6Z1XnP8uxhj8cePQs1D/gQ==',
-  //       'base64',
-  //     ),
-  //   )
-  //
-  // console.log(res.toBase64())
-
-  // const d2 = bcs
-  //   .u8() // type
-  //   .parse(Uint8Array.from(Buffer.from(raw[2], 'base64')))
-  //
-  // console.log(d2)
-  //
-  // const d3 = bcs
-  //   .string() // type
-  //   .parse(Uint8Array.from(Buffer.from(raw[3], 'base64')))
-  //
-  // console.log(d3)
-  //
-  // const d4 = bcs
-  //   .string() // type
-  //   .parse(Uint8Array.from(Buffer.from(raw[4], 'base64')))
-  // console.log('d4', d4)
-  //
-  // const d5 = bcs
-  //   .string() // type
-  //   .parse(Uint8Array.from(Buffer.from(raw[5], 'base64')))
-  // console.log('d5', d5)
+  const d1 = bcs
+    .object() // type
+    .parse(Uint8Array.from(Buffer.from(s[1], 'base64')))
+  console.log(d1)
+
+  const d2 = bcs
+    .u64() // type
+    .parse(Uint8Array.from(Buffer.from(s[2], 'base64')))
+
+  console.log(d2)
+
+  const d3 = bcs
+    .address() // type
+    .parse(Uint8Array.from(Buffer.from(s[3], 'base64')))
+
+  console.log(d3)
+
+  const d4 = bcs
+    .bool() // type
+    .parse(Uint8Array.from(Buffer.from(s[4], 'base64')))
+  console.log('d4', d4)
+
+  const d5 = bcs
+    .option(bcs.u8()) // type
+    .parse(Uint8Array.from(Buffer.from(s[5], 'base64')))
+  console.log('d5', d5)
+  const d6 = bcs
+    .option(bcs.u64()) // type
+    .parse(Uint8Array.from(Buffer.from(s[6], 'base64')))
+  console.log('d6', d6)
+  const d7 = bcs
+    .option(bcs.u64()) // type
+    .parse(Uint8Array.from(Buffer.from(s[7], 'base64')))
+  console.log('d7', d7)
 }
 parse5()

+ 27 - 4
src/onchain/finalTask.ts

@@ -5,7 +5,7 @@ import { forEachAsync } from 'useless-helpers'
 async function startCheck(concurrency) {
   const accountsRaw = await DBClient.instance.account.findMany({
     where: {
-      status: 3,
+      status: 4,
     },
     orderBy: {
       lastRun: 'asc',
@@ -42,14 +42,37 @@ async function startCheck(concurrency) {
       //   return
       // }
 
-      const done = await client.feedJennie()
+      //roll dice 20xp
+      // const done = await client.week6task3()
+      // const done = await client.swapScript()
+      //99=done
+      // const done = await client.drawFood()
+      //swap 50xp
+      // const done = await client.tucSawap()
+      //mint 50xp
+      // const done = await client.week7task3()
+      // addLiquidity 50xp
+      const done = await client.week6task2()
       if (done == `done`) {
         console.log(`done work`)
         await DBClient.instance.account.update({
           where: { id: account.id },
-          data: { status: 4 },
+          data: { status: 3 },
         })
       }
+      // else if (done == `undone`) {
+      //   console.log(`undone work`)
+      //   await DBClient.instance.account.update({
+      //     where: { id: account.id },
+      //     data: { status: 3 },
+      //   })
+      // }
+      // if (done == `needTask`) {
+      //   await DBClient.instance.account.update({
+      //     where: { id: account.id },
+      //     data: { status: 5 },
+      //   })
+      // }
     } catch (e) {
       // console.log(e)
       console.log(
@@ -62,4 +85,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(40)
+startCheck(200)

+ 23 - 15
src/onchain/week3/randomWeek3.ts

@@ -9,7 +9,7 @@ async function startCheck(concurrency) {
     where: {
       finish: 0,
     },
-    take: 2000,
+    take: 4000,
     orderBy: {
       id: 'asc',
     },
@@ -20,38 +20,46 @@ async function startCheck(concurrency) {
     )
 
     const res = await polly()
-      .waitAndRetry(5)
+      .waitAndRetry(10)
       .executeForPromise(async () => {
         const axios = getAxiosClient(true)
 
         return await axios.get(
-          `https://xp-api.initiation-1.initia.xyz/xp/weekly/${account.address}/7`,
+          `https://xp-api.initiation-1.initia.xyz/xp/weekly/${account.address}/9`,
         )
       })
 
-    if (res.data.finished_tasks.length === 3) {
+    if (res.data.finished_tasks.length === 4) {
       await DBClient.instance.randomTask2.update({
         where: { id: account.id },
-        data: { task1: 1, task2: 1, task3: 1, finish: 1 },
+        data: { task1: 1, task2: 1, task3: 1, task4: 1, finish: 1 },
       })
       return
     }
-    if (res.data.finished_tasks.includes(`civitia_claim_rent_weekly`)) {
+    //bridge_op_deposit
+    if (res.data.finished_tasks.includes(`bridge_op_deposit`)) {
       account.task1 = 1
     } else {
       account.task1 = 0
     }
-    if (res.data.finished_tasks.includes(`tucana_swap_weekly`)) {
+    //
+    if (res.data.finished_tasks.includes(`bridge_op_withdraw`)) {
       account.task2 = 1
     } else {
       account.task2 = 0
     }
-    if (res.data.finished_tasks.includes(`initai_burn_weekly`)) {
+    //bridge_ibc_transfer
+    if (res.data.finished_tasks.includes(`bridge_ibc_transfer`)) {
       account.task3 = 1
     } else {
       account.task3 = 0
     }
-
+    //milkyway_mint_milk_init
+    if (res.data.finished_tasks.includes(`milkyway_mint_milk_init`)) {
+      account.task4 = 1
+    } else {
+      account.task4 = 0
+    }
     try {
       // await faucetAccount(account.address)
       const notDone = []
@@ -66,7 +74,7 @@ async function startCheck(concurrency) {
         notDone.push(3)
       }
       if (account.task4 === 0) {
-        // notDone.push(4)
+        notDone.push(4)
       }
       if (account.task5 === 0) {
         // notDone.push(5)
@@ -104,7 +112,7 @@ async function startCheck(concurrency) {
           `${index}/${accountsRaw.length}: processing ${account.address},task1`,
         )
 
-        const bool = await client.week7task1()
+        const bool = await client.questBridge()
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task1`,
           bool,
@@ -119,7 +127,7 @@ async function startCheck(concurrency) {
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task2`,
         )
-        const bool = await client.week7task2()
+        const bool = await client.questTask2()
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task2`,
           bool,
@@ -134,7 +142,7 @@ async function startCheck(concurrency) {
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task3`,
         )
-        const bool = await client.week7task3()
+        const bool = await client.questTask3()
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task3`,
           bool,
@@ -149,7 +157,7 @@ async function startCheck(concurrency) {
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task4`,
         )
-        const bool = await client.week5Task4()
+        const bool = await client.questTask4()
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task4`,
           bool,
@@ -203,4 +211,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(10)
+startCheck(30)

+ 5 - 2
src/swapTester.ts

@@ -12,7 +12,9 @@ const key = new MnemonicKey({
   mnemonic:
     // 'visual giant rely tooth recall explain vital tunnel snow road airport cake',
     // 'deal earth suggest craft impact vocal outdoor perfect winter nice unhappy lizard',
-    'nut chalk dilemma solve same correct hood lava earn window under coral picture rabbit inform room maximum puppy mixed valley giggle glue mail frame',
+    'educate shock jaguar unfold famous bag legend damp fence trumpet steak again body party carbon index daughter unusual miracle hen dove brand loan beach',
+  // 'nut chalk dilemma solve same correct hood lava earn window under coral picture rabbit inform room maximum puppy mixed valley giggle glue mail frame',
+  // 'recipe bind slow color mammal wave slush clump filter spot retire faculty area room enough pill become cluster cheap repair riot safe grit smile',
   // 'language tooth rug border arm essence badge rough ahead unaware bag night stay auto spawn february odor equip hub demand three setup used sentence',
   // 'camp rural essay together right oblige shine visa sketch garage legal crush argue calm soup egg forum luxury action cupboard fade myth gospel confirm',
   // 'neutral flight plug goddess marble champion message bottom gentle guilt ketchup way guide obey nominee panda sleep meadow scene sea fine cause upgrade only',
@@ -49,7 +51,8 @@ async function main() {
   // console.log(a)
   // await client.transferGas('init1yq7erc0hmemy7exhycdqx8j05jj46g0hgycw5g', 0.2)
   // await client.mintPart()
-  const res = await client.week7task1()
+  // const res = await client.questBridge()
+  const res = await client.questTask4()
   // const res = ((new Date().valueOf() + 1500000) * 1000000).toString()
   console.log(res)
   // console.log(`1718639224520000000`)

+ 1 - 1
src/utils/index.ts

@@ -15,6 +15,7 @@ export function generateRandomString(length: number) {
   }
   return result
 }
+
 export function getAxiosClient(useProxy: boolean) {
   const pass = `test1234_session-${generateRandomString(8)}_lifetime-1h`
   const proxyAgent = useProxy
@@ -62,7 +63,6 @@ export function getProxyAgent() {
   return new HttpsProxyAgent(`http://tuxla:${pass}@geo.iproyal.com:12321`)
 }
 
-
 export async function forEachAsync<T = any>(
   array: T[],
   concurrency: number,

+ 460 - 33
yarn.lock

@@ -938,6 +938,13 @@
   resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz"
   integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
 
+"@babel/runtime@^7.18.9":
+  version "7.24.8"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e"
+  integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
 "@babel/runtime@^7.8.4":
   version "7.24.7"
   resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz"
@@ -979,6 +986,246 @@
     "@babel/helper-validator-identifier" "^7.24.7"
     to-fast-properties "^2.0.0"
 
+"@confio/ics23@^0.6.8":
+  version "0.6.8"
+  resolved "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz"
+  integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==
+  dependencies:
+    "@noble/hashes" "^1.0.0"
+    protobufjs "^6.8.8"
+
+"@cosmjs/amino@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.28.13.tgz#b51417a23c1ff8ef8b85a6862eba8492c6c44f38"
+  integrity sha512-IHnH2zGwaY69qT4mVAavr/pfzx6YE+ud1NHJbvVePlbGiz68CXTi5LHR+K0lrKB5mQ7E+ZErWz2mw5U/x+V1wQ==
+  dependencies:
+    "@cosmjs/crypto" "0.28.13"
+    "@cosmjs/encoding" "0.28.13"
+    "@cosmjs/math" "0.28.13"
+    "@cosmjs/utils" "0.28.13"
+
+"@cosmjs/amino@0.31.3", "@cosmjs/amino@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.31.3.tgz"
+  integrity sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw==
+  dependencies:
+    "@cosmjs/crypto" "^0.31.3"
+    "@cosmjs/encoding" "^0.31.3"
+    "@cosmjs/math" "^0.31.3"
+    "@cosmjs/utils" "^0.31.3"
+
+"@cosmjs/crypto@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.28.13.tgz#541b6a36f616b2da5a568ead46d4e83841ceb412"
+  integrity sha512-ynKfM0q/tMBQMHJby6ad8lR3gkgBKaelQhIsCZTjClsnuC7oYT9y3ThSZCUWr7Pa9h0J8ahU2YV2oFWFVWJQzQ==
+  dependencies:
+    "@cosmjs/encoding" "0.28.13"
+    "@cosmjs/math" "0.28.13"
+    "@cosmjs/utils" "0.28.13"
+    "@noble/hashes" "^1"
+    bn.js "^5.2.0"
+    elliptic "^6.5.3"
+    libsodium-wrappers "^0.7.6"
+
+"@cosmjs/crypto@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.31.3.tgz"
+  integrity sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ==
+  dependencies:
+    "@cosmjs/encoding" "^0.31.3"
+    "@cosmjs/math" "^0.31.3"
+    "@cosmjs/utils" "^0.31.3"
+    "@noble/hashes" "^1"
+    bn.js "^5.2.0"
+    elliptic "^6.5.4"
+    libsodium-wrappers-sumo "^0.7.11"
+
+"@cosmjs/encoding@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.28.13.tgz#7994e8e2c435beaf0690296ffb0f7f3eaec8150b"
+  integrity sha512-jtXbAYtV77rLHxoIrjGFsvgGjeTKttuHRv6cvuy3toCZzY7JzTclKH5O2g36IIE4lXwD9xwuhGJ2aa6A3dhNkA==
+  dependencies:
+    base64-js "^1.3.0"
+    bech32 "^1.1.4"
+    readonly-date "^1.0.0"
+
+"@cosmjs/encoding@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.31.3.tgz"
+  integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg==
+  dependencies:
+    base64-js "^1.3.0"
+    bech32 "^1.1.4"
+    readonly-date "^1.0.0"
+
+"@cosmjs/json-rpc@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.28.13.tgz#ff3f0c4a2f363b1a2c6779f8624a897e217fe297"
+  integrity sha512-fInSvg7x9P6p+GWqet+TMhrMTM3OWWdLJOGS5w2ryubMjgpR1rLiAx77MdTNkArW+/6sUwku0sN4veM4ENQu6A==
+  dependencies:
+    "@cosmjs/stream" "0.28.13"
+    xstream "^11.14.0"
+
+"@cosmjs/json-rpc@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.31.3.tgz"
+  integrity sha512-7LVYerXjnm69qqYR3uA6LGCrBW2EO5/F7lfJxAmY+iII2C7xO3a0vAjMSt5zBBh29PXrJVS6c2qRP22W1Le2Wg==
+  dependencies:
+    "@cosmjs/stream" "^0.31.3"
+    xstream "^11.14.0"
+
+"@cosmjs/math@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.28.13.tgz#50c05bc67007a04216f7f5e0c93f57270f8cc077"
+  integrity sha512-PDpL8W/kbyeWi0mQ2OruyqE8ZUAdxPs1xCbDX3WXJwy2oU+X2UTbkuweJHVpS9CIqmZulBoWQAmlf6t6zr1N/g==
+  dependencies:
+    bn.js "^5.2.0"
+
+"@cosmjs/math@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/math/-/math-0.31.3.tgz"
+  integrity sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A==
+  dependencies:
+    bn.js "^5.2.0"
+
+"@cosmjs/proto-signing@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.28.13.tgz#95ac12f0da0f0814f348f5ae996c3e96d015df61"
+  integrity sha512-nSl/2ZLsUJYz3Ad0RY3ihZUgRHIow2OnYqKsESMu+3RA/jTi9bDYhiBu8mNMHI0xrEJry918B2CyI56pOUHdPQ==
+  dependencies:
+    "@cosmjs/amino" "0.28.13"
+    "@cosmjs/crypto" "0.28.13"
+    "@cosmjs/encoding" "0.28.13"
+    "@cosmjs/math" "0.28.13"
+    "@cosmjs/utils" "0.28.13"
+    cosmjs-types "^0.4.0"
+    long "^4.0.0"
+
+"@cosmjs/proto-signing@0.31.3", "@cosmjs/proto-signing@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz"
+  integrity sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA==
+  dependencies:
+    "@cosmjs/amino" "^0.31.3"
+    "@cosmjs/crypto" "^0.31.3"
+    "@cosmjs/encoding" "^0.31.3"
+    "@cosmjs/math" "^0.31.3"
+    "@cosmjs/utils" "^0.31.3"
+    cosmjs-types "^0.8.0"
+    long "^4.0.0"
+
+"@cosmjs/socket@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.28.13.tgz#d8443ad6e91d080fc6b80a7e9cf297a56b1f6833"
+  integrity sha512-lavwGxQ5VdeltyhpFtwCRVfxeWjH5D5mmN7jgx9nuCf3XSFbTcOYxrk2pQ4usenu1Q1KZdL4Yl5RCNrJuHD9Ug==
+  dependencies:
+    "@cosmjs/stream" "0.28.13"
+    isomorphic-ws "^4.0.1"
+    ws "^7"
+    xstream "^11.14.0"
+
+"@cosmjs/socket@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.31.3.tgz"
+  integrity sha512-aqrDGGi7os/hsz5p++avI4L0ZushJ+ItnzbqA7C6hamFSCJwgOkXaOUs+K9hXZdX4rhY7rXO4PH9IH8q09JkTw==
+  dependencies:
+    "@cosmjs/stream" "^0.31.3"
+    isomorphic-ws "^4.0.1"
+    ws "^7"
+    xstream "^11.14.0"
+
+"@cosmjs/stargate@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.28.13.tgz#a73d837a46ee8944e6eafe162f2ff6943c14350e"
+  integrity sha512-dVBMazDz8/eActHsRcZjDHHptOBMqvibj5CFgEtZBp22gP6ASzoAUXTlkSVk5FBf4sfuUHoff6st134/+PGMAg==
+  dependencies:
+    "@confio/ics23" "^0.6.8"
+    "@cosmjs/amino" "0.28.13"
+    "@cosmjs/encoding" "0.28.13"
+    "@cosmjs/math" "0.28.13"
+    "@cosmjs/proto-signing" "0.28.13"
+    "@cosmjs/stream" "0.28.13"
+    "@cosmjs/tendermint-rpc" "0.28.13"
+    "@cosmjs/utils" "0.28.13"
+    cosmjs-types "^0.4.0"
+    long "^4.0.0"
+    protobufjs "~6.11.3"
+    xstream "^11.14.0"
+
+"@cosmjs/stargate@0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.31.3.tgz"
+  integrity sha512-53NxnzmB9FfXpG4KjOUAYAvWLYKdEmZKsutcat/u2BrDXNZ7BN8jim/ENcpwXfs9/Og0K24lEIdvA4gsq3JDQw==
+  dependencies:
+    "@confio/ics23" "^0.6.8"
+    "@cosmjs/amino" "^0.31.3"
+    "@cosmjs/encoding" "^0.31.3"
+    "@cosmjs/math" "^0.31.3"
+    "@cosmjs/proto-signing" "^0.31.3"
+    "@cosmjs/stream" "^0.31.3"
+    "@cosmjs/tendermint-rpc" "^0.31.3"
+    "@cosmjs/utils" "^0.31.3"
+    cosmjs-types "^0.8.0"
+    long "^4.0.0"
+    protobufjs "~6.11.3"
+    xstream "^11.14.0"
+
+"@cosmjs/stream@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.28.13.tgz#1e79d1116fda1e63e5ecddbd9d803d403942b1fa"
+  integrity sha512-AnjtfwT8NwPPkd3lhZhjOlOzT0Kn9bgEu2IPOZjQ1nmG2bplsr6TJmnwn0dJxHT7UGtex17h6whKB5N4wU37Wg==
+  dependencies:
+    xstream "^11.14.0"
+
+"@cosmjs/stream@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.31.3.tgz"
+  integrity sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w==
+  dependencies:
+    xstream "^11.14.0"
+
+"@cosmjs/tendermint-rpc@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.28.13.tgz#0bf587ae66fa3f88319edbd258492d28e73f9f29"
+  integrity sha512-GB+ZmfuJIGQm0hsRtLYjeR3lOxF7Z6XyCBR0cX5AAYOZzSEBJjevPgUHD6tLn8zIhvzxaW3/VKnMB+WmlxdH4w==
+  dependencies:
+    "@cosmjs/crypto" "0.28.13"
+    "@cosmjs/encoding" "0.28.13"
+    "@cosmjs/json-rpc" "0.28.13"
+    "@cosmjs/math" "0.28.13"
+    "@cosmjs/socket" "0.28.13"
+    "@cosmjs/stream" "0.28.13"
+    "@cosmjs/utils" "0.28.13"
+    axios "^0.21.2"
+    readonly-date "^1.0.0"
+    xstream "^11.14.0"
+
+"@cosmjs/tendermint-rpc@0.31.3", "@cosmjs/tendermint-rpc@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz"
+  integrity sha512-s3TiWkPCW4QceTQjpYqn4xttUJH36mTPqplMl+qyocdqk5+X5mergzExU/pHZRWQ4pbby8bnR7kMvG4OC1aZ8g==
+  dependencies:
+    "@cosmjs/crypto" "^0.31.3"
+    "@cosmjs/encoding" "^0.31.3"
+    "@cosmjs/json-rpc" "^0.31.3"
+    "@cosmjs/math" "^0.31.3"
+    "@cosmjs/socket" "^0.31.3"
+    "@cosmjs/stream" "^0.31.3"
+    "@cosmjs/utils" "^0.31.3"
+    axios "^0.21.2"
+    readonly-date "^1.0.0"
+    xstream "^11.14.0"
+
+"@cosmjs/utils@0.28.13":
+  version "0.28.13"
+  resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.28.13.tgz#2fd2844ec832d7833811e2ae1691305d09791a08"
+  integrity sha512-dVeMBiyg+46x7XBZEfJK8yTihphbCFpjVYmLJVqmTsHfJwymQ65cpyW/C+V/LgWARGK8hWQ/aX9HM5Ao8QmMSg==
+
+"@cosmjs/utils@^0.31.3":
+  version "0.31.3"
+  resolved "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.31.3.tgz"
+  integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA==
+
 "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
   version "4.4.0"
   resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
@@ -1037,17 +1284,17 @@
   dependencies:
     browser-headers "^0.4.1"
 
-"@initia/initia.js@0.2.7":
-  version "0.2.7"
-  resolved "https://registry.npmjs.org/@initia/initia.js/-/initia.js-0.2.7.tgz"
-  integrity sha512-fQ8tKkpcPwXVU0G32vqUcR9UwSqXYjNx3Y7v4sXNkpavgNrDtDnQBCByq+gUNwD+291SoCp584EOJTRYuZ1lNA==
+"@initia/initia.js@0.2.9":
+  version "0.2.9"
+  resolved "https://registry.npmjs.org/@initia/initia.js/-/initia.js-0.2.9.tgz"
+  integrity sha512-D/I/tu0vl1uTcxfVFAHw3DWhOgdQd/aTuCj1/6+HQwZ6JBif/PmbS+9FEqKmlrIkPoTsrHSENCc262YLKMsnkw==
   dependencies:
-    "@initia/initia.proto" "^0.2.0"
+    "@initia/initia.proto" "^0.2.1"
     "@initia/opinit.proto" "^0.0.8"
     "@ledgerhq/hw-transport" "^6.27.12"
     "@ledgerhq/hw-transport-webhid" "^6.27.12"
     "@ledgerhq/hw-transport-webusb" "^6.27.12"
-    "@mysten/bcs" "^0.10.1"
+    "@mysten/bcs" "^1.0.2"
     axios "^1.6.5"
     bech32 "^2.0.0"
     bignumber.js "^9.1.0"
@@ -1061,10 +1308,10 @@
     tmp "^0.2.1"
     ws "^7.5.9"
 
-"@initia/initia.proto@^0.2.0":
-  version "0.2.0"
-  resolved "https://registry.npmjs.org/@initia/initia.proto/-/initia.proto-0.2.0.tgz"
-  integrity sha512-8jUrGuRGL20UGh/XbBg6vkv6Jihhp8uNnaKxgdhn9LEi7YosZpBPbGTExLvXQD4d8VMVqMoP5Bp/5ns1gNHa9A==
+"@initia/initia.proto@^0.2.1":
+  version "0.2.1"
+  resolved "https://registry.npmjs.org/@initia/initia.proto/-/initia.proto-0.2.1.tgz"
+  integrity sha512-6YVhrNIhZLrKyruWhzlW09tgDDJIaRf6MIzckeKcUCSWx8g0wbfUrOb/i81zArysyhts/2/aWfgtYYQgxTpyzg==
   dependencies:
     "@improbable-eng/grpc-web" "^0.15.0"
     google-protobuf "^3.21.0"
@@ -1209,12 +1456,12 @@
   resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.12.0.tgz"
   integrity sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==
 
-"@mysten/bcs@^0.10.1":
-  version "0.10.1"
-  resolved "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.10.1.tgz"
-  integrity sha512-cQDb7Rhz2J82ZqgVQiHykuwKUlgiLWS2bjoajPPW0uvXlb75qrgKuaxh1UzsaRhHy3egk/APc0xjiZoqdbzB4w==
+"@mysten/bcs@^1.0.2":
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/@mysten/bcs/-/bcs-1.0.3.tgz"
+  integrity sha512-fc2xDj8eteP18zCNr6WStlE0Hxi7kYeY9yAzAN8oyz5EYOLas0JwScR9pAd9VR61BfIThJ+5vxQ6K7Y22lHDVQ==
   dependencies:
-    bs58 "^5.0.0"
+    bs58 "^6.0.0"
 
 "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3":
   version "2.1.8-no-fsevents.3"
@@ -1240,7 +1487,7 @@
   resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz"
   integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
 
-"@noble/hashes@1.4.0", "@noble/hashes@^1.0.0", "@noble/hashes@^1.2.0", "@noble/hashes@~1.4.0":
+"@noble/hashes@1.4.0", "@noble/hashes@^1", "@noble/hashes@^1.0.0", "@noble/hashes@^1.2.0", "@noble/hashes@~1.4.0":
   version "1.4.0"
   resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz"
   integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
@@ -1266,6 +1513,28 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
+"@osmonauts/helpers@^0.6.0":
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/@osmonauts/helpers/-/helpers-0.6.0.tgz#86324110ba1ec76637836ef6ec12ce263e1a7a97"
+  integrity sha512-l62tWR/0W4R+5wRvMeRK0zlaJ8WZhULKsQAZ7kNzggL0pbndIAV+0BJ/jEBbNletoeGtuV8rpi6Wo+w+RmtZGw==
+  dependencies:
+    "@babel/runtime" "^7.18.9"
+    "@cosmjs/amino" "0.28.13"
+    "@cosmjs/crypto" "0.28.13"
+    "@cosmjs/proto-signing" "0.28.13"
+    "@cosmjs/stargate" "0.28.13"
+    cosmjs-types "0.5.1"
+    long "^5.2.0"
+    protobufjs "^6.11.3"
+
+"@osmonauts/lcd@^0.6.0":
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/@osmonauts/lcd/-/lcd-0.6.0.tgz#9545b793b77b4a175e6dc733341940fe192c6655"
+  integrity sha512-vz9VavXrEfxZoXbSAfNfk90MLpn34XtBYPV3L9YilE+s56AhqYxUh83nne9J5somnTRfGnyR3oeV8C+lHkqiuA==
+  dependencies:
+    "@babel/runtime" "^7.18.9"
+    axios "0.27.2"
+
 "@pkgjs/parseargs@^0.11.0":
   version "0.11.0"
   resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
@@ -1434,6 +1703,11 @@
   resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
   integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
 
+"@types/long@^4.0.1":
+  version "4.0.2"
+  resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz"
+  integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==
+
 "@types/node-cron@^3.0.11":
   version "3.0.11"
   resolved "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz"
@@ -1726,6 +2000,21 @@ available-typed-arrays@^1.0.7:
   dependencies:
     possible-typed-array-names "^1.0.0"
 
+axios@0.27.2:
+  version "0.27.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+  integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
+  dependencies:
+    follow-redirects "^1.14.9"
+    form-data "^4.0.0"
+
+axios@^0.21.2:
+  version "0.21.4"
+  resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz"
+  integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+  dependencies:
+    follow-redirects "^1.14.0"
+
 axios@^1.6.5, axios@^1.6.8, axios@^1.7.2:
   version "1.7.2"
   resolved "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz"
@@ -1776,16 +2065,21 @@ base-x@^3.0.2:
   dependencies:
     safe-buffer "^5.0.1"
 
-base-x@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz"
-  integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+base-x@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz"
+  integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==
 
-base64-js@^1.0.2, base64-js@^1.3.1:
+base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1:
   version "1.5.1"
   resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
 
+bech32@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz"
+  integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
 bech32@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz"
@@ -2022,12 +2316,12 @@ bs58@^4.0.0:
   dependencies:
     base-x "^3.0.2"
 
-bs58@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz"
-  integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+bs58@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz"
+  integrity sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==
   dependencies:
-    base-x "^4.0.0"
+    base-x "^5.0.0"
 
 bs58check@<3.0.0, bs58check@^2.1.1:
   version "2.1.2"
@@ -2263,6 +2557,30 @@ core-util-is@~1.0.0:
   resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
   integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
 
+cosmjs-types@0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.1.tgz#f9bc35e78c32b687fb6018dc573eb454b3ae2587"
+  integrity sha512-NcC58xUIVLlKdIimWWQAmSlmCjiMrJnuHf4i3LiD8PCextfHR0fT3V5/WlXZZreyMgdmh6ML1zPUfGTbbo3Z5g==
+  dependencies:
+    long "^4.0.0"
+    protobufjs "~6.11.2"
+
+cosmjs-types@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.4.1.tgz#3b2a53ba60d33159dd075596ce8267cfa7027063"
+  integrity sha512-I7E/cHkIgoJzMNQdFF0YVqPlaTqrqKHrskuSTIqlEyxfB5Lf3WKCajSXVK2yHOfOFfSux/RxEdpMzw/eO4DIog==
+  dependencies:
+    long "^4.0.0"
+    protobufjs "~6.11.2"
+
+cosmjs-types@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.8.0.tgz"
+  integrity sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==
+  dependencies:
+    long "^4.0.0"
+    protobufjs "~6.11.2"
+
 create-ecdh@^4.0.0:
   version "4.0.4"
   resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz"
@@ -2764,7 +3082,7 @@ flatted@^3.2.9:
   resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz"
   integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
 
-follow-redirects@^1.15.6:
+follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.6:
   version "1.15.6"
   resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz"
   integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
@@ -2805,7 +3123,7 @@ fs.realpath@^1.0.0:
 
 fsevents@~2.3.2:
   version "2.3.3"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
   integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
 
 function-bind@^1.1.2:
@@ -2883,6 +3201,14 @@ globals@^13.19.0:
   dependencies:
     type-fest "^0.20.2"
 
+globalthis@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
+  integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+  dependencies:
+    define-properties "^1.2.1"
+    gopd "^1.0.1"
+
 globby@^11.0.4, globby@^11.1.0:
   version "11.1.0"
   resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
@@ -3175,6 +3501,11 @@ isexe@^2.0.0:
   resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
   integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
 
+isomorphic-ws@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz"
+  integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
+
 jackspeak@^2.3.6:
   version "2.3.6"
   resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz"
@@ -3334,6 +3665,30 @@ levn@^0.4.1:
     prelude-ls "^1.2.1"
     type-check "~0.4.0"
 
+libsodium-sumo@^0.7.14:
+  version "0.7.14"
+  resolved "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.14.tgz"
+  integrity sha512-2nDge6qlAjcwyslAhWfVumlkeSNK5+WCfKa2/VEq9prvlT5vP2FR0m0o5hmKaYqfsZ4TQVj5czQsimZvXDB1CQ==
+
+libsodium-wrappers-sumo@^0.7.11:
+  version "0.7.14"
+  resolved "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.14.tgz"
+  integrity sha512-0lm7ZwN5a95J2yUi8R1rgQeeaVDIWnvNzgVmXmZswis4mC+bQtbDrB+QpJlL4qklaKx3hVpJjoc6ubzJFiv64Q==
+  dependencies:
+    libsodium-sumo "^0.7.14"
+
+libsodium-wrappers@^0.7.6:
+  version "0.7.14"
+  resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.14.tgz#b21d9e8d58de686c6318a772805ee1c5d02035a5"
+  integrity sha512-300TtsePizhJZ7HjLmWr6hLHAgJUxIGhapSw+EwfCtDuWaEmEdGXSQv6j6qFw0bs9l4vS2NH9BtOHfXAq6h5kQ==
+  dependencies:
+    libsodium "^0.7.14"
+
+libsodium@^0.7.14:
+  version "0.7.14"
+  resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.14.tgz#d9daace70dbc36051b947d37999bb6337c364c88"
+  integrity sha512-/pOd7eO6oZrfORquRTC4284OUJFcMi8F3Vnc9xtRBT0teLfOUxWIItaBFF3odYjZ7nlJNwnLdUVEUFHxVyX/Sw==
+
 locate-path@^6.0.0:
   version "6.0.0"
   resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
@@ -3363,6 +3718,11 @@ lodash.merge@^4.6.2:
   resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
+long@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz"
+  integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
 long@^5.0.0, long@^5.2.0, long@^5.2.3:
   version "5.2.3"
   resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz"
@@ -3839,6 +4199,25 @@ process@~0.11.0:
   resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
   integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
 
+protobufjs@^6.11.2, protobufjs@^6.11.3, protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3:
+  version "6.11.4"
+  resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz"
+  integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==
+  dependencies:
+    "@protobufjs/aspromise" "^1.1.2"
+    "@protobufjs/base64" "^1.1.2"
+    "@protobufjs/codegen" "^2.0.4"
+    "@protobufjs/eventemitter" "^1.1.0"
+    "@protobufjs/fetch" "^1.1.0"
+    "@protobufjs/float" "^1.0.2"
+    "@protobufjs/inquire" "^1.1.0"
+    "@protobufjs/path" "^1.1.2"
+    "@protobufjs/pool" "^1.1.0"
+    "@protobufjs/utf8" "^1.1.0"
+    "@types/long" "^4.0.1"
+    "@types/node" ">=13.7.0"
+    long "^4.0.0"
+
 protobufjs@^7.1.1:
   version "7.3.0"
   resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz"
@@ -3908,7 +4287,7 @@ queue-microtask@^1.2.2:
 
 random-words@^2.0.1:
   version "2.0.1"
-  resolved "https://registry.yarnpkg.com/random-words/-/random-words-2.0.1.tgz#cc4564385d040c9fad2b817621a0041a1ecc90f6"
+  resolved "https://registry.npmjs.org/random-words/-/random-words-2.0.1.tgz"
   integrity sha512-nZNJAmgcFmtJMTDDIUCm/iK4R6RydC6NvALvWhYItXQrgYGk1F7Gww416LpVROFQtfVd5TaLEf4WuSsko03N7w==
   dependencies:
     seedrandom "^3.0.5"
@@ -3977,6 +4356,11 @@ readjson@^2.2.0, readjson@^2.2.2:
     jju "^1.4.0"
     try-catch "^3.0.0"
 
+readonly-date@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz"
+  integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==
+
 regenerate-unicode-properties@^10.1.0:
   version "10.1.1"
   resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz"
@@ -4127,7 +4511,7 @@ secp256k1@^5.0.0:
 
 seedrandom@^3.0.5:
   version "3.0.5"
-  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
+  resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz"
   integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
 
 semver@^5.6.0:
@@ -4291,7 +4675,30 @@ stream-splicer@^2.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.2"
 
-"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
+stridejs@^0.10.0-alpha:
+  version "0.10.0-alpha"
+  resolved "https://registry.yarnpkg.com/stridejs/-/stridejs-0.10.0-alpha.tgz#f7d9ebfa6b9acc82027240be9ba694f3649160c1"
+  integrity sha512-RKXNtLjuMZ1AEcTYRAQDyYstr5VHhhxNJQZXOqTMKoMjE7w9TaMy6XeznFyFUj0CdpPPBkIl7z0O38Zdyh2Z1A==
+  dependencies:
+    "@babel/runtime" "^7.18.9"
+    "@cosmjs/amino" "0.31.3"
+    "@cosmjs/proto-signing" "0.31.3"
+    "@cosmjs/stargate" "0.31.3"
+    "@cosmjs/tendermint-rpc" "0.31.3"
+    "@osmonauts/helpers" "^0.6.0"
+    "@osmonauts/lcd" "^0.6.0"
+    protobufjs "^6.11.2"
+
+"string-width-cjs@npm:string-width@^4.2.0":
+  version "4.2.3"
+  resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string-width@^4.1.0:
   version "4.2.3"
   resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
   integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -4323,7 +4730,14 @@ string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   version "6.0.1"
   resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
   integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -4368,6 +4782,11 @@ supports-preserve-symlinks-flag@^1.0.0:
   resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
+symbol-observable@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz"
+  integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==
+
 synckit@^0.8.6:
   version "0.8.8"
   resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz"
@@ -4710,7 +5129,7 @@ ws@8.17.1, ws@^8.13.0:
   resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz"
   integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
 
-ws@^7.5.9:
+ws@^7, ws@^7.5.9:
   version "7.5.9"
   resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz"
   integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
@@ -4731,6 +5150,14 @@ xrpl@^3.0.0:
     ripple-binary-codec "^2.1.0"
     ripple-keypairs "^2.0.0"
 
+xstream@^11.14.0:
+  version "11.14.0"
+  resolved "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz"
+  integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==
+  dependencies:
+    globalthis "^1.0.1"
+    symbol-observable "^2.0.3"
+
 xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1:
   version "4.0.2"
   resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"