--- sidebar_position: 3 description: Walkthrough of commands to use the interchain exchange module. --- # Use the Interchain Exchange In this chapter, you will learn about the exchange and how it will function once it is implemented. This will give you a better understanding of what you will be building in the coming chapters. To achieve this, we will perform the following tasks: * Start two local blockchains * Set up an IBC relayer between the two chains * Create an exchange order book for a token pair on the two chains * Submit sell orders on the Mars chain * Submit buy orders on the Venus chain * Cancel sell or buy orders Starting the two local blockchains and setting up the IBC relayer will allow us to create an exchange order book between the two chains. This order book will allow us to submit sell and buy orders, as well as cancel any orders that we no longer want to maintain. It is important to note that the commands in this chapter will only work properly if you have completed all the following chapters in this tutorial. By the end of this chapter, you should have a good understanding of how the exchange will operate. ## Start blockchain nodes To start using the interchain exchange, you will need to start two separate blockchains. This can be done by running the `ignite chain serve` command, followed by the `-c` flag and the path to the configuration file for each blockchain. For example, to start the `mars` blockchain, you would run: ``` ignite chain serve -c mars.yml ``` To start the `venus` blockchain, you would run a similar command, but with the path to the `venus.yml` configuration file: ``` ignite chain serve -c venus.yml ``` Once both blockchains are running, you can proceed with configuring the relayer to enable interchain exchange between the two chains. ## Relayer Next, let's set up an IBC relayer between two chains. If you have used a relayer in the past, reset the relayer configuration directory: ``` rm -rf ~/.ignite/relayer ``` Now you can use the `ignite relayer configure` command. This command allows you to specify the source and target chains, along with their respective RPC endpoints, faucet URLs, port numbers, versions, gas prices, and gas limits. ``` ignite relayer configure -a --source-rpc "http://0.0.0.0:26657" --source-faucet "http://0.0.0.0:4500" --source-port "dex" --source-version "dex-1" --source-gasprice "0.0000025stake" --source-prefix "cosmos" --source-gaslimit 300000 --target-rpc "http://0.0.0.0:26659" --target-faucet "http://0.0.0.0:4501" --target-port "dex" --target-version "dex-1" --target-gasprice "0.0000025stake" --target-prefix "cosmos" --target-gaslimit 300000 ``` To create a connection between the two chains, you can use the ignite relayer connect command. This command will establish a connection between the source and target chains, allowing you to transfer data and assets between them. ``` ignite relayer connect ``` Now that we have two separate blockchain networks up and running, and a relayer connection established to facilitate communication between them, we are ready to begin using the interchain exchange binary to interact with these networks. This will allow us to create order books and buy/sell orders, enabling us to trade assets between the two chains. ## Order Book To create an order book for a pair of tokens, you can use the following command: ``` interchanged tx dex send-create-pair dex channel-0 marscoin venuscoin --from alice --chain-id mars --home ~/.mars ``` This command will create an order book for the pair of tokens `marscoin` and `venuscoin`. The command will be executed by the user `alice` on the Mars blockchain. The `--home` parameter specifies the location of the configuration directory for the Mars blockchain. Creating an order book affects state on the Mars blockchain to which the transaction was broadcast and the Venus blockchain. On the Mars blockchain, the `send-create-pair` command creates an empty sell order book. ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 0 orders: [] index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` On the Venus blockchain, the same `send-createPair` command creates a buy order book: ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 0 orders: [] index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` In the `create-pair` command on the Mars blockchain, an IBC packet is sent to the Venus chain. This packet contains information that is used to create a buy order book on the Venus chain. When the Venus chain receives the IBC packet, it processes the information contained in the packet and creates a buy order book. The Venus chain then sends an acknowledgement back to the Mars chain to confirm that the buy order book has been successfully created. Upon receiving the acknowledgement from the Venus chain, the Mars chain creates a sell order book. This sell order book is associated with the buy order book on the Venus chain, allowing users to trade assets between the two chains. ## Sell Order After creating an order book, the next step is to create a sell order. This can be done using the `send-sell-order` command, which is used to broadcast a transaction with a message that locks a specified amount of tokens and creates a sell order on the Mars blockchain. ``` interchanged tx dex send-sell-order dex channel-0 marscoin 10 venuscoin 15 --from alice --chain-id mars --home ~/.mars ``` In the example provided, the `send-sell-order` command is used to create a sell order for 10 `marscoin` token and 15 `venuscoin` token. This sell order will be added to the order book on the Mars blockchain. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` ```yml balances: - amount: "990" # decreased from 1000 denom: marscoin - amount: "1000" denom: token ``` ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 1 orders: # a new sell order is created - amount: 10 creator: cosmos14ntyzr6d2dx4ppds9tvenx53fn0xl5jcakrtm4 id: 0 price: 15 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` ## Buy order After creating a sell order, the next step in the trading process is typically to create a buy order. This can be done using the `send-buy-order` command, which is used to lock a specified amount of tokens and create a buy order on the Venus blockchain ``` interchanged tx dex send-buy-order dex channel-0 marscoin 10 venuscoin 5 --from alice --chain-id venus --home ~/.venus --node tcp://localhost:26659 ``` In the example provided, the `send-buy-order` command is used to create a buy order for 10 `marscoin` token and 5 `venuscoin` token. This buy order will be added to the order book on the Venus blockchain. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` ```yml balances: - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "950" # decreased from 1000 denom: venuscoin ``` ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 1 orders: # a new buy order is created - amount: 10 creator: cosmos1mrrttwtdcp47pl4hq6sar3mwqpmtc7pcl9e6ss id: 0 price: 5 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` ## Perform an Exchange with a Sell Order You currently have two open orders for `marscoin`: * A sell order on the Mars chain, where you are offering to sell 10 `marscoin` for 15 `venuscoin`. * A buy order on the Venus chain, where you are willing to buy 5 `marscoin` for 5 `venuscoin`. To perform an exchange, you can send a sell order to the Mars chain using the following command: ``` interchanged tx dex send-sell-order dex channel-0 marscoin 5 venuscoin 3 --from alice --home ~/.mars ``` This sell order, offering to sell 5 `marscoin` for 3 `venuscoin`, will be filled on the Venus chain by the existing buy order. This will result in the amount of the buy order on the Venus chain being reduced by 5 `marscoin`. ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 1 orders: - amount: 5 # decreased from 10 creator: cosmos1mrrttwtdcp47pl4hq6sar3mwqpmtc7pcl9e6ss id: 0 price: 5 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` The sender of the filled sell order traded 5 `marscoin` for 25 `venuscoin` tokens. This means that the amount of the sell order (5 `marscoin`) was multiplied by the price of the buy order (5 `venuscoin`) to determine the value of the exchange. In this case, the value of the exchange was 25 `venuscoin` vouchers. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` ```yml balances: - amount: "25" # increased from 0 denom: ibc/BB38C24E9877 - amount: "985" # decreased from 990 denom: marscoin - amount: "1000" denom: token ``` The counterparty, or the sender of the buy `marscoin` order, will receive 5 `marscoin` as a result of the exchange. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` ```yml balances: - amount: "5" # increased from 0 denom: ibc/745B473BFE24 # marscoin voucher - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "950" denom: venuscoin ``` The `venuscoin` balance has remained unchanged because the appropriate amount of `venuscoin` (50) was already locked at the time the buy order was created in the previous step. ## Perform an Exchange with a Buy Order To perform an exchange with a buy order, send a transaction to the decentralized exchange to buy 5 `marscoin` for 15 `venuscoin`. This is done by running the following command: ``` interchanged tx dex send-buy-order dex channel-0 marscoin 5 venuscoin 15 --from alice --home ~/.venus --node tcp://localhost:26659 ``` This buy order will be immediately filled on the Mars chain, and the creator of the sell order will receive 75 `venuscoin` vouchers as payment. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` ```yml balances: - amount: "100" # increased from 25 denom: ibc/BB38C24E9877 # venuscoin voucher - amount: "985" denom: marscoin - amount: "1000" denom: token ``` The amount of the sell order will be decreased by the amount of the filled buy order, so in this case it will be decreased by 5 `marscoin`. ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 1 orders: - amount: 5 # decreased from 10 creator: cosmos14ntyzr6d2dx4ppds9tvenx53fn0xl5jcakrtm4 id: 0 price: 15 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` The creator of the buy order receives 5 marscoin vouchers for 75 venuscoin (5marscoin * 15venuscoin): ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` ```yml balances: - amount: "10" # increased from 5 denom: ibc/745B473BFE24 # marscoin vouchers - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "875" # decreased from 950 denom: venuscoin ``` ## Complete Exchange with a Partially Filled Sell Order To complete the exchange with a partially filled sell order, send a transaction to the decentralized exchange to sell 10 `marscoin` for 3 `venuscoin`. This is done by running the following command: ``` interchanged tx dex send-sell-order dex channel-0 marscoin 10 venuscoin 3 --from alice --home ~/.mars ``` In this scenario, the sell amount is 10 `marscoin`, but there is an existing buy order for only 5 `marscoin`. The buy order will be filled completely and removed from the order book. The author of the previously created buy order will receive 10 `marscoin` vouchers from the exchange. To check the balances, she can run the following command: ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` ```yml balances: - amount: "15" # increased from 5 denom: ibc/745B473BFE24 # marscoin voucher - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "875" denom: venuscoin ``` ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 1 orders: [] # buy order with amount 5marscoin has been closed index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` The author of the sell order successfully exchanged 5 marscoin and received 25 venuscoin vouchers. The other 5marscoin created a sell order: ```yml balances: - amount: "125" # increased from 100 denom: ibc/BB38C24E9877 # venuscoin vouchers - amount: "975" # decreased from 985 denom: marscoin - amount: "1000" denom: token ``` ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 2 orders: - amount: 5 # hasn't changed creator: cosmos14ntyzr6d2dx4ppds9tvenx53fn0xl5jcakrtm4 id: 0 price: 15 - amount: 5 # new order is created creator: cosmos14ntyzr6d2dx4ppds9tvenx53fn0xl5jcakrtm4 id: 1 price: 3 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` ## Complete Exchange with a Partially Filled Buy Order To complete the exchange with a partially filled buy order, send a transaction to the decentralized exchange to buy 10 `marscoin` for 5 `venuscoin`. This is done by running the following command: ``` interchanged tx dex send-buy-order dex channel-0 marscoin 10 venuscoin 5 --from alice --home ~/.venus --node tcp://localhost:26659 ``` In this scenario, the buy order is only partially filled for 5 `marscoin`. There is an existing sell order for 5 `marscoin` (with a price of 3 `venuscoin`) on the Mars chain, which is completely filled and removed from the order book. The author of the closed sell order will receive 15 `venuscoin` vouchers as payment, which is the product of 5 `marscoin` and 3 `venuscoin`. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` ```yml balances: - amount: "140" # increased from 125 denom: ibc/BB38C24E9877 # venuscoin vouchers - amount: "975" denom: marscoin - amount: "1000" denom: token ``` ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 2 orders: - amount: 5 # order hasn't changed creator: cosmos14ntyzr6d2dx4ppds9tvenx53fn0xl5jcakrtm4 id: 0 price: 15 # a sell order for 5 marscoin has been closed index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` In this scenario, the author of the buy order will receive 5 `marscoin` vouchers as payment, which locks up 50 `venuscoin` of their token. The remaining 5 `marscoin` that is not filled by the sell order will create a new buy order on the Venus chain. This means that the author of the buy order is still interested in purchasing 5 `marscoin`, and is willing to pay the specified price for it. The new buy order will remain on the order book until it is filled by another sell order, or it is cancelled by the buyer. ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` ```yml balances: - amount: "20" # increased from 15 denom: ibc/745B473BFE24 # marscoin vouchers - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "825" # decreased from 875 denom: venuscoin ``` ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 2 orders: - amount: 5 # new buy order is created creator: cosmos1mrrttwtdcp47pl4hq6sar3mwqpmtc7pcl9e6ss id: 1 price: 5 index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` ## Cancel an Order After the exchanges described, there are still two open orders: a sell order on the Mars chain (5 `marscoin` for 15 `venuscoin`), and a buy order on the Venus chain (5 `marscoin` for 5 `venuscoin`). To cancel an order on a blockchain, you can use the `cancel-sell-order` or `cancel-buy-order` command, depending on the type of order you want to cancel. The command takes several arguments, including the `channel-id` of the IBC connection, the `amount-denom` and `price-denom` of the order, and the `order-id` of the order you want to cancel. To cancel a sell order on the Mars chain, you would run the following command: ``` interchanged tx dex cancel-sell-order dex channel-0 marscoin venuscoin 0 --from alice --home ~/.mars ``` This will cancel the sell order and remove it from the order book. The balance of Alice's `marscoin` will be increased by the amount of the cancelled sell order. To check Alice's balances, including her updated `marscoin` balance, run the following command: ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.mars) ``` This will return a list of Alice's balances, including her updated `marscoin` balance. ```yml balances: - amount: "140" denom: ibc/BB38C24E9877 - amount: "980" # increased from 975 denom: marscoin - amount: "1000" denom: token ``` After the sell order on the Mars chain has been cancelled, the sell order book on that blockchain will be empty. This means that there are no longer any active sell orders on the Mars chain, and anyone interested in purchasing `marscoin` will need to create a new buy order. The sell order book will remain empty until a new sell order is created and added to it. ``` interchanged q dex list-sell-order-book ``` ```yml sellOrderBook: - amountDenom: marscoin book: idCount: 2 orders: [] index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` To cancel a buy order on the `Venus` chain, you can run the following command: ``` interchanged tx dex cancel-buy-order dex channel-0 marscoin venuscoin 1 --from alice --home ~/.venus --node tcp://localhost:26659 ``` This will cancel the buy order and remove it from the order book. The balance of Alice's `venuscoin` will be increased by the amount of the cancelled buy order. To check Alice's balances, including her updated `venuscoin` balance, you can run the following command: ``` interchanged q bank balances $(interchanged keys show -a alice --home ~/.venus) --node tcp://localhost:26659 ``` The amount of `venuscoin` is increased: ```yml balances: - amount: "20" denom: ibc/745B473BFE24 - amount: "900000000" denom: stake - amount: "1000" denom: token - amount: "850" # increased from 825 denom: venuscoin ``` This will return a list of Alice's balances, including her updated `venuscoin` balance. After canceling a buy order, the buy order book on the Venus blockchain will be empty. This means that there are no longer any active buy orders on the chain, and anyone interested in selling `marscoin` will need to create a new sell order. The buy order book will remain empty until a new buy order is created and added to it. ``` interchanged q dex list-buy-order-book --node tcp://localhost:26659 ``` ```yml buyOrderBook: - amountDenom: marscoin book: idCount: 2 orders: [] index: dex-channel-0-marscoin-venuscoin priceDenom: venuscoin ``` In this walkthrough, we demonstrated how to set up an interchain exchange for trading tokens between two different blockchain networks. This involved creating an exchange order book for a specific token pair and establishing a fixed exchange rate between the two. Once the exchange was set up, users could send sell orders on the Mars chain and buy orders on the Venus chain. This allowed them to offer their tokens for sale or purchase tokens from the exchange. In addition, users could also cancel their orders if needed.