diff --git a/.env.homa b/.env.homa deleted file mode 100644 index 5461b1d..0000000 --- a/.env.homa +++ /dev/null @@ -1,14 +0,0 @@ -### testnet urls -# relayer addr: 0xe3234f433914d4cfcf846491ec5a7831ab9f0bb3 -# relayer substrate addr: 5C82pcyrgW1gCm3jS8yBjo9AEp9HCUXiUkuKA1zWWiACgw1C - -KARURA_ETH_RPC=https://eth-rpc-karura-testnet.aca-staging.network -KARURA_NODE_URL=wss://karura-testnet.aca-staging.network/rpc/karura/ws -KARURA_PRIVATE_KEY=efb03e3f4fd8b3d7f9b14de6c6fb95044e2321d6bcb9dfe287ba987920254044 - -ACALA_ETH_RPC=http://localhost:8545 -ACALA_NODE_URL=ws://localhost:8000 -ACALA_PRIVATE_KEY=efb03e3f4fd8b3d7f9b14de6c6fb95044e2321d6bcb9dfe287ba987920254044 - -PORT=3111 -TESTNET_MODE=0 \ No newline at end of file diff --git a/.gitignore b/.gitignore index dfab4c9..cae1829 100644 --- a/.gitignore +++ b/.gitignore @@ -106,4 +106,6 @@ dist **/.env -db.* \ No newline at end of file +db.* + +.env.prod \ No newline at end of file diff --git a/src/__tests__/configs/acala.yml b/src/__tests__/configs/acala.yml index aa9ea09..4f15377 100644 --- a/src/__tests__/configs/acala.yml +++ b/src/__tests__/configs/acala.yml @@ -2,7 +2,8 @@ endpoint: - wss://acala-rpc.aca-api.network - wss://acala-rpc.dwellir.com mock-signature-host: true -block: ${env.ACALA_BLOCK_NUMBER} +# block: ${env.ACALA_BLOCK_NUMBER} +block: 6510220 db: ./db.sqlite runtime-log-level: 5 @@ -84,8 +85,12 @@ import-storage: - 249LSvsEyxS4VpEJGg62yhYA7sHy1KcgGW6KzACBCLW1RsZF EvmAccounts: EvmAddresses: + - - - 246gNkjCexYRsCpdjtVhz35sHjcb21jpqipzT9u4uwKV8iEE + - '0xe3234f433914d4cfCF846491EC5a7831ab9f0bb3' - - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - '0x75E480dB528101a381Ce68544611C169Ad7EB342' Accounts: + - - - '0xe3234f433914d4cfCF846491EC5a7831ab9f0bb3' + - 246gNkjCexYRsCpdjtVhz35sHjcb21jpqipzT9u4uwKV8iEE - - - '0x75E480dB528101a381Ce68544611C169Ad7EB342' - - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY \ No newline at end of file + - 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY diff --git a/src/__tests__/relay.test.ts b/src/__tests__/relay.test.ts index 84c7d9b..3c6f911 100644 --- a/src/__tests__/relay.test.ts +++ b/src/__tests__/relay.test.ts @@ -1,21 +1,33 @@ +import { AcalaJsonRpcProvider } from '@acala-network/eth-providers'; import { CHAIN_ID_ACALA } from '@certusone/wormhole-sdk'; +import { ERC20__factory } from '@acala-network/asset-router/dist/typechain-types'; import { describe, expect, it } from 'vitest'; -import { RELAYER_URL } from '../consts'; +import { ETH_RPC } from '../consts'; +import { TEST_ADDR_RELAYER } from './testConsts'; +import { VAA_TRANSFER_10_USDC_ETH_TO_ACALA } from './vaa'; import { relay } from './testUtils'; -const VAA_TRANSFER_10_USDC = '01000000040d000f5a53b35d8e8721a66f7e03bd35dfed45d9879fbc0d16c33e10957a04956d9a4669095edf0bee17cd6425529b95b6e5406176a17477c681376e0c90b527b3fa01024314e57f709f33a630cc298216fac3079ad33934d1851b253d2946d61d7ab63746380f4866b99e2d359323e35276bc98281cabc6bd49b2e33ae3cb490d34660c0004d76d33d7726bc5257bb1f4cc5476435daba0fba24c462cf66042808308114c02685f6468bb8cabfe6f6e09064cd7baf1df261b0cfda93da3e3ad7a0a64a6747301063d3642068ad9b73966ccfb34cf399216a28e9e86ba2d94fa077fd477418167462fb6d69bf49f174671d00d92b63959327151bb22282b12ccbc74e8ea622ea7c70107696a2cac5b9c5e9b8f00e41edb4c224bc7315b2d7b18ad0b22ca9c0e068c17c31a4fff7cfb5512c930d84afc432752704774525cc841001985bc1fc07fce37f900086895a80e8dd2fefb190cda2744c79e8f0bf6e18ccd837d731244bdc7dccbf57b176a1e9c2e3196dbb9e748e1548ae46bb422baba2157d2afb5633ff09dced6ad00094dfabeaa190e53ba9ddf7bdc3faef8563052637939135fc2631d9dbdbac403f61f4861a7ba1dea2445864641e8b069b5ba655a0097dfd17a4bade8cfaabcaaa4010ad534c20b0d91d0fdc0ccc3441faba13a71f4eaac7683c6f3941b21af8233493f25ba3e43f99080565371d621fab70577d913a7c6f28caf928642bf71dd11e46f000cf8e983f8d21aa830e563e41e7f3c4a723bafe6cd01302faeee5ef4d336c0617c38cde3ea4fc0b08bbbe870c6fae1c7437cd589be131c6087bf61e554ac89f499000eaf6e59952fe8cc208f85238a3524302eae5f6742b926518b283fa71a5f4a9ce856399e67e9a9ba7da40ae041516acc36e3d6ed943f7bbc27d19f3107ffab7241000f1ed262dcca1b61b3e5ee0f80e4cecb0bbeef1bd36ca9183c407bfee998164f7c5c0b3753fd99d35035c22dab7b935b6fcfb28ae71129171a57905705d55f3c320111bdb5458a53c75f87e2084c08ecf3eb74b097213b049d17d1a70ac1c5073077d25e07ac99aa1c04379a7211661a4edae6a727681c5ed4e03f05fba37066f19a1900122fb0912cdb5b70eb4a7e825adb4808a6d92a2d890fa9e4542b5ec1ed68eb17930ee63a02d48eab6aa5494ffbb8e16ec4e50952035969e946f6e762b80087d900016683d9bfea6a010000020000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa58500000000000495e1010100000000000000000000000000000000000000000000000000000000009fba65000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480002000000000000000000000000bbbba9ebe50f9456e106e6ef2992179182889999000c0000000000000000000000000000000000000000000000000000000000000000'; +const provider = new AcalaJsonRpcProvider(ETH_RPC.LOCAL); + +const USDC_ADDR = '0x07DF96D1341A7d16Ba1AD431E2c847d978BC2bCe'; +const USER_ADDR = '0xBbBBa9Ebe50f9456E106e6ef2992179182889999'; describe('/relay', () => { - describe('relay USDC', () => { - it('works', async () => { - console.log(`relaying with ${RELAYER_URL.RELAY}`); - const result = await relay({ - targetChain: CHAIN_ID_ACALA, - signedVAA: VAA_TRANSFER_10_USDC, - }); + it('relay USDC to user', async () => { + const dai = ERC20__factory.connect(USDC_ADDR, provider); + const curBalRelayer = (await dai.balanceOf(USER_ADDR)).toBigInt(); + console.log({ curBalRelayer }); - expect(result.data?.status).to.eq(1); + const result = await relay({ + targetChain: CHAIN_ID_ACALA, + signedVAA: VAA_TRANSFER_10_USDC_ETH_TO_ACALA, }); + expect(result.data?.status).to.eq(1); + + const afterBalRelayer = (await dai.balanceOf(USER_ADDR)).toBigInt(); + console.log({ afterBalRelayer }); + + expect(afterBalRelayer - curBalRelayer).to.eq(10467941n); // 10.467941 USDC }); }); diff --git a/src/__tests__/route.test.ts b/src/__tests__/route.test.ts index dcf71c0..87e3708 100644 --- a/src/__tests__/route.test.ts +++ b/src/__tests__/route.test.ts @@ -15,7 +15,11 @@ import { } from './testConsts'; import { ETH_RPC, FUJI_TOKEN, GOERLI_USDC, PARA_ID } from '../consts'; import { - encodeXcmDest, + VAA_RANDOM_TOKEN_BSC_TO_ACALA, + VAA_TINY_AMOUNT_DAI_BSC_TO_ACALA, + VAA_TRANSFER_10_USDC_ETH_TO_ACALA, +} from './vaa'; +import { expectError, expectErrorData, getBasiliskUsdcBalance, @@ -27,132 +31,94 @@ import { shouldRouteWormhole, shouldRouteXcm, transferFromFujiToKaruraTestnet, + transferToRouter, } from './testUtils'; import { getSignedVAAFromSequence } from '../utils'; -const destAddr = 'bXmPf7DcVmFuHEmzH3UX8t6AUkfNQW8pnTeXGhFhqbfngjAak'; -const dest = encodeXcmDest({ - V3: { - parents: 1, - interior: { - X2: [ - { parachain: 2090 }, - { accountId32: destAddr }, - ], - }, - }, -}); +const DAI_ADDR = '0x54A37A01cD75B616D63E0ab665bFfdb0143c52AE'; -const providerKarura = new AcalaJsonRpcProvider(ETH_RPC.KARURA_TESTNET); -const relayerKarura = new Wallet(TEST_KEY.RELAYER, providerKarura); +const VAA_DAI_HYDRA = '01000000040d00d26a66904e780a5cff85cbc9b9b432eab98cafd7e44d49f1d1bbc36ee086e4086b057bb99e007c79753c39c2b801d88f9a76d6924c3f3284f710f1923c1475bf00016ca27e5fc37e4d2cbd99534dcc8baa57f3a658b4a9c238b2fae100510df897db37ab7166ea5ca0d6925cc908b9e487810f36faf84eb3f43f3c2f9297bc9572c201029a05af272025bad76145d52a5bc32b6ad06551fafa5b805aad0cfa7bcb8d0c6219524d2a10c71ba1393d1f94d9e0672c0b5090ffe225599dfff506c7753a4e870004545063222a09374c174cff07e92aa1823867b9bf59815f929cd8d67aa92dad1a6ddcf78ac9116ce4ae6f0f9d96c3940aa12b028234994e985c8dd8f4db9fd8c9010740fdef738b7fae5f6c5eb90a090dd27bcec1ae9652a14fa2d899bdc1b39563c35785976f12941d51a26adb7eaf64441319634e7bdb4ca5d434e31bc0bf8d3b8701097380e1a231bb02eec28a57fb03cd3a7ecfd675fba64d5d7e1667545ad79011c32f4516739fb4364a4888f1b02de1473aeb241e84963a3a11d3f4f7b6bc49859e010a1f124ecae48acef864556f60ccec8a0549545499ec33b22c3ec30054a1537e04142bc80877b75252d5d67598d18f88c13a7f2e7744d2e75259d0945bbc9c7288000d83817da0a40da3f2939f1d06c531179f7b5f4163180dbd6b3dbee84e44d261f02f07518c5c060af6a88d6efae78bd6f35578cbb7cea81c3d177485c84569f8ec010eaf4f1c3e672d98464eb8a05e13b61426b6c537d3321a7dc7065f5abb8c865cf16bcdd5eb20ea37fa2b4faeaf6feba147b7a213f04370dddd7ab46781bfda1f7c010f731a74b4cc9113741ece7d943619a2cd1b8b2a441a053e098f1344cc7d0028527bd096329da0be902724aa6f4d190a76ac90903d6e822364eaf174de5c2d102a011075156ae84288550bef7d96b929cda6244a14bee24daa2f8eda186375b3fc981d12a23c14f24151160d81f938c52929f66dd9402bca16b8316c84b4bdfc7a3a9100115f101d86b7dc0fa0e4b4a41097ce9369732706c87cd885416e39417f94e87caa71880572c11b1809bdbc5a44746256ef538bf55caeb9a58f18876aa1064f668e0012d30a833350b5408ccd9ede536b6e2a71e985d753583accc2f41f759e88496aed0934ddd8527e0c361871c134b7269534e5e24c9772e1f3b1c3f6d8a18c23b1dc01668646cb2982010000020000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585000000000004996b0101000000000000000000000000000000000000000000000000000000003c3360800000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0002000000000000000000000000c5dd20ed342cefece9e013d7d1763c398e987f7d000c0000000000000000000000000000000000000000000000000000000000000000'; -describe('/routeXcm', () => { - const api = new ApiPromise({ provider: new WsProvider(BASILISK_TESTNET_NODE_URL) }); +const routeArgs = { + dest: '0x04010200c91f0100525756d2a8c2bb099f2ac22c669bb5a1e5eaf94f687f7b7c5779b288b05bed75', + destParaId: '2034', // hydra + originAddr: '0x6b175474e89094c44da98b954eedeac495271d0f', // DAI +}; - beforeAll(async () => { await api.isReady; }); - afterAll(async () => { await api.disconnect(); }); +const provider = new AcalaJsonRpcProvider(ETH_RPC.LOCAL); +const relayer = new Wallet(TEST_KEY.RELAYER, provider); +describe('/routeXcm', () => { it('when should route', async () => { - const routeArgs = { - dest, - destParaId: PARA_ID.BASILISK, - originAddr: GOERLI_USDC, - }; - const res = await shouldRouteXcm(routeArgs); const { routerAddr } = res.data; - console.log('xcming to router ...'); - await mockXcmToRouter(routerAddr, relayerKarura); + console.log('transferring to router ...'); + await transferToRouter(routerAddr, relayer); - const curBalUser = await getBasiliskUsdcBalance(api, destAddr); - console.log({ curBalUser }); + const dai = ERC20__factory.connect(DAI_ADDR, provider); + const curBalRelayer = (await dai.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); + console.log({ curBalRelayer }); console.log('routing ...'); const routeRes = await routeXcm(routeArgs); console.log(`route finished! txHash: ${routeRes.data}`); - console.log('waiting for token to arrive at basilisk ...'); - await sleep(25000); + const afterBalRelayer = (await dai.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); + console.log({ afterBalRelayer }); - const afterBalUser = await getBasiliskUsdcBalance(api, destAddr); - console.log({ afterBalUser }); + expect(afterBalRelayer - curBalRelayer).to.eq(40000000000000000n); + expect((await dai.balanceOf(routerAddr)).toBigInt()).to.eq(0n); - // expect(afterBalUser - curBalUser).to.eq(800n); // 1000 - 200 + // router should be destroyed + const routerCode = await provider.getCode(routerAddr); + expect(routerCode).to.eq('0x'); }); // describe.skip('when should not route', () => {}) }); -describe('/relayAndRoute', () => { - const api = new ApiPromise({ provider: new WsProvider(BASILISK_TESTNET_NODE_URL) }); - const usdc = ERC20__factory.connect(KARURA_USDC_ADDRESS, providerKarura); - - beforeAll(async () => { await api.isReady; }); - afterAll(async () => { await api.disconnect(); }); - +describe.only('/relayAndRoute', () => { it('when should route', async () => { - const routeArgs = { - dest, - destParaId: PARA_ID.BASILISK, - originAddr: GOERLI_USDC, - }; - - const curBalUser = await getBasiliskUsdcBalance(api, destAddr); - const curBalRelayer = (await usdc.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); - console.log({ curBalUser, curBalRelayer }); - const { routerAddr } = (await shouldRouteXcm(routeArgs)).data; console.log({ routerAddr }); - const signedVAA = await transferFromFujiToKaruraTestnet('0.001', FUJI_TOKEN.USDC, routerAddr); - console.log({ signedVAA }); - const relayAndRouteArgs = { ...routeArgs, - signedVAA, + signedVAA: VAA_DAI_HYDRA, }; - const wormholeWithdrawFilter = usdc.filters.Transfer( + const dai = ERC20__factory.connect(DAI_ADDR, provider); + const curBalRelayer = (await dai.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); + console.log({ curBalRelayer }); + + const wormholeWithdrawFilter = dai.filters.Transfer( '0x0000000000000000000000000000000000000000', routerAddr, ); - usdc.once(wormholeWithdrawFilter, (_from, _to, _value, event) => { + dai.once(wormholeWithdrawFilter, (_from, _to, _value, event) => { console.log(`relay finished! txHash: ${event.transactionHash}`); }); const res = await relayAndRoute(relayAndRouteArgs); console.log(`route finished! txHash: ${res.data}`); - console.log('waiting for token to arrive at basilisk ...'); - await sleep(25000); + const afterBalRelayer = (await dai.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); + console.log({ afterBalRelayer }); - const afterBalUser = await getBasiliskUsdcBalance(api, destAddr); - const afterBalRelayer = (await usdc.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); - console.log({ afterBalUser, afterBalRelayer }); - - expect(afterBalRelayer - curBalRelayer).to.eq(200n); - // expect(afterBalUser - curBalUser).to.eq(800n); // 1000 - 200 - expect((await usdc.balanceOf(routerAddr)).toBigInt()).to.eq(0n); + expect(afterBalRelayer - curBalRelayer).to.eq(40000000000000000n); + expect((await dai.balanceOf(routerAddr)).toBigInt()).to.eq(0n); // router should be destroyed - const routerCode = await providerKarura.getCode(routerAddr); + const routerCode = await provider.getCode(routerAddr); expect(routerCode).to.eq('0x'); }); it('when should not route', async () => { - const routeArgs = { - dest, - destParaId: PARA_ID.BASILISK, - originAddr: GOERLI_USDC, - }; - try { await relayAndRoute({ ...routeArgs, - - // bridge 0.000001 USDC - signedVAA: '010000000001004ba23fa55bcb370773bdba954523ea305f96f814f51ce259fb327b57d985eec86a0f69bf46c4bb444d09b1d70e3b2aaa434639ec3ae93f5d0671b3e38055cf3501648726ae4d36000000040000000000000000000000009dcf9d205c9de35334d646bee44b2d2859712a0900000000000012580f01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f00020000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b0000000000000000000000000000000000000000000000000000000000000000', + signedVAA: VAA_TINY_AMOUNT_DAI_BSC_TO_ACALA, // bridge 0.000001 DAI }); expect.fail('relayAndRoute did not throw when it should!'); @@ -163,9 +129,7 @@ describe('/relayAndRoute', () => { try { await relayAndRoute({ ...routeArgs, - - // bridge 10 TKN - signedVAA: '01000000000100689102e0be499c096acd1ac49a34216a32f8c19f1b053e0ff47e0a994ea302b50261b4c1feab4ae933fa8de83bd86efde12cc3b82da00b9b8ccc2d502e145ad2006487368e8f3a010000040000000000000000000000009dcf9d205c9de35334d646bee44b2d2859712a09000000000000125c0f01000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000009c8bcccdb17545658c6b84591567c6ed9b4d55bb000b0000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b0000000000000000000000000000000000000000000000000000000000000000', + signedVAA: VAA_RANDOM_TOKEN_BSC_TO_ACALA, }); expect.fail('relayAndRoute did not throw when it should!'); @@ -176,9 +140,7 @@ describe('/relayAndRoute', () => { try { await relayAndRouteBatch({ ...routeArgs, - - // invalid VAA - signedVAA: '01000000000100565399ecd3485d842c6e8677179e6a909977cf5be5bbce6273a3a5c06abceb9b79adf48f41f99beb852a48e5fec0f89e7465574c7e6e2034244272c7d3d436030164d0c59b2b670100000600000000000000000000000061e44e506ca5659e6c0bba9b678586fa2d7297560000000000001c38010100000000000000000000000000000000000000000000000000000000000003e800000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f00020000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b000000000000000000000000000000000000000000000000000000000000000' + '12345', + signedVAA: VAA_TRANSFER_10_USDC_ETH_TO_ACALA + '12345', // invalid VAA }); expect.fail('relayAndRoute did not throw when it should!'); @@ -191,107 +153,11 @@ describe('/relayAndRoute', () => { }); }); -describe('/relayAndRouteBatch', () => { - const api = new ApiPromise({ provider: new WsProvider(BASILISK_TESTNET_NODE_URL) }); - const usdc = ERC20__factory.connect(KARURA_USDC_ADDRESS, providerKarura); - - beforeAll(async () => { await api.isReady; }); - afterAll(async () => { await api.disconnect(); }); - - it('when should route', async () => { - const routeArgs = { - dest, - destParaId: PARA_ID.BASILISK, - originAddr: GOERLI_USDC, - }; - - const curBalUser = await getBasiliskUsdcBalance(api, destAddr); - const curBalRelayer = (await usdc.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); - console.log({ curBalUser, curBalRelayer }); - - const { routerAddr } = (await shouldRouteXcm(routeArgs)).data; - console.log({ routerAddr }); - - const signedVAA = await transferFromFujiToKaruraTestnet('0.001', FUJI_TOKEN.USDC, routerAddr); - console.log({ signedVAA }); - - const relayAndRouteArgs = { - ...routeArgs, - signedVAA, - }; - - const res = await relayAndRouteBatch(relayAndRouteArgs); - console.log(`batch relay and route finished! txHash: ${res.data}`); - - console.log('waiting for token to arrive at basilisk ...'); - await sleep(25000); - - const afterBalUser = await getBasiliskUsdcBalance(api, destAddr); - const afterBalRelayer = (await usdc.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); - console.log({ afterBalUser, afterBalRelayer }); - - // expect(afterBalRelayer - curBalRelayer).to.eq(200n); - // expect(afterBalUser - curBalUser).to.eq(800n); // 1000 - 200 - expect((await usdc.balanceOf(routerAddr)).toBigInt()).to.eq(0n); - - // router should be destroyed - const routerCode = await providerKarura.getCode(routerAddr); - expect(routerCode).to.eq('0x'); - }); - - it('when should not route', async () => { - const routeArgs = { - dest, - destParaId: PARA_ID.BASILISK, - originAddr: GOERLI_USDC, - }; - - try { - await relayAndRouteBatch({ - ...routeArgs, - - // bridge 0.000001 USDC - signedVAA: '010000000001004ba23fa55bcb370773bdba954523ea305f96f814f51ce259fb327b57d985eec86a0f69bf46c4bb444d09b1d70e3b2aaa434639ec3ae93f5d0671b3e38055cf3501648726ae4d36000000040000000000000000000000009dcf9d205c9de35334d646bee44b2d2859712a0900000000000012580f01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f00020000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b0000000000000000000000000000000000000000000000000000000000000000', - }); - - expect.fail('relayAndRouteBatch did not throw when it should!'); - } catch (err) { - expectError(err, 'token amount too small to relay', 500); - } - - try { - await relayAndRouteBatch({ - ...routeArgs, - - // bridge 10 TKN - signedVAA: '01000000000100689102e0be499c096acd1ac49a34216a32f8c19f1b053e0ff47e0a994ea302b50261b4c1feab4ae933fa8de83bd86efde12cc3b82da00b9b8ccc2d502e145ad2006487368e8f3a010000040000000000000000000000009dcf9d205c9de35334d646bee44b2d2859712a09000000000000125c0f01000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000009c8bcccdb17545658c6b84591567c6ed9b4d55bb000b0000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b0000000000000000000000000000000000000000000000000000000000000000', - }); - - expect.fail('relayAndRouteBatch did not throw when it should!'); - } catch (err) { - expectError(err, 'unsupported token', 500); - } - - try { - await relayAndRouteBatch({ - ...routeArgs, - - // invalid VAA - signedVAA: '01000000000100565399ecd3485d842c6e8677179e6a909977cf5be5bbce6273a3a5c06abceb9b79adf48f41f99beb852a48e5fec0f89e7465574c7e6e2034244272c7d3d436030164d0c59b2b670100000600000000000000000000000061e44e506ca5659e6c0bba9b678586fa2d7297560000000000001c38010100000000000000000000000000000000000000000000000000000000000003e800000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f00020000000000000000000000008341cd8b7bd360461fe3ce01422fe3e24628262f000b000000000000000000000000000000000000000000000000000000000000000' + '12345', - }); - - expect.fail('relayAndRouteBatch did not throw when it should!'); - } catch (err) { - expectError(err, 'failed to estimate gas limit', 500); - expectErrorData(err, errData => { - expect(errData.params.err.reason).to.contain('VM signature invalid'); - }); - } - }); -}); +// not in use +describe.skip('/relayAndRouteBatch', () => {}); describe('/routeWormhole', () => { - const usdcK = ERC20__factory.connect(KARURA_USDC_ADDRESS, providerKarura); + const usdcK = ERC20__factory.connect(KARURA_USDC_ADDRESS, provider); const usdcF = ERC20__factory.connect(FUJI_TOKEN.USDC, new JsonRpcProvider(ETH_RPC.FUJI)); it('when should route', async () => { @@ -306,7 +172,7 @@ describe('/routeWormhole', () => { const { routerAddr } = res.data; console.log('xcming to router ...'); - await mockXcmToRouter(routerAddr, relayerKarura); + await mockXcmToRouter(routerAddr, relayer); const curBalUser = (await usdcF.balanceOf(TEST_ADDR_USER)).toBigInt(); const curBalRelayer = (await usdcK.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); @@ -319,11 +185,11 @@ describe('/routeWormhole', () => { // router should be destroyed expect((await usdcK.balanceOf(routerAddr)).toBigInt()).to.eq(0n); - const routerCode = await providerKarura.getCode(routerAddr); + const routerCode = await provider.getCode(routerAddr); expect(routerCode).to.eq('0x'); /* ---------- should be able to redeem from eth ---------- */ - const depositReceipt = await providerKarura.getTransactionReceipt(txHash); + const depositReceipt = await provider.getTransactionReceipt(txHash); const sequence = parseSequenceFromLogEth( depositReceipt as ContractReceipt, CONTRACTS.TESTNET.karura.core, @@ -350,7 +216,7 @@ describe('/routeWormhole', () => { const afterBalRelayer = (await usdcK.balanceOf(TEST_ADDR_RELAYER)).toBigInt(); console.log({ afterBalUser, afterBalRelayer }); - expect(afterBalRelayer - curBalRelayer).to.eq(200n); + expect(afterBalRelayer - curBalRelayer).to.eq(40000000000000000n); expect(afterBalUser - curBalUser).to.eq(800n); // 1000 - 200 }); diff --git a/src/__tests__/testUtils.ts b/src/__tests__/testUtils.ts index 9d14d9c..dadad07 100644 --- a/src/__tests__/testUtils.ts +++ b/src/__tests__/testUtils.ts @@ -38,11 +38,6 @@ export const transferFromFujiToKaruraTestnet = async ( ); }; -export const encodeXcmDest = (_data: any) => { - // TODO: use api to encode - return '0x03010200a9200100d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d'; -}; - export const getBasiliskUsdcBalance = async (api: ApiPromise, addr: string) => { const balance = await api.query.tokens.accounts(addr, 3); return (balance as any).free.toBigInt(); diff --git a/src/__tests__/vaa.ts b/src/__tests__/vaa.ts new file mode 100644 index 0000000..78ca27c --- /dev/null +++ b/src/__tests__/vaa.ts @@ -0,0 +1,5 @@ +export const VAA_TRANSFER_10_USDC_ETH_TO_ACALA = '01000000040d000f5a53b35d8e8721a66f7e03bd35dfed45d9879fbc0d16c33e10957a04956d9a4669095edf0bee17cd6425529b95b6e5406176a17477c681376e0c90b527b3fa01024314e57f709f33a630cc298216fac3079ad33934d1851b253d2946d61d7ab63746380f4866b99e2d359323e35276bc98281cabc6bd49b2e33ae3cb490d34660c0004d76d33d7726bc5257bb1f4cc5476435daba0fba24c462cf66042808308114c02685f6468bb8cabfe6f6e09064cd7baf1df261b0cfda93da3e3ad7a0a64a6747301063d3642068ad9b73966ccfb34cf399216a28e9e86ba2d94fa077fd477418167462fb6d69bf49f174671d00d92b63959327151bb22282b12ccbc74e8ea622ea7c70107696a2cac5b9c5e9b8f00e41edb4c224bc7315b2d7b18ad0b22ca9c0e068c17c31a4fff7cfb5512c930d84afc432752704774525cc841001985bc1fc07fce37f900086895a80e8dd2fefb190cda2744c79e8f0bf6e18ccd837d731244bdc7dccbf57b176a1e9c2e3196dbb9e748e1548ae46bb422baba2157d2afb5633ff09dced6ad00094dfabeaa190e53ba9ddf7bdc3faef8563052637939135fc2631d9dbdbac403f61f4861a7ba1dea2445864641e8b069b5ba655a0097dfd17a4bade8cfaabcaaa4010ad534c20b0d91d0fdc0ccc3441faba13a71f4eaac7683c6f3941b21af8233493f25ba3e43f99080565371d621fab70577d913a7c6f28caf928642bf71dd11e46f000cf8e983f8d21aa830e563e41e7f3c4a723bafe6cd01302faeee5ef4d336c0617c38cde3ea4fc0b08bbbe870c6fae1c7437cd589be131c6087bf61e554ac89f499000eaf6e59952fe8cc208f85238a3524302eae5f6742b926518b283fa71a5f4a9ce856399e67e9a9ba7da40ae041516acc36e3d6ed943f7bbc27d19f3107ffab7241000f1ed262dcca1b61b3e5ee0f80e4cecb0bbeef1bd36ca9183c407bfee998164f7c5c0b3753fd99d35035c22dab7b935b6fcfb28ae71129171a57905705d55f3c320111bdb5458a53c75f87e2084c08ecf3eb74b097213b049d17d1a70ac1c5073077d25e07ac99aa1c04379a7211661a4edae6a727681c5ed4e03f05fba37066f19a1900122fb0912cdb5b70eb4a7e825adb4808a6d92a2d890fa9e4542b5ec1ed68eb17930ee63a02d48eab6aa5494ffbb8e16ec4e50952035969e946f6e762b80087d900016683d9bfea6a010000020000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa58500000000000495e1010100000000000000000000000000000000000000000000000000000000009fba65000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480002000000000000000000000000bbbba9ebe50f9456e106e6ef2992179182889999000c0000000000000000000000000000000000000000000000000000000000000000'; + +export const VAA_TINY_AMOUNT_DAI_BSC_TO_ACALA = '01000000040d0004ca4b1f445c4f3b9978a04f6ca0a371cdb5cf09e051a65e5ceda85841a1ea192128a3ea34b12d278f1f7911bd3d02acbd7d242a56e6f927479c40cd9a26d3d001012b78e132f2d0b2b46e4e2d0e9747c55572395e7cbf23cf007806651207dbfb387701cf97ca123c69cd0e86c7c6d404d90718c4938c4ae6f13706ad071808071b0102b72fa0e5b67766bf85b72345d7846c518a1bc8bb34849520945e61ebf57fc5e6144fcb3fcf2d1338e387acd76060fedd9700649976dfb99dbfeb90b61406e6f300031fb168e74094098d693ab0c335072a0f98d78cf50947c4cdb5d13e03e1c7997222971aa478e53fd302964a9d74e4cec4b4a3e97897a8209e27eb65ca8f011bad01060c15b92717afa2d94b47533c9ce962a1bc6d672c0bc2d12768a70d52d6bc6dde4b7fe064a451e490b8e451ed7cd86fb5b4cb4adb59bbfd72267e483f8e5366b6000735eeb73de11f48353fff8eb72a5afcf1a8b3140ec4af33c594c45a0a79cb2d6e4a1f583662ff76ddc807ee0b81270e07b00eaf6754bfbc575b4e73a7bf23bbe40009764448acabb0f8e829e6093a5d5c11fa5987c65caf7aeae8d11cb2a42667278e7b6d64d86cf703934662027078138b7b95ae385f679a2ccf19653ec5e7d532b1000caf246fa442403dc83549ac7326e9b3a0fb45e9a79e09845671917a17d49e3793647b1a376a21b444c06e7c3dda0711c5bd86d8da684bd0741169b5bd8e70878b000d497781332f7b5845ad798aa735993c8d43bb787d7fc5a1a20dcfa6c89765d03f09f0f7b95eccf6d96bcec147b6dd0306b91274bed39506c136d1830afb731694000f41fff97fea7cf32580f882aea65d0f7732c0cb76bff6d107aa81a16f45ab00ee22455c41dbbaefceb1e6390ba5f5dcb19c1c6f075d05c2daf3038081a22de48600103a0d9e9fbf0a4536b8c8ee0d67e1f26f856f844b869e4eb75bf1970bc55f7c5912812a098dbe66a9436777986443c1d23293ad5dedba23c4212cb2cac4f020af01115ca64e67dfcff726bd7f278dd4e53f6d1abb1d0d48071786c5b9d32e0e19417275bbaff7968b14cc49581eef61c746cd4e7adfb969fe3a5d187a4160079e94630012c3e1a939740b6febbfc44bb2474f650d449d3d77c7ee4f2acfd2e4e60e9f55d676bb4c8127d0e50398e02a97fa2b3b1f8b70188cd7139a9efa79d6d2ccdc85cb01668697eeb64601000004000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7000000000008c9660f0100000000000000000000000000000000000000000000000000000000000000640000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0002000000000000000000000000bbbba9ebe50f9456e106e6ef2992179182889999000c0000000000000000000000000000000000000000000000000000000000000000'; + +export const VAA_RANDOM_TOKEN_BSC_TO_ACALA = '01000000040d006745dfb84b8181d1050e56216534f7e9eff6bad4486879c7fcf74a49eceade6d145146237abc05c401a02da45b50eb7ff73e77b7bc55dba57b27cf58b984d158010108b635568e4725400a5583570f0f171f596758b094425031fc673da1122917f876e932989a0d4ae40ef36e2f85349e00cdb212c37df54bcc031803ab4b25f82d000305a7a1c1fc6445b4f966cc4aac30a7e6522ee6e5e3baff7b9b67659b23d170b9658a9dc5afb246cb6c373d40e872e3a3271b053e3ab87cd21ed793b223da342a0004e7e74a8fcc20a6b4ba727b72ebc91a5125c2a5535cced87314d0a46e0de9a58a512387f29994ea7262ea9d24233e008c1f4864aaeb5692737e6067a398fb51840006db57ebe1dc85e2efb440f475dd4d6a345e351c37ce87bbfe9728581e30b1234f68cc4567dcda89e62cd2c1dc24d080501d26583a727f6b51203a029ba6404e86010781d3323a0e581e45ba25ade33e0dfd293ae90540975def1903cdae01356db24c1cdb6021f3670dff46742ff1fcab7fcf35aa55aeb634984642ccf87f99f94429000905df12dafdb9935e36253593a9343aaded2a47e664e8665ffa219ff893e225422fad14b253b7f954b055ca90b5c64bb916ea5b92b1d825387bf0d2843deb9d61010a4f867a562272018325eb96dcd8c0c6bf1a96a43b9015f39128af7e9b248bc5863511687fa46da5b9a543188768a2407018b6abfffd88307031744c658f23b2d5010dc068244c9a36aeab917ca6bb9214450b373cc96939de6530a405cc7d6b0917d510ab68ef93b36e0789d29159ca17519bfe86f8fff61b6785f61e05be17106bdc010f85def2429b5517e23303ad109d0fca25c9d85c48fabdf8b71e58c5f40c098bee48b88db8aa70a12f7be5ba17f7d082ae0e288fc68a28eda7ea8e26fd73cdabc001106d81952d8981b1d547872e1ca23272de557da86c110acfabe53aed43154c4b8b62027a950967a0e5529f65ec367613c773b55d50f5607f8b7419435f62843d2201117faacf31751887b9be9e46acac3b069aa7688da5c497efbb2cd72bf05586f9181c338072378b3a54426afdb3c7849981333d4f271fbcff7f2b39fe41629ac2f101126c776f391e0352b2135e6d4d5f9f3f19a820d4b15f8ede09edd7238363e3f3b45ce25bb5c0a5df388bafce9daa70ff67ca6214d7cb0da1e27bed69ef397d14cb0166869ded4b8600000004000000000000000000000000b6f6d86a8f9879a9c87f643768d9efc38c1da6e7000000000008c9750f010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a3fff4e9d3d5a34088b36949a10e35403797c6cb0004000000000000000000000000bbbba9ebe50f9456e106e6ef2992179182889999000c0000000000000000000000000000000000000000000000000000000000000000';