sdk/js/src/token_bridge/__tests__: added more tests (#1029)
* sdk/js/src/token_bridge: adding more tests * sdk/js/token_bridge/__tests__: ci changes
This commit is contained in:
parent
040eace4f7
commit
85b6dfc420
|
@ -6,49 +6,71 @@ const ci = !!process.env.CI;
|
|||
// see devnet.md
|
||||
export const ETH_NODE_URL = ci ? "ws://eth-devnet:8545" : "ws://localhost:8545";
|
||||
export const ETH_PRIVATE_KEY =
|
||||
"0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d";
|
||||
"0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d";
|
||||
export const ETH_CORE_BRIDGE_ADDRESS =
|
||||
"0xC89Ce4735882C9F0f0FE26686c53074E09B0D550";
|
||||
"0xC89Ce4735882C9F0f0FE26686c53074E09B0D550";
|
||||
export const ETH_TOKEN_BRIDGE_ADDRESS =
|
||||
"0x0290FB167208Af455bB137780163b7B7a9a10C16";
|
||||
"0x0290FB167208Af455bB137780163b7B7a9a10C16";
|
||||
export const SOLANA_HOST = ci
|
||||
? "http://solana-devnet:8899"
|
||||
: "http://localhost:8899";
|
||||
? "http://solana-devnet:8899"
|
||||
: "http://localhost:8899";
|
||||
export const SOLANA_PRIVATE_KEY = new Uint8Array([
|
||||
14, 173, 153, 4, 176, 224, 201, 111, 32, 237, 183, 185, 159, 247, 22, 161, 89,
|
||||
84, 215, 209, 212, 137, 10, 92, 157, 49, 29, 192, 101, 164, 152, 70, 87, 65,
|
||||
8, 174, 214, 157, 175, 126, 98, 90, 54, 24, 100, 177, 247, 77, 19, 112, 47,
|
||||
44, 165, 109, 233, 102, 14, 86, 109, 29, 134, 145, 132, 141,
|
||||
14, 173, 153, 4, 176, 224, 201, 111, 32, 237, 183, 185, 159, 247, 22, 161,
|
||||
89, 84, 215, 209, 212, 137, 10, 92, 157, 49, 29, 192, 101, 164, 152, 70, 87,
|
||||
65, 8, 174, 214, 157, 175, 126, 98, 90, 54, 24, 100, 177, 247, 77, 19, 112,
|
||||
47, 44, 165, 109, 233, 102, 14, 86, 109, 29, 134, 145, 132, 141,
|
||||
]);
|
||||
export const SOLANA_CORE_BRIDGE_ADDRESS =
|
||||
"Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
|
||||
"Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
|
||||
export const SOLANA_TOKEN_BRIDGE_ADDRESS =
|
||||
"B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE";
|
||||
"B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE";
|
||||
export const TERRA_NODE_URL = ci
|
||||
? "http://terra-terrad:1317"
|
||||
: "http://localhost:1317";
|
||||
? "http://terra-terrad:1317"
|
||||
: "http://localhost:1317";
|
||||
export const TERRA_CHAIN_ID = "localterra";
|
||||
export const TERRA_GAS_PRICES_URL = ci
|
||||
? "http://terra-fcd:3060/v1/txs/gas_prices"
|
||||
: "http://localhost:3060/v1/txs/gas_prices";
|
||||
? "http://terra-fcd:3060/v1/txs/gas_prices"
|
||||
: "http://localhost:3060/v1/txs/gas_prices";
|
||||
export const TERRA_CORE_BRIDGE_ADDRESS =
|
||||
"terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5";
|
||||
"terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5";
|
||||
export const TERRA_TOKEN_BRIDGE_ADDRESS =
|
||||
"terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4";
|
||||
"terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4";
|
||||
export const TERRA_PRIVATE_KEY =
|
||||
"notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius";
|
||||
"notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius";
|
||||
export const TEST_ERC20 = "0x2D8BE6BF0baA74e0A907016679CaE9190e80dD0A";
|
||||
export const TEST_SOLANA_TOKEN = "2WDq7wSs9zYrpx2kbHDA4RUTRch2CCTP6ZWaH4GNfnQQ";
|
||||
export const WORMHOLE_RPC_HOSTS = ci
|
||||
? ["http://guardian:7071"]
|
||||
: ["http://localhost:7071"];
|
||||
? ["http://guardian:7071"]
|
||||
: ["http://localhost:7071"];
|
||||
|
||||
export type Environment = "devnet" | "testnet" | "mainnet";
|
||||
export const CLUSTER: Environment = "devnet" as Environment; //This is the currently selected environment.
|
||||
|
||||
export const TERRA_HOST =
|
||||
CLUSTER === "mainnet"
|
||||
? {
|
||||
URL: "https://lcd.terra.dev",
|
||||
chainID: "columbus-5",
|
||||
name: "mainnet",
|
||||
}
|
||||
: CLUSTER === "testnet"
|
||||
? {
|
||||
URL: "https://bombay-lcd.terra.dev",
|
||||
chainID: "bombay-12",
|
||||
name: "testnet",
|
||||
}
|
||||
: {
|
||||
URL: TERRA_NODE_URL,
|
||||
chainID: "columbus-5",
|
||||
name: "localterra",
|
||||
};
|
||||
|
||||
describe("consts should exist", () => {
|
||||
it("has Solana test token", () => {
|
||||
expect.assertions(1);
|
||||
const connection = new Connection(SOLANA_HOST, "confirmed");
|
||||
return expect(
|
||||
connection.getAccountInfo(new PublicKey(TEST_SOLANA_TOKEN))
|
||||
).resolves.toBeTruthy();
|
||||
});
|
||||
it("has Solana test token", () => {
|
||||
expect.assertions(1);
|
||||
const connection = new Connection(SOLANA_HOST, "confirmed");
|
||||
return expect(
|
||||
connection.getAccountInfo(new PublicKey(TEST_SOLANA_TOKEN))
|
||||
).resolves.toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
import { parseUnits } from "@ethersproject/units";
|
||||
import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport";
|
||||
import {
|
||||
ASSOCIATED_TOKEN_PROGRAM_ID,
|
||||
Token,
|
||||
TOKEN_PROGRAM_ID,
|
||||
} from "@solana/spl-token";
|
||||
import { Connection, Keypair, PublicKey, Transaction } from "@solana/web3.js";
|
||||
import { LCDClient, MnemonicKey, TxInfo } from "@terra-money/terra.js";
|
||||
import { ethers } from "ethers";
|
||||
import {
|
||||
approveEth,
|
||||
ChainId,
|
||||
CHAIN_ID_ETH,
|
||||
CHAIN_ID_SOLANA,
|
||||
getForeignAssetSolana,
|
||||
getSignedVAAWithRetry,
|
||||
hexToUint8Array,
|
||||
nativeToHexString,
|
||||
parseSequenceFromLogEth,
|
||||
|
@ -24,7 +28,12 @@ import {
|
|||
SOLANA_HOST,
|
||||
SOLANA_PRIVATE_KEY,
|
||||
SOLANA_TOKEN_BRIDGE_ADDRESS,
|
||||
TERRA_CHAIN_ID,
|
||||
TERRA_HOST,
|
||||
TERRA_NODE_URL,
|
||||
TERRA_PRIVATE_KEY,
|
||||
TEST_ERC20,
|
||||
WORMHOLE_RPC_HOSTS,
|
||||
} from "./consts";
|
||||
|
||||
export async function transferFromEthToSolana(): Promise<string> {
|
||||
|
@ -92,3 +101,88 @@ export async function transferFromEthToSolana(): Promise<string> {
|
|||
provider.destroy();
|
||||
return sequence;
|
||||
}
|
||||
|
||||
export async function waitForTerraExecution(
|
||||
transaction: string
|
||||
): Promise<TxInfo | undefined> {
|
||||
const lcd = new LCDClient(TERRA_HOST);
|
||||
let done: boolean = false;
|
||||
let info;
|
||||
while (!done) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
try {
|
||||
info = await lcd.tx.txInfo(transaction);
|
||||
if (info) {
|
||||
done = true;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
if (info && info.code !== 0) {
|
||||
// error code
|
||||
throw new Error(
|
||||
`Tx ${transaction}: error code ${info.code}: ${info.raw_log}`
|
||||
);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
export async function getSignedVAABySequence(
|
||||
chainId: ChainId,
|
||||
sequence: string,
|
||||
emitterAddress: string
|
||||
): Promise<Uint8Array> {
|
||||
//Note, if handed a sequence which doesn't exist or was skipped for consensus this will retry until the timeout.
|
||||
const { vaaBytes } = await getSignedVAAWithRetry(
|
||||
WORMHOLE_RPC_HOSTS,
|
||||
chainId,
|
||||
emitterAddress,
|
||||
sequence,
|
||||
{
|
||||
transport: NodeHttpTransport(), //This should only be needed when running in node.
|
||||
},
|
||||
1000, //retryTimeout
|
||||
1000 //Maximum retry attempts
|
||||
);
|
||||
|
||||
return vaaBytes;
|
||||
}
|
||||
|
||||
export async function queryBalanceOnTerra(asset: string): Promise<number> {
|
||||
const lcd = new LCDClient({
|
||||
URL: TERRA_NODE_URL,
|
||||
chainID: TERRA_CHAIN_ID,
|
||||
});
|
||||
const mk = new MnemonicKey({
|
||||
mnemonic: TERRA_PRIVATE_KEY,
|
||||
});
|
||||
const wallet = lcd.wallet(mk);
|
||||
|
||||
let balance: number = NaN;
|
||||
try {
|
||||
let coins: any;
|
||||
let pagnation: any;
|
||||
[coins, pagnation] = await lcd.bank.balance(wallet.key.accAddress);
|
||||
console.log("wallet query returned: %o", coins);
|
||||
if (coins) {
|
||||
let coin = coins.get(asset);
|
||||
if (coin) {
|
||||
balance = parseInt(coin.toData().amount);
|
||||
} else {
|
||||
console.error(
|
||||
"failed to query coin balance, coin [" +
|
||||
asset +
|
||||
"] is not in the wallet, coins: %o",
|
||||
coins
|
||||
);
|
||||
}
|
||||
} else {
|
||||
console.error("failed to query coin balance!");
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("failed to query coin balance: %o", e);
|
||||
}
|
||||
|
||||
return balance;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue