# Paloma IBC and ICA testing
## Paloma setup
### Clone repo and install
``` bash
git clone https://github.com/palomachain/paloma.git
git checkout aleem/fix-ibc
export VERSION=v0.11.7
make install
```
* Confirm osmosis binary installed
``` sh
$ palomad version
v0.11.7
```
### Setup paloma validator
* Initialize node
``` bash
palomad init validator --chain-id paloma-1
```
* Add keys and copy the `relayer` mnemonic seed(required for relayer)
``` sh
palomad keys add validator --keyring-backend test
palomad keys add key1 --keyring-backend test
palomad keys add relayer --keyring-backend test
```
``` bash
palomad add-genesis-account validator 1000000000000000000000000ugrain --keyring-backend test
palomad add-genesis-account key1 1000000000000000000000000ugrain --keyring-backend test
palomad add-genesis-account relayer 1000000000000000000000000ugrain --keyring-backend test
sed -i "s/172800s/600s/g" ~/.paloma/config/genesis.json
palomad gentx validator 9000000000000000000ugrain --chain-id paloma-1 --keyring-backend test
palomad collect-gentxs
palomad start
```
## Osmosis setup
### install osmosis binary
Download and install osmosis binary from https://github.com/osmosis-labs/osmosis/releases/tag/v15.1.0
* Confirm osmosis binary installed
``` bash
$ osmosis version
15.1.0
```
### setup osmosis validator node
* Initialize node
``` bash
osmosis init validator --chain-id osmosis-1
```
* Add keys and copy the `relayer` mnemonic seed(required for relayer)
``` bash
osmosis keys add validator --keyring-backend test
osmosis keys add key1 --keyring-backend test
osmosis keys add relayer --keyring-backend test
```
``` bash
osmosis add-genesis-account validator 10000000000000000000uosmo --keyring-backend test
osmosis add-genesis-account key1 10000000000000000000uosmo --keyring-backend test
osmosis add-genesis-account relayer 10000000000000000000uosmo --keyring-backend test
sed -i "s/stake/uosmo/g" ~/.osmosisd/config/genesis.json
osmosis gentx validator 100000000000000000uosmo --chain-id osmosis-1 --keyring-backend test
osmosis collect-gentxs
```
Note: As we are running both chains on the same system, we cannot use the same ports for both networks. Therefore, we need to update the configuration of the second network.
### Update osmosis node configuration
* Open .osmosisd/config/config.toml file and chage the ports.
``` toml
proxy_app "tcp://127.0.0.1:26658" => "tcp://127.0.0.1:16658"
rpc.laddr "tcp://127.0.0.1:26658" => "tcp://127.0.0.1:16658"
p2p.laddr = "tcp://0.0.0.0:26656" => "tcp://127.0.0.1:16656"
```
* Open .osmosisd/config/app.toml file and chage the ports.
``` toml
api.enable false => true
api.address "tcp://0.0.0.0:1317" => "tcp://0.0.0.0:1318"
grpc.address "0.0.0.0:9090" => "0.0.0.0:9100"
grpc-web.address "0.0.0.0:9091" => "0.0.0.0:9101"
```
### start osmosis validator node
``` bash
osmosis start
```
* After successfully running both the chains we have to install the hermes relayer.
### Hermes relayer setup
* Follow these instructions to install Hermes relayer https://hermes.informal.systems/quick-start/installation.html
* After Hermes installation create a `.hermes/config.toml` file and paste the following data.
``` toml
[global]
log_level = 'info'
[mode]
[mode.clients]
enabled = true
refresh = true
misbehaviour = true
[mode.connections]
enabled = true
[mode.channels]
enabled = true
[mode.packets]
enabled = true
clear_interval = 100
clear_on_start = true
tx_confirmation = true
[telemetry]
enabled = true
host = '127.0.0.1'
port = 3001
[rest]
enabled = true
host = '127.0.0.1'
port = 3000
[[chains]]
id = 'paloma-1'
rpc_addr = 'http://localhost:26657'
grpc_addr = 'http://localhost:9090'
websocket_addr = 'ws:/localhost:26657/websocket'
rpc_timeout = '15s'
account_prefix = 'paloma'
key_name = 'key'
store_prefix = 'ibc'
gas_price = { price = 0.01, denom = 'ugrain' }
max_gas = 10000000
clock_drift = '5s'
trusting_period = '1days'
trust_threshold = { numerator = '1', denominator = '3' }
[[chains]]
id = 'osmosis-1'
rpc_addr = 'http://localhost:16657'
grpc_addr = 'http://localhost:9100'
websocket_addr = 'ws:/localhost:16657/websocket'
rpc_timeout = '15s'
account_prefix = 'osmo'
key_name = 'key1'
store_prefix = 'ibc'
gas_price = { price = 0.01, denom = 'uosmo' }
max_gas = 10000000
clock_drift = '5s'
trusting_period = '1days'
trust_threshold = { numerator = '1', denominator = '3' }
```
* Now create a new text file `paloma.txt` and paste mnemonic seed of relayer key.
* * Now create a new text file `osmosis.txt` and paste mnemonic seed of relayer key.
* Now add keys for both network
```
hermes keys add --mnemonic-file paloma.txt --chain paloma-1
hermes keys add --mnemonic-file osmosis.txt --chain osmosis-1
```
* Now check the keys is successfully added or not with this command:
``` bash
hermes keys list --chain paloma-1
hermes keys list --chain osmosis-1
```
### IBC transfers
* Now we have to create a transfer channel between both the chains to perform IBC transfers.
``` sh
hermes create channel --a-chain paloma-1 --b-chain osmosis-1 --a-port transfer --b-port transfer --new-client-connection
```
* After successfully creating channel and connection start the Hermes relayer.
``` sh
hermes start
```
* IBC transfer from Paloma chain to Osmosis chain
``` bash
palomad tx ibc-transfer transfer transfer channel-0 osmo1402gct50k0ylfrk37vd7uzw0c8q2uq8e202jhy 100000ugrain --chain-id paloma-1 --from key1 --keyring-backend test
```
NOTE: you can find channel id with `palomad q ibc channel channels`
* Now switch to Osmosis and check the account balance of `osmo1402gct50k0ylfrk37vd7uzw0c8q2uq8e202jhy`. There should be a token with IBC denom.
* Now do IBC transfer from Osmosis to Paloma chain
``` bash
osmosis tx ibc-transfer transfer transfer channel-0 paloma1sardq8anj85k49sfh3vchvd4elphy24kx9w43g 10000stake --from key1 --chain-id osmosis-1 --keyring-backend test --node tcp://0.0.0.0:16657 --fees 900stake
```
NOTE: you can find channel id with `osmosis q ibc channel channels`
* Now switch to Paloma and check the account balance of `paloma1sardq8anj85k49sfh3vchvd4elphy24kx9w43g`. There should be a token with IBC denom.
## Paloma upgrade to v0.11.8
* After performing IBC transfers submit a software upgrade proposal
``` bash
palomad tx gov submit-proposal software-upgrade v0.11.8 --upgrade-height 1500 --title v0.11.8 --description "testing v0.11.8 upgrade" --deposit 1000000ugrain --from key1 --keyring-backend test --chain-id paloma-1
palomad tx gov vote 1 yes --from validator --keyring-backend test --chain-id paloma-1
palomad tx gov vote 1 yes --from key1 --keyring-backend test --chain-id paloma-1
```
* Wait for upgrade hight to hit. After the upgrade height hit, stop the Paloma node.
``` bash
git checkout master
export VERSION=v0.11.8
make install
palomad start
```
After starting the Paloma chain with new binary, test IBC transfer again.
## ICA testing
* Stop the osmosis node if it is running before testing ICA.
To test ICA we need a chain with both ICA controller and host enabled.
### ICA demo chain setup
``` bash
git clone https://github.com/cosmos/interchain-accounts-demo.git
cd interchain-accounts-demo
make install
```
* Check binary installed
``` bash
ica version --long
```
* Setup ICA demo chain
Note: Copy relayer key mnemonic seed, we need it for relayer account.
``` bash
icad init validator --chain-id icademo-1
icad keys add validator --keyring-backend test
icad keys add key1 --keyring-backend test
icad keys add relayer --keyring-backend test
icad genesis add-genesis-account validator 10000000000stake --keyring-backend test
icad genesis add-genesis-account key1 10000000000stake --keyring-backend test
icad genesis add-genesis-account relayer 10000000000stake --keyring-backend test
icad genesis gentx validator 10000000000stake --keyring-backend test --chain-id icademo-1
sed -i "s/172800s/600s/g" ~/.ica/config/genesis.json
icad genesis collect-gentxs
```
### Update ICA demo node configuration
* Open .ica/config/config.toml file and chage the ports.
``` toml
proxy_app "tcp://127.0.0.1:26658" => "tcp://127.0.0.1:16658"
rpc.laddr "tcp://127.0.0.1:26658" => "tcp://127.0.0.1:16658"
p2p.laddr = "tcp://0.0.0.0:26656" => "tcp://127.0.0.1:16656"
```
* Open .ica/config/app.toml file and chage the ports.
``` toml
api.enable false => true
api.address "tcp://0.0.0.0:1317" => "tcp://0.0.0.0:1318"
grpc.address "0.0.0.0:9090" => "0.0.0.0:9100"
grpc-web.address "0.0.0.0:9091" => "0.0.0.0:9101"
```
* Start the ICA demo app node
``` bash
icad start
```
* Now open hermes configuration file and remove osmosis chain information and add the following ICA demo chain information to the `config.toml` file.
``` toml
[[chains]]
id = 'icademo-1'
rpc_addr = 'http://localhost:16657'
grpc_addr = 'http://localhost:9100'
websocket_addr = 'ws:/localhost:16657/websocket'
rpc_timeout = '15s'
account_prefix = 'cosmos'
key_name = 'key1'
store_prefix = 'ibc'
gas_price = { price = 0.01, denom = 'stake' }
max_gas = 10000000
clock_drift = '5s'
trusting_period = '1days'
trust_threshold = { numerator = '1', denominator = '3' }
```
* Now add a relayer account for ICA demo chain.
``` bash
hermes keys add --chain icademo-1 --mnemonic-file <path-to-relayer-mnemonic-file>
```
* After adding account start the hermes relayer.
``` bash
hermes start
```
* Create a new connection between Paloma chain and ICA demo chain
``` bash
hermes create connection --a-chain paloma-1 --b-chain icademo-1
```
* Note down channel and connection
#### create interchain account on paloma chain
``` bash
# Register an interchain account on behalf of key1
icad tx intertx register --from key1 --connection-id connection-0 --chain-id icademo-1 --node tcp://localhost:16657 --keyring-backend test -y
export ICADEMO_KEY1=$(icad keys show -a key1 --keyring-backend test)
# Query the address of the interchain account
icad query intertx interchainaccounts connection-0 $ICADEMO_KEY1 --node tcp://localhost:16657
# Store the interchain account address by parsing the query result
export ICADEMO_ADDR=$(icad query intertx interchainaccounts connection-0 $ICADEMO_KEY1 --node tcp://localhost:16657 -o json | jq -r '.interchain_account_address') && echo $ICADEMO_ADDR
```
#### Funding the Interchain Account wallet
``` bash
# Query the interchain account balance on the host chain. It should be empty.
palomad q bank balances $ICADEMO_ADDR --chain-id paloma-1 --node tcp://localhost:26657
# Send funds to the interchain account.
palomad tx bank send key1 $ICADEMO_ADDR 10000ugrain --chain-id paloma-1 --node tcp://localhost:26657 --keyring-backend test -y
# Query the balance once again and observe the changes
icad q bank balances $ICADEMO_ADDR --chain-id test-2 --node tcp://localhost:26657
```
#### Sending ICA transactions
``` bash
# Submit a staking delegation tx using the interchain account via ibc
icad tx intertx submit \
'{
"@type":"/cosmos.staking.v1beta1.MsgDelegate",
"delegator_address":"<SET $ICADEMO_ADDR HERE>",
"validator_address":"<PALOMA NODE VALIDATOR ADDRESS>",
"amount": {
"denom": "ugrain",
"amount": "10"
}
}' --connection-id connection-0 --from key1 --chain-id icademo-1 --node tcp://localhost:16657 --keyring-backend test -y
# Inspect the staking delegations of ICA account on the host chain
palomad q staking delegations $ICADEMO_ADDR
```
* Follow same steps if you want to create ICA account from the Paloma chain.