From 4bc8eadf36ff8a0eb738ead8ce7725e576797ee4 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 21 May 2024 19:06:36 -0700 Subject: [PATCH] feat sdk: add multi-send --- typescript-sdk/bun.lockb | Bin 112342 -> 112692 bytes typescript-sdk/package.json | 1 + typescript-sdk/scripts/logger.ts | 15 ++++++ typescript-sdk/scripts/union-to-sepolia.ts | 60 +++++++++++++-------- typescript-sdk/src/mod.ts | 2 +- 5 files changed, 56 insertions(+), 22 deletions(-) create mode 100644 typescript-sdk/scripts/logger.ts diff --git a/typescript-sdk/bun.lockb b/typescript-sdk/bun.lockb index 2b5545f3c76a2b64f4314d4900dbcc024cd4794c..57aea01f9634c37cd69451cae8e695ca516b8789 100755 GIT binary patch delta 7571 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 Tg-Q`-d~vt%YE6GdtiAT1^%q;w delta 7612 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 ci+r~r { + const d = new Date() + const [date] = d.toISOString().split("T") + const [time] = d.toTimeString().split(" ") + return `${date} ${time}` +} diff --git a/typescript-sdk/scripts/union-to-sepolia.ts b/typescript-sdk/scripts/union-to-sepolia.ts index 5726a54396..93e100ade9 100644 --- a/typescript-sdk/scripts/union-to-sepolia.ts +++ b/typescript-sdk/scripts/union-to-sepolia.ts @@ -1,16 +1,25 @@ #!/usr/bin/env bun +import "#/patch.ts" import { parseArgs } from "node:util" import { UnionClient } from "#/mod.ts" +import { consola, timestamp } from "./logger.ts" +import type { ExecuteInstruction } from "@cosmjs/cosmwasm-stargate" /* `bun scripts/to-sepolia.ts --private-key "..."` */ const { values } = parseArgs({ args: process.argv.slice(2), - options: { "private-key": { type: "string" } } + options: { + "private-key": { type: "string" }, + "tx-count": { type: "string", default: "1" } + } }) const PRIVATE_KEY = values["private-key"] if (!PRIVATE_KEY) throw new Error("Private key not found") +const TX_COUNT = Number(values["tx-count"]) + +consola.box(`Sending ${TX_COUNT} transactions from Union to Sepolia`) const unionClient = await UnionClient.connectWithSecret({ rpcUrl: "https://rpc.testnet.bonlulu.uno", @@ -22,24 +31,33 @@ const unionClient = await UnionClient.connectWithSecret({ }) const contractAddress = "union124t57vjgsyknnhmr3fpkmyvw2543448kpt2xhk5p5hxtmjjsrmzsjyc4n7" -const unoFromUnionToSepolia = await unionClient.transferAssets({ - kind: "cosmwasm", - instructions: [ - { - contractAddress, - msg: { - transfer: { - channel: "channel-0", - receiver: "0x8478B37E983F520dBCB5d7D3aAD8276B82631aBd".slice(2), - memo: "sending UNO from Union to Sepolia" - } - }, - funds: [ - // denom: `factory/union124t57vjgsyknnhmr3fpkmyvw2543448kpt2xhk5p5hxtmjjsrmzsjyc4n7/0xc5775fca1b3285dc8b749d58b227527211c108b8d3` - { amount: "30", denom: `muno` } - ] - } - ] -}) -console.log(unoFromUnionToSepolia.transactionHash) +const unionToSepoliaTransactions: Array = Array.from( + { length: TX_COUNT }, + (_, index) => ({ + contractAddress, + msg: { + transfer: { + channel: "channel-0", + receiver: "0xD0081080Ae8493cf7340458Eaf4412030df5FEEb".slice(2), + memo: `${index} - ${timestamp()} Sending UNO from Union to Sepolia` + } + }, + funds: [{ amount: (index + 1).toString(), denom: `muno` }] + }) +) + +const transactionResults = await Array.fromAsync( + unionToSepoliaTransactions, + async transaction => + unionClient.transferAssets({ kind: "cosmwasm", instructions: [transaction] }), + { concurrency: 1 } +) + +consola.info( + JSON.stringify( + transactionResults.map(item => item.transactionHash), + undefined, + 2 + ) +) diff --git a/typescript-sdk/src/mod.ts b/typescript-sdk/src/mod.ts index 1a700c50c0..e956a146b2 100644 --- a/typescript-sdk/src/mod.ts +++ b/typescript-sdk/src/mod.ts @@ -215,7 +215,7 @@ export class UnionClient implements IUnionClient { public async cosmwasmMessageExecuteContract( instructions: Array ): Promise { - const { address: signerAddress } = await this.getAccount() + const { address: signerAddress, algo, pubkey } = await this.getAccount() const cosmwasmClient = await this.signingCosmWasmClient() const response = await cosmwasmClient.executeMultiple(signerAddress, instructions, "auto") return response