Skip to main content

Ethereum Compatibility

Kaia provides wrapped transaction types to support Ethereum compatibility. Ethereum transaction types in Kaia have the same attributes and RLP encoding schemes with Ethereum's design except for the single-byte type delimiter called EthereumTxTypeEnvelope. Therefore, users can successfully deploy transactions generated by Ethereum development tools on Kaia. The type delimiter is also omitted when users use eth namespace APIs, so they can use Kaia just as if they were using Ethereum. Using kaia namespace APIs, users can deploy and retrieve Ethereum formatted transactions as a type of Kaia transactions without getting confused with the existing Kaia transaction types.

EthereumTxTypeEnvelope

EthereumTxTypeEnvelope is a single-byte prefix for raw transactions that denotes Ethereum transaction types. Ethereum has adopted an extendable transaction type scheme from EIP-2718 and it uses a type numbering system that conflicts with Kaia's. To resolve the conflict between two different transaction type schemes, Kaia has introduced EthereumTxTypeEnvelope which allows for separation and expansion for future Ethereum transaction types.

EthereumTxTypeEnvelope is an additional type delimiter and used only for raw transactions and type numbering. It is not used for transaction hash or signature hash. For that purpose, EthereumTransactionType as defined in EIPs is used.

  • EthereumTxTypeEnvelope: 0x78
  • TxHashRLP : EthereumTransactionType || TransactionPayload
  • RawTransaction : EthereumTxTypeEnvelope || EthereumTransactionType || TransactionPayload

TxTypeEthereumAccessList

TxTypeEthereumAccessList represents a type of Ethereum transaction specified in EIP-2930. This transactions type contains an access list, a list of addresses and storage keys that the transaction is supposed to access. Since this transaction type exists to support compatibility, it only works with EOAs associated with [AccountKeyLegacy]. EOAs associated with other account key types should use other transaction types such as TxTypeValueTransfer, TxTypeSmartContractExecution, and so on. This transaction type can create accounts, transfer tokens, deploy/execute smart contracts or a mix of the aforementioned.

note

Kaia networks can process this transaction type after the EthTxTypeCompatibleBlock

note

NOTE: This transaction type only supports the format of the Ethereum transaction type. Unlike EIP-2930, there are no benefits in terms of transaction fee from using access list.

Attributes

AttributeTypeDescription
typeuint8 (Go)The type of TxTypeEthereumAccessList that is a concatenation of EthereumTxTypeEnvelope and EthereumTransactionType. This must be 0x7801.
chainId*big.Int (Go)The destination chain ID.
nonceuint64 (Go)A value used to uniquely identify a sender’s transaction. If two transactions with the same nonce are generated by a sender, only one is executed.
gasPrice*big.Int (Go)A multiplier to get how much the sender will pay in tokens. The amount of tokens the sender will pay is calculated via gas * gasPrice. For example, the sender will pay 10 KAIA for a transaction fee if gas is 10 and gasPrice is 10^18. See Unit of KAIA.
gasuint64 (Go)The maximum amount of transaction fee the transaction is allowed to use.
to*common.Address (Go)The account address that will receive the transferred value.
value*big.Int (Go)The amount of KAIA in kei to be transferred.
data[]byte (Go)Data attached to the transaction, used for transaction execution.
accessListtype.AccessList (Go)A list of addresses and storage keys consisting of [](common.Address, []common.Hash).
v, r, s*big.Int (Go)The cryptographic signature generated by the sender to let the receiver obtain the sender's address.

RLP Encoding for Signature

To make a signature for this transaction type, the RLP serialization proceeds as follows:

note

This type of transaction should be signed with London Signer


SigRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

RLP Encoding for SenderTxHash

To obtain SenderTxHash for this transaction type, the RLP serialization proceeds as follows:


SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)
Signature = sign(SenderTxHash, <private key>)

RLP Encoding for Transaction Hash

To make a transaction hash, the RLP serialization proceeds as follows:


TxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, v, r, s])
TxHash = keccak256(TxHashRLP)

Raw Transaction


RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, v, r, s])

RLP Encoding (Example)

The following shows the result of the RLP serialization and the transaction object:


