---
# System prepended metadata

title: Interchain Security Sandbox Setup

---

# Interchain Security Sandbox Setup

We will set up the following testnet in a single machine:
- 4 provider validator nodes on chain "earth"
- 4 consumer validator nodes on chain "moon"
- 1 relayer
- Both chains will have denom "stake"
- Validators:
    - alpha
        - alpha-provider.stg.earthball.xyz
    - beta
        - beta-provider.stg.earthball.xyz
    - gamma
        - gamma-provider.stg.earthball.xyz
    - delta
        - delta-provider.stg.earthball.xyz

## 1. Set up a provider chain

Set up a 4-validator provider chain.
Set up gov_testing and voting time to 1 minute.

Set up a single validator with a minimal amount of staked tokens, and airdrop tokens to a non-validator "playmaker" account that will do a lot of the delegating. In this case, the playmaker address comes from the public-facing mnemonics.

Single-validator play:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: provider-alpha
    chain_home: "{{node_user_home}}/.isp"
    chain_binary_name: interchain-security-pd
    chain_version: tags/v0.1.4
    chain_repository: https://github.com/cosmos/interchain-security.git
    chain_denom: stake
    chain_id: earth
    chain_home_clear: true
    node_service_name: "provider-alpha"
    chain_create_validator: true
    chain_validator_coins: "10000000"
    chain_gentx_validator: "1000000"
    cosmovisor_service_name: "cv-provider-alpha"
    chain_gov_testing: true
    chain_voting_period: 60s
    chain_airdrop: true
    chain_airdrop_accounts:
      - cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl
    reboot: false
    pruning: nothing
    p2p_allow_duplicate_ip: true
  children:
    node:
      hosts:
        "{{ target }}":
          fast_sync: false
          api_enabled: true
          api_port: 26650
          rpc_port: 26651
          p2p_port: 26652
          grpc_port: 26653
          rpc_pprof_port: 26654
          grpc_web_enabled: false

```
  
Verify that the airdrop account has funds:
```
interchain-security-pd q bank balances cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --node http://localhost:26651
```

## 2. Join the chain with three more nodes.

Copy genesis file from first node, and collect the node ID as well as p2p port (26652 from the play above). The node id can be obtained from the genesis file by looking for "memo", or running `interchain-security-pd tendermint show-node-id` on the alpha node.

Run the "join playbook" using different ports for each node:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    chain_binary_name: interchain-security-pd
    chain_version: tags/v0.1.4
    chain_repository: https://github.com/cosmos/interchain-security.git
    genesis_file: 'provider-genesis.json'
    p2p_persistent_peers: '47652c26df2489e9e3c0c63ede8a5b7c86e05690@138.197.134.60:26652'
    chain_denom: stake
    chain_id: earth
    chain_home_clear: true
    reboot: false
    pruning: nothing
    p2p_allow_duplicate_ip: true
    api_enabled: true
    grpc_web_enabled: false
  children:
    node:
      hosts:
        beta-provider.stg.earthball.xyz:
          node_user: provider-beta
          chain_home: "{{node_user_home}}/.isp"
          node_service_name: "provider-beta"
          cosmovisor_service_name: "cv-provider-beta"
          api_port: 26660
          rpc_port: 26661
          p2p_port: 26662
          grpc_port: 26663
          rpc_pprof_port: 26664
        gamma-provider.stg.earthball.xyz:
          node_user: provider-gamma
          chain_home: "{{node_user_home}}/.isp"
          node_service_name: "provider-gamma"
          cosmovisor_service_name: "cv-provider-gamma"
          api_port: 26670
          rpc_port: 26671
          p2p_port: 26672
          grpc_port: 26673
          rpc_pprof_port: 26674
        delta-provider.stg.earthball.xyz:
          node_user: provider-delta
          chain_home: "{{node_user_home}}/.isp"
          node_service_name: "provider-delta"
          cosmovisor_service_name: "cv-provider-delta"
          api_port: 26680
          rpc_port: 26681
          p2p_port: 26682
          grpc_port: 26683
          rpc_pprof_port: 26684
```

