From 57c58945813b0c1286c185fc1f6e2d4d31e1b4ee Mon Sep 17 00:00:00 2001 From: npty Date: Mon, 6 Nov 2023 21:12:21 +0700 Subject: [PATCH] chore: refactor scripts --- package-lock.json | 6 + packages/axelar-local-dev-cosmos/.gitignore | 3 + .../axelar/bin/04-register-broadcaster.sh | 18 -- .../docker/axelar/bin/init_axelar.sh | 1 + .../axelar/bin/{ => libs}/activate-chain.sh | 3 +- .../broadcast-unsigned-multi-tx.sh} | 0 .../docker/axelar/bin/libs/evm-rpc.toml | 24 +++ .../docker/axelar/bin/{ => libs}/params.json | 0 .../docker/axelar/bin/setup.sh | 13 ++ .../axelar/bin/{ => steps}/01-add-chain.sh | 7 +- .../bin/{ => steps}/02-add-cosmos-chain.sh | 5 +- .../bin/{ => steps}/03-register-asset.sh | 3 +- .../bin/steps/04-register-broadcaster.sh | 30 +++ packages/axelar-local-dev-cosmos/package.json | 3 +- .../axelar-local-dev-cosmos/scripts/clean.sh | 7 + .../axelar-local-dev-cosmos/scripts/start.ts | 3 + .../src/__tests__/ibc-relayer-client.spec.ts | 17 ++ .../src/__tests__/listener.e2e.ts | 69 ++++++- .../src/clients/CosmosClient.ts | 2 + .../src/clients/CosmosRelayerClient.ts | 12 ++ .../src/clients/IBCRelayerClient.ts | 190 +++++++++++++++--- .../src/docker/start.ts | 3 + packages/axelar-local-dev-cosmos/src/index.ts | 1 + .../src/listeners/AxelarListener.ts | 73 +++++++ .../src/listeners/eventTypes.ts | 38 ++++ .../src/listeners/index.ts | 2 + .../src/listeners/parser.ts | 73 +++++++ packages/axelar-local-dev-cosmos/src/types.ts | 70 +++++++ .../wasm/send_receive.wasm | Bin 0 -> 200510 bytes 29 files changed, 619 insertions(+), 57 deletions(-) delete mode 100755 packages/axelar-local-dev-cosmos/docker/axelar/bin/04-register-broadcaster.sh rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{ => libs}/activate-chain.sh (90%) rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{broadcast-unsigned-tx.sh => libs/broadcast-unsigned-multi-tx.sh} (100%) create mode 100644 packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/evm-rpc.toml rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{ => libs}/params.json (100%) create mode 100755 packages/axelar-local-dev-cosmos/docker/axelar/bin/setup.sh rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{ => steps}/01-add-chain.sh (74%) rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{ => steps}/02-add-cosmos-chain.sh (85%) rename packages/axelar-local-dev-cosmos/docker/axelar/bin/{ => steps}/03-register-asset.sh (90%) create mode 100755 packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/04-register-broadcaster.sh create mode 100755 packages/axelar-local-dev-cosmos/scripts/clean.sh create mode 100644 packages/axelar-local-dev-cosmos/src/clients/CosmosRelayerClient.ts create mode 100644 packages/axelar-local-dev-cosmos/src/listeners/AxelarListener.ts create mode 100644 packages/axelar-local-dev-cosmos/src/listeners/eventTypes.ts create mode 100644 packages/axelar-local-dev-cosmos/src/listeners/index.ts create mode 100644 packages/axelar-local-dev-cosmos/src/listeners/parser.ts create mode 100644 packages/axelar-local-dev-cosmos/wasm/send_receive.wasm diff --git a/package-lock.json b/package-lock.json index 64ef2906..01917704 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23504,6 +23504,11 @@ "node": ">= 0.10" } }, + "node_modules/reconnecting-websocket": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz", + "integrity": "sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==" + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -30484,6 +30489,7 @@ "@cosmjs/cosmwasm-stargate": "^0.31.1", "@cosmjs/stargate": "^0.31.1", "@types/sinon": "^10.0.20", + "reconnecting-websocket": "^4.4.0", "sinon": "^17.0.0" }, "devDependencies": { diff --git a/packages/axelar-local-dev-cosmos/.gitignore b/packages/axelar-local-dev-cosmos/.gitignore index aa554534..053920fe 100644 --- a/packages/axelar-local-dev-cosmos/.gitignore +++ b/packages/axelar-local-dev-cosmos/.gitignore @@ -3,3 +3,6 @@ # Docker docker/**/.* config.json +channel.json +connection.json +info/* diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/04-register-broadcaster.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/04-register-broadcaster.sh deleted file mode 100755 index 7d20cebf..00000000 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/04-register-broadcaster.sh +++ /dev/null @@ -1,18 +0,0 @@ - -#!/bin/sh - -CHAIN_ID=axelar -HOME=/root/private/.axelar -DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" - -echo "Registering broadcaster" -docker exec -it axelar /bin/sh -c "axelard tx snapshot register-proxy \$(axelard keys show owner -a ${DEFAULT_KEYS_FLAGS}) --generate-only \ ---chain-id ${CHAIN_ID} --from \$(axelard keys show governance -a ${DEFAULT_KEYS_FLAGS}) ${DEFAULT_KEYS_FLAGS} \ ---output json --gas 1000000 &> ${HOME}/unsigned_msg.json" -docker exec -t axelar /bin/sh -c "cat ${HOME}/unsigned_msg.json" -echo "Registered broadcaster" - -sh broadcast-unsigned-tx.sh - - - diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/init_axelar.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/init_axelar.sh index e65665b8..8ac74d9b 100755 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/init_axelar.sh +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/init_axelar.sh @@ -30,6 +30,7 @@ sed -i '/\[api\]/,/\[/ s/swagger = false/swagger = true/' "$HOME"/config/app.tom # staking/governance token is hardcoded in config, change this sed -i "s/\"stake\"/\"$DENOM\"/" "$HOME"/config/genesis.json && echo "Updated staking token to $DENOM" + # Adding a new key named 'owner' with a test keyring-backend in the specified home directory # and storing the mnemonic in the mnemonic.txt file mnemonic=$(axelard keys add owner ${DEFAULT_KEYS_FLAGS} 2>&1 | tail -n 1) diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/activate-chain.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/activate-chain.sh similarity index 90% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/activate-chain.sh rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/activate-chain.sh index 6996c94f..6722f458 100755 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/activate-chain.sh +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/activate-chain.sh @@ -4,6 +4,7 @@ CHAIN_ID=axelar HOME=/root/private/.axelar DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" CHAIN=$1 +DIR="$(dirname "$0")" if [ -z "$CHAIN" ] then @@ -18,4 +19,4 @@ docker exec -it axelar /bin/sh -c "axelard tx nexus activate-chain ${CHAIN} --ge echo "Activated chain ${CHAIN}" docker exec -t axelar /bin/sh -c "cat ${HOME}/unsigned_msg.json" -sh broadcast-unsigned-tx.sh +sh "$DIR/broadcast-unsigned-multi-tx.sh" diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/broadcast-unsigned-tx.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/broadcast-unsigned-multi-tx.sh similarity index 100% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/broadcast-unsigned-tx.sh rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/broadcast-unsigned-multi-tx.sh diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/evm-rpc.toml b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/evm-rpc.toml new file mode 100644 index 00000000..0ed30c4c --- /dev/null +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/evm-rpc.toml @@ -0,0 +1,24 @@ +[[axelar_bridge_evm]] +name = "Ethereum" +rpc_addr = "localhost:8500/0" +start-with-bridge = false + +[[axelar_bridge_evm]] +name = "Avalanche" +rpc_addr = "localhost:8500/1" +start-with-bridge = false + +[[axelar_bridge_evm]] +name = "Fantom" +rpc_addr = "localhost:8500/2" +start-with-bridge = false + +[[axelar_bridge_evm]] +name = "Moonbeam" +rpc_addr = "localhost:8500/3" +start-with-bridge = false + +[[axelar_bridge_evm]] +name = "Polygon" +rpc_addr = "localhost:8500/4" +start-with-bridge = false diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/params.json b/packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/params.json similarity index 100% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/params.json rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/libs/params.json diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/setup.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/setup.sh new file mode 100755 index 00000000..44863d68 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/setup.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +EVM_CHAIN=ethereum +COSMOS_CHAIN=wasm + +# 1. Add EVM chain +sh ./steps/01-add-chain.sh ${EVM_CHAIN} + +# # 2. Add cosmos-based chain +sh ./steps/02-add-cosmos-chain.sh ${COSMOS_CHAIN} + +# # 3. Register Broadcaster Account and Maintainer +# sh ./steps/04-register-broadcaster.sh diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/01-add-chain.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/01-add-chain.sh similarity index 74% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/01-add-chain.sh rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/01-add-chain.sh index 1cf913e0..51115fbb 100755 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/01-add-chain.sh +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/01-add-chain.sh @@ -4,6 +4,7 @@ CHAIN_ID=axelar HOME=/root/private/.axelar DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" CHAIN=$1 +DIR="$(dirname "$0")" if [ -z "$CHAIN" ] then @@ -11,10 +12,12 @@ then exit 1 fi -docker exec -it axelar /bin/sh -c "axelard tx evm add-chain ${CHAIN} /root/private/bin/params.json --generate-only \ +docker exec -it axelar /bin/sh -c "axelard tx evm add-chain ${CHAIN} /root/private/bin/libs/params.json --generate-only \ --chain-id ${CHAIN_ID} --from \$(axelard keys show governance -a ${DEFAULT_KEYS_FLAGS}) --home ${HOME} \ --output json --gas 500000 &> ${HOME}/unsigned_msg.json" echo "Added evm chain" docker exec -t axelar /bin/sh -c "cat ${HOME}/unsigned_msg.json" -sh broadcast-unsigned-tx.sh +sh "$DIR/../libs/broadcast-unsigned-multi-tx.sh" + +sh "$DIR/../libs/activate-chain.sh" ${CHAIN} diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/02-add-cosmos-chain.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/02-add-cosmos-chain.sh similarity index 85% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/02-add-cosmos-chain.sh rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/02-add-cosmos-chain.sh index 3c58e097..62d6957e 100755 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/02-add-cosmos-chain.sh +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/02-add-cosmos-chain.sh @@ -5,6 +5,7 @@ HOME=/root/private/.axelar DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" CHAIN=$1 CHANNEL_ID=${2:-channel-0} +DIR="$(dirname "$0")" if [ -z "$CHAIN" ] then @@ -21,4 +22,6 @@ docker exec -it axelar /bin/sh -c "axelard tx axelarnet add-cosmos-based-chain $ echo "Added cosmos-based chain" docker exec -t axelar /bin/sh -c "cat ${HOME}/unsigned_msg.json" -sh broadcast-unsigned-tx.sh +sh "$DIR/../libs/broadcast-unsigned-multi-tx.sh" + +sh "$DIR/../libs/activate-chain.sh" ${CHAIN} diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/03-register-asset.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/03-register-asset.sh similarity index 90% rename from packages/axelar-local-dev-cosmos/docker/axelar/bin/03-register-asset.sh rename to packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/03-register-asset.sh index fef713a7..70e6a4f4 100755 --- a/packages/axelar-local-dev-cosmos/docker/axelar/bin/03-register-asset.sh +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/03-register-asset.sh @@ -5,6 +5,7 @@ HOME=/root/private/.axelar DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" CHAIN=$1 DENOM=${2:-uwasm} +DIR="$(dirname "$0")" if [ -z "$CHAIN" ] then @@ -19,4 +20,4 @@ docker exec -it axelar /bin/sh -c "axelard tx axelarnet register-asset ${CHAIN} docker exec -t axelar /bin/sh -c "cat ${HOME}/unsigned_msg.json" echo "Registered asset ${CHAIN} ${DENOM}" -sh broadcast-unsigned-tx.sh +sh "$DIR/../libs/broadcast-unsigned-multi-tx.sh" diff --git a/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/04-register-broadcaster.sh b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/04-register-broadcaster.sh new file mode 100755 index 00000000..510ac900 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/docker/axelar/bin/steps/04-register-broadcaster.sh @@ -0,0 +1,30 @@ + +#!/bin/sh + +CHAIN_ID=axelar +HOME=/root/private/.axelar +DEFAULT_KEYS_FLAGS="--keyring-backend test --home ${HOME}" +DIR="$(dirname "$0")" + +# 1. Register broadcaster +echo "Registering broadcaster" +docker exec -it axelar /bin/sh -c "axelard tx snapshot register-proxy \$(axelard keys show gov1 -a ${DEFAULT_KEYS_FLAGS}) \ +--chain-id ${CHAIN_ID} --from owner ${DEFAULT_KEYS_FLAGS} \ +--output json --gas 1000000" +echo "Registered broadcaster" + +# Read the content of the local file and append it to the file inside the Docker container +docker exec -t axelar /bin/sh -c "cat /root/private/bin/libs/evm-rpc.toml >> "$HOME"/config/config.toml" +echo "Added evm-rpc.toml to config.toml" + +# 2. Register broadcaster as a maintainerf +echo "Registering maintainer" +docker exec -it axelar /bin/sh -c "axelard tx nexus register-chain-maintainer avalanche ethereum fantom moonbeam polygon \ +--chain-id ${CHAIN_ID} --from gov1 ${DEFAULT_KEYS_FLAGS} \ +--output json --gas 1000000" + +echo "Registered maintainer" + + + + diff --git a/packages/axelar-local-dev-cosmos/package.json b/packages/axelar-local-dev-cosmos/package.json index ce96d9b2..9803e750 100644 --- a/packages/axelar-local-dev-cosmos/package.json +++ b/packages/axelar-local-dev-cosmos/package.json @@ -14,7 +14,7 @@ "prettier": "prettier --write 'src/**/*.ts'", "build": "npm run clean && npm run build-ts", "build-ts": "tsc", - "start": "ts-node scripts/start.ts", + "start": "./scripts/clean.sh && ts-node scripts/start.ts", "stop": "ts-node scripts/stop.ts" }, "dependencies": { @@ -23,6 +23,7 @@ "@cosmjs/cosmwasm-stargate": "^0.31.1", "@cosmjs/stargate": "^0.31.1", "@types/sinon": "^10.0.20", + "reconnecting-websocket": "^4.4.0", "sinon": "^17.0.0" }, "author": "euro@axelar.network", diff --git a/packages/axelar-local-dev-cosmos/scripts/clean.sh b/packages/axelar-local-dev-cosmos/scripts/clean.sh new file mode 100755 index 00000000..be95ff08 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/scripts/clean.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Get the directory of the current script +DIR="$(dirname "$0")" + +# Remove the directory relative to the script's location +rm -rf "$DIR/../info" diff --git a/packages/axelar-local-dev-cosmos/scripts/start.ts b/packages/axelar-local-dev-cosmos/scripts/start.ts index bceac859..f3c2225f 100644 --- a/packages/axelar-local-dev-cosmos/scripts/start.ts +++ b/packages/axelar-local-dev-cosmos/scripts/start.ts @@ -1,3 +1,6 @@ import { startAll } from "../src/docker"; +const path = require("path"); +import childProcess from "child_process"; +// clean up info json startAll(); diff --git a/packages/axelar-local-dev-cosmos/src/__tests__/ibc-relayer-client.spec.ts b/packages/axelar-local-dev-cosmos/src/__tests__/ibc-relayer-client.spec.ts index 5de64167..d6313dbc 100644 --- a/packages/axelar-local-dev-cosmos/src/__tests__/ibc-relayer-client.spec.ts +++ b/packages/axelar-local-dev-cosmos/src/__tests__/ibc-relayer-client.spec.ts @@ -1,4 +1,5 @@ import { IBCRelayerClient } from "../clients/IBCRelayerClient"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; describe("IBCRelayerClient", () => { it.skip("should be able to create a connection and channel", async () => { @@ -15,4 +16,20 @@ describe("IBCRelayerClient", () => { expect(response2!.src).toBeDefined(); expect(response2!.dest).toBeDefined(); }); + + it("should create a wallet from a mnemonic if provided", async () => { + const mockMnemonic = await DirectSecp256k1HdWallet.generate(12).then( + (w) => w.mnemonic + ); + const result = await IBCRelayerClient.create(mockMnemonic); + + expect(result.relayerAccount.mnemonic).toEqual(mockMnemonic); + }); + + it("should generate a new wallet if no mnemonic is provided", async () => { + const result = await IBCRelayerClient.create(); + + expect(result).toBeDefined(); + expect(result.relayerAccount.mnemonic).toBeDefined(); + }); }); diff --git a/packages/axelar-local-dev-cosmos/src/__tests__/listener.e2e.ts b/packages/axelar-local-dev-cosmos/src/__tests__/listener.e2e.ts index b8f30639..b09d64df 100644 --- a/packages/axelar-local-dev-cosmos/src/__tests__/listener.e2e.ts +++ b/packages/axelar-local-dev-cosmos/src/__tests__/listener.e2e.ts @@ -19,6 +19,53 @@ describe("E2E - Listener", () => { "illness step primary sibling donkey body sphere pigeon inject antique head educate"; async function executeContractCall() { + // Upload the wasm contract + const _path = path.resolve(__dirname, "../..", "wasm/send_receive.wasm"); + const response = await wasmClient.uploadWasm(_path).catch((err) => { + console.log(err); + + throw err; + }); + console.log(response); + console.log("Uploaded wasm:", response.codeId); + + // Instantiate the contract + const { client } = wasmClient; + const ownerAddress = await wasmClient.getOwnerAccount(); + const { contractAddress } = await client.instantiate( + ownerAddress, + response.codeId, + { + channel: srcChannelId, + }, + "amazing random contract", + "auto" + ); + console.log("Deployed contract:", contractAddress); + + const denom = wasmClient.chainInfo.denom; + + const execution = await client.execute( + ownerAddress, + contractAddress, + { + send_message_evm: { + destination_chain: "ethereum", + destination_address: "0x49324C7f83568861AB1b66E547BB1B66431f1070", + message: "Hello", + }, + }, + "auto", + "test", + [{ amount: "1000000", denom }] + ); + + // console.log(JSON.stringify(execution, null, 2)); + + await relayerClient.relayPackets(); + } + + async function executeContractCallWithToken() { // Upload the wasm contract const _path = path.resolve(__dirname, "../..", "wasm/multi_send.wasm"); const response = await wasmClient.uploadWasm(_path); @@ -82,19 +129,25 @@ describe("E2E - Listener", () => { it("should receive ibc events from call contract", (done) => { (async () => { - axelarListener.listen(AxelarIBCEvent, (args) => { - console.log("Any event", args); - }); + // axelarListener.listen(AxelarIBCEvent, (args) => { + // console.log("Any event", args); + // }); axelarListener.listen(AxelarCosmosContractCallEvent, (args) => { console.log("Received ContractCall", args); done(); }); - axelarListener.listen(AxelarCosmosContractCallWithTokenEvent, (args) => { - console.log("Received ContractCallWithToken:", args); - done(); - }); + // axelarListener.listen(AxelarCosmosContractCallWithTokenEvent, (args) => { + // console.log("Received ContractCallWithToken:", args); + // done(); + // }); - await executeContractCall(); + try { + await executeContractCall(); + } catch (e) { + console.log(e); + done(); + } + await executeContractCallWithToken(); })(); }); }); diff --git a/packages/axelar-local-dev-cosmos/src/clients/CosmosClient.ts b/packages/axelar-local-dev-cosmos/src/clients/CosmosClient.ts index 6e309178..76ce26b7 100644 --- a/packages/axelar-local-dev-cosmos/src/clients/CosmosClient.ts +++ b/packages/axelar-local-dev-cosmos/src/clients/CosmosClient.ts @@ -38,6 +38,7 @@ export class CosmosClient { denom: config.denom || defaultDenom, lcdUrl: config.lcdUrl || `http://localhost/${chain}-lcd`, rpcUrl: config.rpcUrl || `http://localhost/${chain}-rpc`, + wsUrl: config.wsUrl || `ws://localhost/${chain}-rpc/websocket`, }; const walletOptions = { @@ -96,6 +97,7 @@ export class CosmosClient { denom: this.chainInfo.denom, lcdUrl: this.chainInfo.lcdUrl, rpcUrl: this.chainInfo.rpcUrl, + wsUrl: this.chainInfo.wsUrl, }; } diff --git a/packages/axelar-local-dev-cosmos/src/clients/CosmosRelayerClient.ts b/packages/axelar-local-dev-cosmos/src/clients/CosmosRelayerClient.ts new file mode 100644 index 00000000..3334c85e --- /dev/null +++ b/packages/axelar-local-dev-cosmos/src/clients/CosmosRelayerClient.ts @@ -0,0 +1,12 @@ +import ReconnectingWebSocket from "reconnecting-websocket"; +import { CosmosChainInfo } from "../types"; + +export class CosmosRelayerClient { + private wsMap: Map; + + private constructor(config: Omit) { + this.wsMap = new Map(); + } + + async listenIncomingIBCEvents() {} +} diff --git a/packages/axelar-local-dev-cosmos/src/clients/IBCRelayerClient.ts b/packages/axelar-local-dev-cosmos/src/clients/IBCRelayerClient.ts index 21717503..dc17f1bf 100644 --- a/packages/axelar-local-dev-cosmos/src/clients/IBCRelayerClient.ts +++ b/packages/axelar-local-dev-cosmos/src/clients/IBCRelayerClient.ts @@ -3,8 +3,11 @@ import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { IbcClient, Link, RelayedHeights } from "@confio/relayer"; import { ChannelPair } from "@confio/relayer/build/lib/link"; import { CosmosClient } from "../clients/CosmosClient"; -import { relay } from "@axelar-network/axelar-local-dev"; +import { ethers } from "ethers"; +import fs from "fs"; +import path from "path"; import { convertCosmosAddress } from "../docker"; +import { CosmosChain } from "../types"; export class IBCRelayerClient { axelarClient: CosmosClient; @@ -24,37 +27,99 @@ export class IBCRelayerClient { this.relayerAccount = relayer; } - static async create() { + static async create(mnemonic?: string) { const axelarClient = await CosmosClient.create("axelar"); const wasmClient = await CosmosClient.create("wasm"); - const relayer = await DirectSecp256k1HdWallet.generate(12, { - prefix: "wasm", + + const relayer = await IBCRelayerClient.createRelayerAccount( + "wasm", + mnemonic + ); + + return new IBCRelayerClient(axelarClient, wasmClient, relayer); + } + + private static async createRelayerAccount( + prefix: CosmosChain, + mnemonic?: string + ) { + if (mnemonic) { + return await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix, + }); + } + + return await DirectSecp256k1HdWallet.generate(12, { + prefix, }); + } - // Fund the relayer address - const relayerAddress = await relayer - .getAccounts() - .then((accounts) => accounts[0].address); - const relayerAxelarAddress = convertCosmosAddress(relayerAddress, "axelar"); + async fundRelayerAccountsIfNeeded(minAmount = "10000000") { + const fund = await this.getRelayerFund(); + + if ( + ethers.BigNumber.from(fund.wasm.balance).lt(minAmount) || + ethers.BigNumber.from(fund.axelar.balance).lt(minAmount) + ) { + await this.fundRelayer(minAmount); + } + } + + async fundRelayer(amount = "1000000000") { + const relayerAddress = await this.getRelayerAddress("wasm"); + const relayerAxelarAddress = await this.getRelayerAddress("axelar"); - await wasmClient.fundWallet(relayerAddress, "100000000"); - console.log("Funded relayer address on wasm:", relayerAddress); - await axelarClient.fundWallet(relayerAxelarAddress, "100000000"); - console.log("Funded relayer address on axelar:", relayerAxelarAddress); + // Fund the relayer address + await this.wasmClient.fundWallet(relayerAddress, amount); + console.log( + `Funded ${amount}${ + this.wasmClient.getChainInfo().denom + } to relayer address on wasm:`, + relayerAddress + ); + await this.axelarClient.fundWallet(relayerAxelarAddress, amount); + console.log( + `Funded ${amount}${ + this.axelarClient.getChainInfo().denom + } to relayer address on axelar:`, + relayerAxelarAddress + ); + } + async getRelayerFund() { // check the fund - const balance = await wasmClient.getBalance(relayerAddress); + const relayerAddress = await this.getRelayerAddress("wasm"); + const relayerAxelarAddress = await this.getRelayerAddress("axelar"); + + const balance = await this.wasmClient.getBalance(relayerAddress); console.log("Relayer wasm balance", balance); - const axelarBalance = await axelarClient.getBalance(relayerAxelarAddress); - console.log("Relayer axelar balance", axelarBalance); + const axelarBalance = await this.axelarClient.getBalance( + relayerAxelarAddress + ); + console.log("Relayer axelar balance", relayerAxelarAddress, axelarBalance); - return new IBCRelayerClient(axelarClient, wasmClient, relayer); + return { + wasm: { + address: relayerAddress, + balance, + }, + axelar: { + address: relayerAxelarAddress, + balance: axelarBalance, + }, + }; } - getRelayerAddress() { - return this.relayerAccount + async getRelayerAddress(prefix: CosmosChain = "wasm") { + const relayerAddress = await this.relayerAccount .getAccounts() .then((accounts) => accounts[0].address); + + if (prefix === "wasm") { + return relayerAddress; + } + + return convertCosmosAddress(relayerAddress, prefix); } async getIBCClient(client: CosmosClient) { @@ -79,7 +144,31 @@ export class IBCRelayerClient { ); } - async initConnection() { + getCurrentConnection() { + try { + const json = fs.readFileSync( + path.join(__dirname, "../../info/connection.json"), + "utf8" + ); + return JSON.parse(json); + } catch (e) { + return undefined; + } + } + + getCurrentChannel(): ChannelPair | undefined { + try { + const json = fs.readFileSync( + path.join(__dirname, "../../info/channel.json"), + "utf8" + ); + return JSON.parse(json); + } catch (e) { + return undefined; + } + } + + async initConnection(saveToFile = false) { const axelarIBCClient = await this.getIBCClient(this.axelarClient); const wasmIBCClient = await this.getIBCClient(this.wasmClient); @@ -93,10 +182,42 @@ export class IBCRelayerClient { }, }; - this.link = await Link.createWithNewConnections( - axelarIBCClient, - wasmIBCClient - ); + const connection = await this.getCurrentConnection(); + + if (connection) { + console.log("Using existing connection", connection); + this.link = await Link.createWithExistingConnections( + axelarIBCClient, + wasmIBCClient, + connection.axelar.connectionId, + connection.wasm.connectionId + ); + } else { + console.log("Creating new connection"); + this.link = await Link.createWithNewConnections( + axelarIBCClient, + wasmIBCClient + ); + + if (saveToFile) { + const infoPath = path.join(__dirname, "../../info"); + await fs.promises + .mkdir(infoPath, { recursive: true }) + .catch(console.error); + const channelPath = path.join(infoPath, "connection.json"); + fs.writeFileSync( + channelPath, + JSON.stringify({ + axelar: { + connectionId: this.link.endA.connectionID, + }, + wasm: { + connectionId: this.link.endB.connectionID, + }, + }) + ); + } + } return { axelar: { @@ -108,13 +229,19 @@ export class IBCRelayerClient { }; } - async createChannel(sender: "A" | "B") { + async createChannel(sender: "A" | "B", saveToFile = false) { if (!this.link) { throw new Error("Link not initialized"); } if (this.channel) return this.channel; + const channel = await this.getCurrentChannel(); + if (channel) { + console.log("Using existing channel", channel); + return channel; + } + this.channel = await this.link?.createChannel( sender, "transfer", @@ -123,6 +250,15 @@ export class IBCRelayerClient { "ics20-1" ); + if (saveToFile) { + const infoPath = path.join(__dirname, "../../info"); + await fs.promises + .mkdir(infoPath, { recursive: true }) + .catch(console.error); + const channelPath = path.join(infoPath, "channel.json"); + fs.writeFileSync(channelPath, JSON.stringify(this.channel)); + } + return this.channel; } @@ -131,6 +267,10 @@ export class IBCRelayerClient { throw new Error("Link not initialized"); } + // Update the clients to get the latest height. Otherwise, the relayer will not relay packets + await this.link!.updateClient("A"); + await this.link!.updateClient("B"); + this.lastRelayedHeight = await this.link!.checkAndRelayPacketsAndAcks( this.lastRelayedHeight, 2, diff --git a/packages/axelar-local-dev-cosmos/src/docker/start.ts b/packages/axelar-local-dev-cosmos/src/docker/start.ts index 10a73b67..85fb3580 100644 --- a/packages/axelar-local-dev-cosmos/src/docker/start.ts +++ b/packages/axelar-local-dev-cosmos/src/docker/start.ts @@ -68,9 +68,11 @@ export async function start( const rpcUrl = `http://localhost/${chain}-rpc`; const lcdUrl = `http://localhost/${chain}-lcd`; + const wsUrl = `ws://localhost/${chain}-rpc/websocket`; console.log(`RPC server for ${chain} is started at ${rpcUrl}`); console.log(`LCD server for ${chain} is started at ${lcdUrl}`); + console.log(`WS server for ${chain} is started at ${wsUrl}`); return { prefix: chain, @@ -78,6 +80,7 @@ export async function start( denom: getChainDenom(chain), lcdUrl, rpcUrl, + wsUrl, }; } diff --git a/packages/axelar-local-dev-cosmos/src/index.ts b/packages/axelar-local-dev-cosmos/src/index.ts index b8fd0ad6..ebaffdd9 100644 --- a/packages/axelar-local-dev-cosmos/src/index.ts +++ b/packages/axelar-local-dev-cosmos/src/index.ts @@ -1 +1,2 @@ export * from "./clients"; +export * from "./listeners"; diff --git a/packages/axelar-local-dev-cosmos/src/listeners/AxelarListener.ts b/packages/axelar-local-dev-cosmos/src/listeners/AxelarListener.ts new file mode 100644 index 00000000..a3aebc50 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/src/listeners/AxelarListener.ts @@ -0,0 +1,73 @@ +import ReconnectingWebSocket from "reconnecting-websocket"; +import WebSocket from "isomorphic-ws"; +import { AxelarListenerEvent, CosmosChainInfo } from "../types"; + +export class AxelarListener { + private wsMap: Map; + private wsOptions = { + WebSocket, // custom WebSocket constructor + maxRetries: Infinity, + }; + + private wsUrl: string; + + constructor(config: Pick) { + this.wsMap = new Map(); + this.wsUrl = config.wsUrl || `ws://localhost/axelar-rpc/websocket`; + } + + private initWs(topicId: string) { + const _ws = this.wsMap.get(topicId); + if (_ws) { + return _ws; + } + const ws = new ReconnectingWebSocket(this.wsUrl, [], this.wsOptions); + this.wsMap.set(topicId, ws); + + return ws; + } + + public listen(event: AxelarListenerEvent, callback: (args: T) => void) { + const ws = this.initWs(event.topicId); + ws.addEventListener("open", () => { + ws.send( + JSON.stringify({ + jsonrpc: "2.0", + id: 1, + method: "subscribe", + params: [event.topicId], + }) + ); + console.info(`[AxelarListener] Listening to "${event.type}" event`); + }); + + ws.addEventListener("close", () => { + console.debug( + `[AxelarListener] ws connection for ${event.type} is closed. Reconnect Ws...` + ); + ws.reconnect(); + }); + + ws.addEventListener("message", (ev: MessageEvent) => { + // convert buffer to json + const _event = JSON.parse(ev.data.toString()); + + // check if the event topic is matched + if (!_event.result || _event.result.query !== event.topicId) return; + + console.debug(`[AxelarListener] Received ${event.type} event`); + + // parse the event data + event + .parseEvent(_event.result.events) + .then((ev) => { + callback(ev); + }) + .catch((e) => { + console.debug( + `[AxelarListener] Failed to parse topic ${event.topicId} GMP event: ${e}` + ); + }); + }); + } +} diff --git a/packages/axelar-local-dev-cosmos/src/listeners/eventTypes.ts b/packages/axelar-local-dev-cosmos/src/listeners/eventTypes.ts new file mode 100644 index 00000000..a9bf9e27 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/src/listeners/eventTypes.ts @@ -0,0 +1,38 @@ +import { + ContractCallSubmitted, + ContractCallWithTokenSubmitted, + IBCEvent, +} from "../types"; +import { + parseContractCallSubmittedEvent, + parseContractCallWithTokenSubmittedEvent, + parseIBCEvent, +} from "./parser"; + +export interface AxelarListenerEvent { + type: string; + topicId: string; + parseEvent: (event: any) => Promise; +} + +export const AxelarIBCEvent: AxelarListenerEvent> = { + type: "IBCEvent", + topicId: `tm.event='Tx' AND message.action='/ibc.core.channel.v1.MsgRecvPacket'`, + parseEvent: parseIBCEvent, +}; + +export const AxelarCosmosContractCallEvent: AxelarListenerEvent< + IBCEvent +> = { + type: "axelar.axelarnet.v1beta1.ContractCallSubmitted", + topicId: `tm.event='Tx' AND axelar.axelarnet.v1beta1.ContractCallSubmitted.message_id EXISTS`, + parseEvent: parseContractCallSubmittedEvent, +}; + +export const AxelarCosmosContractCallWithTokenEvent: AxelarListenerEvent< + IBCEvent +> = { + type: "axelar.axelarnet.v1beta1.ContractCallWithTokenSubmitted", + topicId: `tm.event='Tx' AND axelar.axelarnet.v1beta1.ContractCallWithTokenSubmitted.message_id EXISTS`, + parseEvent: parseContractCallWithTokenSubmittedEvent, +}; diff --git a/packages/axelar-local-dev-cosmos/src/listeners/index.ts b/packages/axelar-local-dev-cosmos/src/listeners/index.ts new file mode 100644 index 00000000..c7404a70 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/src/listeners/index.ts @@ -0,0 +1,2 @@ +export * from "./AxelarListener"; +export * from "./eventTypes"; diff --git a/packages/axelar-local-dev-cosmos/src/listeners/parser.ts b/packages/axelar-local-dev-cosmos/src/listeners/parser.ts new file mode 100644 index 00000000..ffe7ca49 --- /dev/null +++ b/packages/axelar-local-dev-cosmos/src/listeners/parser.ts @@ -0,0 +1,73 @@ +import { + ContractCallSubmitted, + ContractCallWithTokenSubmitted, + IBCEvent, +} from "../types"; + +const decodeBase64 = (str: string) => { + return Buffer.from(str, "base64").toString("hex"); +}; + +const removeQuote = (str: string) => { + return str.replace(/['"]+/g, ""); +}; + +export function parseIBCEvent(event: any) { + console.log("parseIBCEvent", event); + // const data = { + // event: removeQuote(event["write_acknowledgement.packet_data"][0]), + // } as any; + return Promise.resolve(event); +} + +export function parseContractCallSubmittedEvent( + event: any +): Promise> { + const key = "axelar.axelarnet.v1beta1.ContractCallSubmitted"; + const data = { + messageId: removeQuote(event[`${key}.message_id`][0]), + sender: removeQuote(event[`${key}.sender`][0]), + sourceChain: removeQuote(event[`${key}.source_chain`][0]), + destinationChain: removeQuote(event[`${key}.destination_chain`][0]), + contractAddress: removeQuote(event[`${key}.contract_address`][0]), + payload: `0x${decodeBase64(removeQuote(event[`${key}.payload`][0]))}`, + payloadHash: `0x${decodeBase64( + removeQuote(event[`${key}.payload_hash`][0]) + )}`, + }; + + return Promise.resolve({ + hash: event["tx.hash"][0], + srcChannel: event?.["write_acknowledgement.packet_src_channel"]?.[0], + destChannel: event?.["write_acknowledgement.packet_dst_channel"]?.[0], + args: data, + }); +} + +export function parseContractCallWithTokenSubmittedEvent( + event: any +): Promise> { + console.log("dsad", event); + const key = "axelar.axelarnet.v1beta1.ContractCallWithTokenSubmitted"; + const asset = JSON.parse(event[`${key}.asset`][0]); + const data = { + messageId: removeQuote(event[`${key}.message_id`][0]), + sender: removeQuote(event[`${key}.sender`][0]), + sourceChain: removeQuote(event[`${key}.source_chain`][0]), + destinationChain: removeQuote(event[`${key}.destination_chain`][0]), + contractAddress: removeQuote(event[`${key}.contract_address`][0]), + amount: asset.amount.toString(), + symbol: asset.denom, + payload: `0x${decodeBase64(removeQuote(event[`${key}.payload`][0]))}`, + payloadHash: `0x${decodeBase64( + removeQuote(event[`${key}.payload_hash`][0]) + )}`, + }; + + return Promise.resolve({ + hash: event["tx.hash"][0], + srcChannel: event?.["write_acknowledgement.packet_src_channel"]?.[0], + destChannel: event?.["write_acknowledgement.packet_dst_channel"]?.[0], + args: data, + }); +} diff --git a/packages/axelar-local-dev-cosmos/src/types.ts b/packages/axelar-local-dev-cosmos/src/types.ts index e0a63bea..89409b39 100644 --- a/packages/axelar-local-dev-cosmos/src/types.ts +++ b/packages/axelar-local-dev-cosmos/src/types.ts @@ -1,3 +1,6 @@ +import { Height } from "cosmjs-types/ibc/core/client/v1/client"; +import { Coin } from "@cosmjs/stargate"; + export interface CosmosChainInfo { owner: { mnemonic: string; @@ -7,6 +10,7 @@ export interface CosmosChainInfo { denom?: string; rpcUrl?: string; lcdUrl?: string; + wsUrl?: string; } export type ChainConfig = { @@ -20,3 +24,69 @@ export type ChainDenom = T extends "axelar" : CosmosChain extends "wasm" ? "uwasm" : never; + +export interface AxelarListenerEvent { + type: string; + topicId: string; + parseEvent: (event: any) => Promise; +} + +export interface ContractCallSubmitted { + messageId: string; + sender: string; + sourceChain: string; + destinationChain: string; + contractAddress: string; + payload: string; + payloadHash: string; +} + +export interface ContractCallWithTokenSubmitted { + messageId: string; + sender: string; + sourceChain: string; + destinationChain: string; + contractAddress: string; + payload: string; + payloadHash: string; + symbol: string; + amount: string; +} + +export interface MsgTransfer { + /** the port on which the packet will be sent */ + sourcePort: string; + /** the channel by which the packet will be sent */ + + sourceChannel: string; + /** the tokens to be transferred */ + + token?: Coin; + /** the sender address */ + + sender: string; + /** the recipient address on the destination chain */ + + receiver: string; + /** + * Timeout height relative to the current block height. + * The timeout is disabled when set to 0. + */ + + timeoutHeight?: Height; + /** + * Timeout timestamp in absolute nanoseconds since unix epoch. + * The timeout is disabled when set to 0. + */ + + timeoutTimestamp: Long; + + memo: string; +} + +export interface IBCEvent { + hash: string; + srcChannel?: string; + destChannel?: string; + args: T; +} diff --git a/packages/axelar-local-dev-cosmos/wasm/send_receive.wasm b/packages/axelar-local-dev-cosmos/wasm/send_receive.wasm new file mode 100644 index 0000000000000000000000000000000000000000..bce5e33660d2894a8df1fc6bf34d2b7b3856b858 GIT binary patch literal 200510 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