hel 1 سال پیش
والد
کامیت
bf8ef991e8
11فایلهای تغییر یافته به همراه631 افزوده شده و 116 حذف شده
  1. 1 1
      package.json
  2. 7 7
      src/BaseClient.ts
  3. 471 51
      src/InitiaClient.ts
  4. 9 8
      src/onchain/finalTask.ts
  5. 39 22
      src/onchain/gasCollect.ts
  6. 57 19
      src/onchain/week3/randomWeek3.ts
  7. 40 0
      src/onchain/week3/task3Balance.ts
  8. 2 2
      src/swapTester.ts
  9. 0 1
      src/test.ts
  10. 1 1
      src/utils/index.ts
  11. 4 4
      yarn.lock

+ 1 - 1
package.json

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

+ 7 - 7
src/BaseClient.ts

@@ -84,7 +84,7 @@ export abstract class BaseClient {
       useProxy ? requester : null,
     )
     this.miniMove = new LCDClient(
-      'https://lcd.minimove-1.initia.xyz/',
+      'https://lcd.minimove-1.initia.xyz',
       { chainId: 'minimove-1' },
       useProxy ? requester : null,
     )
@@ -111,7 +111,7 @@ export abstract class BaseClient {
       useProxy ? requester : null,
     )
     this.initAi = new LCDClient(
-      'https://maze-rest-617bacff-7d34-4eb8-87f4-ee16fb4e0ac7.ue1-prod.newmetric.xyz/',
+      'https://maze-rest-617bacff-7d34-4eb8-87f4-ee16fb4e0ac7.ue1-prod.newmetric.xyz',
       {
         chainId: 'init-ai-1',
       },
@@ -198,7 +198,7 @@ export abstract class BaseClient {
       this.key.accAddress,
       'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
     )
-    return Number(balances.amount) > 5000000
+    return Number(balances.amount) > 3500000
   }
 
   async funded() {
@@ -398,7 +398,7 @@ export abstract class BaseClient {
       msgs: Array.isArray(msg) ? msg : [msg],
       feeDenoms: ['uinit'],
     })
