| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- // This test is intended to be run on devnet without an active eth miner
- // see https://github.com/trufflesuite/ganache-cli-archive#custom-methods
- const {
- NodeHttpTransport,
- } = require("@improbable-eng/grpc-web-node-http-transport");
- const { ethers } = require("ethers");
- const { parseUnits } = require("ethers/lib/utils");
- const {
- approveEth,
- transferFromEth,
- CHAIN_ID_BSC,
- CHAIN_ID_ETH,
- hexToUint8Array,
- nativeToHexString,
- parseSequenceFromLogEth,
- getEmitterAddressEth,
- getSignedVAA,
- } = require("@certusone/wormhole-sdk");
- const { default: axios } = require("axios");
- const ETH_NODE_URL = "ws://localhost:8545";
- const ETH_PRIVATE_KEY =
- "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d";
- const ETH_CORE_BRIDGE_ADDRESS = "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550";
- const ETH_TOKEN_BRIDGE_ADDRESS = "0x0290FB167208Af455bB137780163b7B7a9a10C16";
- const TEST_ERC20 = "0x2D8BE6BF0baA74e0A907016679CaE9190e80dD0A";
- const WORMHOLE_RPC_HOST = "http://localhost:7071";
- (async () => {
- // create a signer for Eth
- const provider = new ethers.providers.WebSocketProvider(ETH_NODE_URL);
- const signer = new ethers.Wallet(ETH_PRIVATE_KEY, provider);
- console.log(`Height ${await provider.getBlockNumber()}`);
- // TEST 1 - send with 20 blocks conf
- const amount = parseUnits("1", 18);
- // approve the bridge to spend tokens
- await approveEth(ETH_TOKEN_BRIDGE_ADDRESS, TEST_ERC20, signer, amount);
- // transfer tokens
- const receipt = await transferFromEth(
- ETH_TOKEN_BRIDGE_ADDRESS,
- signer,
- TEST_ERC20,
- amount,
- CHAIN_ID_BSC,
- hexToUint8Array(
- nativeToHexString(await signer.getAddress(), CHAIN_ID_ETH) || ""
- )
- );
- // get the sequence from the logs (needed to fetch the vaa)
- const sequence = parseSequenceFromLogEth(receipt, ETH_CORE_BRIDGE_ADDRESS);
- const emitterAddress = getEmitterAddressEth(ETH_TOKEN_BRIDGE_ADDRESS);
- console.log(`FIRST TX, SEQ ${sequence}`);
- for (let i = 1; i <= 20; i++) {
- console.log(`Attempt ${i}`);
- await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_mine",
- params: [Date.now()],
- });
- console.log(`Height ${await provider.getBlockNumber()}`);
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- }
- // TEST 2 - send with 1 conf, rollback before tx, 30 confs
- const {
- data: { result: snapshotId },
- } = await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_snapshot",
- params: [],
- });
- console.log(`SNAPSHOT ${snapshotId}`);
- console.log(`Height ${await provider.getBlockNumber()}`);
- const amount2 = parseUnits("2", 18);
- // approve the bridge to spend tokens
- await approveEth(ETH_TOKEN_BRIDGE_ADDRESS, TEST_ERC20, signer, amount2);
- // transfer tokens
- const receipt2 = await transferFromEth(
- ETH_TOKEN_BRIDGE_ADDRESS,
- signer,
- TEST_ERC20,
- amount2,
- CHAIN_ID_BSC,
- hexToUint8Array(
- nativeToHexString(await signer.getAddress(), CHAIN_ID_ETH) || ""
- )
- );
- // get the sequence from the logs (needed to fetch the vaa)
- const sequence2 = parseSequenceFromLogEth(receipt2, ETH_CORE_BRIDGE_ADDRESS);
- console.log(`SECOND TX, SEQ ${sequence2}`);
- console.log(`Attempt 1`);
- await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_mine",
- params: [Date.now()],
- });
- console.log(`Height ${await provider.getBlockNumber()}`);
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence2,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- console.log(`Rollback 1`);
- await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_revert",
- params: [snapshotId],
- });
- console.log(`Height ${await provider.getBlockNumber()}`);
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence2,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- for (let i = 1; i <= 30; i++) {
- console.log(`Attempt ${i}`);
- await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_mine",
- params: [Date.now()],
- });
- console.log(`Height ${await provider.getBlockNumber()}`);
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence2,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- }
- // TEST 3 - repeat test 1 and verify test 2 is still not found
- const amount3 = parseUnits("3", 18);
- // approve the bridge to spend tokens
- await approveEth(ETH_TOKEN_BRIDGE_ADDRESS, TEST_ERC20, signer, amount3);
- // transfer tokens
- const receipt3 = await transferFromEth(
- ETH_TOKEN_BRIDGE_ADDRESS,
- signer,
- TEST_ERC20,
- amount3,
- CHAIN_ID_BSC,
- hexToUint8Array(
- nativeToHexString(await signer.getAddress(), CHAIN_ID_ETH) || ""
- )
- );
- // get the sequence from the logs (needed to fetch the vaa)
- const sequence3 = parseSequenceFromLogEth(receipt3, ETH_CORE_BRIDGE_ADDRESS);
- console.log(`FIRST TX, SEQ ${sequence3}`);
- for (let i = 1; i <= 20; i++) {
- console.log(`Attempt ${i}`);
- await axios.post("http://localhost:8545", {
- id: 1337,
- jsonrpc: "2.0",
- method: "evm_mine",
- params: [Date.now()],
- });
- console.log(`Height ${await provider.getBlockNumber()}`);
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence3,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- }
- console.log("Checking SEQ from test 2");
- try {
- const { vaaBytes: signedVAA } = await getSignedVAA(
- WORMHOLE_RPC_HOST,
- CHAIN_ID_ETH,
- emitterAddress,
- sequence2,
- {
- transport: NodeHttpTransport(),
- }
- );
- console.log(!!signedVAA);
- } catch (e) {
- console.error(e.message);
- }
- provider.destroy();
- })();
|