Skip to content

build(deps): bump google.golang.org/grpc from 1.76.0 to 1.78.0 in the minor-updates group across 1 directory #1092

build(deps): bump google.golang.org/grpc from 1.76.0 to 1.78.0 in the minor-updates group across 1 directory

build(deps): bump google.golang.org/grpc from 1.76.0 to 1.78.0 in the minor-updates group across 1 directory #1092

name: Ev-ABCI Integration & IBC Tests
on:
push:
branches: ["main"]
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-gm-image:
name: Build GM Image
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
packages: write
outputs:
image_tag: ${{ steps.tag.outputs.tag }}
env:
IGNITE_VERSION: v29.3.0 # the gm build script depends on some annotations
IGNITE_EVOLVE_APP_VERSION: main
EVNODE_VERSION: v1.0.0-beta.10.0.20251216132820-afcd6bd9b354
steps:
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Determine image tag
id: tag
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "tag=ghcr.io/evstack/evolve-gm:pr-${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
else
echo "tag=ghcr.io/evstack/evolve-gm:${{ github.sha }}" >> "$GITHUB_OUTPUT"
fi
- name: Build and push GM image
uses: docker/build-push-action@v6
with:
context: .
file: tests/integration/docker/Dockerfile.gm
push: true
tags: ${{ steps.tag.outputs.tag }}
build-args: |
IGNITE_VERSION=${{ env.IGNITE_VERSION }}
IGNITE_EVOLVE_APP_VERSION=${{ env.IGNITE_EVOLVE_APP_VERSION }}
EVNODE_VERSION=${{ env.EVNODE_VERSION }}
liveness-tastora:
name: Test with EV-ABCI Chain (Tastora)
runs-on: ubuntu-latest
timeout-minutes: 30
env:
EVNODE_VERSION: "v1.0.0-beta.10.0.20251216132820-afcd6bd9b354"
IGNITE_VERSION: "v29.6.1"
IGNITE_EVOLVE_APP_VERSION: "main"
EVOLVE_IMAGE_REPO: "evolve-gm"
EVOLVE_IMAGE_TAG: "latest"
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: "stable"
cache: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Evolve Docker Image
run: |
docker build \
--build-arg EVNODE_VERSION=${{ env.EVNODE_VERSION }} \
--build-arg IGNITE_VERSION=${{ env.IGNITE_VERSION }} \
--build-arg IGNITE_EVOLVE_APP_VERSION=${{ env.IGNITE_EVOLVE_APP_VERSION }} \
-t ${{ env.EVOLVE_IMAGE_REPO }}:${{ env.EVOLVE_IMAGE_TAG }} \
.
- name: Run Liveness Test
run: |
cd tests/integration
go test -v -run TestDockerIntegrationTestSuite/TestLivenessWithCelestiaDA -timeout 30m
env:
EVOLVE_IMAGE_REPO: ${{ env.EVOLVE_IMAGE_REPO }}
EVOLVE_IMAGE_TAG: ${{ env.EVOLVE_IMAGE_TAG }}
liveness:
name: Test with Evolve Chain
runs-on: ubuntu-latest
timeout-minutes: 30
env:
DO_NOT_TRACK: true
EVNODE_VERSION: "v1.0.0-beta.10.0.20251216132820-afcd6bd9b354"
IGNITE_VERSION: "v29.6.1"
IGNITE_EVOLVE_APP_VERSION: "main"
outputs:
carol_mnemonic: ${{ steps.save_mnemonic.outputs.carol_mnemonic }}
gmd_home: ${{ steps.paths.outputs.GMD_HOME }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: "stable"
cache: true
- name: Install Ignite CLI
run: |
curl -sSL https://get.ignite.com/cli@$IGNITE_VERSION! | bash
- name: Scaffold Evolve Chain
run: |
# scaffold a new chain
ignite scaffold chain gm --no-module --skip-git --address-prefix gm
cd gm
# install evolve app
ignite app install github.com/ignite/apps/evolve@$IGNITE_EVOLVE_APP_VERSION
# add evolve to the chain
ignite evolve add
- name: Start Local DA
run: |
cd gm
# start the local da in the background
go tool github.com/evstack/ev-node/tools/local-da &
# capture the background process PID
echo "DA_PID=$!" >> $GITHUB_ENV
# give it a moment to start
sleep 3
- name: Replace ABCI Module with Current Branch And Prepare Chain
run: |
# get the path to the current checkout of ev-abci
CURRENT_DIR=$(pwd)
GO_EXECUTION_ABCI_DIR=$CURRENT_DIR
# enter the gm directory
cd gm
# replace the github.com/evstack/ev-node module with tagged version
go mod edit -replace github.com/evstack/ev-node=github.com/evstack/ev-node@$EVNODE_VERSION
# replace the github.com/evstack/ev-abci module with the local version
go mod edit -replace github.com/evstack/ev-abci=$GO_EXECUTION_ABCI_DIR
# download dependencies and update go.mod/go.sum
go mod tidy
# build the chain
ignite chain build --skip-proto
# initialize evolve
ignite evolve init
- name: Create extra accounts
id: save_mnemonic
run: |
MNEMONIC=$(gmd keys add carol --output json | jq -r .mnemonic)
echo "$MNEMONIC" > carol.mnemonic
echo "CAROL_MNEMONIC=$MNEMONIC" >> $GITHUB_ENV
echo "carol_mnemonic=$MNEMONIC" >> $GITHUB_OUTPUT
- name: Get gm binary and gmd home paths
id: paths
run: |
GM_BINARY_PATH=$(which gmd)
echo "GM_BINARY_PATH=$GM_BINARY_PATH"
echo "GM_BINARY_PATH=$GM_BINARY_PATH" >> $GITHUB_ENV
echo "GM_BINARY_PATH=$GM_BINARY_PATH" >> $GITHUB_OUTPUT
GMD_HOME=$(gmd config home)
echo "GMD_HOME=$GMD_HOME"
echo "GMD_HOME=$GMD_HOME" >> $GITHUB_ENV
echo "GMD_HOME=$GMD_HOME" >> $GITHUB_OUTPUT
- name: Upload gm Binary and gmd Home Directory
uses: actions/upload-artifact@v6
with:
name: gmd
include-hidden-files: true
if-no-files-found: error
path: |
${{ steps.paths.outputs.GM_BINARY_PATH }}
${{ steps.paths.outputs.GMD_HOME }}
- name: Start Chain and Wait for Blocks
run: |
# start the chain and send output to a log file
gmd start --rollkit.node.aggregator --log_format=json > chain.log 2>&1 &
CHAIN_PID=$!
echo "CHAIN_PID=$CHAIN_PID" >> $GITHUB_ENV
echo "Waiting for chain to produce blocks..."
# wait for chain to start and check for 5 blocks
BLOCKS_FOUND=0
MAX_ATTEMPTS=60
ATTEMPT=0
while [ $BLOCKS_FOUND -lt 5 ] && [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
sleep 2
ATTEMPT=$((ATTEMPT+1))
# check if the chain is still running
if ! ps -p $CHAIN_PID > /dev/null; then
echo "Chain process died unexpectedly"
cat chain.log
exit 1
fi
# query the node for the current block height
BLOCKS_FOUND=$(gmd query block --output json | tail -n +2 | jq -r '.header.height')
echo "Found $BLOCKS_FOUND blocks so far (attempt $ATTEMPT/$MAX_ATTEMPTS)"
done
if [ $BLOCKS_FOUND -lt 5 ]; then
echo "Failed to find 5 blocks within time limit"
cat chain.log
exit 1
fi
echo "Success! Chain produced at least 5 blocks."
- name: Test Transaction Submission and Query
run: |
# get Bob's and Carol's addresses
BOB_ADDRESS=$(gmd keys show bob -a)
CAROL_ADDRESS=$(gmd keys show carol -a)
echo "Bob's address: $BOB_ADDRESS"
echo "Carol's address: $CAROL_ADDRESS"
# query bob's initial balance
echo "Querying Bob's initial balance..."
INITIAL_BALANCE=$(gmd query bank balances $BOB_ADDRESS --output json | jq '.balances[0].amount' -r)
echo "Bob's initial balance: $INITIAL_BALANCE stake"
# check that bob has funds
if [ "$INITIAL_BALANCE" == "" ] || [ "$INITIAL_BALANCE" == "null" ] || [ "$INITIAL_BALANCE" -lt 100 ]; then
echo "Error: Bob's account not properly funded"
exit 1
fi
# send transaction from bob to carol and get tx hash
echo "Sending 100stake from Bob to Carol..."
TX_HASH=$(gmd tx bank send $BOB_ADDRESS $CAROL_ADDRESS 100stake -y --output json | jq -r .txhash)
sleep 3
# query the transaction
TX_RESULT=$(gmd query tx $TX_HASH --output json)
TX_CODE=$(echo $TX_RESULT | jq -r '.code')
if [ "$TX_CODE" != "0" ]; then
echo "Error: Transaction failed with code $TX_CODE"
echo $TX_RESULT | jq
exit 1
fi
# query bob's balance after transaction
FINAL_BALANCE=$(gmd query bank balances $BOB_ADDRESS --output json | jq '.balances[0].amount' -r)
echo "Bob's final balance: $FINAL_BALANCE"
# calculate and verify the expected balance
EXPECTED_BALANCE=$((INITIAL_BALANCE - 100))
if [ "$FINAL_BALANCE" != "$EXPECTED_BALANCE" ]; then
echo "Error: Balance mismatch. Expected: $EXPECTED_BALANCE, Actual: $FINAL_BALANCE"
exit 1
fi
echo "✅ Transaction test successful! Balance correctly updated."
- name: Cleanup Processes
if: always()
run: |
# kill chain process if it exists
if [[ -n "${CHAIN_PID}" ]]; then
kill -9 $CHAIN_PID || true
fi
# kill DA process if it exists
if [[ -n "${DA_PID}" ]]; then
kill -9 $DA_PID || true
fi
ibc:
name: Test IBC Connection Ev-ABCI <-> Cosmos Hub
runs-on: ubuntu-latest
timeout-minutes: 60
needs: liveness
env:
DO_NOT_TRACK: true
CAROL_MNEMONIC: ${{ needs.liveness.outputs.carol_mnemonic }}
GMD_HOME: ${{ needs.liveness.outputs.gmd_home }}
HERMES_VERSION: "v1.13.1"
GAIA_VERSION: "v25.1.0"
EVNODE_VERSION: "v1.0.0-beta.10.0.20251216132820-afcd6bd9b354"
steps:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Download gm Binary and gmd Home Directory
uses: actions/download-artifact@v4 # keep v4.
with:
name: gmd
path: gmd
- name: Download Gaia Binary
run: |
wget https://github.com/cosmos/gaia/releases/download/${GAIA_VERSION}/gaiad-${GAIA_VERSION}-linux-amd64
chmod +x gaiad-${GAIA_VERSION}-linux-amd64
sudo mv gaiad-${GAIA_VERSION}-linux-amd64 /usr/local/bin/gaiad
- name: Download Hermes Binary
run: |
wget https://github.com/informalsystems/hermes/releases/download/${HERMES_VERSION}/hermes-${HERMES_VERSION}-x86_64-unknown-linux-gnu.tar.gz
tar -xzf hermes-${HERMES_VERSION}-x86_64-unknown-linux-gnu.tar.gz
sudo mv hermes /usr/local/bin/hermes
- name: Start Cosmos Hub Chain
run: |
gaiad init cosmos-local --chain-id cosmos-local
echo "$CAROL_MNEMONIC" | gaiad keys add validator \
--keyring-backend test \
--recover > /dev/null 2>&1
gaiad genesis add-genesis-account $(gaiad keys show validator -a --keyring-backend test) 1000000000stake
gaiad genesis gentx validator 100000000stake --fees 1stake --chain-id cosmos-local --keyring-backend test
gaiad genesis collect-gentxs
gaiad config set app minimum-gas-prices 0.025stake
gaiad config set app grpc.enable true
gaiad start --rpc.laddr tcp://0.0.0.0:26654 --rpc.pprof_laddr localhost:6061 --p2p.laddr tcp://0.0.0.0:26653 --grpc.address 0.0.0.0:9091 --log_format=json > cosmos.log 2>&1 &
echo "COSMOS_PID=$!" >> $GITHUB_ENV
sleep 5
- name: Start Local DA
run: |
# Create a temporary go module to use go tool (can't use go install due to replace directives)
mkdir -p /tmp/da-tool
cd /tmp/da-tool
go mod init temp
go mod edit -replace github.com/evstack/ev-node=github.com/evstack/ev-node@$EVNODE_VERSION
go get github.com/evstack/ev-node/tools/local-da
# start the local da in the background
go tool github.com/evstack/ev-node/tools/local-da &
# capture the background process PID
echo "DA_PID=$!" >> $GITHUB_ENV
# give it a moment to start
sleep 3
- name: Start Evolve Chain
run: |
chmod +x ./gmd/go/bin/gmd # restoring permissions after download
./gmd/go/bin/gmd start --rollkit.node.aggregator --rpc.laddr tcp://0.0.0.0:26657 --grpc.address 0.0.0.0:9090 --log_format=json --home ./gmd/.gm > chain.log 2>&1 &
echo "CHAIN_PID=$!" >> $GITHUB_ENV
sleep 10
CAROL_ADDRESS=$(./gmd/go/bin/gmd keys show carol -a --home ./gmd/.gm)
echo "Fund Carol's account ($CAROL_ADDRESS)"
./gmd/go/bin/gmd tx bank send bob $CAROL_ADDRESS 200000stake -y --output json --home ./gmd/.gm
sleep 5
- name: Configure & Start Hermes Relayer
run: |
mkdir -p ~/.hermes
cat > ~/.hermes/config.toml <<EOF
[global]
log_level = "trace"
[mode]
[mode.clients]
enabled = true
refresh = true
misbehaviour = true
[mode.connections]
enabled = true
[mode.channels]
enabled = true
[mode.packets]
enabled = true
[[chains]]
id = "cosmos-local"
rpc_addr = "http://localhost:26654"
grpc_addr = "http://localhost:9091"
event_source = { mode = "pull", interval = "1s", max_retries = 4 }
store_prefix = "ibc"
account_prefix = "cosmos"
key_name = "validator"
gas_price = { price = 1, denom = "stake" }
gas_multiplier = 1.2
rpc_timeout = "10s"
trusting_period = "503h"
clock_drift = "10s"
[[chains]]
id = "gm"
rpc_addr = "http://localhost:26657"
grpc_addr = "http://localhost:9090"
store_prefix = "ibc"
event_source = { mode = "pull", interval = "1s", max_retries = 4 }
account_prefix = "gm"
key_name = "carol"
gas_price = { price = 0.025, denom = "stake" }
gas_multiplier = 1.2
rpc_timeout = "10s"
trusting_period = "503h"
clock_drift = "10s"
EOF
# add keys for both chains
tmp=$(mktemp)
echo "$CAROL_MNEMONIC" > $tmp
hermes keys add --chain gm --mnemonic-file $tmp
hermes keys add --chain cosmos-local --mnemonic-file $tmp
hermes start > hermes.log 2>&1 &
echo "HERMES_PID=$!" >> $GITHUB_ENV
- name: Create IBC Connection and Channel
run: |
hermes create channel --a-chain gm --a-port transfer --b-chain cosmos-local --b-port transfer --order unordered --new-client-connection --yes
- name: ICS20 Transfer Evolve -> Cosmos Hub
run: |
ROLLKIT_ADDR=$(./gmd/go/bin/gmd keys show carol -a --home ./gmd/.gm)
COSMOS_ADDR=$(gaiad keys show validator -a --keyring-backend test)
./gmd/go/bin/gmd tx ibc-transfer transfer transfer channel-0 $COSMOS_ADDR 100stake --from carol -y --home ./gmd/.gm
# Wait for IBC transfer to complete with retry logic
echo "Waiting for IBC transfer to complete..."
MAX_ATTEMPTS=30
ATTEMPT=0
IBC_FOUND=false
while [ $ATTEMPT -lt $MAX_ATTEMPTS ] && [ "$IBC_FOUND" = false ]; do
sleep 3
ATTEMPT=$((ATTEMPT+1))
BALANCE=$(gaiad query bank balances $COSMOS_ADDR --output json --node http://localhost:26654 | jq '.balances')
echo "Attempt $ATTEMPT/$MAX_ATTEMPTS - Gm balance: $BALANCE"
# Check if any denom starts with ibc/
if echo "$BALANCE" | jq -e '.[] | select(.denom | startswith("ibc/"))' > /dev/null; then
IBC_FOUND=true
echo "✅ IBC transfer successful! IBC denom found in balance."
else
echo "IBC denom not found yet, retrying in 3 seconds..."
fi
done
if [ "$IBC_FOUND" = false ]; then
echo "Error: No IBC denom found in balance after transfer within $MAX_ATTEMPTS attempts!"
echo "Final balance: $BALANCE"
exit 1
fi
- name: ICS20 Transfer Cosmos Hub -> Evolve
run: |
ROLLKIT_ADDR=$(./gmd/go/bin/gmd keys show carol -a --home ./gmd/.gm)
COSMOS_ADDR=$(gaiad keys show validator -a --keyring-backend test)
gaiad tx ibc-transfer transfer transfer channel-0 $ROLLKIT_ADDR 100stake --from validator --node http://localhost:26654 --fees 200000stake --keyring-backend test -y
# Wait for IBC transfer to complete with retry logic
echo "Waiting for IBC transfer to complete..."
MAX_ATTEMPTS=30
ATTEMPT=0
IBC_FOUND=false
while [ $ATTEMPT -lt $MAX_ATTEMPTS ] && [ "$IBC_FOUND" = false ]; do
sleep 3
ATTEMPT=$((ATTEMPT+1))
BALANCE=$(./gmd/go/bin/gmd query bank balances $ROLLKIT_ADDR --output json --home ./gmd/.gm | jq '.balances')
echo "Attempt $ATTEMPT/$MAX_ATTEMPTS - Gm balance: $BALANCE"
# Check if any denom starts with ibc/
if echo "$BALANCE" | jq -e '.[] | select(.denom | startswith("ibc/"))' > /dev/null; then
IBC_FOUND=true
echo "✅ IBC transfer successful! IBC denom found in balance."
else
echo "IBC denom not found yet, retrying in 3 seconds..."
fi
done
if [ "$IBC_FOUND" = false ]; then
echo "Error: No IBC denom found in balance after transfer within $MAX_ATTEMPTS attempts!"
echo "Final balance: $BALANCE"
exit 1
fi
- name: Print logs on failure
if: failure()
run: |
echo '--- chain.log ---'
cat chain.log || true
echo '--- cosmos.log ---'
cat cosmos.log || true
echo '--- hermes.log ---'
cat hermes.log || true
- name: Cleanup Processes
if: always()
run: |
if [[ -n "${CHAIN_PID}" ]]; then
kill -9 $CHAIN_PID || true
fi
if [[ -n "${COSMOS_PID}" ]]; then
kill -9 $COSMOS_PID || true
fi
if [[ -n "${DA_PID}" ]]; then
kill -9 $DA_PID || true
fi
if [[ -n "${HERMES_PID}" ]]; then
kill -9 $HERMES_PID || true
fi
attester-integration:
needs: build-gm-image
name: Attester Mode Integration Test
runs-on: ubuntu-latest
timeout-minutes: 30
env:
DO_NOT_TRACK: true
EVNODE_VERSION: "v1.0.0-beta.10.0.20251216132820-afcd6bd9b354"
IGNITE_VERSION: "v29.6.1"
IGNITE_EVOLVE_APP_VERSION: "main"
GAIA_VERSION: "v25.1.0"
EVOLVE_IMAGE_REPO: "evabci/gm"
EVOLVE_IMAGE_TAG: "local"
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Pull GM image from GHCR
run: |
docker pull ${{ needs.build-gm-image.outputs.image_tag }}
docker tag ${{ needs.build-gm-image.outputs.image_tag }} evabci/gm:local
- name: Run attester integration test
working-directory: tests/integration
env:
GOTOOLCHAIN: auto
VERBOSE: "true"
run: |
go test -v -run 'TestDockerIntegrationTestSuite/TestAttesterSystem' -count=1