hel пре 1 година
родитељ
комит
2b40cafc67
9 измењених фајлова са 344 додато и 45 уклоњено
  1. 2 1
      package.json
  2. 50 5
      src/BaseClient.ts
  3. 0 8
      src/InitiaClient.ts
  4. 48 13
      src/InitiaTask.ts
  5. 106 1
      src/JennieModule.ts
  6. 105 0
      src/decodeFunction.ts
  7. 10 0
      src/interface.ts
  8. 17 16
      src/swapTester.ts
  9. 6 1
      src/utils/index.ts

+ 2 - 1
package.json

@@ -30,7 +30,8 @@
     "build:release": "npm run clean && tsc -p tsconfig.release.json && tsc-alias",
     "lint": "eslint . --ext .ts --ext .mts",
     "prettier": "prettier --config .prettierrc --write .",
-    "test": "yarn build && node build/src/swapTester.js"
+    "test": "yarn build && node build/src/swapTester.js",
+    "decode": "yarn build && node build/src/decodeFunction.js"
   },
   "license": "Apache-2.0",
   "dependencies": {

+ 50 - 5
src/BaseClient.ts

@@ -1,17 +1,30 @@
-import { LCDClient, MnemonicKey, Msg, Wallet } from '@initia/initia.js'
+import {
+  APIRequester,
+  bcs,
+  LCDClient,
+  MnemonicKey,
+  Msg,
+  Wallet,
+} from '@initia/initia.js'
+import { getProxyUrl } from './utils'
 
 export abstract class BaseClient {
   key: MnemonicKey
   lcd: LCDClient
   wallet: Wallet
-  protected constructor(mnemonic: string) {
+  protected constructor(mnemonic: string, useProxy: boolean = false) {
     this.key = new MnemonicKey({
       mnemonic: mnemonic,
     })
 
-    this.lcd = new LCDClient('https://api-initia-testnet.whispernode.com/', {
-      chainId: 'initiation-1',
-    })
+    const requester = new APIRequester(getProxyUrl())
+    this.lcd = new LCDClient(
+      'https://api-initia-testnet.whispernode.com/',
+      {
+        chainId: 'initiation-1',
+      },
+      useProxy ? requester : null,
+    )
 
     this.wallet = new Wallet(this.lcd, this.key)
   }
@@ -23,4 +36,36 @@ export abstract class BaseClient {
     const broadcast = await this.lcd.tx.broadcast(signed)
     console.log(broadcast)
   }
+
+  async checkBalance() {
+    const balances = await this.lcd.bank.balance(this.key.accAddress)
+    return balances[0].toArray()
+  }
+
+  async getUsdcAmount() {
+    const tokens = await this.checkBalance()
+    const usdc = tokens.filter(token => token.denom === 'uusdc')[0]
+    return usdc.amount
+  }
+
+  async bridge() {
+    // {
+    //   "move": {
+    //   "message": {
+    //     "module_address": "0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a",
+    //       "module_name": "swap_transfer",
+    //       "function_name": "mixed_route_swap_to",
+    //       "type_args": [],
+    //       "args": [
+    //       "KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=",
+    //       "AQIBACBjlv8aKTjnJqzBAbnFQUuAXZpgXAPI4IMk9cDIgH98vA==",
+    //       "QEIPAAAAAAA=",
+    //       "ASQqBwAAAAAA",
+    //       "AAAAAAAAAAAAAAAAIzfL288YfTPUDoedDWdgWzL+KVg="
+    //     ]
+    //   }
+    // }
+    // }
+    // {"move":{"message":{"module_address":"0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a","module_name":"swap_transfer","function_name":"mixed_route_swap_to","type_args":[],"args":["KxToiwb36zAB/GsetggCNYVVpN+xpO02UHMJotdmzk0=","AQIBACBjlv8aKTjnJqzBAbnFQUuAXZpgXAPI4IMk9cDIgH98vA==","QEIPAAAAAAA=","ASQqBwAAAAAA","AAAAAAAAAAAAAAAAIzfL288YfTPUDoedDWdgWzL+KVg="]}}}
+  }
 }

+ 0 - 8
src/InitiaClient.ts

@@ -6,14 +6,6 @@ export class InitiaClient extends InitiaTask {
     super(mnemonic)
   }
 
-  async checkBalance() {
-    const balances = await this.lcd.bank.balance(
-      'init14l3c2vxrdvu6y0sqykppey930s4kufsvt97aeu',
-    )
-    console.log(balances)
-    //todo filter balance
-  }
-
   async transfer(to: string, amount: number) {
     const msg = new MsgSend(
       this.wallet.key.accAddress,

+ 48 - 13
src/InitiaTask.ts

@@ -1,11 +1,23 @@
 import { JennieModule } from './JennieModule'
-import { MsgDelegate, MsgExecute } from '@initia/initia.js'
+import {
+  bcs,
+  MsgDelegate,
+  MsgExecute,
+  MsgWithdrawDelegatorReward,
+} from '@initia/initia.js'
 import { validatorArray } from './validatorArray'
+import { generateRandomString, getAxiosClient } from './utils'
+import axios from 'axios'
 
 export abstract class InitiaTask extends JennieModule {
   protected constructor(mnemonic: string) {
     super(mnemonic)
   }
+
+  randomAmount(min: number, max: number) {
+    return Math.floor(Math.random() * (max - min) + min)
+  }
+  //done
   async swapScript() {
     const msg = new MsgExecute(
       this.key.accAddress,
@@ -14,16 +26,22 @@ export abstract class InitiaTask extends JennieModule {
       'swap_script',
       [],
       [
-        '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=',
-        'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
-        'QEIPAAAAAAA=',
-        'ASCLDAAAAAAA',
+        '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=', //liquidityTOken
+        'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=', //offerCoin
+        'QEIPAAAAAAA=', //offerAmount
+        bcs
+          .option(bcs.u64())
+          .serialize(this.randomAmount(1000, 10000))
+          .toBase64(),
       ],
     )
     await this.broadcast(msg)
   }
 
   async nameRegister() {
+    const random = generateRandomString(10)
+    console.log(random)
+    const arg = bcs.string().serialize(random).toBase64()
     const msgs = []
     msgs.push(
       new MsgExecute(
@@ -32,7 +50,7 @@ export abstract class InitiaTask extends JennieModule {
         'usernames',
         'register_domain',
         [],
-        ['B2RhbW5icm8=', '4IfhAQAAAAA='],
+        [arg, '4IfhAQAAAAA='],
       ),
     )
     msgs.push(
@@ -42,13 +60,19 @@ export abstract class InitiaTask extends JennieModule {
         'usernames',
         'set_name',
         [],
-        ['B2RhbW5icm8='],
+        [arg],
       ),
     )
     await this.broadcast(msgs)
   }
 
   async stakeSingle() {
+    const usdcAmount = await this.getUsdcAmount()
+
+    const randomValidator =
+      validatorArray[Math.floor(Math.random() * validatorArray.length)]
+    // console.log(bcs.u64().serialize(usdcAmount).toBase64())
+    // console.log(bcs.string().serialize(randomValidator).toBase64())
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x42cd8467b1c86e59bf319e5664a09b6b5840bb3fac64f5ce690b5041c530565a',
@@ -56,11 +80,14 @@ export abstract class InitiaTask extends JennieModule {
       'single_asset_provide_stake',
       [],
       [
-        'sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=',
-        'rM6zskU5Kv4INGt5TPXE/4Xn6ajIL8r1ESrp1kulfMs=',
-        '64YBAAAAAAA=', //amount
-        'AeJwBwAAAAAA',
-        'MmluaXR2YWxvcGVyMXEyYWw1OWd5bHo0MGptczZlbWV5NnBzOGxldWd1aHM3a3ZxaGFn', //validator
+        '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=',
+        'KYJNlS4DVJD651Z97qXxW1BKaPpzYQBjwWCrH6h91gk=',
+        bcs.u64().serialize(usdcAmount).toBase64(), //amount
+        bcs
+          .option(bcs.u64())
+          .serialize(this.randomAmount(1000, 10000))
+          .toBase64(),
+        bcs.string().serialize(randomValidator).toBase64(), //validator
       ],
     )
     await this.broadcast(msg)
@@ -70,10 +97,18 @@ export abstract class InitiaTask extends JennieModule {
     const randomValidator =
       validatorArray[Math.floor(Math.random() * validatorArray.length)]
     const msg = new MsgDelegate(
-      'init1w6ftxlsv7y5putq955ymxh2kd0wru7nqshetka', // delegator address
+      this.key.accAddress, // delegator address
       randomValidator, // validator's operator addres
       '100000uinit', // delegate amount
     )
     await this.broadcast(msg)
   }
+
+  async claimReward() {
+    const msg = new MsgWithdrawDelegatorReward(
+      this.key.accAddress,
+      'initvaloper1r3cuy3q2gxh0mpj2nu0cnpqtutaxx9z87r6qtt',
+    )
+    await this.broadcast(msg)
+  }
 }

+ 106 - 1
src/JennieModule.ts

@@ -1,5 +1,6 @@
 import { BaseClient } from './BaseClient'
-import { MsgExecute } from '@initia/initia.js'
+import { bcs, MsgExecute } from '@initia/initia.js'
+import { getAxiosClient } from './utils'
 
 export abstract class JennieModule extends BaseClient {
   protected constructor(mnemonic: string) {
@@ -31,6 +32,38 @@ export abstract class JennieModule extends BaseClient {
   }
 
   async mintJennie() {
+    // Fetch mint progress details for 'jennie'
+    const mintProgress: MintProgress = await this.lcd.move.viewFunction(
+      '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+      'jennie',
+      'get_jennie_mint_progress',
+      [],
+      [bcs.address().serialize(this.key.accAddress).toBase64()],
+    )
+
+    // Check if 'jennie' is already minted
+    if (mintProgress.is_minted) {
+      return
+    }
+
+    // Initialize a flag to determine if all parts are minted
+    let allPartsMinted = true
+
+    // Iterate over each part progress
+    for (const partProgress of mintProgress.jennie_part_progresses) {
+      // If any part is not minted, set the flag to false
+      if (!partProgress.is_minted) {
+        allPartsMinted = false
+        break // No need to check further parts
+      }
+    }
+
+    // If not all parts are minted, exit the function
+    if (!allPartsMinted) {
+      return
+    }
+
+    // Prepare the minting message
     const msg = new MsgExecute(
       this.key.accAddress,
       '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
@@ -39,6 +72,78 @@ export abstract class JennieModule extends BaseClient {
       [],
       [],
     )
+
+    // Broadcast the minting message
     await this.broadcast(msg)
   }
+  async mintPart() {
+    // 获取 'jennie' 的铸造进度
+    const mintProgress: MintProgress = await this.lcd.move.viewFunction(
+      '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+      'jennie',
+      'get_jennie_mint_progress',
+      [],
+      [bcs.address().serialize(this.key.accAddress).toBase64()],
+    )
+
+    // 初始化消息数组
+    const msgs: MsgExecute[] = []
+
+    // 遍历每个部件的进度
+    for (const item of mintProgress.jennie_part_progresses) {
+      // 如果部件已批准但未铸造,创建消息
+      if (item.is_approved && !item.is_minted) {
+        const msg = new MsgExecute(
+          this.key.accAddress,
+          '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+          'jennie',
+          'mint_part',
+          [],
+          [bcs.u8().serialize(item.task).toBase64()],
+        )
+        msgs.push(msg)
+      }
+    }
+
+    // 广播所有消息
+    await this.broadcast(msgs)
+  }
+  async claimable() {
+    //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}`,
+    )
+
+    if (data.data.claimable_list.length > 0) {
+      const proofs = data.data.claimable_list[0].merkle_proofs
+      const proofsu8vec = proofs.map(p =>
+        Uint8Array.from(Buffer.from(p, 'base64')),
+      )
+      const sd = bcs
+        .vector(bcs.vector(bcs.u8()))
+        .serialize(proofsu8vec)
+        .toBase64()
+      const msg = new MsgExecute(
+        this.key.accAddress,
+        '0x9065fda28f52bb14ade545411f02e8e07a9cb4ba',
+        'initia_xp',
+        'claim_point',
+        [],
+        [
+          bcs.u64().serialize(data.data.claimable_list[0].stage).toBase64(),
+          sd,
+          bcs
+            .u64()
+            .serialize(data.data.claimable_list[0].task_point)
+            .toBase64(),
+          bcs
+            .u64()
+            .serialize(data.data.claimable_list[0].referral_point)
+            .toBase64(),
+        ],
+      )
+      await this.broadcast(msg)
+    }
+  }
 }

+ 105 - 0
src/decodeFunction.ts

@@ -0,0 +1,105 @@
+import { bcs } from '@initia/initia.js'
+
+// signle_asset_provide_stake
+
+function parse1(): void {
+  console.log('signle_asset_provide_stake')
+
+  const raw = [
+    'sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=', // liquidity_token: 0xb134ae6786f10ef74294e627d2519b63b7c742a6735f98682929fea9a84744d2
+    'rM6zskU5Kv4INGt5TPXE/4Xn6ajIL8r1ESrp1kulfMs=', // metadata_addr: 0xacceb3b245392afe08346b794cf5c4ff85e7e9a8c82fcaf5112ae9d64ba57ccb
+    '64YBAAAAAAA=', // 100075
+    'AWNwBwAAAAAA', // 124805889
+    'MmluaXR2YWxvcGVyMXEyYWw1OWd5bHo0MGptczZlbWV5NnBzOGxldWd1aHM3a3ZxaGFn', // validator: initvaloper1q2al59gylz40jms6emey6ps8leuguhs7kvqhag
+  ]
+
+  const d0 = bcs
+    .object() // type
+    .parse(Uint8Array.from(Buffer.from(raw[0], 'base64')))
+
+  console.log(d0)
+
+  const d1 = bcs
+    .object() // type
+    .parse(Uint8Array.from(Buffer.from(raw[1], 'base64')))
+
+  console.log(d1)
+
+  const d2 = bcs
+    .u64() // type
+    .parse(Uint8Array.from(Buffer.from(raw[2], 'base64')))
+
+  console.log(d2)
+
+  const d3 = bcs
+    .u64() // 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)
+}
+
+//
+
+function parse2(): void {
+  const raw = [
+    '2/BsSK85hOxtmuipqn27C7HnhKqbjEpWga9mDPhVjX0=',
+    'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+    'QEIPAAAAAAA=',
+    'AWTiCwAAAAAA',
+  ]
+
+  //199370241
+  //199386113
+  const d0 = bcs
+    .object() // type
+    .parse(Uint8Array.from(Buffer.from(raw[0], 'base64')))
+
+  console.log(d0)
+
+  const d1 = bcs
+    .object() // type
+    .parse(Uint8Array.from(Buffer.from(raw[1], 'base64')))
+
+  console.log(d1)
+
+  const d2 = bcs
+    .u64() // type
+    .parse(Uint8Array.from(Buffer.from(raw[2], 'base64')))
+
+  console.log(d2)
+
+  const d3 = bcs
+    .u64() // type
+    .parse(Uint8Array.from(Buffer.from(raw[3], 'base64')))
+
+  console.log(d3)
+}
+function parse3(): void {
+  const raw = [
+    'AgAAAAAAAAA=',
+    'ESAOD/B2oCm8SjNKm3hUeK0gmt6Hqm1kI3Mi2IKFJyPAUyBRT85X9TgphBgRyew8Ly2o39pLleenhkrA5Zk/Eb0KDyC0zyJC5Ul/VCIXzRfHOHcV9hmIwWSAd7Ig+/biAxC+syATi2DhMzxscZFi477/SmpdyL/G6yxSIhZvzAD3k1PLFCCyBBzWXiTK+tvU6nyp8VcaaabrMjjunIO0WPwQSw+e/SDQ2NKstdYfGLNdhIpN6TmypLTV9ZbS68gpVm5mW31CiSAo5ej6RrniG38E2+Oau6kH9VLp6DJ0ZaNvj3GV3cb14yC+/K6fm35Hu5VrWLb5uZrPY3zXwC5dzizqeTF9xdWBZSCDsY+I4010EDka6/uUhueG04K3V5IQbJ2S46dqGr+d2yBfhPhXp5YoyAOgZMr8aPWIPKceAQWJwO/lD2MfVy07/SD8YGqoh30YPb8+06b3Hc5mpK7LQe3XIfsWwulPLUhf6CDE+vPfF0CGg+DeOvb0nUFjYCfHtX5DAO3WJaWGHIrxuSCFHMsKJpNz2mGUwsoMISVc+nsp48P3LzIadKWabTdVFSBhd0rRgqB4jcpv0Fo5T87/D+KYAyV7kNw6apy0cE/k4SAanRoIN9sO9XOa0yGEBwHBXZG69JJCsyECO1mmBW1vAyB/eLoGw+M5mqks4X7Q8ZYHINiEkblxVORLlWvtUg0G8CCyXG4KRavQ0ouOkzel82wgFDQgoIymnoFKf7lX8KQLdA==',
+    'HgAAAAAAAAA=',
+    'AAAAAAAAAAA=',
+  ]
+
+  //199370241
+  //199386113
+  const d0 = bcs
+    .address() // type
+    .parse(Uint8Array.from(Buffer.from(raw[1], 'base64')))
+
+  console.log(d0)
+
+  // const d1 = bcs
+  //   .u64() // type
+  //   .parse(Uint8Array.from(Buffer.from(raw[1], 'base64')))
+  //
+  // console.log(d1)
+}
+parse3()

+ 10 - 0
src/interface.ts

@@ -0,0 +1,10 @@
+interface JenniePartProgress {
+  is_approved: boolean
+  is_minted: boolean
+  task: number
+}
+
+interface MintProgress {
+  is_minted: boolean
+  jennie_part_progresses: JenniePartProgress[]
+}

+ 17 - 16
src/swapTester.ts

@@ -3,7 +3,8 @@ import { InitiaClient } from './InitiaClient'
 
 const key = new MnemonicKey({
   mnemonic:
-    'deal earth suggest craft impact vocal outdoor perfect winter nice unhappy lizard',
+    // 'deal earth suggest craft impact vocal outdoor perfect winter nice unhappy lizard',
+    'visual giant rely tooth recall explain vital tunnel snow road airport cake',
 })
 console.log('mnemonic:', key.mnemonic)
 // mnemonic: beauty sniff protect...
@@ -14,23 +15,23 @@ const lcd = new LCDClient('https://api-initia-testnet.whispernode.com/', {
   chainId: 'initiation-1',
 })
 
-const wallet = new Wallet(lcd, key)
-const msg = new MsgExecute(
-  key.accAddress,
-  '0x1',
-  'dex',
-  'swap_script',
-  [],
-  [
-    'sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=',
-    'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
-    'QEIPAAAAAAA=',
-    'AdWGAQAAAAAA',
-  ],
-)
+// const wallet = new Wallet(lcd, key)
+// const msg = new MsgExecute(
+//   key.accAddress,
+//   '0x1',
+//   'dex',
+//   'swap_script',
+//   [],
+//   [
+//     'sTSuZ4bxDvdClOYn0lGbY7fHQqZzX5hoKSn+qahHRNI=',
+//     'jkczvavPfUr8PRTw3UbJv1L7D86eS5lsk54ZW4vIkdk=',
+//     'QEIPAAAAAAA=',
+//     'AdWGAQAAAAAA',
+//   ],
+// )
 
 async function main() {
   const client = new InitiaClient(key.mnemonic)
-  await client.swapScript()
+  await client.claimable()
 }
 main()

+ 6 - 1
src/utils/index.ts

@@ -6,7 +6,8 @@ export async function sleep(ms: number) {
 }
 
 export function generateRandomString(length: number) {
-  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+  const characters =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
   let result = ''
   const charactersLength = characters.length
   for (let i = 0; i < length; i++) {
@@ -14,6 +15,10 @@ export function generateRandomString(length: number) {
   }
   return result
 }
+export function getProxyUrl() {
+  const pass = `test1234_session-${generateRandomString(8)}_lifetime-24h`
+  return `http://tuxla:${pass}@geo.iproyal.com:12321`
+}
 
 export function getAxiosClient(useProxy: boolean) {
   const pass = `test1234_session-${generateRandomString(8)}_lifetime-20m`