TX(3a3ab67168de40b1f8a2141a70a4e2f551f90d7814b2fbcb3ac99ad8d8d0b641)
Contract: false
Chaind: 0x2
From: a94f5374fce5edbc8e2a8697c15331677e6ebf0b
To: 7b65b75d204abed71587c9e519a89277766ee1d0
Nonce: 1234
GasPrice: 0x19
GasLimit 0xf4240
Value: 0xa
Data: 0x31323334
AccessList: [{0000000000000000000000000000000000000001 [0000000000000000000000000000000000000000000000000000000000000000]}]
V: 0x1
R: 0xbfc80a874c43b71b67c68fa5927d1443407f31aef4ec6369bbecdb76fc39b0c0
S: 0x193e62c1dd63905aee7073958675dcb45d78c716a9a286b54a496e82cb762f26
Hex: 7801f8a1028204d219830f4240947b65b75d204abed71587c9e519a89277766ee1d00a8431323334f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000001a0bfc80a874c43b71b67c68fa5927d1443407f31aef4ec6369bbecdb76fc39b0c0a0193e62c1dd63905aee7073958675dcb45d78c716a9a286b54a496e82cb762f26

RPC Output (Example)

The following shows a transaction object returned via JSON RPC.

The return of eth_getTransactionByHash


{
"blockHash": "0x7bd7e8a92ecaa5781a15a8b6fff589f8ac8a79325b517a1ba5d5f2f3d7af1b00",
"blockNumber": "0x1c8f4b",
"from": "0x5618e15ec2916bbe6cf2cce20ce31e61d6062cac",
"gas": "0x174876e800",
"gasPrice": "0x5d21dba00",
"hash": "0x3f67e48c2090f560234f555cd4edf7853b6327aa9a6a795be1efe3f360dac118",
"input": "0x1122",
"nonce": "0x11",
"to": "0x5dce87b5bfcde54023811b168dc97a9f10913957",
"transactionIndex": "0x0",
"value": "0x186a0",
"type": "0x1",
"accessList": [
{
"address": "0x0000000000000000000000000000000000000001",
"storageKeys": [
"0x0000000000000000000000000000000000000000000000000000000000000000"
]
}
],
"chainId": "0x2710",
"v": "0x1",
"r": "0xebb2d2144293c257e27aaa1d22156f322b0d2d7385257f186c117899d791f174",
"s": "0x5cea970287c9f0f9754050a552c458c066d8f3b3e4639f561b22ce4cb7553ac0"
}

The return of kaia_getTransactionByHash


{
"accessList": [
{
"address": "0x0000000000000000000000000000000000000001",
"storageKeys": [
"0x0000000000000000000000000000000000000000000000000000000000000000"
]
}
],
"blockHash": "0x7bd7e8a92ecaa5781a15a8b6fff589f8ac8a79325b517a1ba5d5f2f3d7af1b00",
"blockNumber": "0x1c8f4b",
"chainID": "0x2710",
"from": "0x5618e15ec2916bbe6cf2cce20ce31e61d6062cac",
"gas": "0x174876e800",
"gasPrice": "0x5d21dba00",
"hash": "0x3f67e48c2090f560234f555cd4edf7853b6327aa9a6a795be1efe3f360dac118",
"input": "0x1122",
"nonce": "0x11",
"senderTxHash": "0x3f67e48c2090f560234f555cd4edf7853b6327aa9a6a795be1efe3f360dac118",
"signatures": [
{
"V": "0x1",
"R": "0xebb2d2144293c257e27aaa1d22156f322b0d2d7385257f186c117899d791f174",
"S": "0x5cea970287c9f0f9754050a552c458c066d8f3b3e4639f561b22ce4cb7553ac0"
}
],
"to": "0x5dce87b5bfcde54023811b168dc97a9f10913957",
"transactionIndex": "0x0",
"type": "TxTypeEthereumAccessList",
"typeInt": 30721,
"value": "0x186a0"
}

TxTypeEthereumDynamicFee

