hel 1 năm trước cách đây
mục cha
commit
af489d2a0d

+ 2 - 0
package.json

@@ -45,7 +45,9 @@
     "generateRandomW2": "yarn build && node build/src/onchain/week2/generateRandomW2.js",
     "runWeek2": "yarn build && node build/src/onchain/week2/randomWeek2.js",
     "runWeek3": "yarn build && node build/src/onchain/week3/randomWeek3.js",
+    "resetWeek3": "yarn build && node build/src/onchain/week3/task3Reset.js",
     "task3check": "yarn build && node build/src/onchain/week3/task3check.js",
+    "task3cut": "yarn build && node build/src/onchain/week3/task3Cut.js",
     "task3Balance": "yarn build && node build/src/onchain/week3/task3Balance.js",
     "runWeek2Task2": "yarn build && node build/src/onchain/week2/week2task2.js",
     "randomTask": "yarn build && node build/src/onchain/randomTask.js",

+ 160 - 20
src/BaseClient.ts

@@ -29,7 +29,10 @@ export abstract class BaseClient {
   lcd: LCDClient
   tucana: LCDClient
   initAi: LCDClient
+  civi: LCDClient
   blackWings: LCDClient
+  noon: LCDClient
+  miniMove: LCDClient
   wallet: Wallet
   tucanaWallet: Wallet
   rpcUrlUsing: string
@@ -75,6 +78,17 @@ export abstract class BaseClient {
       useProxy ? requester : null,
     )
 
+    this.noon = new LCDClient(
+      'https://burrito-1-lcd.lunchlunch.xyz/',
+      { chainId: 'burrito-1' },
+      useProxy ? requester : null,
+    )
+    this.miniMove = new LCDClient(
+      'https://lcd.minimove-1.initia.xyz/',
+      { chainId: 'minimove-1' },
+      useProxy ? requester : null,
+    )
+
     this.tucana = new LCDClient(
       'https://maze-rest-c9796789-107d-49ab-b6de-059724d2a91d.ue1-prod.newmetric.xyz/',
       {
@@ -82,17 +96,24 @@ export abstract class BaseClient {
       },
       useProxy ? requester : null,
     )
+    this.civi = new LCDClient(
+      'https://maze-rest-sequencer-beab9b6f-d96d-435e-9caf-5679296d8172.ue1-prod.newmetric.xyz',
+      {
+        chainId: 'landlord-1',
+      },
+      useProxy ? requester : null,
+    )
     this.blackWings = new LCDClient(
-      'https://maze-rest-18bdff44-3aa4-425e-9bc0-06a2afa40af8.ue1-prod.newmetric.xyz/',
+      'https://maze-rest-18bdff44-3aa4-425e-9bc0-06a2afa40af8.ue1-prod.newmetric.xyz',
       {
-        chainId: 'birdee-1',
+        chainId: 'tomcat-1',
       },
       useProxy ? requester : null,
     )
     this.initAi = new LCDClient(
       'https://maze-rest-617bacff-7d34-4eb8-87f4-ee16fb4e0ac7.ue1-prod.newmetric.xyz/',
       {
-        chainId: 'birdee-1',
+        chainId: 'init-ai-1',
       },
       useProxy ? requester : null,
     )
@@ -101,26 +122,47 @@ export abstract class BaseClient {
   }
 
   async broadcast(msg: Msg | Msg[]) {
-    const randLimit = 160000 + Math.floor(Math.random() * 10000)
+    // const randLimit = 160000 + Math.floor(Math.random() * 10000)
+
+    const simulate = await this.lcd.tx.estimateFee(
+      [{ sequenceNumber: await this.wallet.sequence() }],
+      {
+        msgs: Array.isArray(msg) ? msg : [msg],
+      },
+    )
+    // console.log('simulate', simulate)
+    // console.log('simulate2', simulate.amount.toArray()[0].amount)
     const signed = await this.wallet.createAndSignTx({
       msgs: Array.isArray(msg) ? msg : [msg],
       fee: new Fee(
-        randLimit,
+        simulate.gas_limit,
         new Coins([
           new Coin(
             'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
-            randLimit / 2,
+            simulate.amount.toArray()[0].amount,
           ),
         ]),
       ),
     })
+    // return `1`
+    // const signed2 = await this.wallet.createAndSignTx({
+    //   msgs: Array.isArray(msg) ? msg : [msg],
+    //   fee: new Fee(
+    //     Math.floor(Number(simulate) * 1.1),
+    //     new Coins([
+    //       new Coin(
+    //         'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
+    //         Math.floor(Number(simulate) * 1.05),
+    //       ),
+    //     ]),
+    //   ),
+    // })
     const broadcast = await this.lcd.tx.broadcastAsync(signed)
-    // console.log(broadcast.raw_log)
-    // console.log(this.key.accAddress)
     return broadcast.txhash
-    // console.log(broadcast)
   }
-
+  randomAmount(min: number, max: number) {
+    return Math.floor(Math.random() * (max - min) + min)
+  }
   async checkBalance() {
     const balances = await this.lcd.bank.balance(this.key.accAddress)
     return balances[0].toArray()
@@ -152,13 +194,11 @@ export abstract class BaseClient {
   }
 
   async gasGot() {
-    const balances = await this.axiosBalance()
-    const gas = balances.filter(
-      token =>
-        token.denom ===
-        'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
+    const balances = await this.lcd.bank.balanceByDenom(
+      this.key.accAddress,
+      'move/944f8dd8dc49f96c25fea9849f16436dcfa6d564eec802f3ef7f8b3ea85368ff',
     )
-    return Number(gas.length) > 0
+    return Number(balances.amount) > 5000000
   }
 
   async funded() {
@@ -173,10 +213,44 @@ export abstract class BaseClient {
     return tuc.amount
   }
 
+  async needBlackWingsInit() {
+    const balances = await this.blackWings.bank.balance(this.key.accAddress)
+    const blackWings = balances[0]
+      .toArray()
+      .filter(
+        token =>
+          token.denom ===
+          'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+      )[0]
+    return Number(blackWings.amount) < 1000000
+  }
+
+  async checkBlackWingsBalance() {
+    try {
+      const balances = await this.blackWings.bank.balance(this.key.accAddress)
+      return balances[0].toArray()
+    } catch (e) {
+      throw new Error('..')
+    }
+  }
+  async checkAiBalance() {
+    try {
+      const balances = await this.initAi.bank.balance(this.key.accAddress)
+      return balances[0].toArray()
+    } catch (e) {
+      throw new Error('..')
+    }
+  }
+
   async checkUsdcSwaped() {
     const tokens = await this.checkBalance()
-    const usdc = tokens.filter(token => token.denom === 'uusdc')[0]
-    return !!usdc
+    try {
+      const usdc = tokens.filter(token => token.denom === 'uusdc')[0]
+      return Number(usdc.amount) > 2000000
+    } catch (e) {
+      console.log(`error`)
+      throw new Error('..')
+    }
   }
   async checkTiaSwaped() {
     const tokens = await this.checkBalance()
@@ -378,12 +452,65 @@ export abstract class BaseClient {
     console.log(broadcast)
   }
 
+  async newBridgeUsdc2BlackWings() {
+    const random = this.randomAmount(1000000, 1000000 * 3)
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-13',
+      new Coin('uusdc', random),
+      this.key.accAddress,
+      this.key.accAddress,
+      null, // timeout height
+      ((new Date().valueOf() + 100000) * 1000000).toString(),
+    )
+    return await this.broadcast(msg)
+  }
+  async newBridgeUsdc2Tucana() {
+    const random = this.randomAmount(1000000, 1500000)
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-25',
+      new Coin('uusdc', random),
+      this.key.accAddress,
+      this.key.accAddress,
+      null, // timeout height
+      ((new Date().valueOf() + 100000) * 1000000).toString(),
+    )
+    return await this.broadcast(msg)
+  }
+  async newBridgeTia2Noon() {
+    const random = this.randomAmount(100000, 150000)
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-31',
+      new Coin('utia', random),
+      this.key.accAddress,
+      this.key.accAddress,
+      null, // timeout height
+      ((new Date().valueOf() + 100000) * 1000000).toString(),
+    )
+    return await this.broadcast(msg)
+  }
+  async newBridgeEth2MiniMove() {
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin('ueth', 100),
+      this.key.accAddress,
+      this.key.accAddress,
+      null, // timeout height
+      ((new Date().valueOf() + 100000) * 1000000).toString(),
+    )
+    return await this.broadcast(msg)
+  }
+
   async newBridge2BlackWings() {
+    const random = this.randomAmount(1000000, 1000000 * 4)
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,
       8,
       this.key.accAddress,
-      new Coin('uinit', 1000000),
+      new Coin('uinit', random),
     )
     return await this.broadcast(msg)
   }
@@ -397,11 +524,24 @@ export abstract class BaseClient {
     return await this.broadcast(msg)
   }
   async newBridge2Ai() {
+    const random = this.randomAmount(1500000, 1000000 * 3)
+
     const msg = new MsgInitiateTokenDeposit(
       this.key.accAddress,
       6,
       this.key.accAddress,
-      new Coin('uinit', 1000000),
+      new Coin('uinit', random),
+    )
+    return await this.broadcast(msg)
+  }
+  async newBridge2Civi() {
+    const random = this.randomAmount(1500000, 1000000 * 3)
+
+    const msg = new MsgInitiateTokenDeposit(
+      this.key.accAddress,
+      24,
+      this.key.accAddress,
+      new Coin('uinit', random),
     )
     return await this.broadcast(msg)
   }

+ 478 - 2
src/InitiaClient.ts

@@ -1,5 +1,14 @@
 import { InitiaTask } from './InitiaTask'
-import { Coin, MsgSend } from '@initia/initia.js'
+import {
+  bcs,
+  Coin,
+  Coins,
+  Fee,
+  Msg,
+  MsgSend,
+  MsgTransfer,
+  Wallet,
+} from '@initia/initia.js'
 
 export class InitiaClient extends InitiaTask {
   constructor(mnemonic: string, useProxy: boolean = false) {
@@ -36,7 +45,7 @@ export class InitiaClient extends InitiaTask {
       // sequence: 3,
       msgs: [msg],
     })
-    const broadcast = await this.lcd.tx.broadcast(signed)
+    const broadcast = await this.lcd.tx.broadcastAsync(signed)
     return broadcast.txhash
   }
 
@@ -49,4 +58,471 @@ export class InitiaClient extends InitiaTask {
       return await this.transfer(toAddr, 1)
     }
   }
+
+  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',
+    )
+
+    if (Number(l2InitBalance.amount) < 1000000) {
+      await this.newBridge2BlackWings()
+      return `l2Init`
+    }
+    if (Number(l2UsdcBalance.amount) < 1000000) {
+      const usdcL1 = await this.lcd.bank.balanceByDenom(
+        this.key.accAddress,
+        'uusdc',
+      )
+      if (Number(usdcL1.amount) < 1500000) {
+        await this.swapScript()
+        return `usdcL1`
+      }
+      await this.newBridgeUsdc2BlackWings()
+      return `l2Usdc`
+    }
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
+        '1000000',
+      ),
+      this.wallet.key.accAddress,
+      '0x1::cosmos::transfer',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x1","module_name":"cosmos","function_name":"transfer","type_args":[],"args":["${bcs
+        .string()
+        .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() }],
+      {
+        msgs: [msg],
+        feeDenoms: [
+          'l2/aee375e9d0b181f0d9d3a49f9a3d1d6b05d62b0ac81f8c92b9282afa4213d884',
+        ],
+      },
+    )
+    // console.log(simulate)
+    // return false
+    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 {
+      const broadcast = await this.blackWings.tx.broadcastAsync(signed)
+      console.log(broadcast)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // const res = await this.newBridge2BlackWings()
+  }
+  async week5Task2() {
+    const l2InitBalance = await this.initAi.bank.balanceByDenom(
+      this.key.accAddress,
+      'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+    )
+    // console.log(l2InitBalance.amount)
+    if (Number(l2InitBalance.amount) < 1500000) {
+      await this.newBridge2Ai()
+      return `l2Init`
+    }
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'l2/aadf1a9da6a38b7e7e11839364ee42002260eff1657f403b9ce608337bcb986b',
+        '1000000',
+      ),
+      this.wallet.key.accAddress,
+      '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AceZDQAAAAAA","DgAAAAAAAAA=","${bcs
+        .address()
+        .serialize(this.wallet.key.accAddress)
+        .toBase64()}","AA=="]}}}`,
+    )
+    //{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["2+lWb+7Xy+Fy4RJ3INn8xwr0QQlVvARSifYjl59C9Bc=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AbceDwAAAAAA","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=","oIYBAAAAAAA=","AQqDAQAAAAAA","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=","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() }],
+      {
+        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 {
+      const broadcast = await this.initAi.tx.broadcastAsync(signed)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // const res = await this.newBridge2BlackWings()
+  }
+  async week5Task5() {
+    const l2InitBalance = await this.civi.bank.balanceByDenom(
+      this.key.accAddress,
+      'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+    )
+    console.log(l2InitBalance.amount)
+    if (Number(l2InitBalance.amount) < 1500000) {
+      await this.newBridge2Civi()
+      return `l2Init`
+    }
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+        '1000000',
+      ),
+      this.wallet.key.accAddress,
+      '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"minit_swap_deposit","type_args":[],"args":["JjnYP0/zx59/+jgNkDxgaXtMMsnK+o/d4vH3JyELlSQ=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AceZDQAAAAAA","BgAAAAAAAAA=","${bcs
+        .address()
+        .serialize(this.wallet.key.accAddress)
+        .toBase64()}","AA=="]}}}`,
+    )
+    // {"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() }],
+      {
+        msgs: [msg],
+        feeDenoms: [
+          'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+        ],
+      },
+    )
+    const signed = await aiWallet.createAndSignTx({
+      msgs: [msg],
+      fee: new Fee(
+        simulate.gas_limit,
+        new Coins([
+          new Coin(
+            'l2/afaa3f4e1717c75712f8e8073e41f051a4e516cd25daa82d948c4729388edefd',
+            simulate.amount.toArray()[0].amount,
+          ),
+        ]),
+      ),
+    })
+    try {
+      const broadcast = await this.civi.tx.broadcastAsync(signed)
+      console.log(broadcast)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // const res = await this.newBridge2BlackWings()
+  }
+  async week5Task3() {
+    const l2InitBalance = await this.noon.bank.balanceByDenom(
+      this.key.accAddress,
+      'l2/ffea49d63cbadcfd749b4f635eca198b2f3b44cb1f6b580f5d201d58f3bf7aea',
+    )
+    if (Number(l2InitBalance.amount) < 1000000) {
+      await this.newBridge2Noon()
+      return `l2Init`
+    }
+    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,
+        'utia',
+      )
+      if (Number(usdcL1.amount) < 100000) {
+        await this.swapTiaScript()
+        return `usdcL1`
+      }
+      await this.newBridgeTia2Noon()
+      return `l2Usdc`
+    }
+
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'ibc/C3E53D20BC7A4CC993B17C7971F8ECD06A433C10B6A96F4C4C3714F0624C56DA',
+        '100000',
+      ),
+      this.wallet.key.accAddress,
+      '0x1::cosmos::transfer',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x1","module_name":"cosmos","function_name":"transfer","type_args":[],"args":["${bcs
+        .string()
+        .serialize(this.wallet.key.accAddress)
+        .toBase64()}",
+        "rM6zskU5Kv4INGt5TPXE/4Xn6ajIL8r1ESrp1kulfMs=",
+        "oIYBAAAAAAA=",
+        "CHRyYW5zZmVy",
+        "CWNoYW5uZWwtMg==",
+        "AAAAAAAAAAA=",
+        "AAAAAAAAAAA=",
+        "wLIeSpLN2Rc=",
+        "AA=="]}}}`,
+    )
+    //"args":["K2luaXQxYzhlcWR6aGE2ZGE3cmpwNDZrZTdlemcydHVwMmN4Z3dwYXp1c2U=",
+    // "rM6zskU5Kv4INGt5TPXE/4Xn6ajIL8r1ESrp1kulfMs=",
+    // "oIYBAAAAAAA=",
+    // "CHRyYW5zZmVy",
+    // "CWNoYW5uZWwtMg==",
+    // "AAAAAAAAAAA=",
+    // "AAAAAAAAAAA=",
+    // "wLIeSpLN2Rc=",
+    // "AA=="]}}}
+
+    const noonWallet = new Wallet(this.noon, this.wallet.key)
+    const simulate = await this.noon.tx.estimateFee(
+      [{ sequenceNumber: await noonWallet.sequence() }],
+      {
+        msgs: [msg],
+        feeDenoms: [
+          'l2/ffea49d63cbadcfd749b4f635eca198b2f3b44cb1f6b580f5d201d58f3bf7aea',
+        ],
+      },
+    )
+    // // console.log(simulate)
+    // // return false
+    const signed = await noonWallet.createAndSignTx({
+      msgs: [msg],
+      fee: new Fee(
+        simulate.gas_limit,
+        new Coins([
+          new Coin(
+            'l2/ffea49d63cbadcfd749b4f635eca198b2f3b44cb1f6b580f5d201d58f3bf7aea',
+            simulate.amount.toArray()[0].amount,
+          ),
+        ]),
+      ),
+    })
+    try {
+      const broadcast = await this.noon.tx.broadcastAsync(signed)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // const res = await this.newBridge2BlackWings()
+  }
+  async week5Task4() {
+    // const balance = await this.miniMove.bank.balance(this.key.accAddress)
+    //
+    // console.log(balance)
+
+    const l2InitBalance = await this.miniMove.bank.balanceByDenom(
+      this.key.accAddress,
+      'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+    )
+    if (Number(l2InitBalance.amount) < 1000000) {
+      await this.newBridge2Minimove()
+      return `l2Init`
+    }
+
+    const l2UsdcBalance = await this.miniMove.bank.balanceByDenom(
+      this.key.accAddress,
+      'ibc/0E98D4D1D907597448FD3A7C33DDAE10A90FA86FC8A9F5A0B175393783F249CD',
+    )
+
+    if (Number(l2UsdcBalance.amount) < 100) {
+      const usdcL1 = await this.lcd.bank.balanceByDenom(
+        this.key.accAddress,
+        'ueth',
+      )
+      if (Number(usdcL1.amount) < 100) {
+        await this.swapEthScript()
+        return `usdcL1`
+      }
+      await this.newBridgeEth2MiniMove()
+      return `l2Usdc`
+    }
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'ibc/0E98D4D1D907597448FD3A7C33DDAE10A90FA86FC8A9F5A0B175393783F249CD',
+        '100',
+      ),
+      this.wallet.key.accAddress,
+      '0x1::cosmos::transfer',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x1","module_name":"cosmos","function_name":"transfer","type_args":[],"args":["${bcs
+        .string()
+        .serialize(this.wallet.key.accAddress)
+        .toBase64()}","vg74SeQlyomDDB/w+YT1sLUStwyralrilMYlXD7kzQw=","ZAAAAAAAAAA=","CHRyYW5zZmVy","CmNoYW5uZWwtMTM=","AAAAAAAAAAA=","AAAAAAAAAAA=","gP4gbcvR2Rc=","AA=="]}}}`,
+    )
+
+    //["K2luaXQxYzhlcWR6aGE2ZGE3cmpwNDZrZTdlemcydHVwMmN4Z3dwYXp1c2U=",
+    // "vg74SeQlyomDDB/w+YT1sLUStwyralrilMYlXD7kzQw=",
+    // "ZAAAAAAAAAA=",
+    // "CHRyYW5zZmVy",
+    // "CmNoYW5uZWwtMTM=",
+    // "AAAAAAAAAAA=",
+    // "AAAAAAAAAAA=",
+    // "gP4gbcvR2Rc=",
+    // "AA=="]}}}
+
+    const miniWallet = new Wallet(this.miniMove, this.wallet.key)
+    const simulate = await this.miniMove.tx.estimateFee(
+      [{ sequenceNumber: await miniWallet.sequence() }],
+      {
+        msgs: [msg],
+        feeDenoms: [
+          'l2/771d639f30fbe45e3fbca954ffbe2fcc26f915f5513c67a4a2d0bc1d635bdefd',
+        ],
+      },
+    )
+    // // console.log(simulate)
+    // // return false
+    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 {
+      const broadcast = await this.miniMove.tx.broadcastAsync(signed)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // 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',
+    )
+
+    if (Number(l2InitBalance.amount) < 1000000) {
+      await this.newBridge2Tucana()
+      return `l2Init`
+    }
+    if (Number(l2UsdcBalance.amount) < 1000000) {
+      const usdcL1 = await this.lcd.bank.balanceByDenom(
+        this.key.accAddress,
+        'uusdc',
+      )
+      if (Number(usdcL1.amount) < 1500000) {
+        await this.swapScript()
+        return `usdcL1`
+      }
+      await this.newBridgeUsdc2Tucana()
+      return `l2Usdc`
+    }
+    const msg = new MsgTransfer(
+      'transfer',
+      'channel-0',
+      new Coin(
+        'ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5',
+        '1000000',
+      ),
+      this.wallet.key.accAddress,
+      '0x1::cosmos::transfer',
+      null,
+      ((new Date().valueOf() + 3500000) * 1000000).toString(),
+      `{"move":{"message":{"module_address":"0x1","module_name":"cosmos","function_name":"transfer","type_args":[],"args":["${bcs
+        .string()
+        .serialize(this.wallet.key.accAddress)
+        .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() }],
+      {
+        msgs: [msg],
+        feeDenoms: [
+          'l2/333f8e6ae6855338f99d451126bfefc1b920763c16681d55fbc7df68ccb36972',
+        ],
+      },
+    )
+    // console.log(simulate)
+    // return false
+    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 {
+      const broadcast = await this.tucana.tx.broadcastAsync(signed)
+      console.log(broadcast)
+      return `done`
+    } catch (e) {
+      console.log(e)
+      return `error`
+    }
+
+    // const res = await this.newBridge2BlackWings()
+  }
 }

+ 27 - 20
src/InitiaTask.ts

@@ -14,16 +14,27 @@ export abstract class InitiaTask extends JennieModule {
     super(mnemonic, useProxy)
   }
 
-  randomAmount(min: number, max: number) {
-    return Math.floor(Math.random() * (max - min) + min)
-  }
   //done
+
   async swapScript() {
-    const swaped = await this.checkUsdcSwaped()
-    if (swaped) {
-      console.log(`swaped`)
-      return `done`
-    }
+    // const swaped = await this.checkUsdcSwaped()
+    // if (swaped) {
+    //   console.log(`swaped`)
+    //   return `done`
+    // }
+    // ;[
+    //   '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=',
+    //   'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+    //   'QEtMAAAAAAA=',
+    //   'AbThSwAAAAAA',
+    // ]
+
+    // const amount = bcs
+    //   .u64() // type
+    //   .parse(Uint8Array.from(Buffer.from('QEtMAAAAAAA=', 'base64')))
+    // console.log(amount)
+    // return `done`
+    const randomNum = this.randomAmount(5000000, 5000000 * 2)
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x1',
@@ -33,7 +44,7 @@ export abstract class InitiaTask extends JennieModule {
       [
         '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=', //liquidityTOken
         'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=', //offerCoin
-        'QEIPAAAAAAA=', //offerAmount
+        bcs.u64().serialize(randomNum).toBase64(), //offerAmount
         bcs
           .option(bcs.u64())
           .serialize(this.randomAmount(1000, 2000))
@@ -43,12 +54,8 @@ export abstract class InitiaTask extends JennieModule {
     return await this.broadcast(msg)
   }
   async swapTiaScript() {
-    const swaped = await this.checkTiaSwaped()
-    if (swaped) {
-      console.log(`swaped`)
-      return `done`
-    }
     //["sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AaY5AQAAAAAA"]
+    const randomNum = this.randomAmount(5000000, 10000000)
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x1',
@@ -58,7 +65,7 @@ export abstract class InitiaTask extends JennieModule {
       [
         'sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=', //liquidityTOken
         'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=', //offerCoin
-        'QEIPAAAAAAA=', //offerAmount
+        bcs.u64().serialize(randomNum).toBase64(), //offerAmount
         bcs
           .option(bcs.u64())
           .serialize(this.randomAmount(1000, 2000))
@@ -68,11 +75,11 @@ export abstract class InitiaTask extends JennieModule {
     return await this.broadcast(msg)
   }
   async swapEthScript() {
-    const swaped = await this.checkEthSwaped()
-    if (swaped) {
-      console.log(`swaped`)
-      return `done`
-    }
+    // const swaped = await this.checkEthSwaped()
+    // if (swaped) {
+    //   console.log(`swaped`)
+    //   return `done`
+    // }
     // ["orDTyOU+N57eMfOjYf8CcW1Q7FPGtluMSKgdWwZUggA=","jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=","QEIPAAAAAAA=","AeYAAAAAAAAA"]
     const msg = new MsgExecute(
       this.key.accAddress,

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

@@ -7,7 +7,10 @@ async function startCheck(concurrency) {
     where: {
       finish: 0,
     },
-    take: 40000,
+    take: 1,
+    orderBy: {
+      id: 'asc',
+    },
   })
   await forEachAsync(accountsRaw, concurrency, async (account, index) => {
     console.log(
@@ -52,6 +55,7 @@ async function startCheck(concurrency) {
       const client = new InitiaClient(account.mnemonic, true)
       const gasGot = await client.gasGot()
       if (!gasGot) {
+        console.log()
         await DBClient.instance.randomTask2.update({
           where: { id: account.id },
           data: { finish: -1 },
@@ -60,8 +64,8 @@ async function startCheck(concurrency) {
       }
       if (randomPick === 1) {
         console.log(`task1`)
-        const bool = await client.newBridge2BlackWings()
-        if (bool) {
+        const bool = await client.week5Task1()
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task1: 1 },
@@ -69,8 +73,8 @@ async function startCheck(concurrency) {
         }
       } else if (randomPick === 2) {
         console.log(`task2`)
-        const bool = await client.newBridge2Noon()
-        if (bool) {
+        const bool = await client.week5Task2()
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task2: 1 },
@@ -78,8 +82,8 @@ async function startCheck(concurrency) {
         }
       } else if (randomPick === 3) {
         console.log(`task3`)
-        const bool = await client.newBridge2Tucana()
-        if (bool) {
+        const bool = await client.week5Task3()
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task3: 1 },
@@ -87,9 +91,9 @@ async function startCheck(concurrency) {
         }
       } else if (randomPick === 4) {
         console.log(`task4`)
-        const bool = await client.newBridge2Ai()
+        const bool = await client.week5Task4()
 
-        if (bool) {
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task4: 1 },
@@ -97,10 +101,10 @@ async function startCheck(concurrency) {
         }
       } else if (randomPick === 5) {
         console.log(`task5`)
-        const bool = await client.newBridge2Minimove()
+        const bool = await client.week5Task5()
 
-        console.log(bool)
-        if (bool) {
+        console.log(bool === `done`)
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task5: 1 },
@@ -108,8 +112,8 @@ async function startCheck(concurrency) {
         }
       } else if (randomPick === 6) {
         console.log(`task6`)
-        const bool = await client.newBridge2Miniwasm()
-        if (bool) {
+        const bool = await client.week5Task6()
+        if (bool === `done`) {
           await DBClient.instance.randomTask2.update({
             where: { id: account.id },
             data: { task6: 1 },
@@ -118,6 +122,7 @@ async function startCheck(concurrency) {
       }
     } catch (e) {
       console.log(e.message)
+      // process.exit(0)
       return
       // await DBClient.instance.account.update({
       //   where: { id: account.id },
@@ -127,4 +132,4 @@ async function startCheck(concurrency) {
   })
 }
 
-startCheck(100)
+startCheck(10)

+ 37 - 0
src/onchain/week3/task3Cut.ts

@@ -0,0 +1,37 @@
+import { forEachAsync } from '../../utils'
+import { DBClient } from '../../singletons'
+
+async function startCheck(concurrency) {
+  const accountsRaw = await DBClient.instance.account.findMany({
+    where: {
+      status: {
+        in: [2, 3],
+      },
+    },
+    take: 40000,
+  })
+  await forEachAsync(accountsRaw, concurrency, async (account, index) => {
+    console.log(
+      `${index}/${accountsRaw.length}: processing ${account.address},account id: ${account.id}`,
+    )
+    try {
+      const data = {
+        mnemonic: account.mnemonic,
+        address: account.address,
+        toAddress: account.address,
+        task1: 0,
+        task2: 0,
+        task3: 0,
+        task4: 0,
+        task5: 0,
+        task6: 0,
+        finish: 0,
+      }
+      await DBClient.instance.randomTask2.create({
+        data,
+      })
+    } catch (e) {}
+  })
+}
+
+startCheck(300)

+ 33 - 0
src/onchain/week3/task3Reset.ts

@@ -0,0 +1,33 @@
+import { forEachAsync } from '../../utils'
+import { DBClient } from '../../singletons'
+
+async function startCheck(concurrency) {
+  const accountsRaw = await DBClient.instance.randomTask2.findMany({
+    where: {
+      finish: 1,
+    },
+    take: 40000,
+  })
+  await forEachAsync(accountsRaw, concurrency, async (account, index) => {
+    console.log(
+      `${index}/${accountsRaw.length}: processing ${account.address},account id: ${account.id}`,
+    )
+    try {
+      const data = {
+        task1: 0,
+        task2: 0,
+        task3: 0,
+        task4: 0,
+        task5: 0,
+        task6: 0,
+        finish: 0,
+      }
+      await DBClient.instance.randomTask2.update({
+        where: { id: account.id },
+        data,
+      })
+    } catch (e) {}
+  })
+}
+
+startCheck(300)

+ 8 - 3
src/swapTester.ts

@@ -12,8 +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',
-    'language tooth rug border arm essence badge rough ahead unaware bag night stay auto spawn february odor equip hub demand three setup used sentence',
-  // 'grass spawn flavor cancel borrow only furnace must planet they hub mask dignity rotate report bubble nurse renew ten eagle purity mass dial fever',
+    // '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',
 })
 console.log('mnemonic:', key.mnemonic)
 // mnemonic: beauty sniff protect...
@@ -45,8 +45,13 @@ async function main() {
   // await client.drawFood()
   // const a = await client.newBridge2Miniwasm()
   // console.log(a)
-  await client.transferGas('init1yq7erc0hmemy7exhycdqx8j05jj46g0hgycw5g', 0.2)
+  // await client.transferGas('init1yq7erc0hmemy7exhycdqx8j05jj46g0hgycw5g', 0.2)
   // await client.mintPart()
+  const res = await client.week5Task5()
+  // const res = ((new Date().valueOf() + 1500000) * 1000000).toString()
+  console.log(res)
+  // console.log(`1718639224520000000`)
+  // 1718638714100000000
 }
 const target = '0x76622C9877947A6EEBaBba6898FAf6C57Ea2dfC8'