# Documentation
#### Fetch Price Feed data on osmosis smart contract from bandchain
---------------------------------------
### Table of Contents
_______________________________________
- [Testnet Setup](#Testnet-Setup)
- [Install osmosisd tool](#Install-osmosisd-tool)
- [Initialize osmosis test node](#Initialize-osmosis-test-node)
- [Update Configuration](#Update-Configuration)
- [Sync with testnet](#Sync-with-testnet)
- [Run test-net node](#Run-test-net-node)
- [Configure osmosid client](#Configure-osmosid-client)
- [Add wallets with funds](#Add-wallets-with-funds)
________________________
- [Price Feed Contract](#Price-Feed-Contract)
- [Clone Repository](#Clone-Repository)
- [Build Contract](#Build-Contract)
- [Upload Contract](#Upload-Contract)
- [Initialize Contract](#Initialize-Contract)
- [Useful Commands]()
_______________________________________
- [Hermes Relayer](#Hermes-Relayer)
- [Install Rust Dependencies](#Install-Dependencies)
- [Build & setup Hermes](#Build-amp-setup-Hermes)
- [Add keys](#Add-keys)
- [Configure](#Configure)
- [Health Check](#Health-Check)
- [Run Relayer service](#Run-Relayer-service)
- [Useful Commands](#Useful-Commands1)
_______________________________________
- [Get Price Data](#Get-Price-Data)
_______________________________________
_______________________________________
## Testnet Setup
#### Install osmosisd tool
Clone the official reposiroty
```bash=
git clone https://github.com/osmosis-labs/osmosis.git
```
Checkout to a version **v25.0.0-rc0**
```bash=
git checkout v25.0.0-rc0
```
Run the following command to build **osmosisd** command tool.
```bash=
make install
```
This will generate a **osmosisd** file inside **build** directory.
Copy this **osmosisd** file to system file path. Example command
```bash=
cp ./build/osmosisd /usr/local/bin/osmosisd
```
Check osmosisd version.
```bash=
osmosisd version
```
#### Initialize osmosis test node
``` bash=
MONIKER=my-node
osmosisd init $MONIKER --chain-id osmo-test-5 --home $HOME/.osmosisd osmosisd init <your-key-name> --chain-id osmo-test-5
```
This will generate `genesis.json`, `app.toml`,`client.toml`,`config.toml` and some other files inside `~/.osmosisd/config` directory.
#### Update Configuration
1) Please update `laddr` value to `tcp://0.0.0.0:26657` under
**RPC Server Configuration Options** in `~/.osmosisd/config/config.toml` file.
2) Please update `address` value to `0.0.0.0:9090` under **gRPC Configuration** in `~/.osmosisd/config/app.toml` file.
3) Please update `address` value to `tcp://0.0.0.0:1317` under **API Configuration** in `~/.osmosisd/config/app.toml` file.
This will help you to make **RPC**, **gRPC**, AND **LCD** service to acess publicly.
**Note:** Assign domains to these services.
#### Sync with testnet
Please visit https://snapshots.testnet.osmosis.zone/ to get the latest snapshot of osmosis-testnet.
Use proviced snapshot link to download latest snap and extract to `~/.osmosisd` directory.
Example command...
```bash=
wget -q -O - https://osmosis.fra1.digitaloceanspaces.com/osmo-test-5/snapshots/v25/osmotest5_7394867.tar.lz4 | lz4 -d | tar -C $HOME/.osmosisd -xvf -
```
Please keep pacence this will took long time depending on the file size to be downloaded.
#### Run test-net node
Use following commands to validate genesis file and run node in testnet state.
```bash=
osmosisd validate-genesis
osmosisd start
```
Please make sure you are receiving latest block heights.
#### Configure osmosid client
Use following command to update osmosisd clint application configuration.
```bash=
osmosisd config chain-id osmo-test-5
osmosisd config node <your-rpc-domain-here>
```
Check and confirm abbove changes appied successfully.
```bash=
osmosisd status
```
#### Add wallets with funds
We have osmosis official git repository in our local machine.
Run following command.
```bash=
make localnet-keys
```
This will generate accounts which is pre-configured with one validator and 9 accounts with ION and OSMO balances.
Accounts are as follows...
| Account | Address | Mnemonic|
|-----------|-----------|---------|
|lo-val | osmo1phaxpevm5wecex2jyaqty2a4v02qj7qmlmzk5a osmovaloper1phaxpevm5wecex2jyaqty2a4v02qj7qm9v24r6 | satisfy adjust timber high purchase tuition stool faith fine install that you unaware feed domain license impose boss human eager hat rent enjoy dawn |
|lo-test1 | osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks | notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius |
| lo-test2 | osmo18s5lynnmx37hq4wlrw9gdn68sg2uxp5rgk26vv | quality vacuum heart guard buzz spike sight swarm shove special gym robust assume sudden deposit grid alcohol choice devote leader tilt noodle tide penalty |
| lo-test3 | osmo1qwexv7c6sm95lwhzn9027vyu2ccneaqad4w8ka | symbol force gallery make bulk round subway violin worry mixture penalty kingdom boring survey tool fringe patrol sausage hard admit remember broken alien absorb |
| lo-test4 | osmo14hcxlnwlqtq75ttaxf674vk6mafspg8xwgnn53 | bounce success option birth apple portion aunt rural episode solution hockey pencil lend session cause hedgehog slender journey system canvas decorate razor catch empty |
|lo-test5 | osmo12rr534cer5c0vj53eq4y32lcwguyy7nndt0u2t | second render cat sing soup reward cluster island bench diet lumber grocery repeat balcony perfect diesel stumble piano distance caught occur example ozone loyal |
| lo-test6 | osmo1nt33cjd5auzh36syym6azgc8tve0jlvklnq7jq | spatial forest elevator battle also spoon fun skirt flight initial nasty transfer glory palm drama gossip remove fan joke shove label dune debate quick |
| lo-test7 | osmo10qfrpash5g2vk3hppvu45x0g860czur8ff5yx0 | noble width taxi input there patrol clown public spell aunt wish punch moment will misery eight excess arena pen turtle minimum grain vague inmate |
| lo-test8 | osmo1f4tvsdukfwh6s9swrc24gkuz23tp8pd3e9r5fa | cream sport mango believe inhale text fish rely elegant below earth april wall rug ritual blossom cherry detail length blind digital proof identify ride |
| lo-test9 | osmo1myv43sqgnj5sm4zl98ftl45af9cfzk7nhjxjqh | index light average senior silent limit usual local involve delay update rack cause inmate wall render magnet common feature laundry exact casual resource hundred |
| lo-test10 | osmo14gs9zqh8m49yy9kscjqu9h72exyf295afg6kgk | prefer forget visit mistake mixture feel eyebrow autumn shop pair address airport diesel street pass vague innocent poem method awful require hurry unhappy shoulder |
## Price Feed Contract
#### Clone Repository
Please clone cw-band repository from official bandprotocol github.
```bash=
git clone https://github.com/bandprotocol/cw-band.git
```
#### Build Contract
Change directory to above cloned repository.
```bash=
cd cw-band/
```
**docker** is required to build and generate optimized `.wasm` file.
For docker installation please follow their official guide from [This link](https://docs.docker.com/desktop/install/ubuntu/)
```bash=
docker run --rm -v "$(pwd)":/code --mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry cosmwasm/workspace-optimizer:0.12.7
```
Above command will generate `price_feed.wasm `file inside `artifacts/` directory.
#### Upload Contract
Please run the following command to upload/deploy **wasm** file and get **CODE_ID.**
``` bash=
DEPLOYER=lo-test2
CHAIN_ID=osmo-test-5
TX=$(osmosisd tx wasm store artifacts/price_feed.wasm --from $DEPLOYER --chain-id=osmo-test-5 --gas-prices 0.05uosmo --gas auto --gas-adjustment 1.3 -b sync --output json -y | jq -r '.txhash')
CODE_ID=$(osmosisd query tx $TX --output json | jq -r '.events | map(select(.type == "store_code"))[0].attributes | map(select(.key == "code_id"))[0].value')
echo "Your contract code_id is $CODE_ID"
```
Above code will print out the **CODE_ID** of deployed wasm file.
#### Initialize Contract
Please run the following command to initialize contract for the above deployed `wasm` file.
```bash=
INITIAL_STATE='{"ask_count":"16","client_id":"cw-band-price-feed","execute_gas":"500000","fee_limit":[{"amount":"100000","denom":"uband"}],"min_count":"10","minimum_sources":4,"oracle_script_id":"360","prepare_gas":"100000"}'
osmosisd tx wasm instantiate $CODE_ID $INITIAL_STATE --amount 5uosmo --label "Price feed contract" --from $DEPLOYER --chain-id $CHAIN_ID --gas-prices 0.1uosmo --gas auto --gas-adjustment 1.3 -y --no-admin
CONTRACT_ADDR=$(osmosisd query wasm list-contract-by-code $CODE_ID --output json | jq -r '.contracts[0]')
echo "Your contract address is $CONTRACT_ADDR"
```
The above command will initialize to get data from bandchain laozi-testnet6 network.
Here we are using `oracle_script_id` **360** price-feed data.
Please follow oracle script link [Here](https://laozi-testnet6.cosmoscan.io/oracle-script/360)
#### Useful Commands
## Hermes Relayer
#### Install Dependencies
```bash=
# Update repository and install go
sudo apt-get install build-essential
wget https://dl.google.com/go/go1.22.3.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
source .profile
go version
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustc version
cargo version
```
#### Build & setup Hermes
```bash=
cargo install ibc-relayer-cli --bin hermes --locked
```
#### Add keys
```bash=
hermes keys add --chain band-laozi-testnet6 --mnemonic-file <band.mnemonic> --hd-path "m/44'/494'/0'/0/0"
hermes keys add --chain osmo-test-5 --mnemonic-file <osmosis.mnemonic> --hd-path "m/44'/494'/0'/0/0"
```
#### Configure
```yam=
# This is an example configuration for Hermes. It is meant to be
# used as a reference, _NOT_ for configuring a production relayer.
# If you're looking to configure a production relayer for some chains,
# try using the `hermes config auto` command to generate a config
# file that serves as the starting point for configuring Hermes.
# The global section has parameters that apply globally to the relayer operation.
[global]
# Specify the verbosity for the relayer logging output. Default: 'info'
# Valid options are 'error', 'warn', 'info', 'debug', 'trace'.
log_level = 'trace'
# Specify the mode to be used by the relayer. [Required]
[mode]
# Specify the client mode.
[mode.clients]
# Whether or not to enable the client workers. [Required]
enabled = true
# Whether or not to enable periodic refresh of clients. [Default: true]
# This feature only applies to clients that underlie an open channel.
# For Tendermint clients, the frequency at which Hermes refreshes them is 2/3 of their
# trusting period (e.g., refresh every ~9 days if the trusting period is 14 days).
# Note: Even if this is disabled, clients will be refreshed automatically if
# there is activity on a connection or channel they are involved with.
refresh = true
# Whether or not to enable misbehaviour detection for clients. [Default: true]
misbehaviour = true
# Specify the connections mode.
[mode.connections]
# Whether or not to enable the connection workers for handshake completion. [Required]
enabled = true
# Specify the channels mode.
[mode.channels]
# Whether or not to enable the channel workers for handshake completion. [Required]
enabled = true
# Specify the packets mode.
[mode.packets]
# Whether or not to enable the packet workers. [Required]
enabled = true
# Parametrize the periodic packet clearing feature.
# Interval (in number of blocks) at which pending packets
# should be periodically cleared. A value of '0' will disable
# periodic packet clearing. [Default: 100]
clear_interval = 100
# Whether or not to clear packets on start. [Default: true]
clear_on_start = true
# Toggle the transaction confirmation mechanism.
# The tx confirmation mechanism periodically queries the `/tx_search` RPC
# endpoint to check that previously-submitted transactions
# (to any chain in this config file) have been successfully delivered.
# If they have not been, and `clear_interval = 0`, then those packets are
# queued up for re-submission.
# If set to `false`, the following telemetry metrics will be disabled:
# `acknowledgment_packets_confirmed`, `receive_packets_confirmed` and `timeout_packets_confirmed`.
# [Default: false]
tx_confirmation = false
# Auto register the counterparty payee on a destination chain to
# the relayer's address on the source chain. This can be used
# for simple configuration of the relayer to receive fees for
# relaying RecvPacket on fee-enabled channels.
# For more complex configuration, turn this off and use the CLI
# to manually register the payee addresses.
# [Default: false]
auto_register_counterparty_payee = false
# Set the maximum size for the memo field in ICS20 packets.
# If the size of the memo field is bigger than the configured
# one, the packet will not be relayed.
# The filter can be disabled by setting `enabled = false`.
# [Default: "32KiB"]
#ics20_max_memo_size = { enabled = true, size = "32KiB" }
# Set the maximum size for the receiver field in ICS20 packets.
# If the size of the receiver field is bigger than the configured
# one, the packet will not be relayed.
# The filter can be disabled by setting `enabled = false`.
# [Default: "2KiB"]
#ics20_max_receiver_size = { enabled = true, size = "2KiB" }
# The REST section defines parameters for Hermes' built-in RESTful API.
# https://hermes.informal.systems/rest.html
[rest]
# Whether or not to enable the REST service. Default: false
enabled = false
# Specify the IPv4/6 host over which the built-in HTTP server will serve the RESTful
# API requests. Default: 127.0.0.1
host = '0.0.0.0'
# Specify the port over which the built-in HTTP server will serve the restful API
# requests. Default: 3000
port = 3000
# The telemetry section defines parameters for Hermes' built-in telemetry capabilities.
# https://hermes.informal.systems/telemetry.html
[telemetry]
# Whether or not to enable the telemetry service. Default: false
enabled = false
# Specify the IPv4/6 host over which the built-in HTTP server will serve the metrics
# gathered by the telemetry service. Default: 127.0.0.1
host = '0.0.0.0'
# Specify the port over which the built-in HTTP server will serve the metrics gathered
# by the telemetry service. Default: 3001
port = 3001
[telemetry.buckets]
# Specify the range of the 10 histogram buckets in ms for the `tx_latency_submitted` metric.
# Default: { start = 500, end = 10000, buckets = 10 }
# The default will give the following buckets:
# [500, 2450, 4400, 6350, 8300, 10250, 12200, 14150, 16100, 18050, 20000]
# latency_submitted = { start = 500, end = 20000, buckets = 10 }
# Specify the range of the 10 histogram buckets in ms for the `tx_latency_confirmed` metric.
# Default: { start = 1000, end = 20000, buckets = 10 }
# The default will give the following buckets:
# [1000, 3900, 6800, 9700, 12600, 15500, 18400, 21300, 24200, 27100, 30000]
# latency_confirmed = { start = 1000, end = 30000, buckets = 10 }
# The tracing server section defines parameters for Hermes' server allowing updates to the tracing directives.
#
# https://hermes.informal.systems/advanced/troubleshooting/log-level.html#overriding-the-tracing-filter-during-runtime
[tracing_server]
# Whether or not to enable the tracing server. Default: false
enabled = false
# Specify the port over which the built-in TCP server will serve the directives. Default: 5555
port = 5555
# A chains section includes parameters related to a chain and the full node to which
# the relayer can send transactions and queries.
[[chains]]
# Specify the chain ID. Required
id = 'osmo-test-5'
# Specify the chain type, currently only `CosmosSdk` is supported.
# Default: CosmosSdk
type = "CosmosSdk"
# Whether or not this is a CCV consumer chain. Default: false
# Only specify true for CCV consumer chain, but NOT for sovereign chains.
ccv_consumer_chain = false
# Specify the RPC address and port where the chain RPC server listens on. Required
rpc_addr = 'https://rpc.osmosis-test-5.stockdex.io:443/'
# Specify the GRPC address and port where the chain GRPC server listens on. Required
grpc_addr = 'https://grpc.osmosis-test-5.stockdex.io:443/'
# The type of event source to use for getting events from the chain.
#
# This setting can take two types of values, as an inline table:
#
# a) Push: for receiving IBC events over WebSocket.
#
# `{ mode = 'push', url = 'ws://127.0.0.1:26657/websocket', batch_delay = '500ms' }`
#
# where
#
# - `url` is the WebSocket URL to connect to. Required
# - `batch_delay` is the delay until event batch is
# emitted in the absence of NewBlock event. Default: 500ms
# Lower values will result in faster event processing, improving the latency of Hermes,
# but may split the events into more batches than necessary, requiring more client updates
# to be submitted, yielding higher costs. Higher values will result in slower event
# processing, increasing the latency of Hermes, but are more likely to batch events together.
# The default value provides good latency while minimizing the number of client updates needed.
# b) Pull: for polling for IBC events via the `/block_results` RPC endpoint.
#
# `{ mode = 'pull', interval = '1s', max_retries = 4 }`
#
# where
#
# - `interval` is the interval at which to poll for blocks. Default: 1s
# - `max_retries` is the maximum number of retries to collect events for each block. Default: 4
#
# This mode should only be used in situations where Hermes misses events that it should be
# receiving, such as when relaying for CosmWasm-enabled chains which emit IBC events without
# the `message` attribute. Without this attribute, the WebSocket is not able to catch these
# events, so the `/block_results` RPC must be used instead.
#
# event_source = { mode = 'push', url = 'wss://rpc.osmosis-test-5.stockdex.io/websocket', batch_delay = '500ms' }
event_source = { mode = 'pull', interval = '1s', max_retries = 4 }
# Specify the maximum amount of time (duration) that the RPC requests should
# take before timing out. Default: 10s (10 seconds)
# Note: Hermes uses this parameter _only_ in `start` mode; for all other CLIs,
# Hermes uses a large preconfigured timeout (on the order of minutes).
rpc_timeout = '10s'
# Experimental: Whether or not the full node is trusted.
#
# If not trusted, Hermes will verify headers included in the `ClientUpdate` message using the light client.
#
# Note: If the full node is configured as trusted then, in addition to headers not being verified,
# the verification traces will not be provided.
# This may cause failure in client updates after significant change in validator sets.
#
# Default: false
trusted_node = false
# Specify the prefix used by the chain. Required
account_prefix = 'osmo'
# Specify the name of the private key to use for signing transactions. Required
# See the Adding Keys chapter for more information about managing signing keys:
# https://hermes.informal.systems/documentation/commands/keys/index.html#adding-keys
key_name = 'testkey'
# Specify the folder used to store the keys. Optional
# If this is not specified then the hermes home folder is used.
# key_store_folder = '$HOME/.hermes/keys'
# Specify the address type which determines:
# 1) address derivation;
# 2) how to retrieve and decode accounts and pubkeys;
# 3) the message signing method.
# The current configuration options are for Cosmos SDK and Ethermint.
#
# Example configuration for chains based on Ethermint library:
#
# address_type = { derivation = 'ethermint', proto_type = { pk_type = '/ethermint.crypto.v1.ethsecp256k1.PubKey' } }
#
# Default: { derivation = 'cosmos' }, i.e. address derivation as in Cosmos SDK.
# Warning: This is an advanced feature! Modify with caution.
address_type = { derivation = 'cosmos' }
# Specify the store prefix used by the on-chain IBC modules. Required
# Recommended value for Cosmos SDK: 'ibc'
store_prefix = 'ibc'
# Gas Parameters
#
# The term 'gas' is used to denote the amount of computation needed to execute
# and validate a transaction on-chain. It can be thought of as fuel that gets
# spent in order to power the on-chain execution of a transaction.
#
# Hermes attempts to simulate how much gas a transaction will expend on its
# target chain. From that, it calculates the cost of that gas by multiplying the
# amount of estimated gas by the `gas_multiplier` and the `gas_price`
# (estimated gas * `gas_multiplier` * `gas_price`) in order to compute the
# total fee to be deducted from the relayer's wallet.
#
# The `simulate_tx` operation does not always correctly estimate the appropriate
# amount of gas that a transaction requires. In those cases when the operation
# fails, Hermes will attempt to submit the transaction using the specified
# `default_gas` and `max_gas` parameters. In the case that a transaction would
# require more than `max_gas`, it doesn't get submitted and a
# `TxSimulateGasEstimateExceeded` error is returned.
# Specify the default amount of gas to be used in case the tx simulation fails,
# and Hermes cannot estimate the amount of gas needed.
# Default: 100 000
default_gas = 100000
# Specify the maximum amount of gas to be used as the gas limit for a transaction.
# If `default_gas` is unspecified, then `max_gas` will be used as `default_gas`.
# Default: 400 000
max_gas = 4000000
# Specify the price per gas used of the fee to submit a transaction and
# the denomination of the fee.
#
# The specified gas price should always be greater or equal to the `min-gas-price`
# configured on the chain. This is to ensure that at least some minimal price is
# paid for each unit of gas per transaction.
#
# Required
gas_price = { price = 0.025, denom = 'uosmo' }
# Multiply this amount with the gas estimate, used to compute the fee
# and account for potential estimation error.
#
# The purpose of multiplying by `gas_multiplier` is to provide a bit of a buffer
# to catch some of the cases when the gas estimation calculation is on the low
# end.
#
# Example: With this setting set to 1.1, then if the estimated gas
# is 80_000, then gas used to compute the fee will be adjusted to
# 80_000 * 1.1 = 88_000.
#
# Default: 1.1, ie. the gas is increased by 10%
# Minimum value: 1.0
gas_multiplier = 1.1
# Query the current gas price from the chain instead of using the static `gas_price` from the config.
# Useful for chains which have [EIP-1559][eip]-like dynamic gas price.
#
# At the moment, only chains which support the `osmosis.txfees.v1beta1.Query/GetEipBaseFee`
# query can be used with dynamic gas price enabled.
#
# See this page in the Hermes guide for more information:
# https://hermes.informal.systems/documentation/configuration/dynamic-gas-fees.html
#
# Default: { enabled = false, multiplier = 1.1, max = 0.6 }
dynamic_gas_price = { enabled = false, multiplier = 1.1, max = 0.6 }
# Specify how many IBC messages at most to include in a single transaction.
# Default: 30
max_msg_num = 30
# Specify the maximum size, in bytes, of each transaction that Hermes will submit.
# Default: 2097152 (2 MiB)
max_tx_size = 2097152
# How many packets to fetch at once from the chain when clearing packets.
# Default: 50
query_packets_chunk_size = 50
# Specify the maximum amount of time to tolerate a clock drift.
# The clock drift parameter defines how much new (untrusted) header's time
# can drift into the future. Default: 5s
clock_drift = '5s'
# Specify the fallback value for the maximum time per block for this chain.
# The block time together with the clock drift are added to the source drift to estimate
# the maximum clock drift when creating a client on this chain. Default: 30s
# When validating the configuration, Hermes will query the /genesis RPC endpoint in order
# to retrieve the `max_expected_time_per_block` and use it as the `max_block_time`.
# If the query fails, the configured `max_block_time` is used instead.
# For cosmos-SDK chains a good approximation is `timeout_propose` + `timeout_commit`
# Note: This MUST be the same as the `max_expected_time_per_block` genesis parameter for Tendermint chains.
max_block_time = '30s'
# Specify the amount of time to be used as the light client trusting period.
# It should be significantly less than the unbonding period
# (e.g. unbonding period = 3 weeks, trusting period = 2 weeks).
#
# Default: 2/3 of the `unbonding period` for Cosmos SDK chains
trusting_period = '3days'
# The rate at which to refresh the client referencing this chain,
# expressed as a fraction of the trusting period.
#
# Default: 1/3 (ie. three times per trusting period)
client_refresh_rate = '1/3'
# Specify the trust threshold for the light client, ie. the minimum fraction of validators
# which must overlap across two blocks during light client verification.
#
# Warning: This is an advanced feature! Modify with caution.
#
# Default: 2/3
trust_threshold = '2/3'
# Specify a string that Hermes will use as a memo for each transaction it submits
# to this chain. The string is limited to 50 characters. Default: '' (empty).
# Note: Hermes will append to the string defined here additional
# operational debugging information, e.g., relayer build version.
memo_prefix = ''
# If this is set to a string, it will overwrite the memo used by Hermes for each transaction
# it submits to this chain.
# Default: not set.
# This is used for chains which have a very small character limit for the memo,
# and the additional information appended by Hermes would overflow that limit.
# memo_overwrite = ''
# This section specifies the filters for policy based relaying.
#
# Default: no policy / filters, allow all packets on all channels.
#
# Only packet filtering based on channel identifier can be specified.
# A channel filter has two fields:
# 1. `policy` - one of two types are supported:
# - 'allow': permit relaying _only on_ the port/channel id in the list below,
# - 'deny': permit relaying on any channel _except for_ the list below.
# 2. `list` - the list of channels specified by the port and channel identifiers.
# Optionally, each element may also contains wildcards, for eg. 'ica*'
# to match all identifiers starting with 'ica' or '*' to match all identifiers.
#
# Example configuration of a channel filter, only allowing packet relaying on
# channel with port ID 'transfer' and channel ID 'channel-0', as well as on
# all ICA channels.
#
# [chains.packet_filter]
# policy = 'allow'
# list = [
# ['ica*', '*'],
# ['transfer', 'channel-0'],
# ]
# This section specifies the filters for incentivized packet relaying.
# Default: no filters, will relay all packets even if they
# are not incentivized.
#
# It is possible to specify the channel or use wildcards for the
# channels.
# The only fee which can be parametrized is the `recv_fee`.
#
# Example configuration of a filter which will only relay incentivized
# packets, with no regards for channel and amount.
#
# [chains.packet_filter.min_fees.'*']
# recv = [ { amount = 0 } ]
#
# Example configuration of a filter which will only relay packets if they are
# from the channel 'channel-0', and they have a `recv_fee` of at least 20 stake
# or 10 uatom.
#
# [chains.packet_filter.min_fees.'channel-0']
# recv = [ { amount = 20, denom = 'stake' }, { amount = 10, denom = 'uatom' } ]
# Specify that the transaction fees should be paid from this fee granter's account.
# Optional. If unspecified (the default behavior), then no fee granter is used, and
# the account specified in `key_name` will pay the tx fees for all transactions
# submitted to this chain.
# fee_granter = ''
# Specify the CometBFT compatibility mode to use.
# The following behaviours are applied whether the `compat_mode` is configured or not:
# * compat_mode is specified and the version queried from /status is the same as the one configured: Use that version without log output
# * compat_mode is specified but the version queried from /status differs: The CompatMode configured is used, but a warning log is outputted
# * compat_mode is not specified but /status returns a correct version: The CompatMode retrieved from the endpoint is used
# * compat_mode is not specified and /status does not return a valid version: Hermes stops and outputs an error informing the user a compat_mode needs to be configured
# Possible values: [`0.34`, `0.37`]
# compat_mode = '0.34'
# Specify the a clear interval for the chain.
# This will override the global clear interval for this chain only, allowing different intervals for each chain.
# clear_interval = 50
# Specify packet sequences which should not be cleared, per channel.
#
# For each channel, specify a list of sequences which should not be cleared, eg.
#
# excluded_sequences = [
# ['channel-0', [1, 2, 3]],
# ['channel-1', [4, 5, 6]]
# ]
#
# Default: No filter
# excluded_sequences = []
[[chains]]
id = 'band-laozi-testnet6'
rpc_addr = 'https://rpc.laozi-testnet6.bandchain.org:443/'
grpc_addr = 'https://laozi-testnet6.bandchain.org:443/'
# event_source = { mode = 'push', url = 'wss://rpc.laozi-testnet6.bandchain.org/websocket', batch_delay = '500ms' }
event_source = { mode = 'pull', interval = '1s', max_retries = 4 }
rpc_timeout = '10s'
trusted_node = false
account_prefix = 'band'
key_name = 'testkey'
store_prefix = 'ibc'
default_gas = 100000
max_gas = 4000000
gas_price = { price = 0.025, denom = 'uband' }
gas_multiplier = 1.1
max_msg_num = 30
max_tx_size = 2097152
clock_drift = '5s'
max_block_time = '30s'
trusting_period = '3days'
trust_threshold = '2/3'
address_type = { derivation = 'cosmos' }
```
#### Health Check
```bash=
hermes health-check
```
#### Run Relayer service
##### Create Channel
```bash=
hermes create channel --a-chain band-laozi-testnet6 --b-chain osmo-test-5 --a-port oracle --b-port wasm.osmo1n5tknme9q7k8xysm7d2t34z00ktg3jvkm9m7mq7u8s9jm6w777sqjtwepu --order unordered --channel-version bandchain-1 --new-client-connection
```
Above command will took some time to create the channels between band and osmo testnet and provide following output. which will have channel-ids.
```json=
SUCCESS Channel {
ordering: Unordered,
a_side: ChannelSide {
chain: BaseChainHandle {
chain_id: ChainId {
id: "band-laozi-testnet6",
version: 0,
},
runtime_sender: Sender { .. },
},
client_id: ClientId(
"07-tendermint-1154",
),
connection_id: ConnectionId(
"connection-1001",
),
port_id: PortId(
"oracle",
),
channel_id: Some(
ChannelId(
"channel-861",
),
),
version: Some(
Version(
"bandchain-1",
),
),
},
b_side: ChannelSide {
chain: BaseChainHandle {
chain_id: ChainId {
id: "osmo-test-5",
version: 5,
},
runtime_sender: Sender { .. },
},
client_id: ClientId(
"07-tendermint-3556",
),
connection_id: ConnectionId(
"connection-3116",
),
port_id: PortId(
"wasm.osmo1n5tknme9q7k8xysm7d2t34z00ktg3jvkm9m7mq7u8s9jm6w777sqjtwepu",
),
channel_id: Some(
ChannelId(
"channel-7977",
),
),
version: Some(
Version(
"bandchain-1",
),
),
},
connection_delay: 0ns,
}
```
##### Run hermes relayer
```bash=
hermes start
```
## Get Price Data
#### Update Price Data onchain.
```bash=
osmosisd tx wasm execute osmo1n5tknme9q7k8xysm7d2t34z00ktg3jvkm9m7mq7u8s9jm6w777sqjtwepu '{"request":{"symbols": ["BTC"] }}' --from lo-val -y --chain-id=osmo-test-5 --gas-prices 0.01uosmo --gas auto --gas-adjustment 1.3
```
#### Query price data
```bash=
osmosisd query wasm contract-state smart osmo1n5tknme9q7k8xysm7d2t34z00ktg3jvkm9m7mq7u8s9jm6w777sqjtwepu '{"get_rate":{"symbol":"BTC"}}' --chain-id osmo-test-5
```