84 lines
2.3 KiB
TypeScript
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");
|
|
}
|