TxTypeEthereumDynamicFee represents a type of Ethereum transaction specified in EIP-1559. This transaction type contains gasTipCap and gasFeeCap instead of gasPrice. Since this transaction type exists to support compatibility, it only works with EOAs associated with [AccountKeyLegacy]. EOAs associated with other account key types should use other transaction types such as TxTypeValueTransfer, TxTypeSmartContractExecution, and so on. This type of transaction can create accouns, transfer tokens, deploy/execute smart contracts, or a mix of the aforementioned.

note

NOTE: Kaia networks can process this transaction type after the EthTxTypeCompatibleBlock

note

Currently, this type of transaction only supports the format of the Ethereum transaction type. Unlike EIP-2930, there are no benefits in terms of transaction fees from using access list.

note

NOTE: Since Kaia has a fixed gas price, gasTipCap and gasFeeCap should take the gas price for the respective network, which is 250 Gkei at the time of writing.

Attributes

AttributeTypeDescription
typeuint8 (Go)The type of TxTypeEthereumDynamicFee that is a concatenation of EthereumTxTypeEnvelope and EthereumTransactionType. It must be 0x7802.
chainId*big.Int (Go)The destination chain ID.
nonceuint64 (Go)A value used to uniquely identify a sender’s transaction. If two transactions with the same nonce are generated by a sender, only one is executed.
gasTipCap*big.Int (Go)A multiplier to get how much the sender will pay in addition to baseFee. Since Kaia has a fixed gas price, gasTipCap and gasFeeCap should take the gas price for the respective network, which is 250 Gkei at the time of writing.
gasFeeCap*big.Int (Go)A multiplier to get how much the sender will pay in tokens. The amount of tokens the sender will pay is calculated via gas * gasFeeCap. Since Kaia has a fixed gas price, gasTipCap and gasFeeCap should take the gas price for the respective network, which is 250 Gkei at the time of writing.
gasuint64 (Go)The maximum amount of transaction fee the transaction is allowed to use.
to*common.Address (Go)The account address that will receive the transferred value.
value*big.Int (Go)The amount of KAIA in kei to be transferred.
data[]byte (Go)Data attached to the transaction, used for transaction execution.
accessListtype.AccessList (Go)A list of addresses and storage keys consisting of [](common.Address, []common.Hash).
v, r, s*big.Int (Go)The cryptographic signature generated by the sender to let the receiver obtain the sender's address.

RLP Encoding for Signature

To make a signature for this transaction type, the RLP serialization proceeds as follows:

note

This type of transaction should be signed with London Signer


SigRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gasLimit, to, value, data, accessList])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

RLP Encoding for SenderTxHash

To obtain SenderTxHash for this transaction type, the RLP serialization proceeds as follows:


SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gasLimit, to, value, data, accessList, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)
Signature = sign(SenderTxHash, <private key>)

RLP Encoding for Transaction Hash

To obtain a transaction hash, the RLP serialization proceeds as follows:


TxHashRLP = EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gasLimit, to, value, data, accessList, v, r, s])
TxHash = keccak256(TxHashRLP)

Raw Transaction


RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, gasTipCap, gasFeeCap, gasLimit, to, value, data, accessList, v, r, s])

RLP Encoding (Example)

The following shows the result of the RLP serialization and the transaction object:


TX(be74e122acf00c2f257e8698ecf01140b58b2880de3f24d0875730425eccb45a)
Contract: false
Chaind: 0x2
From: a94f5374fce5edbc8e2a8697c15331677e6ebf0b
To: 7b65b75d204abed71587c9e519a89277766ee1d0
Nonce: 1234
GasTipCap: 0x19
GasFeeCap: 0x19
GasLimit 0xf4240
Value: 0xa
Data: 0x31323334
AccessList: [{0000000000000000000000000000000000000001 [0000000000000000000000000000000000000000000000000000000000000000]}]
V: 0x0
R: 0xca14aa0bada2da7ca1b143c16e2dd4a69f2a1e77ce54c7f6d440fe828a777f4f
S: 0x117f0f78aed398b2995b5ee7c67ace25d52be3c72c1384c2aaa9683b351556
Hex: 7802f8a1028204d21919830f4240947b65b75d204abed71587c9e519a89277766ee1d00a8431323334f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000080a0ca14aa0bada2da7ca1b143c16e2dd4a69f2a1e77ce54c7f6d440fe828a777f4f9f117f0f78aed398b2995b5ee7c67ace25d52be3c72c1384c2aaa9683b351556

