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
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()); }}
❯ java FeeDelegatedAccountUpdateExample.javaTxHash : 0xdc81bb3ae59a0fdbb9a6616aeaf1b05f7252681edcf71b121ebc0d43d7dde024receipt :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