-    const broadcast = await this.lcd.tx.broadcast(signed)
+    await this.lcd.tx.broadcast(signed)
   }
   async bridge2Ai(amount: number) {
     const size = bcs
@@ -505,7 +505,7 @@ export abstract class BaseClient {
   }
 
   async newBridge2BlackWings() {
-    const random = this.randomAmount(1000000, 1000000 * 4)
+    const random = this.randomAmount(1000000, 1500000)
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,
       8,
@@ -524,7 +524,7 @@ export abstract class BaseClient {
     return await this.broadcast(msg)
   }
   async newBridge2Ai() {
-    const random = this.randomAmount(1500000, 1000000 * 3)
+    const random = this.randomAmount(1500000, 2000000)
 
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,
@@ -535,7 +535,7 @@ export abstract class BaseClient {
     return await this.broadcast(msg)
   }
   async newBridge2Civi() {
-    const random = this.randomAmount(1500000, 1000000 * 3)
+    const random = this.randomAmount(1500000, 2000000)
 
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,

+ 471 - 51
src/InitiaClient.ts

@@ -9,6 +9,7 @@ import {
   MsgTransfer,
   Wallet,
 } from '@initia/initia.js'
+import polly from 'polly-js'
 
 export class InitiaClient extends InitiaTask {
   constructor(mnemonic: string, useProxy: boolean = false) {
@@ -60,18 +61,89 @@ export class InitiaClient extends InitiaTask {
   }
 
   async week5Task1() {
-    const l2InitBalance = await this.blackWings.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
-    )
-    const l2UsdcBalance = await this.blackWings.bank.balanceByDenom(
-      this.key.accAddress,
-      'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
-    )
+    const l2UsdcBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2UsdcBalance = await this.blackWings.bank.balanceByDenom(
+          this.key.accAddress,
+          'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
+        )
+        if (info.count < 3 && Number(l2UsdcBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2UsdcBalance
+      })
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.blackWings.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+        )
+        console.log(l2InitBalance.amount)
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+
+    const blackWingsWallet = new Wallet(this.blackWings, this.wallet.key)
 
     if (Number(l2InitBalance.amount) < 1000000) {
       await this.newBridge2BlackWings()
       return `l2Init`
+    } else if (Number(l2InitBalance.amount) > 1500000) {
+      const amount = Number(l2InitBalance.amount) - 1500000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 3500000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":["MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","${bcs
+          .u64()
+          .serialize(amount)
+          .toBase64()}","AVMWDwAAAAAA","${bcs
+          .address()
+          .serialize(this.wallet.key.accAddress)
+          .toBase64()}"]}}}`,
+      )
+      // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":[ "MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=", "jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=", "1rRRAAAAAAA=", "AVMWDwAAAAAA", "AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+      // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":["MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","ATgWDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      const simulate = await this.blackWings.tx.estimateFee(
+        [{ sequenceNumber: await blackWingsWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+          ],
+        },
+      )
+      const signed = await blackWingsWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        await this.blackWings.tx.broadcastAsync(signed)
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
     }
     if (Number(l2UsdcBalance.amount) < 1000000) {
       const usdcL1 = await this.lcd.bank.balanceByDenom(
@@ -101,7 +173,7 @@ export class InitiaClient extends InitiaTask {
         .serialize(this.wallet.key.accAddress)
         .toBase64()}","KYJNlS4DVJD651Z97qXxW1BKaPpzYQBjwWCrH6h91gk=","oIYBAAAAAAA=","CHRyYW5zZmVy","CWNoYW5uZWwtMA==","AAAAAAAAAAA=","AAAAAAAAAAA=","QB1hTqPC2Rc=","AA=="]}}}`,
     )
-    const blackWingsWallet = new Wallet(this.blackWings, this.wallet.key)
+
     const simulate = await this.blackWings.tx.estimateFee(
       [{ sequenceNumber: await blackWingsWallet.sequence() }],
       {
@@ -137,15 +209,81 @@ export class InitiaClient extends InitiaTask {
     // const res = await this.newBridge2BlackWings()
   }
   async week5Task2() {
-    const l2InitBalance = await this.initAi.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
-    )
-    // console.log(l2InitBalance.amount)
+    const l2InitBalance = await polly()
+      .waitAndRetry(5)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.initAi.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+        )
+        console.log(l2InitBalance.amount)
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        } else {
+          return l2InitBalance
+        }
+      })
+
+    const aiWallet = new Wallet(this.initAi, this.wallet.key)
+
     if (Number(l2InitBalance.amount) < 1500000) {
       await this.newBridge2Ai()
       return `l2Init`
+    } else if (Number(l2InitBalance.amount) > 1500000) {
+      const amount = Number(l2InitBalance.amount) - 1500000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 100000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","${bcs
+          .u64()
+          .serialize(amount)
+          .toBase64()}","AVMWDwAAAAAA","${bcs
+          .address()
+          .serialize(this.wallet.key.accAddress)
+          .toBase64()}"]}}}`,
+      )
+      //["MaT2Csca1vMydHLPGphV211CBZwKsp4Wv7byEuusLRw=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AVMWDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      //["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","gJaYAAAAAAA=","ATGVlwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+      const simulate = await this.initAi.tx.estimateFee(
+        [{ sequenceNumber: await aiWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+          ],
+        },
+      )
+      const signed = await aiWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        console.log(await this.initAi.tx.broadcast(signed))
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
     }