RPC Output (Example)

The following shows a transaction object returned via JSON RPC.

The return of eth_getTransactionByHash


{
"blockHash": "0x55792fe186e3d1515fe35a68c2c8d7977b2d7db184d80526f906c53222b77833",
"blockNumber": "0x1c944d",
"from": "0x5618e15ec2916bbe6cf2cce20ce31e61d6062cac",
"gas": "0x174876e800",
"gasPrice": "0x5d21dba00",
"maxFeePerGas": "0x5d21dba00",
"maxPriorityFeePerGas": "0x5d21dba00",
"hash": "0x5db239963029ad9ef6c3331b10ae455638316e330b0efdae2cc1f8e86884e66e",
"input": "0x1122",
"nonce": "0x13",
"to": "0xa0f1633f4c666d7fe5ba912bd5caf03d3655ac31",
"transactionIndex": "0x0",
"value": "0x186a0",
"type": "0x2",
"accessList": [
{
"address": "0x0000000000000000000000000000000000000001",
"storageKeys": [
"0x0000000000000000000000000000000000000000000000000000000000000000"
]
}
],
"chainId": "0x2710",
"v": "0x1",
"r": "0x27e007cbe79fd8cc9b89dd798bdd5aa62d038273bf006c7c3b40e13a938ab807",
"s": "0x6209bb328855f02fa2671fecb41efd9f191b03ecab5e580227fa2a0674879384"
}

The return of kaia_getTransactionByHash


{
"accessList": [
{
"address": "0x0000000000000000000000000000000000000001",
"storageKeys": [
"0x0000000000000000000000000000000000000000000000000000000000000000"
]
}
],
"blockHash": "0x55792fe186e3d1515fe35a68c2c8d7977b2d7db184d80526f906c53222b77833",
"blockNumber": "0x1c944d",
"chainId": "0x2710",
"from": "0x5618e15ec2916bbe6cf2cce20ce31e61d6062cac",
"gas": "0x174876e800",
"hash": "0x5db239963029ad9ef6c3331b10ae455638316e330b0efdae2cc1f8e86884e66e",
"input": "0x1122",
"maxFeePerGas": "0x5d21dba00",
"maxPriorityFeePerGas": "0x5d21dba00",
"nonce": "0x13",
"senderTxHash": "0x5db239963029ad9ef6c3331b10ae455638316e330b0efdae2cc1f8e86884e66e",
"signatures": [
{
"V": "0x1",
"R": "0x27e007cbe79fd8cc9b89dd798bdd5aa62d038273bf006c7c3b40e13a938ab807",
"S": "0x6209bb328855f02fa2671fecb41efd9f191b03ecab5e580227fa2a0674879384"
}
],
"to": "0xa0f1633f4c666d7fe5ba912bd5caf03d3655ac31",
"transactionIndex": "0x0",
"type": "TxTypeEthereumDynamicFee",
"typeInt": 30722,
"value": "0x186a0"
}

TxTypeEthereumBlob

TxTypeEthereumBlob represents a type of Ethereum transaction specified in EIP-4844 and KIP-279. This transaction type carries binary large objects (blobs) of data, providing a cost-effective data availability layer for Layer 2 rollups on Kaia. By separating blob data from permanent calldata storage, rollups can post data at a lower cost through an independent blob fee market. The blob data itself is not accessible by the EVM; only the blobVersionedHashes commitments are accessible on-chain. Since this transaction type exists to support compatibility, it only works with EOAs associated with [AccountKeyLegacy]. This transaction type cannot be used to create contracts — the to field must not be nil.

note

Kaia networks can process this transaction type after the OsakaCompatibleBlock

note

Kaia's blob gas parameters are tuned for 1-second blocks. Only one blob per block is allowed. Only the EIP-7594 sidecar format (V1) is accepted — V0 sidecars are rejected. Blob sidecars are retained for 1,814,400 blocks (~21 days).

note