## 3. Create a new validator in each node.

beta

Create self-delegation account
```
interchain-security-pd keys add beta-validator --home ~/.isp --keyring-backend test
- name: beta-validator
  type: local
  address: cosmos1sc82038qv9st0tenrqnavft78gyryt0r0vsvqs
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AzG47vQp5mzpNTtE9GFnmwwZHIWn25BLOWjO5lL0vzA5"}'
  mnemonic: ""


**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

cycle story emotion consider combine emotion walk shield early sand post useless blouse busy cry proof test neglect hundred atom fun already chicken diesel
```

gamma

Create self-delegation account
```
interchain-security-pd keys add gamma-validator --home ~/.isp --keyring-backend test
- name: gamma-validator
  type: local
  address: cosmos1lxnr0nvq30ulvleg3ww9rtedt6rk3dde9tw8wq
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AjX788vp+VTYZpQ99QfKN8RLPBF8pa3taTodAFo2uwKL"}'
  mnemonic: ""


**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

card mammal leave cause clarify unknown liar sick fade cabbage upgrade limit type endorse ahead identify clutch sentence flush rough reason virtual poverty dress

```

delta

Create self-delegation account
```
interchain-security-pd keys add delta-validator --home ~/.isp --keyring-backend test

- name: delta-validator
  type: local
  address: cosmos167xwcvk408tmcv5tmwjau9vd7h64d2lnfxmzwe
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AioclXNo7vnvEG8wZPm8K3cAjc0EkrCHqm81Y9GZI/tU"}'
  mnemonic: ""


**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

lend south shell chest staff great brisk wool tube metal bracket wrap uphold couple script child also spider primary capital dizzy spin dismiss seek

```

Fund all validator accounts from playmaker account.

beta
```
interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos1sc82038qv9st0tenrqnavft78gyryt0r0vsvqs 10000000stake --home ~/.isp
```

gamma
```
interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos1lxnr0nvq30ulvleg3ww9rtedt6rk3dde9tw8wq 10000000stake --home ~/.isp

```

delta
```
interchain-security-pd tx bank send cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl cosmos167xwcvk408tmcv5tmwjau9vd7h64d2lnfxmzwe 10000000stake --home ~/.isp

```



Get validator pubkey with and create validator:

beta
```
pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp)

interchain-security-pd tx staking create-validator --moniker "beta" --amount 1000000stake --from beta-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block

```

gamma
```
pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp)

interchain-security-pd tx staking create-validator --moniker "gamma" --amount 1000000stake --from gamma-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block

```

delta
```
pubkey=$(interchain-security-pd tendermint show-validator --home ~/.isp)

interchain-security-pd tx staking create-validator --moniker "delta" --amount 1000000stake --from delta-validator --pubkey $pubkey --keyring-backend test --home ~/.isp --commission-max-change-rate 0.01 --commission-max-rate 0.2 --commission-rate 0.1 --min-self-delegation 1 -b block

```

Change moniker of alpha validator to `alpha`
```
interchain-security-pd tx staking edit-validator --from validator --moniker alpha --home ~/.isp
```

We can now check the validator set here: http://alpha-provider.stg.earthball.xyz:26660/cosmos/staking/v1beta1/validators


Verify playmaker can delegate tokens.

Delegate 1000000stake more to alpha:
```
interchain-security-pd tx staking delegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 1000000stake --from playmaker --home ~/.isp
```

Delegate 1000000stake more to beta:
```
interchain-security-pd tx staking delegate cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp
```

Delegate 1000000stake more to gamma:
```
interchain-security-pd tx staking delegate cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn 1000000stake --from playmaker --home ~/.isp
```

Delegate 1000000stake more to delta:
```
interchain-security-pd tx staking delegate cosmosvaloper167xwcvk408tmcv5tmwjau9vd7h64d2lnvj0hz2 1000000stake --from playmaker --home ~/.isp
```

Check delegations from playmaker account:
```
interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp
```

