Skip to main content

Value Transfer Memo

TxTypeValueTransferMemo is used when a user wants to send KAIA with a specific message.

Import the web3 and @kaiachain/web3js-ext packages to add kaia features on web3

Define sender, fee payer addresses and private keys

Set up the provider with the specified kaia Baobab testnet URL. A provider in web3 is a read-only abstraction to access the blockchain data.

Also, you can change the provider URL from baobab to allthatnode

Create a sender's wallet with the private key using web3.eth.accounts.privateKeyToAccount

Create a fee payer's wallet with the private key using web3.eth.accounts.privateKeyToAccount

Define the transaction object.

Set type: TxType.FeeDelegatedValueTransferMemo for transaction to send a memo value transfer with a fee payer

Set value: toPeb("0.01") to define the value to be transfered, use toPeb to convert Klay to Peb

Set data: "0x1234567890" to define the memo value attached with the transaction

Set others params like from, to

Sign the transaction with sender account using signTransaction

Sign the transaction with fee payer account using signTransactionAsFeePayer

Send the transaction to blockchain. It will return the transaction receipt

TxTypeFeeDelegatedValueTransferMemo.js

const { Web3, TxType, toPeb } = require("@kaiachain/web3js-ext");
const senderAddr = "0xa2a8854b1802d8cd5de631e690817c253d6a9153";
const senderPriv = "0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8";
const feePayerPriv = "0x9435261ed483b6efa3886d6ad9f64c12078a0e28d8d80715c773e16fc000cff4";
const recieverAddr = "0xc40b6909eb7085590e1c26cb3becc25368e249e9";
const provider = new Web3.providers.HttpProvider("https://public-en-kairos.node.kaia.io");
const web3 = new Web3(provider);
const senderAccount = web3.eth.accounts.privateKeyToAccount(senderPriv);
const feePayerAccount = web3.eth.accounts.privateKeyToAccount(feePayerPriv);
async function main() {
const tx = {
type: TxType.FeeDelegatedValueTransferMemo,
from: senderAddr,
to: recieverAddr,
value: toPeb("0.01"),
data: "0x1234567890",
};
// Sign transaction by sender
const signResult1 = await senderAccount.signTransaction(tx);
console.log("senderTxHashRLP", signResult1.rawTransaction);
// Sign and send transaction by fee payer
const signResult2 = await feePayerAccount.signTransactionAsFeePayer(signResult1.rawTransaction);
console.log("signedTx", signResult2.transactionHash);
const receipt = await web3.eth.sendSignedTransaction(signResult2.rawTransaction);
console.log("receipt", receipt);
}
main();

output

❯ node TxTypeFeeDelegatedValueTransferMemo.js
senderTxHashRLP 0x11f88d8203b7850ba43b740082d1f694c40b6909eb7085590e1c26cb3becc25368e249e9872386f26fc1000094a2a8854b1802d8cd5de631e690817c253d6a9153851234567890f847f8458207f5a0fbd13725c0e913f564469d43e6e928514caca92ca5d5fcc18c493445d2bd3f00a065980c9c0ea0bcfa4324c23b21d45acaa8a64d1d47d45a6730774756be794e86
signedTx 0xb17d3bc44eb466cf0870926eb4b7a8e90a3ca348df1e32227ab1eaf2bd7f98c8
receipt {
blockHash: '0x51586607f9d282deede4a9325d6ecdb2abb675fca0350ac6778549f2e7bfed73',
blockNumber: 148744817n,
cumulativeGasUsed: 31500n,
effectiveGasPrice: 25000000000n,
from: '0xa2a8854b1802d8cd5de631e690817c253d6a9153',
gasUsed: 31500n,
logs: [],
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: 1n,
to: '0xc40b6909eb7085590e1c26cb3becc25368e249e9',
transactionHash: '0xb17d3bc44eb466cf0870926eb4b7a8e90a3ca348df1e32227ab1eaf2bd7f98c8',
transactionIndex: 0n,
type: 0n
}