Try   HackMD

Billy's Cosmos Hub Hack Solution

Task 1


# configure gaiad so that there is relevant chain info in two different directories:

gaiad config chain-id test-1
gaiad config node http://165.22.23.73:26657
gaiad config keyring-backend test

gaiad config chain-id test-2 --home ~/.gaiad2
gaiad config node http://164.90.226.126:26657 --home ~/.gaiad2
gaiad config keyring-backend test --home ~/.gaiad2


# Create account on `test-1` (aka a)
> gaiad keys add demo

# Show account on `test-1` (aka a)
> gaiad keys show demo | jq
{
  "name": "demo",
  "type": "local",
  "address": "cosmos1xpgnzjhz650pljhk7f8szu5rjzfj6e2rw8jl3m",
  "pubkey": "{\"@type\":\"/cosmos.crypto.secp256k1.PubKey\",\"key\":\"AxEVQMM3ZbWgnTRYcY/i0RmQ99+RTfx7JmjFHr659wF1\"}"
}

# Show balance of the account that was populated by Billy with `demowallet`

> gaiad q bank balances $(gaiad keys show demo -a) | jq
{
  "balances": [
    {
      "denom": "stake",
      "amount": "1000"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# Create ICA account on `test-2` via `test-1`

> gaiad tx icamsgauth register --from demo --connection-id connection-0 --counterparty-connection-id connection-0 --gas 150000

# Show the account on `test-2` (AKA a')

> gaiad q icamsgauth interchainaccounts $(gaiad keys show demo -a) connection-0 connection-0 | jq
{
  "interchain_account_address": "cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6"
}

# Show the balance of `a'` on `test-2` that was populated by Billy with `demowallet`

> gaiad q bank balances cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 --home ~/.gaiad2 | jq
{
  "balances": [
    {
      "denom": "stake",
      "amount": "1000"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# Create empty account on `test-2`

> gaiad keys add demo --home ~/.gaiad2 --keyring-backend test

> gaiad keys show demo --home ~/.gaiad2 | jq
{
  "name": "demo",
  "type": "local",
  "address": "cosmos1734fsdjhy7unndu2dlks4zfgvzh0x629thq8kt",
  "pubkey": "{\"@type\":\"/cosmos.crypto.secp256k1.PubKey\",\"key\":\"A3gopqMAvispe6h/j26+W3vQ7OgbTlxroVHiYvKCcLeN\"}"
}


# Show the empty account on `test-2` is empty

> gaiad q bank balances $(gaiad keys show demo -a --home ~/.gaiad2) --home ~/.gaiad2 | jq
{
  "balances": [],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# Create the raw send msg for `test-2` to be passed to the ica account on `test-1`

> gaiad tx bank send cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 cosmos1734fsdjhy7unndu2dlks4zfgvzh0x629thq8kt 500stake --from cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 --home ~/.gaiad2 --generate-only | jq '.body.messages[0]' > send-raw.json

# Show the message

> cat send-raw.json
{
  "@type": "/cosmos.bank.v1beta1.MsgSend",
  "from_address": "cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6",
  "to_address": "cosmos1734fsdjhy7unndu2dlks4zfgvzh0x629thq8kt",
  "amount": [
    {
      "denom": "stake",
      "amount": "500"
    }
  ]
}

> gaiad tx icamsgauth submit-tx send-raw.json --connection-id connection-0 --counterparty-connection-id connection-0 --from demo -y | jq

{
  "height": "0",
  "txhash": "5640F02D1D3003AE8878C2EC8C4DAB220551909C613C9615D4F932F4E2485AC3",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

# Show that the token was moved between the account:

> gaiad q bank balances $(gaiad keys show demo -a --home ~/.gaiad2) --home ~/.gaiad2 | jq
{
  "balances": [
    {
      "denom": "stake",
      "amount": "500"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# TASK ONE IS COMPLETE

Task 2

# Send the tokens back to the interchain account

> gaiad tx bank send $(gaiad keys show demo -a --home ~/.gaiad2) cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 500stake --from demo --home ~/.gaiad2 -y | jq
{
  "height": "0",
  "txhash": "3710C5A023490329A90468CAF60A7F2A30F36E86576658EB22F6179A937D776A",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

# Query the balance of the interchain account to show the stake went back

> gaiad q bank balances cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 --home ~/.gaiad2 | jq
{
  "balances": [
    {
      "denom": "stake",
      "amount": "1000"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}


# TASK TWO IS COMPLETE

Task 3


# A new channel needs to be opened between the chains to start using ibc-transfer. This is done with the relayer as follows:

hermes --config ./gaia-config.toml create channel --port-a transfer --port-b transfer test-1 test-2 -v ics20-1

# NOTE: I was unable to use --connection-a connection-0 and re-use the initial connection. Is that expected behaviour? Instead a new connection was created  with port_id `transfer` and `channel_id` `channel-5` (same on both sides)

# Account on `test-1` to send `stake` to PK controlled account on `test-2`

> gaiad tx ibc-transfer transfer transfer channel-5 $(gaiad keys show demo -a --home ~/.gaiad2) 100stake --from demo -y | jq
{
  "height": "0",
  "txhash": "BDECF458321A5163E5C7A2F2EBE1548A982A525B1C49159E2CAEF2DB789BBC9E",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

# Apparently this failed. Hermes had an error about account number mismatch. I restarted the relayer and the tokens were returned, my guess is because the timeout occured. After the restart I tried again and this time it worked.

> gaiad tx ibc-transfer transfer transfer channel-5 $(gaiad keys show demo -a --home ~/.gaiad2) 100stake --from demo -y | jq
{
  "height": "0",
  "txhash": "79B2A1B916793ECD7BD39147A32E72ED6B35040C40D3098852A1CBE5A167C9C9",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

> gaiad q bank balances $(gaiad keys show demo -a --home ~/.gaiad2) --home ~/.gaiad2 | jq
{
  "balances": [
    {
      "denom": "ibc/E37052AA15C33306A29C10EC2EF99E6681FF485550D8BFCBA059F82A809B2623",
      "amount": "100"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# TASK 3 IS COMPLETE

Task 4

# Send the IBC token from the `A` account to `a'`

> gaiad tx bank send $(gaiad keys show demo -a --home ~/.gaiad2) cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 100ibc/E37052AA15C33306A29C10EC2EF99E6681FF485550D8BFCBA059F82A809B2623 --from demo --home ~/.gaiad2 -y | jq
{
  "height": "0",
  "txhash": "4D41351A2AEED8F2B37306D79AB34663D0B26BE2DD667F06251EBD115B302C72",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

# Query the balance of the interchain account

> gaiad q bank balances cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 --home ~/.gaiad2 | jq
{
  "balances": [
    {
      "denom": "ibc/E37052AA15C33306A29C10EC2EF99E6681FF485550D8BFCBA059F82A809B2623",
      "amount": "100"
    },
    {
      "denom": "stake",
      "amount": "1000"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "0"
  }
}

# TASK 4 IS COMPLETE

Task 5

# Create the outgoing IBC transaction that sends the IBC token back to the origin chain from the interchain account.

F99E6681FF485550D8BFCBA059F82A809B2623  --from cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6 --generate-only | jq '.body.messages[0]' > ibc-raw.json

> cat ibc-raw.json
{
  "@type": "/ibc.applications.transfer.v1.MsgTransfer",
  "source_port": "transfer",
  "source_channel": "channel-5",
  "token": {
    "denom": "ibc/E37052AA15C33306A29C10EC2EF99E6681FF485550D8BFCBA059F82A809B2623",
    "amount": "100"
  },
  "sender": "cosmos1zg52ngxx95tznc4mqn6spvue25q2msgpatzw2925d0ar9vgk6u3s6qszr6",
  "receiver": "cosmos1xpgnzjhz650pljhk7f8szu5rjzfj6e2rw8jl3m",
  "timeout_height": {
    "revision_number": "2",
    "revision_height": "13371"
  },
  "timeout_timestamp": "1640193459068597000"
}

# Create the ICA transaction including the evenual IBC trasfer message

> gaiad tx icamsgauth submit-tx ibc-raw.json --connection-id connection-0 --counterparty-connection-id connection
-0 --from demo -y | jq
{
  "height": "0",
  "txhash": "0230BD16B8F803C77EE2B773EE987443838DD247CB58601AAE1FE0DDE5EDB8D3",
  "codespace": "",
  "code": 0,
  "data": "",
  "raw_log": "[]",
  "logs": [],
  "info": "",
  "gas_wanted": "0",
  "gas_used": "0",
  "tx": null,
  "timestamp": "",
  "events": []
}

# HOWEVER, this will fail becauas ibc-transfer messages WERE NOT WHITELISTED in our host chain ica-module genesis as a parameter. Only the delegate and send messages were whitelisted at this point. OOPS!!!