Test redelegating 1000000stake from alpha to beta
```
interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp

{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgBeginRedelegate","delegator_address":"cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl","validator_src_address":"cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87","validator_dst_address":"cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr","amount":{"denom":"stake","amount":"1000000"}}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":[]}

confirm transaction before signing and broadcasting [y/N]: y
code: 0
codespace: ""
data: ""
events: []
gas_used: "0"
gas_wanted: "0"
height: "0"
info: ""
logs: []
raw_log: '[]'
timestamp: ""
tx: null
txhash: B98F1BB3971C0153826B73A80C37DC42111A151FCB103272A3F245F681603BFC
```

Check the transaction:
```
interchain-security-pd q tx --type=hash B98F1BB3971C0153826B73A80C37DC42111A151FCB103272A3F245F681603BFC --home ~/.isp
...
(metadata, events, etc.)
...
raw_log: 'out of gas in location: WriteFlat; gasWanted: 200000, gasUsed: 201607: out
  of gas'
timestamp: "2022-10-21T19:04:28Z
```

Try re-delegating from alpha to beta again, this time with `--gas=auto`
```
interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr 1000000stake --from playmaker --home ~/.isp --gas auto
```

Check delegations from playmaker account:
```
interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp
```

That works. Try re-delegating from beta to alpha now
```
interchain-security-pd tx staking redelegate cosmosvaloper1sc82038qv9st0tenrqnavft78gyryt0r2cyevr cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 1000000stake --from playmaker --home ~/.isp --gas auto
```

Check delegations from playmaker account:
```
interchain-security-pd q staking delegations cosmos1r5v5srda7xfth3hn2s26txvrcrntldjumt8mhl --home ~/.isp
```

Try re-delegating from alpha to gamma and back:
```
interchain-security-pd tx staking redelegate cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn 500000stake --from playmaker --home ~/.isp --gas auto

interchain-security-pd tx staking redelegate cosmosvaloper1lxnr0nvq30ulvleg3ww9rtedt6rk3ddeql6jzn cosmosvaloper15adr54hscrzuqa4c7zxhf7nlf5x65py68hac87 500000stake --from playmaker --home ~/.isp --gas auto

```

## 4. Initialize the consumer chain with a validator account.

Set up a node with the consumer chain binary using the keys from the alpha validator.

The node role must be modified slightly in order for the mnemonic to be registered and cosmovisor to not start.

Run this play:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    node_user: consumer-alpha
    chain_home: "{{node_user_home}}/.isc"
    chain_binary_name: interchain-security-cd
    chain_version: tags/v0.1.4
    chain_repository: https://github.com/cosmos/interchain-security.git
    chain_denom: stake
    chain_id: moon2
    chain_home_clear: true
    node_service_name: "consumer-alpha"
    chain_restore_account: true
    chain_restored_coins: "1000000000000000"
    cosmovisor_service_name: "cv-consumer-alpha"
    reboot: false
    pruning: nothing
    p2p_allow_duplicate_ip: true
    chain_defer_start: true
    priv_validator_key_file: 'alpha-validator-key.json'
    node_key_file: 'alpha-node-key.json'
  children:
    node:
      hosts:
        "{{ target }}":
          fast_sync: false
          api_enabled: true
          api_port: 26655
          rpc_port: 26656
          p2p_port: 26657
          grpc_port: 26658
          rpc_pprof_port: 26659
          grpc_web_enabled: false