eth_sendRawTransaction requires the full blob transaction with sidecar (BlobTxWithBlobs). The blobVersionedHashes must use version prefix 0x01.

Attributes

AttributeTypeDescription
typeuint8 (Go)The type of TxTypeEthereumBlob that is a concatenation of EthereumTxTypeEnvelope and EthereumTransactionType. This must be 0x7803.
chainId*big.Int (Go)The destination chain ID.
nonceuint64 (Go)A value used to uniquely identify a sender's transaction. If two transactions with the same nonce are generated by a sender, only one is executed.
maxPriorityFeePerGas*big.Int (Go)A multiplier to get how much the sender will pay in addition to baseFee. Since Kaia has a fixed gas price, this should take the gas price for the respective network.
maxFeePerGas*big.Int (Go)The maximum amount the sender is willing to pay per unit of gas. Since Kaia has a fixed gas price, this should take the gas price for the respective network.
gasuint64 (Go)The maximum amount of transaction fee the transaction is allowed to use.
to*common.Address (Go)The account address that will receive the transferred value. Must not be nil — blob transactions cannot create contracts.
value*big.Int (Go)The amount of KAIA in kei to be transferred.
data[]byte (Go)Data attached to the transaction, used for transaction execution.
accessListtype.AccessList (Go)A list of addresses and storage keys consisting of [](common.Address, []common.Hash).
maxFeePerBlobGas*big.Int (Go)The maximum fee per unit of blob gas the sender is willing to pay. Blob gas is priced independently from normal gas.
blobVersionedHashes[]common.Hash (Go)List of versioned hashes of the blobs associated with this transaction. Each hash must use version prefix 0x01. At least one hash is required.
v, r, s*big.Int (Go)The cryptographic signature generated by the sender to let the receiver obtain the sender's address.

RLP Encoding for Signature

To make a signature for this transaction type, the RLP serialization proceeds as follows:

note

This type of transaction should be signed with Osaka Signer


SigRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, maxFeePerBlobGas, blobVersionedHashes])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

RLP Encoding for SenderTxHash

To obtain SenderTxHash for this transaction type, the RLP serialization proceeds as follows:


SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, maxFeePerBlobGas, blobVersionedHashes, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)

RLP Encoding for Transaction Hash

To obtain a transaction hash, the RLP serialization proceeds as follows:


TxHashRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, maxFeePerBlobGas, blobVersionedHashes, v, r, s])
TxHash = keccak256(TxHashRLP)

Raw Transaction


RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, maxFeePerBlobGas, blobVersionedHashes, v, r, s])

When submitted via eth_sendRawTransaction, the full network representation including the sidecar must be provided:


BlobTxWithBlobs = rlp([TransactionPayloadBody, sidecar_version, blobs, commitments, proofs])

where sidecar_version is 0x01 per EIP-7594.

RLP Encoding (Example)

The following shows the result of the RLP serialization and the transaction object:


TX(b4687ea17a0908a4dce2d83f8c2566881474b9da30ee8b8979b028778761c9d7)
Contract: false
Chaind: 0x3e9
From: 0a3fa1b8fbdaeabcd2a7cb13abb87e8d1bd0a3b5
To: a9ef4a5bfb21e92c06da23ed79294dab11f5a6df
Nonce: 366
GasTipCap: 0x0
GasFeeCap: 0xba43b7400
GasLimit 0xc350
Value: 0x0
Data: 0xd09de08a
AccessList: []
MaxFeePerBlobGas: 0x5d21dba000
BlobVersionedHashes: [016f2dec5826dba2b8071deb0fba09244486cc4f9b981fe26396bc3206d2a8d7]
V: 0x1
R: 0x4b6905c3f0637363857626004b2367caa5e1d4c60fa3091a058ddbfef34e30ff
S: 0x659b7ede7f3439a3f07958abe448c25ddfc0ba0b530bff60356552484a854916
Hex: 7803f8978203e982016e80850ba43b740082c35094a9ef4a5bfb21e92c06da23ed79294dab11f5a6df8084d09de08ac0855d21dba000e1a0016f2dec5826dba2b8071deb0fba09244486cc4f9b981fe26396bc3206d2a8d701a04b6905c3f0637363857626004b2367caa5e1d4c60fa3091a058ddbfef34e30ffa0659b7ede7f3439a3f07958abe448c25ddfc0ba0b530bff60356552484a854916

