wormhole/wormhole_chain/testing/js/src/utils/walletHelpers.ts

84 lines
2.3 KiB
TypeScript

import { coins } from "@cosmjs/proto-signing";
import { OfflineSigner } from "@cosmjs/proto-signing";
import { StdFee } from "@cosmjs/stargate";
import {
fromValAddress,
getAddress,
getWallet,
getWormchainSigningClient,
getWormholeQueryClient,
} from "@wormhole-foundation/wormhole-chain-sdk";
import {
WORM_DENOM,
NODE_URL,
TENDERMINT_URL,
TEST_WALLET_ADDRESS_1,
TEST_WALLET_MNEMONIC_1,
} from "../consts.js";
//@ts-ignore
import * as elliptic from "elliptic";
import keccak256 from "keccak256";
export async function getQueryClient() {
return getWormholeQueryClient(NODE_URL, true);
}
export async function getSigningClient() {
const testWallet1 = await getWallet(TEST_WALLET_MNEMONIC_1);
return await getWormchainSigningClient(TENDERMINT_URL, testWallet1);
}
export async function getBalance(address: string, denom: string) {
const client = await getQueryClient();
const response = await client.bank.queryBalance(address, denom);
return response.data.balance?.amount || "0";
}
export async function sendTokens(
wallet: OfflineSigner,
recipient: string,
amount: string,
denom: string
) {
const client = await getWormchainSigningClient(TENDERMINT_URL, wallet);
const fromAddress = await getAddress(wallet);
//TODO the autogenned protobuf code doesn't appear to be correct. This not working is a serious bug
// const msg = client.bank.msgSend({
// //@ts-ignore
// amount: [{ amount, denom }],
// //@ts-ignore
// from_address: fromAddress,
// to_address: recipient,
// });
return client.sendTokens(
fromAddress,
recipient,
[{ amount, denom }],
getZeroFee(),
"basicTransfer test"
);
}
export function getZeroFee(): StdFee {
return {
amount: coins(0, WORM_DENOM),
gas: "180000", // 180k",
};
}
export function signValidatorAddress(valAddr: string, privKey: string) {
const EC = elliptic.default.ec;
const ec = new EC("secp256k1");
const key = ec.keyFromPrivate(privKey);
const valAddrHash = keccak256(
Buffer.from(fromValAddress(valAddr).bytes)
).toString("hex");
const signature = key.sign(valAddrHash, { canonical: true });
const hexString =
signature.r.toString("hex").padStart(64, "0") +
signature.s.toString("hex").padStart(64, "0") +
signature.recoveryParam.toString(16).padStart(2, "0");
return Buffer.from(hexString, "hex");
}