```

Run the play with the mnemonic as an extra variable:
```
ansible-playbook node.yml -i examples/ics-init-consumer-chain.yml -e 'target=alpha-provider.stg.earthball.xyz restored_account_mnemonic="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art"'
```

Save the genesis file to the local machine.

## 5. Increase the signed blocks window to 10000 blocks

Change the parameter under the slashing section called `"signed_blocks_window"` to `10000`.


## 6. Propose and pass the new consumer chain.

We will start a consumer chain that uses the `interchain-security-cd` binary.

Populate `consumer-proposal.json` with the relevant values:
```json
{
    "title": "Create a new consumer chain",
    "description": "Consumer chain ",
    "chain_id": "moon2", 
    "initial_height": {
        "revision_height": 1
    },
    "genesis_hash": "748e648ac57d9849ba0c03f83286453edd9885faa249340e301ad811d731526a",
    "binary_hash": "5ae76b4206c0bb8f87208c6ab2b68545fde4cf2c27d53041e24218cab4b3e925",
    "spawn_time": "2022-10-01T10:10:00.000000Z",
    "deposit": "1stake"
}
```

Submit gov proposal from provider chain:
```bash
interchain-security-pd tx gov submit-proposal create-consumer-chain consumer-proposal.json --from validator --home ~/.isp --keyring-backend test
```

Vote on gov proposal on provider chain:
```bash
interchain-security-pd tx gov vote 2 yes --from validator --home ~/.isp --keyring-backend test -y
```

Check that the proposal passed
```
interchain-security-pd q gov proposal 2 --home ~/.isp
```


## 4. Update the genesis file

Collect CCV states in the provider chain
```bash
interchain-security-pd q provider consumer-genesis moon2 --output json --home ~/.isp > moon2_ccv_states.json
```

Copy json file to local machine

Update fresh consumer genesis file with CCV states
```bash
jq -s '.[0].app_state.ccvconsumer = .[1] | .[0]' fresh-consumer-genesis.json moon_ccv_states.json > consumer_genesis.json
```


## 5. Start the consumer chain

Collect the node id for the validator to use it in the p2p_persistent_peers variable.

Start the cosmovisor service in the first node.

Join the consumer chain with an updated inventory file that uses:
- modified genesis file
- p2p_persistent_peers
- priv_validator_key_file for each validator (copied from the provider /config folder)
- node_key_file (copied from the provider /config folder)

```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    ansible_user: root
    chain_binary_name: interchain-security-cd
    chain_version: tags/v0.1.4
    chain_repository: https://github.com/cosmos/interchain-security.git
    genesis_file: 'consumer_genesis.json'
    p2p_persistent_peers: '47652c26df2489e9e3c0c63ede8a5b7c86e05690@138.197.134.60:26657'
    chain_denom: stake
    chain_id: moon2
    chain_home_clear: true
    reboot: false
    pruning: nothing
    p2p_allow_duplicate_ip: true
    api_enabled: true
    grpc_web_enabled: false
  children:
    node:
      hosts:
        alpha-provider.stg.earthball.xyz:
          node_user: consumer-alpha
          chain_home: "{{node_user_home}}/.isc"
          node_service_name: "consumer-alpha"
          cosmovisor_service_name: "cv-consumer-alpha"
          api_port: 26655
          rpc_port: 26656
          p2p_port: 26657
          grpc_port: 26658
          rpc_pprof_port: 26659
          priv_validator_key_file: alpha-validator-key.json
          node_key_file: alpha-node-key.json
        beta-provider.stg.earthball.xyz:
          node_user: consumer-beta
          chain_home: "{{node_user_home}}/.isc"
          node_service_name: "consumer-beta"
          cosmovisor_service_name: "cv-consumer-beta"
          api_port: 26665
          rpc_port: 26666
          p2p_port: 26667
          grpc_port: 26668
          rpc_pprof_port: 26669
          priv_validator_key_file: beta-validator.json
          node_key_file: beta-node.json
        gamma-provider.stg.earthball.xyz:
          node_user: consumer-gamma
          chain_home: "{{node_user_home}}/.isc"
          node_service_name: "consumer-gamma"
          cosmovisor_service_name: "cv-consumer-gamma"
          api_port: 26675
          rpc_port: 26676
          p2p_port: 26677
          grpc_port: 26678
          rpc_pprof_port: 26679
          priv_validator_key_file: gamma-validator.json
          node_key_file: gamma-node.json
        delta-provider.stg.earthball.xyz:
          node_user: consumer-delta
          chain_home: "{{node_user_home}}/.isc"
          node_service_name: "consumer-delta"
          cosmovisor_service_name: "cv-consumer-delta"
          api_port: 26689
          rpc_port: 26689
          p2p_port: 26689
          grpc_port: 26689
          rpc_pprof_port: 26689
          priv_validator_key_file: delta-validator.json
          node_key_file: delta-node.json