RPC Output (Example)

The following shows a transaction object returned via JSON RPC.

The return of eth_getTransactionByHash


{
"blockHash": "0x1683db8c05f898cd9084a8905b3fa2a64b1380b6543e963ea15d2858b241c339",
"blockNumber": "0xc77238e",
"from": "0x0a3fa1b8fbdaeabcd2a7cb13abb87e8d1bd0a3b5",
"gas": "0xc350",
"gasPrice": "0x5d21dba00",
"maxFeePerGas": "0xba43b7400",
"maxPriorityFeePerGas": "0x0",
"maxFeePerBlobGas": "0x5d21dba000",
"hash": "0xb4687ea17a0908a4dce2d83f8c2566881474b9da30ee8b8979b028778761c9d7",
"input": "0xd09de08a",
"nonce": "0x16e",
"to": "0xa9ef4a5bfb21e92c06da23ed79294dab11f5a6df",
"transactionIndex": "0x0",
"value": "0x0",
"type": "0x3",
"accessList": [],
"chainId": "0x3e9",
"blobVersionedHashes": [
"0x016f2dec5826dba2b8071deb0fba09244486cc4f9b981fe26396bc3206d2a8d7"
],
"v": "0x1",
"r": "0x4b6905c3f0637363857626004b2367caa5e1d4c60fa3091a058ddbfef34e30ff",
"s": "0x659b7ede7f3439a3f07958abe448c25ddfc0ba0b530bff60356552484a854916"
}

The return of kaia_getTransactionByHash


{
"accessList": [],
"blobVersionedHashes": [
"0x016f2dec5826dba2b8071deb0fba09244486cc4f9b981fe26396bc3206d2a8d7"
],
"blockHash": "0x1683db8c05f898cd9084a8905b3fa2a64b1380b6543e963ea15d2858b241c339",
"blockNumber": "0xc77238e",
"chainId": "0x3e9",
"from": "0x0a3fa1b8fbdaeabcd2a7cb13abb87e8d1bd0a3b5",
"gas": "0xc350",
"gasPrice": "0x5d21dba00",
"hash": "0xb4687ea17a0908a4dce2d83f8c2566881474b9da30ee8b8979b028778761c9d7",
"input": "0xd09de08a",
"maxFeePerBlobGas": "0x5d21dba000",
"maxFeePerGas": "0xba43b7400",
"maxPriorityFeePerGas": "0x0",
"nonce": "0x16e",
"senderTxHash": "0xb4687ea17a0908a4dce2d83f8c2566881474b9da30ee8b8979b028778761c9d7",
"signatures": [
{
"V": "0x1",
"R": "0x4b6905c3f0637363857626004b2367caa5e1d4c60fa3091a058ddbfef34e30ff",
"S": "0x659b7ede7f3439a3f07958abe448c25ddfc0ba0b530bff60356552484a854916"
}
],
"to": "0xa9ef4a5bfb21e92c06da23ed79294dab11f5a6df",
"transactionIndex": "0x0",
"type": "TxTypeEthereumBlob",
"typeInt": 30723,
"value": "0x0"
}

TxTypeEthereumSetCode

TxTypeEthereumSetCode represents a type of Ethereum transaction specified in EIP-7702 and KIP-228. This transaction type improves user experience by allowing account abstraction features to already existing EOAs. Previously, EOA owners seeking smart account capabilities had to create a new smart account and migrate all assets and privileges. With SetCode transactions, users can attach code to an existing EOA in-place, eliminating the need for costly migrations. The authorizationList specifies a list of (chainId, address, nonce) tuples signed by the accounts whose code should be set, enabling patterns such as batched transactions, gas sponsorship, and scoped delegation. The delegation persists until explicitly changed or removed by another SetCode transaction. Since this transaction type exists to support compatibility, it only works with EOAs associated with [AccountKeyLegacy]. This transaction type cannot be used for contract creation — the destination field must not be nil.

