diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 240a21da98..1583004722 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,9 +8,6 @@ on: tags: - v[0-9]+.* -env: - REGISTRY_IMAGE: informalsystems/hermes - jobs: create-release: runs-on: ubuntu-latest @@ -62,113 +59,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # (optional) CARGO_PROFILE_RELEASE_LTO: true - - docker-build: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - platform: - - linux/amd64 - - linux/arm64 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY_IMAGE }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - - name: Get release version - run: echo "TAG=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV - - - name: Build and push by digest - id: build - uses: docker/build-push-action@v4 - with: - context: ./ci/release/ - file: ./ci/release/hermes.Dockerfile - build-args: TAG=v${{env.TAG}} - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v3 - with: - name: digests - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - docker-merge: - runs-on: ubuntu-latest - needs: - - docker-build - steps: - - name: Download digests - uses: actions/download-artifact@v3 - with: - name: digests - path: /tmp/digests - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY_IMAGE }} - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create --tag ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Push image to GHCR - run: | - docker buildx imagetools create \ - --tag ghcr.io/${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ - ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/.gitignore b/.gitignore index 2e9b0e8816..29b5605e72 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ target/ # Ignore chain's data data +namada_wallet # Ignore Python artifacts .mypy_cache/ diff --git a/e2e/namada-test.sh b/e2e/namada-e2e-test similarity index 93% rename from e2e/namada-test.sh rename to e2e/namada-e2e-test index abeaea6447..e3d67dc957 100755 --- a/e2e/namada-test.sh +++ b/e2e/namada-e2e-test @@ -2,7 +2,7 @@ # This script executes Hermes' E2E test for Namada locally # `make build-release` and `make build-wasm-scripts` on Namada directory in advance -# Run with `namada-test.sh ${namada_dir}` +# Run with `namada-e2e-test ${namada_dir}` set -xe @@ -49,7 +49,7 @@ function init_relayer_balance() { # ==== main ==== # Run 2 Namada chains -${HERMES_DIR}/scripts/setup-namada.sh ${NAMADA_DIR} +${HERMES_DIR}/scripts/setup-namada ${NAMADA_DIR} # Initialize the balances init_relayer_balance "a" ${LEDGER_ADDR_A} diff --git a/e2e/namada-gaia-simple-transfers b/e2e/namada-gaia-simple-transfers new file mode 100755 index 0000000000..570d5853e0 --- /dev/null +++ b/e2e/namada-gaia-simple-transfers @@ -0,0 +1,242 @@ +#!/bin/bash + +# This script sets up Namada and Gaia locally +# `make build-release` and `make build-wasm-scripts` on Namada directory in advance +# Run with `namada-gaia-simple-transfers ${namada_dir}` + +set -e + +NAMADA_DIR=$1 +if [ -z "${NAMADA_DIR}" ] +then + echo "ERROR: Namada directory should be given" + exit 1 +fi +cd $(dirname $0) +HERMES_DIR=${PWD%/e2e*} + +# edit for your environment +NAMADAC="${NAMADA_DIR}/target/debug/namadac" +NAMADAN="${NAMADA_DIR}/target/debug/namadan" +NAMADAW="${NAMADA_DIR}/target/debug/namadaw" +BASE_GENESIS_PATH="${NAMADA_DIR}/genesis/e2e-tests-single-node.toml" +CHECKSUM_PATH="${NAMADA_DIR}/wasm/checksums.json" +DATA_DIR="${HERMES_DIR}/data" +GENESIS_PATH="${DATA_DIR}/e2e-tests-single-node.toml" +# IbcToken from `transfer/channel-0/samoleans` +IBC_TOKEN="atest1d93xxw36xgmkzd3n8y6xxvmx89nxvwtr89jxxe34v3nxvctyvcukyc34vejnjcfnxa3nwefe6325dv" + +NAMADA_LEDGER_ADDR="127.0.0.1:27657" + +HERMES_CONFIG_TEMPLATE=" +[global] +log_level = 'info' + +[mode] + +[mode.clients] +enabled = true +refresh = true +misbehaviour = true + +[mode.connections] +enabled = false + +[mode.channels] +enabled = false + +[mode.packets] +enabled = true +clear_interval = 10 +clear_on_start = false +tx_confirmation = true + +[telemetry] +enabled = false +host = '127.0.0.1' +port = 3001 + +[[chains]] +id = '_CHAIN_ID_' +type = 'namada' +rpc_addr = 'http://127.0.0.1:27657' +grpc_addr = 'http://127.0.0.1:9090' +event_source = { mode = 'push', url = 'ws://127.0.0.1:27657/websocket', batch_delay = '500ms' } +account_prefix = 'cosmos' +key_name = 'relayer' +store_prefix = 'ibc' +gas_price = { price = 0.001, denom = 'nam' } + +[[chains]] +id = 'gaia' +type = 'cosmos-sdk' +rpc_addr = 'http://127.0.0.1:26657' +grpc_addr = 'http://127.0.0.1:9090' +event_source = { mode = 'push', url = 'ws://127.0.0.1:26657/websocket', batch_delay = '500ms' } +account_prefix = 'cosmos' +key_name = 'testkey' +store_prefix = 'ibc' +gas_price = { price = 0.001, denom = 'stake' } +" + +function init_relayer_balance() { + local base_dir=${DATA_DIR}/namada/.namada + + local cnt=0 + local cnt_max=10 + while [ ${cnt} -lt ${cnt_max} ] + do + ${NAMADAC} --base-dir ${base_dir} \ + transfer \ + --source faucet \ + --target relayer \ + --token nam \ + --amount 1000 \ + --signer relayer \ + --ledger-address ${NAMADA_LEDGER_ADDR} + + cnt=$((${cnt} + 1)) + done +} + +#### main #### +mkdir -p ${DATA_DIR} + +# Gaia +rm -rf ${DATA_DIR}/gaia + +${HERMES_DIR}/scripts/one-chain gaiad gaia ${DATA_DIR} \ + 26657 26656 6060 9090 10000 + +# Namada +# make a genesis file +sed "s/epochs_per_year = .*/epochs_per_year = 31536/g" \ + ${BASE_GENESIS_PATH} > ${GENESIS_PATH} +mkdir -p ${DATA_DIR}/namada +base_dir=${DATA_DIR}/namada/.namada +# init network +chain_id=$(NAMADA_BASE_DIR=${base_dir} \ + ${NAMADAC} utils init-network \ + --unsafe-dont-encrypt \ + --genesis-path ${GENESIS_PATH} \ + --chain-prefix namada-test \ + --localhost \ + --dont-archive \ + --wasm-checksums-path ${CHECKSUM_PATH} \ + | awk '$1 == "Derived" {print $4}') + +# copy wasms +cp ${NAMADA_DIR}/wasm/checksums.json ${base_dir}/${chain_id}/setup/validator-0/.namada/${chain_id}/wasm/ +cp ${NAMADA_DIR}/wasm/*.wasm ${base_dir}/${chain_id}/setup/validator-0/.namada/${chain_id}/wasm/ + +# Run Namada +NAMADA_LOG=debug ${NAMADAN} --base-dir ${base_dir}/${chain_id}/setup/validator-0/.namada/ \ + ledger run > ${DATA_DIR}/namada/namada.log 2>&1 & +echo "Namada chain ID: ${chain_id}" +sleep 5 + +# set the wallet +${NAMADAW} --base-dir ${base_dir} key gen --alias relayer --unsafe-dont-encrypt +wallet_dir=${HERMES_DIR}/namada_wallet/${chain_id} +mkdir -p ${wallet_dir} +cp ${base_dir}/${chain_id}/wallet.toml ${wallet_dir} + +# Set the chain ID to the config +cd ${HERMES_DIR} +echo "${HERMES_CONFIG_TEMPLATE}" \ + | sed -e "s/_CHAIN_ID_/${chain_id}/g" \ + > ${HERMES_DIR}/config_for_namada.toml + +# add Gaia key +cargo run -q --bin hermes -- --config config_for_namada.toml \ + keys add --chain gaia --key-file ${DATA_DIR}/gaia/user_seed.json --overwrite + +# Initialize Relayer's balance on Namada +init_relayer_balance + +# create a channel +cargo run --bin hermes -- --config config_for_namada.toml \ + create channel --a-chain ${chain_id} \ + --b-chain gaia \ + --a-port transfer \ + --b-port transfer \ + --new-client-connection --yes + + +# Transfer 100 samoleans from Gaia to Namada +namada_receiver=$(${NAMADAW} --base-dir ${base_dir} address find --alias relayer | awk '{print $4}') +cargo run --bin hermes -- --config config_for_namada.toml \ + tx ft-transfer \ + --dst-chain ${chain_id} \ + --src-chain gaia \ + --src-port transfer \ + --src-channel channel-0 \ + --amount 100 \ + --receiver ${namada_receiver} \ + --denom samoleans \ + --timeout-height-offset 1000 + +# packet-recv +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-recv \ + --dst-chain ${chain_id} \ + --src-chain gaia \ + --src-port transfer \ + --src-channel channel-0 + +# packet-ack +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-ack \ + --dst-chain gaia \ + --src-chain ${chain_id} \ + --src-port transfer \ + --src-channel channel-0 + +echo "Balances on Namada" +${NAMADAC} --base-dir ${base_dir} balance \ + --token ${IBC_TOKEN} \ + --owner relayer \ + --ledger-address ${NAMADA_LEDGER_ADDR} + +echo "Balances on Gaia" +gaia_user=$(gaiad --home ${DATA_DIR}/gaia \ + keys --keyring-backend="test" show user -a) +gaiad query bank balances ${gaia_user} + +# transfer back 50 samoleans from Namada to Gaia +${NAMADAC} --base-dir ${base_dir} ibc-transfer \ + --source relayer \ + --receiver ${gaia_user} \ + --token ${IBC_TOKEN} \ + --amount 50 \ + --signer relayer \ + --channel-id channel-0 \ + --ledger-address ${NAMADA_LEDGER_ADDR} + +# packet-recv +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-recv \ + --dst-chain gaia \ + --src-chain ${chain_id} \ + --src-port transfer \ + --src-channel channel-0 + +# packet-ack +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-ack \ + --dst-chain ${chain_id} \ + --src-chain gaia \ + --src-port transfer \ + --src-channel channel-0 + +echo "Balances on Namada" +${NAMADAC} --base-dir ${base_dir} balance \ + --token ${IBC_TOKEN} \ + --owner relayer \ + --ledger-address ${NAMADA_LEDGER_ADDR} + +echo "Balances on Gaia" +gaiad query bank balances ${gaia_user} + +killall gaiad +killall namadan diff --git a/e2e/namada-simple-transfers b/e2e/namada-simple-transfers new file mode 100755 index 0000000000..6893b0be92 --- /dev/null +++ b/e2e/namada-simple-transfers @@ -0,0 +1,161 @@ +#!/bin/bash + +# This script executes simple transfers between Namada instances locally +# `make build-release` and `make build-wasm-scripts` on Namada directory in advance +# Run with `namada-simple-transfers ${namada_dir}` + +set -e + +NAMADA_DIR=$1 +if [ -z "${NAMADA_DIR}" ] +then + echo "ERROR: Namada directory should be given" + exit 1 +fi +cd $(dirname $0) +HERMES_DIR=${PWD%/e2e*} + +NAMADAC="${NAMADA_DIR}/target/debug/namadac" +NAMADAW="${NAMADA_DIR}/target/debug/namadaw" +DATA_DIR="${HERMES_DIR}/data" +# IbcToken from `transfer/channel-0/#apfel` +IBC_TOKEN="atest1d93xxw36xqckvdn9vgcxyv3jvyurqdrr89jrwvmxxcexxdnpx5cnyv3ex93kvepnxdjnqvrzucsc73" + +LEDGER_ADDR_A="127.0.0.1:27657" +LEDGER_ADDR_B="127.0.0.1:28657" +INITIAL_BALANCE=5000 + +function init_relayer_balance() { + local suffix=$1 + local ledger_addr=$2 + + local base_dir=${DATA_DIR}/namada-${suffix}/.namada + + local cnt=0 + local cnt_max=$((${INITIAL_BALANCE} / 1000)) + while [ ${cnt} -lt ${cnt_max} ] + do + ${NAMADAC} --base-dir ${base_dir} \ + transfer \ + --source faucet \ + --target relayer \ + --token nam \ + --amount 1000 \ + --signer relayer \ + --ledger-address ${ledger_addr} + + cnt=$((${cnt} + 1)) + done +} + +# ==== main ==== + +# Run 2 Namada chains +${HERMES_DIR}/scripts/setup-namada ${NAMADA_DIR} + +cd ${HERMES_DIR} +ids=$(grep "id" config_for_namada.toml | awk -F"'" '/^id/ {print $2}') +chain_a=$(echo ${ids} | awk '{print $1}') +chain_b=$(echo ${ids} | awk '{print $2}') + +# Initialize the balances +init_relayer_balance "a" ${LEDGER_ADDR_A} +init_relayer_balance "b" ${LEDGER_ADDR_B} + +# Create a channel +cargo run --bin hermes -- --config config_for_namada.toml \ + create channel \ + --a-chain ${chain_a} \ + --b-chain ${chain_b} \ + --a-port transfer \ + --b-port transfer \ + --new-client-connection --yes + +# faucet apfel on chain_a +base_dir_a=${DATA_DIR}/namada-a/.namada +${NAMADAC} --base-dir ${base_dir_a} transfer \ + --source faucet \ + --target relayer \ + --token apfel \ + --amount 1000 \ + --signer relayer \ + --ledger-address ${LEDGER_ADDR_A} + +# Get the receiver addresses +receiver_a=$(${NAMADAW} --base-dir ${base_dir_a} address find --alias relayer | awk '{print $4}') +base_dir_b=${DATA_DIR}/namada-b/.namada +receiver_b=$(${NAMADAW} --base-dir ${base_dir_b} address find --alias relayer | awk '{print $4}') + +# transfer 100 apfel from chain_a to chain_b +${NAMADAC} --base-dir ${base_dir_a} ibc-transfer \ + --source relayer \ + --receiver ${receiver_b} \ + --token apfel \ + --amount 100 \ + --signer relayer \ + --channel-id channel-0 \ + --ledger-address ${LEDGER_ADDR_A} + +# packet-recv +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-recv \ + --dst-chain ${chain_b} \ + --src-chain ${chain_a} \ + --src-port transfer \ + --src-channel channel-0 + +# packet-ack +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-ack \ + --dst-chain ${chain_a} \ + --src-chain ${chain_b} \ + --src-port transfer \ + --src-channel channel-0 + +echo "Balances on chain A" +${NAMADAC} --base-dir ${base_dir_a} balance \ + --owner relayer \ + --ledger-address ${LEDGER_ADDR_A} + +echo "Balances on chain B" +${NAMADAC} --base-dir ${base_dir_b} balance \ + --owner relayer \ + --ledger-address ${LEDGER_ADDR_B} + +# transfer back 50 apfel from chain_b to chain_a +${NAMADAC} --base-dir ${base_dir_b} ibc-transfer \ + --source relayer \ + --receiver ${receiver_a} \ + --token ${IBC_TOKEN} \ + --amount 50 \ + --signer relayer \ + --channel-id channel-0 \ + --ledger-address ${LEDGER_ADDR_B} + +# packet-recv +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-recv \ + --dst-chain ${chain_a} \ + --src-chain ${chain_b} \ + --src-port transfer \ + --src-channel channel-0 + +# packet-ack +cargo run --bin hermes -- --config config_for_namada.toml \ + tx packet-ack \ + --dst-chain ${chain_b} \ + --src-chain ${chain_a} \ + --src-port transfer \ + --src-channel channel-0 + +echo "Balances on chain A" +${NAMADAC} --base-dir ${base_dir_a} balance \ + --owner relayer \ + --ledger-address ${LEDGER_ADDR_A} + +echo "Balances on chain B" +${NAMADAC} --base-dir ${base_dir_b} balance \ + --owner relayer \ + --ledger-address ${LEDGER_ADDR_B} + +killall namadan diff --git a/scripts/join-namada.sh b/scripts/join-namada similarity index 100% rename from scripts/join-namada.sh rename to scripts/join-namada diff --git a/scripts/setup-namada.sh b/scripts/setup-namada similarity index 100% rename from scripts/setup-namada.sh rename to scripts/setup-namada