```


Blocks should be coming in now on the consumer chain, but we need to link it to the provider chain next.


## 6. Set up the relayer between chains

- Set `hermes_order: ordered`
- Set `hermes_channel_version: '1'`
- The consumer chain must be the first chain listed (chain a)
- The port name of the consumer chain must be `consumer`
- The port name of the provider chain must be `provider`
- The client id must be specified
- Enable the channel workers for handshake completion.

Inventory file:
```yaml=
---
# yamllint disable rule:line-length
all:
  vars:
    chain_home_clear: true
    hermes_version: v1.0.0
    ansible_user: root
    reboot: false
  children:
    hermes:
      hosts:
        alpha-provider.stg.earthball.xyz:
          hermes_relayer_mnemonics: true
          hermes_order: ordered
          hermes_channel_version: '1'
          hermes_chains:
            moon2:
              hermes_relayer_mnemonic: 'playmaker-mnemonic.txt'
              hermes_port_name: consumer
              hermes_chain_rpc_url_schema: http
              hermes_chain_rpc_hostname: alpha-provider.stg.earthball.xyz
              hermes_chain_rpc_port: 26656
              hermes_chain_grpc_url_schema: http
              hermes_chain_grpc_hostname: alpha-provider.stg.earthball.xyz
              hermes_chain_grpc_port: 26658
              hermes_chain_websocket_url_schema: ws
              hermes_chain_rpc_timeout: '10s'
              hermes_chain_account_prefix: 'cosmos'
              hermes_chain_key_name: 'testkey'
              hermes_chain_store_prefix: 'ibc'
              hermes_chain_max_gas: 2000000
              hermes_chain_fee_granter: ''
              gas_price: "{ price = 0.00, denom = 'stake' }"
              hermes_chain_gas_multiplier: 1.1
              hermes_chain_clock_drift: '5s'
              hermes_chain_trusting_period: '14days'
              hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }"
            earth:
              hermes_relayer_mnemonic: 'playmaker-mnemonic.txt'
              hermes_port_name: provider
              hermes_chain_rpc_url_schema: http
              hermes_chain_rpc_hostname: alpha-provider.stg.earthball.xyz
              hermes_chain_rpc_port: 26651
              hermes_chain_grpc_url_schema: http
              hermes_chain_grpc_hostname: alpha-provider.stg.earthball.xyz
              hermes_chain_grpc_port: 26653
              hermes_chain_websocket_url_schema: ws
              hermes_chain_rpc_timeout: '10s'
              hermes_chain_account_prefix: 'cosmos'
              hermes_chain_key_name: 'testkey'
              hermes_chain_store_prefix: 'ibc'
              hermes_chain_max_gas: 2000000
              hermes_chain_fee_granter: ''
              gas_price: "{ price = 0.00, denom = 'stake' }"
              hermes_chain_gas_multiplier: 1.1
              hermes_chain_clock_drift: '5s'
              hermes_chain_trusting_period: '14days'
              hermes_chain_trust_threshold: "{ numerator = '1', denominator = '3' }"

```


The hermes play because the unbonding period is too short. We need to increase it to 21 days again (or more than 1209600s). We can do that with a gov proposal:

The IBC connection could not be created due to a handshake timeout on the moon chain.
We will attempt to re-start another consumer chain.

We have also changed the app proxy port to 26648 in the consumer alpha node and 26638 in the provider alpha node.

The hermes play errored out during connection creation, so we ran this command in the hermes machine afterwards:

```bash=
hermes create connection --a-chain moon2 --a-client 07-tendermint-0 --b-client 07-tendermint-1
...
SUCCESS Connection {
    delay_period: 0ns,
    a_side: ConnectionSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "moon2",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-0",
        ),
        connection_id: Some(
            ConnectionId(
                "connection-0",
            ),
        ),
    },
    b_side: ConnectionSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "earth",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-1",
        ),
        connection_id: Some(
            ConnectionId(
                "connection-0",
            ),
        ),
    },
}

