Sending transactions using InitiaJS is straightforward. First, we need to import the necessary classes and functions.
import { Wallet, RESTClient, MnemonicKey, MsgSend, Tx, WaitTxBroadcastResult } from '@initia/initia.js';
Next, we need to set up our environment variables. We will need the following:
MNEMONIC
: The mnemonic of the account that will be sending the transaction.
REST_URL
: The URL of the Initia REST.
GAS_PRICES
: The gas prices for the transaction.
SENDER_ADDRESS
: The address of the account that will be sending the transaction.
RECIPIENT_ADDRESS
: The address of the account that will be receiving the transaction.
AMOUNT
: The amount of tokens to send.
if (!process.env.MNEMONIC) {
throw new Error('MNEMONIC environment variable is required');
}
const mnemonic = process.env.MNEMONIC;
const restUrl = process.env.REST_URL || "https://rest.testnet.initia.xyz";
const gasPrices = process.env.GAS_PRICES || "0.015uinit"; // Will be INIT for mainnet
const senderAddress = process.env.SENDER_ADDRESS || 'init1w4cqq6udjqtvl5xx0x6gjeyzgwtze8c05kysnu';
const recipientAddress = process.env.RECIPIENT_ADDRESS || 'init1w4cqq6udjqtvl5xx0x6gjeyzgwtze8c05kysnu';
const amount = process.env.AMOUNT || '1000uinit';
We can then use the use these variables to ultimately create the wallet
client, as well as the sendMsg
object. Since for this example we’re making a token transfer, we’ll use the MsgSend
object. But the SDK provides many other message types for different actions related to staking, governance, and more.
const key: MnemonicKey = new MnemonicKey({ mnemonic }); // Create a key from the mnemonic
const restClient: RESTClient = new RESTClient(restUrl, { gasPrices });
const wallet: Wallet = new Wallet(restClient, key);
const sendMsg: MsgSend = new MsgSend(senderAddress, recipientAddress, amount);
Finally, we can create the function to send the transaction.
- We first create the transaction by calling
wallet.createAndSignTx
. This function takes in the raw message object, signs it using the wallet
, and returns a signed transaction object.
- We then broadcast the transaction by calling
restClient.tx.broadcast
. This function takes in the signed transaction object and broadcasts it to the network.
async function sendTransaction(): Promise<WaitTxBroadcastResult> {
try {
const signedTx: Tx = await wallet.createAndSignTx({
msgs: [sendMsg],
memo: 'memo',
});
const result: WaitTxBroadcastResult = await restClient.tx.broadcast(signedTx);
console.log('Transaction successful');
console.log('Transaction hash:', result.txhash);
return result;
} catch (error: unknown) {
if (error instanceof Error) {
console.error('Transaction failed:', error.message);
} else {
console.error('Transaction failed with an unknown error');
}
throw error;
}
}
Finally, we can call the function to send the transaction.
sendTransaction()
.then(() => process.exit(0))
.catch(() => process.exit(1));
If you then run the script using npx ts-node src/sending-transactions.ts
, you should see an output similar to the following:
Transaction successful
Transaction hash: 4F0B810D15FA7D6A2B9EC2B98B263B0A20E791A8DABCB549620445941B25C699
Full Example
src/sending-transactions.ts
import { Wallet, RESTClient, MnemonicKey, MsgSend, Tx, WaitTxBroadcastResult } from '@initia/initia.js';
const mnemonic = process.env.MNEMONIC;
const restUrl = process.env.REST_URL || "https://rest.testnet.initia.xyz";
const gasPrices = process.env.GAS_PRICES || "0.015uinit"; // Will be INIT for mainnet
const senderAddress = process.env.SENDER_ADDRESS || 'init1w4cqq6udjqtvl5xx0x6gjeyzgwtze8c05kysnu';
const recipientAddress = process.env.RECIPIENT_ADDRESS || 'init1w4cqq6udjqtvl5xx0x6gjeyzgwtze8c05kysnu';
const amount = process.env.AMOUNT || '1000uinit';
const key: MnemonicKey = new MnemonicKey({ mnemonic });
const restClient: RESTClient = new RESTClient(restUrl, { gasPrices });
const wallet: Wallet = new Wallet(restClient, key);
const sendMsg: MsgSend = new MsgSend(senderAddress, recipientAddress, amount);
async function sendTransaction(): Promise<WaitTxBroadcastResult> {
try {
const signedTx: Tx = await wallet.createAndSignTx({
msgs: [sendMsg],
memo: 'memo',
});
const result: WaitTxBroadcastResult = await restClient.tx.broadcast(signedTx);
console.log('Transaction successful');
console.log('Transaction hash:', result.txhash);
return result;
} catch (error: unknown) {
if (error instanceof Error) {
console.error('Transaction failed:', error.message);
} else {
console.error('Transaction failed with an unknown error');
}
throw error;
}
}
sendTransaction()
.then(() => process.exit(0))
.catch(() => process.exit(1));