note

Kaia networks can process this transaction type after the PragueCompatibleBlock

note

Only EOAs with AccountKeyLegacy can have code assigned via an authorization tuple. Authorization tuples referencing accounts with other key types are skipped. Once an EOA has code set, standard TxTypeValueTransfer transactions cannot target it, and TxTypeAccountUpdate transactions cannot originate from it.

note

As specified in EIP-7702, each authorization tuple is signed independently over keccak256(MAGIC || rlp([chainId, address, nonce])) where MAGIC = 0x05. At least one authorization tuple is required.

Attributes

AttributeTypeDescription
typeuint8 (Go)The type of TxTypeEthereumSetCode that is a concatenation of EthereumTxTypeEnvelope and EthereumTransactionType. This must be 0x7804.
chainId*big.Int (Go)The destination chain ID.
nonceuint64 (Go)A value used to uniquely identify a sender's transaction. If two transactions with the same nonce are generated by a sender, only one is executed.
maxPriorityFeePerGas*big.Int (Go)A multiplier to get how much the sender will pay in addition to baseFee. Since Kaia has a fixed gas price, this should take the gas price for the respective network.
maxFeePerGas*big.Int (Go)The maximum amount the sender is willing to pay per unit of gas. Since Kaia has a fixed gas price, this should take the gas price for the respective network.
gasuint64 (Go)The maximum amount of transaction fee the transaction is allowed to use.
destination*common.Address (Go)The account address that will receive the transferred value. Must not be nil — SetCode transactions cannot create contracts.
value*big.Int (Go)The amount of KAIA in kei to be transferred.
data[]byte (Go)Data attached to the transaction, used for transaction execution.
accessListtype.AccessList (Go)A list of addresses and storage keys consisting of [](common.Address, []common.Hash).
authorizationList[]Authorization (Go)A list of authorization tuples, each of the form [chainId, address, nonce, yParity, r, s], where address is the contract whose code the signing authority delegates to, and the tuple is signed by the authority. At least one tuple is required.
v, r, s*big.Int (Go)The cryptographic signature generated by the sender to let the receiver obtain the sender's address.

RLP Encoding for Signature

To make a signature for this transaction type, the RLP serialization proceeds as follows:

note

This type of transaction should be signed with Prague Signer


SigRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, destination, value, data, accessList, authorizationList])
SigHash = keccak256(SigRLP)
Signature = sign(SigHash, <private key>)

Each authorization tuple within authorizationList is independently signed as:


AuthSigRLP = MAGIC || encode([chainId, address, nonce]) // MAGIC = 0x05
AuthSigHash = keccak256(AuthSigRLP)
AuthSignature = sign(AuthSigHash, <authority private key>)

RLP Encoding for SenderTxHash

To obtain SenderTxHash for this transaction type, the RLP serialization proceeds as follows:


SenderTxHashRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, destination, value, data, accessList, authorizationList, v, r, s])
SenderTxHash = keccak256(SenderTxHashRLP)

RLP Encoding for Transaction Hash

To obtain a transaction hash, the RLP serialization proceeds as follows:


TxHashRLP = EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, destination, value, data, accessList, authorizationList, v, r, s])
TxHash = keccak256(TxHashRLP)

Raw Transaction


RawTx = EthereumTxTypeEnvelope || EthereumTransactionType || encode([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, destination, value, data, accessList, authorizationList, v, r, s])

RLP Encoding (Example)

The following shows the result of the RLP serialization and the transaction object:


