Skip to main content

Value Transfer With Memo

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

Fee Delegation

Import the ethers and @kaiachain/ethers-ext packages to add kaia features on ethers.js

Define sender address, sender private key, fee payer address, fee payer private key and reciever address

Set up the provider with the specified kaia Baobab testnet URL. A provider in ethers 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 from private key

Create fee payer's wallet from private key

Declare transaction with the fields such as type, from, to, value, input.

Populating transaction with additional information using senderWallet.populateTransaction

Signing the transaction with the sender's private key

Send the transaction to blockchain using fee payer's wallet. Function sendTransactionAsFeePayer adds a signature with FeePayer’s private key to the sender’s signature and transmits it to the blockchain network.

The wait function returns the tx receipt if the tx was sent to the blockchain successfully.

TxTypeFeeDelegatedValueTransferMemo.js

const { Wallet, TxType, parseKlay } = require("@kaiachain/ethers-ext");
const ethers = require("ethers");
const senderAddr = "0xa2a8854b1802d8cd5de631e690817c253d6a9153";
const senderPriv = "0x0e4ca6d38096ad99324de0dde108587e5d7c600165ae4cd6c2462c597458c2b8";
const feePayerAddr = "0xcb0eb737dfda52756495a5e08a9b37aab3b271da";
const feePayerPriv = "0x9435261ed483b6efa3886d6ad9f64c12078a0e28d8d80715c773e16fc000cff4";
const recieverAddr = "0xc40b6909eb7085590e1c26cb3becc25368e249e9";
async function main() {
const provider = new ethers.providers.JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const senderWallet = new Wallet(senderPriv, provider);
const feePayerWallet = new Wallet(feePayerPriv, provider);
let tx = {
type: TxType.FeeDelegatedValueTransferMemo,
to: recieverAddr,
value: parseKlay("0.01"),
from: senderAddr,
input: "0x1234567890",
};
tx = await senderWallet.populateTransaction(tx);
console.log(tx);
const senderTxHashRLP = await senderWallet.signTransaction(tx);
console.log("senderTxHashRLP", senderTxHashRLP);
const sentTx = await feePayerWallet.sendTransactionAsFeePayer(senderTxHashRLP);
console.log("sentTx", sentTx);
const rc = await sentTx.wait();
console.log("receipt", rc);
}
main();

output

❯ node TxTypeFeeDelegatedValueTransferMemo.js
senderTxHashRLP 0x11f88d8203ac850ba43b740082d1f694c40b6909eb7085590e1c26cb3becc25368e249e9872386f26fc1000094a2a8854b1802d8cd5de631e690817c253d6a9153851234567890f847f8458207f5a0bf499bb98ac755430724cb9cf8deb3e2d43baa0f4dc97036d06bd66c91e74f2ca0092f32dbabd626964eeccfe7a1cfc0d14088ece28f7efde952c341428a531785
sentTx 0xac225ead53297c95b747abd84e7224ecbc1b40f459a532fd22a67143aa83b4ae
receipt {
to: '0xC40B6909EB7085590E1c26Cb3beCC25368e249E9',
from: '0xA2a8854b1802D8Cd5De631E690817c253d6a9153',
contractAddress: null,
transactionIndex: 0,
gasUsed: BigNumber { _hex: '0x7b0c', _isBigNumber: true },
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
blockHash: '0xbc02b7afb16657cd1ec45bb6b7445767eb265702ae766dfc8bda3503f74d81a7',
transactionHash: '0xac225ead53297c95b747abd84e7224ecbc1b40f459a532fd22a67143aa83b4ae',
logs: [],
blockNumber: 148732018,
confirmations: 2,
cumulativeGasUsed: BigNumber { _hex: '0x7b0c', _isBigNumber: true },
effectiveGasPrice: BigNumber { _hex: '0x05d21dba00', _isBigNumber: true },
status: 1,
type: 0,
byzantium: true
}