- Docs
- Developers
- IBC transaction via arch3.js
IBC transaction via arch3.js
In this tutorial, you will learn how to execute an Inter-Blockchain Communication (IBC) transaction using the arch3.js library. The transaction will transfer tokens from your Archway account to a destination address on the Cosmos Hub blockchain.
Prerequisites
Before moving forward, ensure that you have completed the following prerequisites:
- Install Node.js on your system
Create a new NPM project
Create a folder to store your project, and within that folder, execute the following command to initialize an NPM project:
npm init -y
A default package.json file is generated with a structure similar to the following:
{ "name": "ibc_transaction", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC"}
Add "type": "module", to the package.json file to enable the use of ES6 module import syntax in your Node.js application.
Install required packages
Execute the following command to install arch3.js:
npm install --save @archwayhq/arch3.js
Execute the following command to install the long library, which is used for working with large integers:
npm install --save long
Execute the following command to install the dotenv library, which will be used for reading your mnemonic stored in a ".env" file:
npm install --save dotenv
Create .env file
Create a ".env" file that will be used to store your mnemonic and allows for not saving this sensitive information to your source control. In the ".env" file, add the following:
MNEMONIC="enter mnemonic here"
COSMOS_ADDRESS="enter your Cosmos wallet address here"
You can now add your .env file to your .gitignore file so it’s not added to source control.
Create index.js file
In the root of your project folder create an index.js file. This file will contain the entire script that will be executed to complete the IBC transaction.
Script breakdown
- Import the necessary dependencies in your index.js file:
import { SigningArchwayClient } from '@archwayhq/arch3.js';import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";import Long from "long";import dotenv from "dotenv";
- Configure dotenv:
dotenv.config();
- Create the main function which will contain the lines of code below:
async function main() {}
- Set up the network data:
mainnet
testnet
const network = { chainId: 'archway-1', endpoint: 'https://rpc.mainnet.archway.io', prefix: 'archway',};
- Set up your wallet using your mnemonic:
const mnemonic = process.env.MNEMONIC;const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: network.prefix });const accounts = await wallet.getAccounts();
- Set account (sender) and destination addresses:
const accountAddress = accounts[0].address;const destinationAddress = process.env.COSMOS_ADDRESS;
- Create the SigningArchwayClient using the connectWithSigner method.
const signingClient = await SigningArchwayClient.connectWithSigner(network.endpoint, wallet);
- Create the IBC transfer message with the necessary parameters. You can find the source channels for Archway's supported IBC Connections, here:
mainnet
testnet
const msgIBCTransfer = { typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", value: { sourcePort: 'transfer', sourceChannel: 'channel-0', // channel of the bridge token: { denom: 'aarch', amount: '1000000000000000000' }, sender: accountAddress, receiver: destinationAddress, // Timeout is in nanoseconds, you can also just send Long.UZERO for default timeout timeoutTimestamp: Long.fromNumber(Date.now() + 600_000).multiply(1_000_000), },};
- Use the signAndBroadcast method of SigningArchwayClient to sign and broadcast the transaction:
const broadcastResult = await signingClient.signAndBroadcast( accountAddress, [msgIBCTransfer], 'auto', 'IBC Transfer', // optional memo);
- Verify if the transaction was successful by checking the broadcastResult. This is the final lines of code for fucntion main:
if (broadcastResult.code !== undefined && broadcastResult.code !== 0) { console.log("Transaction failed:", broadcastResult.log || broadcastResult.rawLog);} else { console.log("Transaction successful:", broadcastResult.transactionHash);}
- Call the main function:
main();
Full script
mainnet
testnet
import { SigningArchwayClient } from '@archwayhq/arch3.js';import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";import Long from "long";import dotenv from "dotenv";dotenv.config();async function main() { const network = { chainId: 'archway-1', endpoint: 'https://rpc.mainnet.archway.io', prefix: 'archway', }; const mnemonic = process.env.MNEMONIC; const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: network.prefix }); const accounts = await wallet.getAccounts(); const accountAddress = accounts[0].address; const destinationAddress = process.env.COSMOS_ADDRESS; const signingClient = await SigningArchwayClient.connectWithSigner(network.endpoint, wallet); const msgIBCTransfer = { typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", value: { sourcePort: 'transfer', sourceChannel: 'channel-0', // channel of the bridge token: { denom: 'aarch', amount: '1000000000000000000' }, sender: accountAddress, receiver: destinationAddress, // Timeout is in nanoseconds, you can also just send Long.UZERO for default timeout timeoutTimestamp: Long.fromNumber(Date.now() + 600_000).multiply(1_000_000), }, }; const broadcastResult = await signingClient.signAndBroadcast( accountAddress, [msgIBCTransfer], 'auto', 'IBC Transfer', // optional memo ); if (broadcastResult.code !== undefined && broadcastResult.code !== 0) { console.log("Transaction failed:", broadcastResult.log || broadcastResult.rawLog); } else { console.log("Transaction successful:", broadcastResult.transactionHash); }}main();
Execute script
Navigate to the root of your project folder in the terminal and run the following command:
node index.js
Clone and try it yourself
You can find a working example of this Node.js app in the dapp examples (IBC Transaction) repository.