Skip to main content

Account Update

Fee Delegation

Import necessary classes from the Web3j and kaia libraries(web3j-ext).

Connect to the kaia blockchain using Web3j and specify the URL

Creating sender and fee payer credentials using private keys.

Define gas price and gas limit for the transaction

Get the sender's address from credentials.getAddress()

Get the chain ID from the Kaia network

Getting the nonce for the sender's address

Generating a new account key for account update

Creating a raw transaction for account update

Signing the transaction as sender using KlayTransactionEncoder.signMessage.

Signing the transaction as fee payer using KlayTransactionEncoder.signMessageAsFeePayer.

Sending the signed transaction to kaia network

Getting the transaction receipt

Shutting down the Web3j instance

Decoding the raw transaction to get the transaction type

FeeDelegatedAccountUpdateExample.java

package org.web3j.example.transactions;
import org.web3j.tx.response.PollingTransactionReceiptProcessor;
import org.web3j.tx.response.TransactionReceiptProcessor;
import org.web3j.example.keySample;
import java.io.IOException;
import java.math.BigInteger;
import org.web3j.crypto.KlayCredentials;
import org.web3j.crypto.KlayRawTransaction;
import org.web3j.crypto.KlayTransactionEncoder;
import org.web3j.crypto.transaction.account.AccountKeyPublic;
import org.web3j.crypto.transaction.type.TxType;
import org.web3j.crypto.transaction.type.TxTypeFeeDelegatedAccountUpdate;
import org.web3j.crypto.transaction.type.TxType.Type;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.EthChainId;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.http.HttpService;
import org.web3j.protocol.kaia.Web3j;
import org.web3j.utils.Numeric;
import org.web3j.protocol.kaia.core.method.response.TransactionReceipt;
/**
*
*/
public class FeeDelegatedAccountUpdateExample implements keySample {
public static void run(KlayCredentials credentials) throws Exception {
Web3j web3j = Web3j.build(new HttpService(keySample.BAOBAB_URL));
KlayCredentials new_credentials = KlayCredentials.create(PUBLIC_KEY_privkey, PUBLIC_KEY_address);
KlayCredentials credentials_feepayer = KlayCredentials.create(keySample.LEGACY_KEY_FEEPAYER_privkey);
BigInteger GAS_PRICE = BigInteger.valueOf(50000000000L);
BigInteger GAS_LIMIT = BigInteger.valueOf(6721950);
String from = credentials.getAddress();
EthChainId EthchainId = web3j.ethChainId().send();
long chainId = EthchainId.getChainId().longValue();
BigInteger nonce = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.LATEST).send()
.getTransactionCount();
BigInteger newPubkey = new_credentials.getEcKeyPair().getPublicKey();
AccountKeyPublic accountkey = AccountKeyPublic.create(newPubkey);
TxType.Type type = Type.FEE_DELEGATED_ACCOUNT_UPDATE;
KlayRawTransaction raw = KlayRawTransaction.createTransaction(
type,
nonce,
GAS_PRICE,
GAS_LIMIT,
from,
accountkey);
// Sign as sender
byte[] signedMessage = KlayTransactionEncoder.signMessage(raw, chainId, credentials);
// Sign same message as Fee payer
signedMessage = KlayTransactionEncoder.signMessageAsFeePayer(raw, chainId, credentials_feepayer);
String hexValue = Numeric.toHexString(signedMessage);
EthSendTransaction transactionResponse = web3j.ethSendRawTransaction(hexValue).send();
System.out.println("TxHash : \n " + transactionResponse.getResult());
String txHash = transactionResponse.getResult();
int DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH = 40;
int DEFAULT_BLOCK_TIME = 1 * 1000;
long DEFAULT_POLLING_FREQUENCY = DEFAULT_BLOCK_TIME;
TransactionReceiptProcessor transactionReceiptProcessor = new PollingTransactionReceiptProcessor(web3j,
DEFAULT_POLLING_FREQUENCY, DEFAULT_POLLING_ATTEMPTS_PER_TX_HASH);
org.web3j.protocol.core.methods.response.TransactionReceipt ethReceipt = transactionReceiptProcessor
.waitForTransactionReceipt(txHash);
System.out.println("Receipt from eth_getTransactionReceipt : \n" + ethReceipt);
TransactionReceipt receipt = web3j.klayGetTransactionReceipt(txHash).send().getResult();
System.out.println("Receipt from klay_getTransactionReceipt : \n" + receipt);
web3j.shutdown();
TxTypeFeeDelegatedAccountUpdate rawTransaction = TxTypeFeeDelegatedAccountUpdate
.decodeFromRawTransaction(signedMessage);
System.out.println("TxType : " + rawTransaction.getKlayType());
}
}

output

❯ java FeeDelegatedAccountUpdateExample.java
TxHash :
0xdc81bb3ae59a0fdbb9a6616aeaf1b05f7252681edcf71b121ebc0d43d7dde024
receipt :
class TransactionReceipt {
blockHash: 0x350799aaabe33fa8e1ee69a680aca014deb7b2d75562a3181342aafd5a477905
blockNumber: 0x8def123
codeFormat: null
contractAddress: null
feePayer: 0xcb0eb737dfda52756495a5e08a9b37aab3b271da
feePayerSignatures: [class TransactionReceiptFeePayerSignaturesInner {
V: 0x7f5
R: 0x2d805d33598b288d17fea47d2610a0ae16d9ad8cdd21d348366c51b8b3fa4d4f
S: 0x99ac39df17853a3d267040c2701616be38bc3c19d328c12bb74cf2f53268646
}]
feeRatio: null
from: 0xa2a8854b1802d8cd5de631e690817c253d6a9153
gas: 0x66919e
effectiveGasPrice: 0x5d21dba00
gasPrice: 0xba43b7400
gasUsed: 0xc738
humanReadable: null
key: 0x02a103dc9dccbd788c00fa98f7f4082f2f714e799bc0c29d63f04d48b54fe6250453cd
input: null
logs: []
logsBloom: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
nonce: 0x3c7
senderTxHash: 0xae469dc5bd4ae1eddcabebc9a15d523025aaeab4c95fbdf94e744f9965222bb0
signature: []
status: 0x1
txError: null
to: null
transactionHash: 0xdc81bb3ae59a0fdbb9a6616aeaf1b05f7252681edcf71b121ebc0d43d7dde024
transactionIndex: 0x3
type: TxTypeFeeDelegatedAccountUpdate
typeInt: 33
value: null
}
TxType : FEE_DELEGATED_ACCOUNT_UPDATE