TX(383aafe58842af80cc63747b78181439cc8b1786b70fedfd86d966b1ea728da1)
Contract: false
Chaind: 0x3e9
From: 698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce
To: 698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce
Nonce: 29
GasTipCap: 0x0
GasFeeCap: 0x6fc23ac00
GasLimit 0x186a0
Value: 0x0
Data: 0x8129fc1c
AccessList: []
AuthorizationList: [{ChainID: 0x3e9, Address: 5fa0193098ecbbad437243fe0ed77a402cd62242, Nonce: 30}]
V: 0x1
R: 0x77b03c8fd556255dff1f7af72e7a9a8f081e1da9daeb09800d139bf22f22708e
S: 0x26b7d4762db258e596382de1416753c65ca8e3b0855e8276eecf22d019af2805
Hex: 7804f8ce8203e91d808506fc23ac00830186a094698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce80848129fc1cc0f85ef85c8203e9945fa0193098ecbbad437243fe0ed77a402cd622421e01a0a21df3fb047c656d5046ae6b5ea81743c047b281b07591f742a13606f09c4969a01494cb06d71cbaa002d669ff63e1d0044bb5d06a00ca550a103ac0287789614a01a077b03c8fd556255dff1f7af72e7a9a8f081e1da9daeb09800d139bf22f22708ea026b7d4762db258e596382de1416753c65ca8e3b0855e8276eecf22d019af2805

RPC Output (Example)

The following shows a transaction object returned via JSON RPC.

The return of eth_getTransactionByHash


{
"blockHash": "0xb76e4a38c1311159ed6fe704f4b220294589accf1c5ec440a471fd4201c6c968",
"blockNumber": "0xb35bcdd",
"from": "0x698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce",
"gas": "0x186a0",
"gasPrice": "0x5d21dba00",
"maxFeePerGas": "0x6fc23ac00",
"maxPriorityFeePerGas": "0x0",
"hash": "0x383aafe58842af80cc63747b78181439cc8b1786b70fedfd86d966b1ea728da1",
"input": "0x8129fc1c",
"nonce": "0x1d",
"to": "0x698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce",
"transactionIndex": "0x0",
"value": "0x0",
"type": "0x4",
"accessList": [],
"chainId": "0x3e9",
"authorizationList": [
{
"chainId": "0x3e9",
"address": "0x5fa0193098ecbbad437243fe0ed77a402cd62242",
"nonce": "0x1e",
"yParity": "0x1",
"r": "0xa21df3fb047c656d5046ae6b5ea81743c047b281b07591f742a13606f09c4969",
"s": "0x1494cb06d71cbaa002d669ff63e1d0044bb5d06a00ca550a103ac0287789614a"
}
],
"v": "0x1",
"r": "0x77b03c8fd556255dff1f7af72e7a9a8f081e1da9daeb09800d139bf22f22708e",
"s": "0x26b7d4762db258e596382de1416753c65ca8e3b0855e8276eecf22d019af2805"
}

The return of kaia_getTransactionByHash


{
"accessList": [],
"authorizationList": [
{
"chainId": "0x3e9",
"address": "0x5fa0193098ecbbad437243fe0ed77a402cd62242",
"nonce": "0x1e",
"yParity": "0x1",
"r": "0xa21df3fb047c656d5046ae6b5ea81743c047b281b07591f742a13606f09c4969",
"s": "0x1494cb06d71cbaa002d669ff63e1d0044bb5d06a00ca550a103ac0287789614a"
}
],
"blockHash": "0xb76e4a38c1311159ed6fe704f4b220294589accf1c5ec440a471fd4201c6c968",
"blockNumber": "0xb35bcdd",
"chainId": "0x3e9",
"from": "0x698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce",
"gas": "0x186a0",
"gasPrice": "0x5d21dba00",
"hash": "0x383aafe58842af80cc63747b78181439cc8b1786b70fedfd86d966b1ea728da1",
"input": "0x8129fc1c",
"maxFeePerGas": "0x6fc23ac00",
"maxPriorityFeePerGas": "0x0",
"nonce": "0x1d",
"senderTxHash": "0x383aafe58842af80cc63747b78181439cc8b1786b70fedfd86d966b1ea728da1",
"signatures": [
{
"V": "0x1",
"R": "0x77b03c8fd556255dff1f7af72e7a9a8f081e1da9daeb09800d139bf22f22708e",
"S": "0x26b7d4762db258e596382de1416753c65ca8e3b0855e8276eecf22d019af2805"
}
],
"to": "0x698f9bd1a4fc200f8d0c7997810e02a77ca6d5ce",
"transactionIndex": "0x0",
"type": "TxTypeEthereumSetCode",
"typeInt": 30724,
"value": "0x0"
}

Make this page better