helium3@sina.com 1 vuosi sitten
vanhempi
commit
edf5ebb40d
11 muutettua tiedostoa jossa 590 lisäystä ja 144 poistoa
  1. 1 1
      package.json
  2. 77 4
      src/BaseClient.ts
  3. 247 13
      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. 14 10
      src/onchain/week3/randomWeek3.ts
  9. 4 2
      src/swapTester.ts
  10. 1 1
      src/utils/index.ts
  11. 42 26
      yarn.lock

+ 1 - 1
package.json

@@ -60,7 +60,7 @@
   },
   "license": "Apache-2.0",
   "dependencies": {
-    "@initia/initia.js": "0.2.7",
+    "@initia/initia.js": "0.2.9",
     "@prisma/client": "^5.14.0",
     "axios": "^1.6.8",
     "dotenv": "^16.4.5",

+ 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')
+    // ]
+  }
+
 }

+ 247 - 13
src/InitiaClient.ts

@@ -5,17 +5,22 @@ import {
   Coin,
   Coins,
   Fee,
+  IbcChannelMsg,
+  Msg,
+  MsgCall,
   MsgExecute,
+  MsgInitiateTokenWithdrawal,
   MsgSend,
-  MsgTransfer,
+  MsgTransfer, Tx,
   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 { MsgUpdateClient } from '@initia/initia.js/dist/core/ibc/core/client/msgs'
 
 export class InitiaClient extends InitiaTask {
   constructor(mnemonic: string, useProxy: boolean = false) {
@@ -996,11 +1001,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 +1061,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 +1109,7 @@ export class InitiaClient extends InitiaTask {
     }
   }
 
+  //claim rent
   async week7task1() {
     const uinit = await this.civi.bank.balanceByDenom(
       this.key.accAddress,
@@ -1145,6 +1161,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 +1225,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 +1252,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 +1260,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 +1274,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 +1342,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 +1351,7 @@ export class InitiaClient extends InitiaTask {
               ],
             },
           )
+          return res
         })
       const signed = await aiWallt.createAndSignTx({
         msgs: [msg],
@@ -1285,7 +1366,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 +1410,164 @@ 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',
+    )
+    console.log(uinitBalance)
+    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)
+    }
+
+    const wallet = new Wallet(this.milkyway, this.key)
+    const message = {
+      account_number: await wallet.accountNumber(),
+      chain_id: 'glados-1',
+      fee: {
+        gas: '224922',
+        amount: [
+          {
+            amount: '67477',
+            denom: 'umilk',
+          },
+        ],
+      },
+      memo: '',
+      msgs: [
+        {
+          type: 'stride/x/stakeibc/MsgLiquidStake',
+          value: {
+            amount: Math.floor(Number(uinitBalance.amount) / 2).toString(),
+            creator: this.key.accAddress,
+            host_denom: 'uinit',
+          },
+        },
+      ],
+      sequence: (await wallet.sequence()).toString(),
+    }
+
+    // const broadcast = await this.milkyway.tx.broadcast(message)
+  }
 }

+ 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)

+ 14 - 10
src/onchain/week3/randomWeek3.ts

@@ -9,7 +9,7 @@ async function startCheck(concurrency) {
     where: {
       finish: 0,
     },
-    take: 2000,
+    take: 1,
     orderBy: {
       id: 'asc',
     },
@@ -25,7 +25,7 @@ async function startCheck(concurrency) {
         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`,
         )
       })
 
@@ -36,17 +36,20 @@ async function startCheck(concurrency) {
       })
       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
@@ -66,7 +69,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 +107,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 +122,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 +137,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,
@@ -146,6 +149,7 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 4) {
+        return
         console.log(
           `${index}/${accountsRaw.length}: processing ${account.address},task4`,
         )
@@ -203,4 +207,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(10)
+startCheck(1)

+ 4 - 2
src/swapTester.ts

@@ -12,7 +12,8 @@ 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',
+    // '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 +50,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,

+ 42 - 26
yarn.lock

@@ -1037,17 +1037,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.yarnpkg.com/@initia/initia.js/-/initia.js-0.2.9.tgz#465f45427c331c227ce4db9190db7ec17bd1abb5"
+  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 +1061,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.yarnpkg.com/@initia/initia.proto/-/initia.proto-0.2.1.tgz#290eb30d669776b7555aae624d030a311be00127"
+  integrity sha512-6YVhrNIhZLrKyruWhzlW09tgDDJIaRf6MIzckeKcUCSWx8g0wbfUrOb/i81zArysyhts/2/aWfgtYYQgxTpyzg==
   dependencies:
     "@improbable-eng/grpc-web" "^0.15.0"
     google-protobuf "^3.21.0"
@@ -1209,12 +1209,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.yarnpkg.com/@mysten/bcs/-/bcs-1.0.3.tgz#a8d1df65584d193834c9567194d7011eb1ccdcfe"
+  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"
@@ -1776,10 +1776,10 @@ 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.yarnpkg.com/base-x/-/base-x-5.0.0.tgz#6d835ceae379130e1a4cb846a70ac4746f28ea9b"
+  integrity sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==
 
 base64-js@^1.0.2, base64-js@^1.3.1:
   version "1.5.1"
@@ -2022,12 +2022,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.yarnpkg.com/bs58/-/bs58-6.0.0.tgz#a2cda0130558535dd281a2f8697df79caaf425d8"
+  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"
@@ -4291,7 +4291,16 @@ 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:
+"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 +4332,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==