+    // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","sdSvAAAAAAA=","AVMWDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+    // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","sdSvAAAAAAA=","ARemrgAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
     const msg = new MsgTransfer(
       'transfer',
       'channel-0',
@@ -167,7 +305,6 @@ export class InitiaClient extends InitiaTask {
     // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","4MgQAAAAAAA=","AZugEAAAAAAA","DgAAAAAAAAA=","AAAAAAAAAAAAAAAAwfIGiv3Te+HINdWz7IkKXwKsGQ4=","AA=="]}}}
     // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","oLsNAAAAAAA=","AceZDQAAAAAA","DgAAAAAAAAA=","AAAAAAAAAAAAAAAAwfIGiv3Te+HINdWz7IkKXwKsGQ4=","AA=="]}}}
 
-    const aiWallet = new Wallet(this.initAi, this.wallet.key)
     const simulate = await this.initAi.tx.estimateFee(
       [{ sequenceNumber: await aiWallet.sequence() }],
       {
@@ -200,14 +337,79 @@ export class InitiaClient extends InitiaTask {
     // const res = await this.newBridge2BlackWings()
   }
   async week5Task5() {
-    const l2InitBalance = await this.civi.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
-    )
-    console.log(l2InitBalance.amount)
+    const l2InitBalance = await polly()
+      .waitAndRetry(5)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.civi.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+        )
+        console.log(l2InitBalance.amount)
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+
+    const civiWallet = new Wallet(this.civi, this.wallet.key)
+
     if (Number(l2InitBalance.amount) < 1500000) {
       await this.newBridge2Civi()
       return `l2Init`
+    } else if (Number(l2InitBalance.amount) > 2000000) {
+      const amount = Number(l2InitBalance.amount) - 2000000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 100000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":[
+        "JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=",
+        "jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=",
+        "${bcs.u64().serialize(amount).toBase64()}",
+          "AVMWDwAAAAAA",
+          "${bcs
+            .address()
+            .serialize(this.wallet.key.accAddress)
+            .toBase64()}"]}}}`,
+      )
+      // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEtMAAAAAAA=","Aa+XSwAAAAAA","BgAAAAAAAAA=","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg=","AA=="]}}}
+      //["JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AewdDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      const simulate = await this.civi.tx.estimateFee(
+        [{ sequenceNumber: await civiWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+          ],
+        },
+      )
+      const signed = await civiWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        await this.civi.tx.broadcastAsync(signed)
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
     }
     const msg = new MsgTransfer(
       'transfer',
@@ -228,9 +430,8 @@ export class InitiaClient extends InitiaTask {
     // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QA0DAAAAAAA=","AUr8AgAAAAAA","BgAAAAAAAAA=","AAAAAAAAAAAAAAAAwfIGiv3Te+HINdWz7IkKXwKsGQ4=","AA=="]}}}
     // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AWrtDgAAAAAA","BgAAAAAAAAA=","AAAAAAAAAAAAAAAAwfIGiv3Te+HINdWz7IkKXwKsGQ4=","AA=="]}}}
 
-    const aiWallet = new Wallet(this.civi, this.wallet.key)
     const simulate = await this.civi.tx.estimateFee(
-      [{ sequenceNumber: await aiWallet.sequence() }],
+      [{ sequenceNumber: await civiWallet.sequence() }],
       {
         msgs: [msg],
         feeDenoms: [
@@ -238,7 +439,7 @@ export class InitiaClient extends InitiaTask {
         ],
       },
     )
-    const signed = await aiWallet.createAndSignTx({
+    const signed = await civiWallet.createAndSignTx({
       msgs: [msg],
       fee: new Fee(
         simulate.gas_limit,
@@ -262,18 +463,93 @@ export class InitiaClient extends InitiaTask {
     // const res = await this.newBridge2BlackWings()
   }
   async week5Task3() {
-    const l2InitBalance = await this.noon.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/ffea49d63cbadcfd749b4f635eca198b2f3b44cb1f6b580f5d201d58f3bf7aea',
-    )
+    const l2UsdcBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2UsdcBalance = await this.noon.bank.balanceByDenom(
+          this.key.accAddress,
+          'ibc/C3E53D20BC7A4CC993B17C7971F8ECD06A433C10B6A96F4C4C3714F0624C56DA',
+        )
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2UsdcBalance
+      })
+
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.noon.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/ffea49d63cbadcfd749b4f635eca198b2f3b44cb1f6b580f5d201d58f3bf7aea',
+        )
+        console.log(l2InitBalance.amount)
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+    const noonWallet = new Wallet(this.noon, this.wallet.key)
+
     if (Number(l2InitBalance.amount) < 1000000) {
       await this.newBridge2Noon()
       return `l2Init`
+    } else if (Number(l2InitBalance.amount) > 1500000) {
+      const amount = Number(l2InitBalance.amount) - 1500000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 100000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":[
+        "PN/ySmqbELsVrt7cVYQkA3UfLHCNKFoEUf2Paq27w5s=",
+        "jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=",
+        "${bcs.u64().serialize(amount).toBase64()}",
+          "AXoWDwAAAAAA",
+          "${bcs
+            .address()
+            .serialize(this.wallet.key.accAddress)
+            .toBase64()}"]}}}`,
+      )
+      //:["PN/ySmqbELsVrt7cVYQkA3UfLHCNKFoEUf2Paq27w5s=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AaATDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      //["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","gJaYAAAAAAA=","ATGVlwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+      const simulate = await this.noon.tx.estimateFee(
+        [{ sequenceNumber: await noonWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+          ],
+        },
+      )
+      const signed = await noonWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        await this.noon.tx.broadcastAsync(signed)
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
     }
-    const l2UsdcBalance = await this.noon.bank.balanceByDenom(
-      this.key.accAddress,
-      'ibc/C3E53D20BC7A4CC993B17C7971F8ECD06A433C10B6A96F4C4C3714F0624C56DA',
-    )
+
     if (Number(l2UsdcBalance.amount) < 100000) {
       const usdcL1 = await this.lcd.bank.balanceByDenom(
         this.key.accAddress,
@@ -321,7 +597,6 @@ export class InitiaClient extends InitiaTask {
     // "wLIeSpLN2Rc=",
     // "AA=="]}}}
 
-    const noonWallet = new Wallet(this.noon, this.wallet.key)
     const simulate = await this.noon.tx.estimateFee(
       [{ sequenceNumber: await noonWallet.sequence() }],
       {
@@ -359,20 +634,92 @@ export class InitiaClient extends InitiaTask {
     // const balance = await this.miniMove.bank.balance(this.key.accAddress)
     //
     // console.log(balance)
+    const miniWallet = new Wallet(this.miniMove, this.wallet.key)
+    const l2UsdcBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2UsdcBalance = await this.miniMove.bank.balanceByDenom(
+          this.key.accAddress,
+          'ibc/0E98D4D1D907597448FD3A7C33DDAE10A90FA86FC8A9F5A0B175393783F249CD',
+        )
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2UsdcBalance
+      })
+
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.miniMove.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+        )
+        console.log(l2InitBalance.amount)
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
 
-    const l2InitBalance = await this.miniMove.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
-    )
     if (Number(l2InitBalance.amount) < 1000000) {
       await this.newBridge2Minimove()
       return `l2Init`
-    }
+    } else if (Number(l2InitBalance.amount) > 1500000) {
+      const amount = Number(l2InitBalance.amount) - 1500000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 100000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":[
+        "lyGI4ysszsVX7tmLvqnUKhptwnDakAmSY2Xet8Sdt90=",
+        "jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=",
+        "${bcs.u64().serialize(amount).toBase64()}",
+          "AXoWDwAAAAAA",
+          "${bcs
+            .address()
+            .serialize(this.wallet.key.accAddress)
+            .toBase64()}"]}}}`,
+      )
+      //["lyGI4ysszsVX7tmLvqnUKhptwnDakAmSY2Xet8Sdt90=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AZEkDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
 
-    const l2UsdcBalance = await this.miniMove.bank.balanceByDenom(
-      this.key.accAddress,
-      'ibc/0E98D4D1D907597448FD3A7C33DDAE10A90FA86FC8A9F5A0B175393783F249CD',
-    )
+      //["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","gJaYAAAAAAA=","ATGVlwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+      const simulate = await this.miniMove.tx.estimateFee(
+        [{ sequenceNumber: await miniWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+          ],
+        },
+      )
+      const signed = await miniWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        await this.miniMove.tx.broadcastAsync(signed)
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
+    }
 
     if (Number(l2UsdcBalance.amount) < 100) {
       const usdcL1 = await this.lcd.bank.balanceByDenom(
@@ -413,7 +760,6 @@ export class InitiaClient extends InitiaTask {
     // "gP4gbcvR2Rc=",
     // "AA=="]}}}
 
-    const miniWallet = new Wallet(this.miniMove, this.wallet.key)
     const simulate = await this.miniMove.tx.estimateFee(
       [{ sequenceNumber: await miniWallet.sequence() }],
       {
@@ -448,18 +794,93 @@ export class InitiaClient extends InitiaTask {
     // const res = await this.newBridge2BlackWings()
   }
   async week5Task6() {
-    const l2InitBalance = await this.tucana.bank.balanceByDenom(
-      this.key.accAddress,
-      'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
-    )
-    const l2UsdcBalance = await this.tucana.bank.balanceByDenom(
-      this.key.accAddress,
-      'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
-    )
+    const l2UsdcBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2UsdcBalance = await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
+        )
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2UsdcBalance
+      })
+
+    const l2InitBalance = await polly()
+      .waitAndRetry(3)
+      .executeForPromise(async info => {
+        const l2InitBalance = await this.tucana.bank.balanceByDenom(
+          this.key.accAddress,
+          'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        )
+        console.log(l2InitBalance.amount)
+
+        if (info.count < 3 && Number(l2InitBalance.amount) === 0) {
+          throw new Error('retry')
+        }
+        return l2InitBalance
+      })
+    const tucanaWallet = new Wallet(this.tucana, this.wallet.key)
 
     if (Number(l2InitBalance.amount) < 1000000) {
       await this.newBridge2Tucana()
       return `l2Init`
+    } else if (Number(l2InitBalance.amount) > 1500000) {
+      const amount = Number(l2InitBalance.amount) - 1500000
+      const msg = new MsgTransfer(
+        'transfer',
+        'channel-0',
+        new Coin(
+          'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+          amount,
+        ),
+        this.key.accAddress,
+        '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a::swap_transfer::minit_swap_to',
+        null, // timeout height
+        ((new Date().valueOf() + 100000) * 1000000).toString(),
+        `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_to","type_args":[],"args":[
+        "le4pSgOtvbtbIFFlG38fbLx7XtjDh57R6L4+aa8OG/U=",
+        "jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=",
+        "${bcs.u64().serialize(amount).toBase64()}",
+          "AXoWDwAAAAAA",
+          "${bcs
+            .address()
+            .serialize(this.wallet.key.accAddress)
+            .toBase64()}"]}}}`,
+      )
+      //["le4pSgOtvbtbIFFlG38fbLx7XtjDh57R6L4+aa8OG/U=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AXMdDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      //:["PN/ySmqbELsVrt7cVYQkA3UfLHCNKFoEUf2Paq27w5s=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AaATDwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+
+      //["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","gJaYAAAAAAA=","ATGVlwAAAAAA","AAAAAAAAAAAAAAAAfwBn58DHXySh7OLySf/MheBSfzg="]}}}
+      const simulate = await this.tucana.tx.estimateFee(
+        [{ sequenceNumber: await tucanaWallet.sequence() }],
+        {
+          msgs: [msg],
+          feeDenoms: [
+            'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+          ],
+        },
+      )
+      const signed = await tucanaWallet.createAndSignTx({
+        msgs: [msg],
+        fee: new Fee(
+          simulate.gas_limit,
+          new Coins([
+            new Coin(
+              'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+              simulate.amount.toArray()[0].amount,
+            ),
+          ]),
+        ),
+      })
+      try {
+        await this.tucana.tx.broadcastAsync(signed)
+        return `transferBack`
+      } catch (e) {
+        return `error`
+      }
     }
     if (Number(l2UsdcBalance.amount) < 1000000) {
       const usdcL1 = await this.lcd.bank.balanceByDenom(
@@ -490,7 +911,6 @@ export class InitiaClient extends InitiaTask {
         .toBase64()}","KYJNlS4DVJD651Z97qXxW1BKaPpzYQBjwWCrH6h91gk=","QEIPAAAAAAA=","CHRyYW5zZmVy","CmNoYW5uZWwtMzE=","AAAAAAAAAAA=","AAAAAAAAAAA=","gORWtgXT2Rc=","AA=="]}}}`,
     )
     //["K2luaXQxYzhlcWR6aGE2ZGE3cmpwNDZrZTdlemcydHVwMmN4Z3dwYXp1c2U=","KYJNlS4DVJD651Z97qXxW1BKaPpzYQBjwWCrH6h91gk=","QEIPAAAAAAA=","CHRyYW5zZmVy","CmNoYW5uZWwtMzE=","AAAAAAAAAAA=","AAAAAAAAAAA=","gORWtgXT2Rc=","AA=="]}}}
-    const tucanaWallet = new Wallet(this.tucana, this.wallet.key)
     const simulate = await this.tucana.tx.estimateFee(
       [{ sequenceNumber: await tucanaWallet.sequence() }],
       {

+ 9 - 8
src/onchain/finalTask.ts

@@ -5,7 +5,7 @@ import { InitiaClient } from '../InitiaClient'
 async function startCheck(concurrency) {
   const accountsRaw = await DBClient.instance.account.findMany({
     where: {
-      status: -4,
+      status: -5,
     },
     orderBy: {
       lastRun: 'desc',
@@ -23,12 +23,13 @@ async function startCheck(concurrency) {
         account.address,
         `move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff`,
       )
-      if (Number(gasGot.amount) < 300000) {
-        await DBClient.instance.account.update({
-          where: { id: account.id },
-          data: { status: -3 },
-          //可能领过还没到账的
-        })
+      if (Number(gasGot.amount) < 3000000) {
+        // await DBClient.instance.account.update({
+        //   where: { id: account.id },
+        //   data: { status: -5 },
+        //   //可能领过还没到账的
+        // })
+        console.log(`balance not enough`)
         return
       }
       // if (!gasGot) {
@@ -60,4 +61,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(20)
+startCheck(10)

+ 39 - 22
src/onchain/gasCollect.ts

@@ -13,40 +13,57 @@ function chunkArray<T>(array: T[], chunkSize: number): T[][] {
 // 使用示例:
 
 async function startCheck(concurrency) {
-  const accountsRaw = await DBClient.instance.account.findMany({
+  const accountsRaw = await DBClient.instance.randomTask2.findMany({
     where: {
-      status: 889,
+      finish: 0,
     },
-    orderBy: {
-      lastRun: 'asc',
+    take: 10000,
+  })
+  const needList = await DBClient.instance.account.findMany({
+    where: {
+      status: -5,
     },
     take: 10000,
   })
-  const chunked = chunkArray(accountsRaw, 4)
-  await forEachAsync(chunked, concurrency, async account => {
+  const canSend = []
+  // console.log(needList[0])
+  let index = 0
+  await forEachAsync(accountsRaw, concurrency, async account => {
     // console.log(`${index}/${accountsRaw.length}: processing ${account.address}`)
     // const account = chunked[0]
-    const toAddress = account[3].address
-    console.log(`toAddress:`, toAddress, concurrency)
     try {
-      for (let i = 0; i < 3; i++) {
-        const client = new InitiaClient(account[i].mnemonic, true)
-        await client.transferAllGas(toAddress)
+      const client = new InitiaClient(account.mnemonic, true)
+      const balances = await client.lcd.bank.balanceByDenom(
+        client.key.accAddress,
+        'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
+      )
+      // console.log(client.key.accAddress, Number(balances.amount))
+      if (Number(balances.amount) > 10000000) {
+        if (index < needList.length) {
+          index++
+          await client.transferGas(needList[index].address, 5000000)
+          console.log(`send to ${needList[index].address}`)
+
+          await DBClient.instance.account.update({
+            where: { id: needList[index].id },
+            data: { status: -4 },
+          })
+        }
       }
-      // const client = new InitiaClient(account.mnemonic, true)
-      // const gasGot = await client.gasGot()
-      // if (!gasGot) {
-      //   console.log(`gas got:`, gasGot)
-      await DBClient.instance.account.updateMany({
-        where: { id: { in: account.map(item => item.id) } },
-        data: { status: 900 },
-        //可能领过还没到账的
-      })
     } catch (e) {
-      console.log(e.response)
+      console.log(e.message)
     }
     //   return
   })
+  // for (let i = 0; i < needList.length; i++) {
+  //   const account = canSend[i]
+  //   const client = new InitiaClient(account.mnemonic, true)
+  //   await client.transferGas(needList[i].address, 5000000)
+  //   await DBClient.instance.account.update({
+  //     where: { id: needList[i].id },
+  //     data: { status: -4 },
+  //   })
+  // }
 }
 
-startCheck(1)
+startCheck(100)

+ 57 - 19
src/onchain/week3/randomWeek3.ts

@@ -7,7 +7,7 @@ async function startCheck(concurrency) {
     where: {
       finish: 0,
     },
-    take: 10000,
+    take: 1,
     orderBy: {
       id: 'asc',
     },
@@ -40,7 +40,10 @@ async function startCheck(concurrency) {
         notDone.push(6)
       }
 
-      console.log(`notDone`, notDone)
+      console.log(
+        `${index}/${accountsRaw.length}: processing ${account.address} notDone`,
+        notDone,
+      )
 
       if (notDone.length === 0) {
         await DBClient.instance.randomTask2.update({
@@ -53,17 +56,24 @@ async function startCheck(concurrency) {
       const randomPick = notDone[Math.floor(Math.random() * notDone.length)]
 
       const client = new InitiaClient(account.mnemonic, true)
-      const gasGot = await client.gasGot()
-      if (!gasGot) {
-        // await DBClient.instance.randomTask2.update({
-        //   where: { id: account.id },
-        //   data: { finish: -1 },
-        // })
-        return
-      }
+      // const gasGot = await client.gasGot()
+      // if (!gasGot) {
+      //   // await DBClient.instance.randomTask2.update({
+      //   //   where: { id: account.id },
+      //   //   data: { finish: -1 },
+      //   // })
+      //   return
+      // }
       if (randomPick === 1) {
-        console.log(`task1`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task1`,
+        )
+
         const bool = await client.week5Task1()
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task1`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -71,8 +81,14 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 2) {
-        console.log(`task2`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task2`,
+        )
         const bool = await client.week5Task2()
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task2`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -80,8 +96,14 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 3) {
-        console.log(`task3`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task3`,
+        )
         const bool = await client.week5Task3()
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task3`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -89,9 +111,14 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 4) {
-        console.log(`task4`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task4`,
+        )
         const bool = await client.week5Task4()
-
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task4`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -99,9 +126,14 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 5) {
-        console.log(`task5`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task5`,
+        )
         const bool = await client.week5Task5()
-
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task5`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -109,8 +141,14 @@ async function startCheck(concurrency) {
           })
         }
       } else if (randomPick === 6) {
-        console.log(`task6`)
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task6`,
+        )
         const bool = await client.week5Task6()
+        console.log(
+          `${index}/${accountsRaw.length}: processing ${account.address},task6`,
+          bool,
+        )
         if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
@@ -130,4 +168,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(50)
+startCheck(1)

+ 40 - 0
src/onchain/week3/task3Balance.ts

@@ -0,0 +1,40 @@
+import { forEachAsync } from '../../utils'
+import { DBClient } from '../../singletons'
+import { InitiaClient } from '../../InitiaClient'
+
+async function startCheck(concurrency) {
+  const accountsRaw = await DBClient.instance.randomTask2.findMany({
+    where: {
+      finish: -1,
+    },
+    take: 10000,
+    orderBy: {
+      id: 'asc',
+    },
+  })
+  await forEachAsync(accountsRaw, concurrency, async (account, index) => {
+    console.log(
+      `${index}/${accountsRaw.length}: processing ${account.address},account id: ${account.id}`,
+    )
+
+    // await faucetAccount(account.address)
+
+    const client = new InitiaClient(account.mnemonic, true)
+    try {
+      const gasGot = await client.gasGot()
+      if (gasGot) {
+        await DBClient.instance.randomTask2.update({
+          where: { id: account.id },
+          data: { finish: 0 },
+        })
+      } else {
+        await DBClient.instance.randomTask2.update({
+          where: { id: account.id },
+          data: { finish: -1 },
+        })
+      }
+    } catch (e) {}
+  })
+}
+
+startCheck(10)

+ 2 - 2
src/swapTester.ts

@@ -13,7 +13,7 @@ const key = new MnemonicKey({
     // 'visual giant rely tooth recall explain vital tunnel snow road airport cake',
     // 'deal earth suggest craft impact vocal outdoor perfect winter nice unhappy lizard',
     // 'pumpkin frog pond gauge cat essay key employ shoulder keen stomach breeze history urge duty drink leisure crash genuine acid describe erosion ugly raise',
-    'amateur useless busy heavy pass payment artist salt enjoy picnic flavor emotion chaos elite ladder cheap enough pole occur giggle twenty meat brick violin',
+    'neutral flight plug goddess marble champion message bottom gentle guilt ketchup way guide obey nominee panda sleep meadow scene sea fine cause upgrade only',
 })
 console.log('mnemonic:', key.mnemonic)
 // mnemonic: beauty sniff protect...
@@ -47,7 +47,7 @@ async function main() {
   // console.log(a)
   // await client.transferGas('init1yq7erc0hmemy7exhycdqx8j05jj46g0hgycw5g', 0.2)
   // await client.mintPart()
-  const res = await client.week5Task5()
+  const res = await client.week5Task2()
   // const res = ((new Date().valueOf() + 1500000) * 1000000).toString()
   console.log(res)
   // console.log(`1718639224520000000`)

+ 0 - 1
src/test.ts

@@ -1,4 +1,3 @@
-
 import { AccAddress, MnemonicKey, RawKey } from '@initia/initia.js'
 import { InitiaClient } from './InitiaClient'
 import polly from 'polly-js'

+ 1 - 1
src/utils/index.ts

@@ -66,7 +66,7 @@ export async function forEachAsync<T = any>(
   array: T[],
   concurrency: number,
   asyncFn: (item: any, index: number) => Promise<void>,
-  timeout: number = 240000,
+  timeout: number = 200000,
 ) {
   let running = 0 // 当前正在运行的任务数
   let completed = 0 // 完成的任务数

+ 4 - 4
yarn.lock

@@ -1030,10 +1030,10 @@
   dependencies:
     browser-headers "^0.4.1"
 
-"@initia/initia.js@0.2.5":
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/@initia/initia.js/-/initia.js-0.2.5.tgz#a96901ce89ad319c67d7c5d3273563dbddaac922"
-  integrity sha512-smK0h2MlroXJQCY8yR73bUKuIU3WRnB3vPzbIDnCQKZHcqIZ5A8Sl/qz6LQX9cWeAlvuyDYnFDyd+UgSqLOYqg==
+"@initia/initia.js@0.2.7":
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/@initia/initia.js/-/initia.js-0.2.7.tgz#62a58c1137b1e1dc6a824d7654c7d44754d09047"
+  integrity sha512-fQ8tKkpcPwXVU0G32vqUcR9UwSqXYjNx3Y7v4sXNkpavgNrDtDnQBCByq+gUNwD+291SoCp584EOJTRYuZ1lNA==
   dependencies:
     "@initia/initia.proto" "^0.2.0"
     "@initia/opinit.proto" "^0.0.8"