Hermes setup
Install Rust, build Hermes, configure for Pirin and Osmosis, validate, and run.
1. Install Rust dependencies
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
sudo apt-get install pkg-config libssl-dev
sudo apt install librust-openssl-dev build-essential git2. Build and configure Hermes
Install the Hermes CLI, prepare the working directory, and pin to a known-good release:
cargo install ibc-relayer-cli --bin hermes --locked
mkdir -p $HOME/hermes
git clone https://github.com/informalsystems/ibc-rs.git hermes
cd hermes
git checkout v1.7.1Create the Hermes home + keys directories and copy the bundled example config in:
mkdir -p $HOME/.hermes $HOME/.hermes/keys
cp config.toml $HOME/.hermesVerify the install:
hermes versionHermes config.toml
Edit $HOME/.hermes/config.toml. Remove the default example [[chains]]
block and replace it with the Pirin and Osmosis entries below. The
example assumes you're running both a Pirin and an Osmosis full node on
the same host - adjust the RPC/gRPC endpoints if not.
[mode.clients]
enabled = true
refresh = true
misbehaviour = false
[mode.connections]
enabled = true
[mode.channels]
enabled = true
[mode.packets]
enabled = true
[[chains]]
id = 'pirin-1'
rpc_addr = 'http://127.0.0.1:26657'
event_source = { mode = 'push', url = 'ws://127.0.0.1:26657/websocket', batch_delay = '500ms' }
grpc_addr = 'http://127.0.0.1:9090'
rpc_timeout = '10s'
account_prefix = 'nolus'
key_name = 'hermes-nolus'
store_prefix = 'ibc'
default_gas = 5000000
max_gas = 15000000
gas_multiplier = 1.1
max_msg_num = 30
max_tx_size = 2097152
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '14days'
memo_prefix = ''
[chains.trust_threshold]
numerator = '1'
denominator = '3'
[chains.gas_price]
price = 0.025
denom = 'unls'
[chains.packet_filter]
policy = 'allow'
list = [
['transfer', 'channel-0'],
['ica*', '*'],
]
[chains.address_type]
derivation = 'cosmos'
[[chains]]
id = 'osmosis-1'
rpc_addr = 'http://127.0.0.1:26557'
event_source = { mode = 'push', url = 'ws://127.0.0.1:26557/websocket', batch_delay = '500ms' }
grpc_addr = 'http://127.0.0.1:9091'
rpc_timeout = '10s'
account_prefix = 'osmo'
key_name = 'hermes-osmosis'
store_prefix = 'ibc'
default_gas = 5000000
max_gas = 15000000
gas_multiplier = 1.1
max_msg_num = 20
max_tx_size = 209715
clock_drift = '20s'
max_block_time = '10s'
trusting_period = '10days'
memo_prefix = ''
[chains.trust_threshold]
numerator = '1'
denominator = '3'
[chains.gas_price]
price = 0.025
denom = 'uosmo'
[chains.packet_filter]
policy = 'allow'
list = [
['transfer', 'channel-783'],
['ica*', '*'],
]
[chains.address_type]
derivation = 'cosmos'Relayer wallet keys
Add your relayer wallet to Hermes' keyring (stored under
$HOME/.hermes/keys). The wallet needs a positive balance on every
chain because the relayer pays gas to submit IBC transactions.
Use the same mnemonic across all networks, and don't use those addresses for anything else - account sequence errors will follow.
hermes keys add --chain pirin-1 --mnemonic-file <hermes-seed-file>
hermes keys add --chain osmosis-1 --mnemonic-file <hermes-seed-file>3. Validate the configuration
hermes config validate
hermes health-checkA healthy output looks like:
INFO ThreadId(01) [pirin-1] chain is healthy
INFO ThreadId(01) [osmosis-1] chain is healthy4. Run Hermes
Once the underlying nodes are fully synced, start the daemon:
hermes start