```

That seemed to work. Next we can create the channel.

```
hermes create channel --a-chain moon2 --a-port consumer --b-port provider --order ordered --a-connection connection-0 --channel-version 1
...
SUCCESS Channel {
    ordering: Ordered,
    a_side: ChannelSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "moon2",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-0",
        ),
        connection_id: ConnectionId(
            "connection-0",
        ),
        port_id: PortId(
            "consumer",
        ),
        channel_id: Some(
            ChannelId(
                "channel-0",
            ),
        ),
        version: Some(
            Version(
                "1",
            ),
        ),
    },
    b_side: ChannelSide {
        chain: BaseChainHandle {
            chain_id: ChainId {
                id: "earth",
                version: 0,
            },
            runtime_sender: Sender { .. },
        },
        client_id: ClientId(
            "07-tendermint-1",
        ),
        connection_id: ConnectionId(
            "connection-0",
        ),
        port_id: PortId(
            "provider",
        ),
        channel_id: Some(
            ChannelId(
                "channel-0",
            ),
        ),
        version: Some(
            Version(
                "1",
            ),
        ),
    },
    connection_delay: 0ns,
}
```

That also seemed to work.

Start the hermes service (because the play errored out before setting it up).

## 7. Check the validator set matches between chains.

On earth:
```
interchain-security-pd q tendermint-validator-set --home ~/.isp
block_height: "40104"
total: "4"
validators:
- address: cosmosvalcons1jep6hexugh70cultnd5hwarzvdfpayu45h89az
  proposer_priority: "-14413"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: q+sy4tVCZ80VjCMiwYWCKAXfoJXuFfGrRtOshzm15w8=
  voting_power: "20999"
- address: cosmosvalcons1vqf7st30jsje4qx7spf8vkzfmm6j35hy287l2c
  proposer_priority: "127"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: 3LPkv6rfr6n0girXCGUZ2X5/lSLBVKbaO5Kkop1g2OU=
  voting_power: "20998"
- address: cosmosvalcons1p9ze7ntpfu2gm0g5qqpl0japlcfdl7untltmm4
  proposer_priority: "23099"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: 7qC/rP6wueX+2Jeza6pc15EksixyvCGmMc79zGA9FUQ=
  voting_power: "20997"
- address: cosmosvalcons147amlw2uzmvkhm96ffgcr33v5hz882znu425as
  proposer_priority: "-8813"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: yEzuV/fjUQXDMwTC/ZjsmaoE7UYzs8vt+pSCW09Ce8s=
  voting_power: "20816"
```

On moon2:
```
interchain-security-cd q tendermint-validator-set --home ~/.isc
block_height: "735"
total: "4"
validators:
- address: cosmosvalcons1jep6hexugh70cultnd5hwarzvdfpayu45h89az
  proposer_priority: "17212"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: q+sy4tVCZ80VjCMiwYWCKAXfoJXuFfGrRtOshzm15w8=
  voting_power: "20999"
- address: cosmosvalcons1vqf7st30jsje4qx7spf8vkzfmm6j35hy287l2c
  proposer_priority: "-3956"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: 3LPkv6rfr6n0girXCGUZ2X5/lSLBVKbaO5Kkop1g2OU=
  voting_power: "20998"
- address: cosmosvalcons1p9ze7ntpfu2gm0g5qqpl0japlcfdl7untltmm4
  proposer_priority: "-4988"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: 7qC/rP6wueX+2Jeza6pc15EksixyvCGmMc79zGA9FUQ=
  voting_power: "20997"
- address: cosmosvalcons147amlw2uzmvkhm96ffgcr33v5hz882znu425as
  proposer_priority: "-8266"
  pub_key:
    type: tendermint/PubKeyEd25519
    value: yEzuV/fjUQXDMwTC/ZjsmaoE7UYzs8vt+pSCW09Ce8s=
  voting_power: "20816"
```

