Summary
Celo has support for all Ethereum transaction types (i.e. “100% Ethereum compatibility”) and a single Celo transaction type.Actively Supported on Celo
Chain | Transaction type | # | Specification | Recommended | Support | Comment |
---|---|---|---|---|---|---|
![]() | Dynamic fee transaction v2 | 123 | CIP-64 | ✅ | Active 🟢 | Supports paying gas in custom fee currencies |
![]() | Set code transaction | 4 | EIP-7702 | Available since the Isthmus hardfork | ||
![]() | Dynamic fee transaction | 2 | EIP-1559 (CIP-42) | ✅ | Active 🟢 | Typical Ethereum transaction |
![]() | Access list transaction | 1 | EIP-2930 (CIP-35) | ❌ | Active 🟢 | Does not support dynamically changing base fee per gas |
![]() | Legacy transaction | 0 | Ethereum Yellow Paper (CIP-35) | ❌ | Active 🟢 | Does not support dynamically changing base fee per gas |
Deprecated on Celo
Chain | Transaction type | # | Specification | Support | Comment |
---|---|---|---|---|---|
![]() | Dynamic fee transaction | 124 | CIP-42 | Deprecated 🔴 | Deprecation warning published in Gingerbread hard fork and no longer supported following the transition to Celo L2 |
![]() | Legacy transaction | 0 | Celo Mainnet launch (Blockchain client v1.0.0) | Deprecated 🔴 | Deprecation warning published in Gingerbread hard fork and no longer supported following the transition to Celo L2 |
- Active support 🟢: the transaction type is supported and recommended for use.
- Security support 🟠: the transaction type is supported but not recommended for use because it might be deprecated in the future.
- Deprecated 🔴: the transaction type is not supported and not recommended for use.
Client Library Support
Legend:= support for the recommended Ethereum transaction type (
2
)= support for the recommended Celo transaction type (
123
)- ✅ = available
- ❌ = not available
Client library | Language | ![]() | since | ![]() | since | Comment |
---|---|---|---|---|---|---|
viem | TS/JS | ✅ | ✅ | >1.19.5 | --- | |
ethers | TS/JS | ✅ | ❌ | Support via fork in celo-ethers-wrapper | ||
celo-ethers-wrapper | TS/JS | ✅ | ✅ | >2.0.0 | --- | |
web3js | TS/JS | ✅ | ❌ | Support via fork in contractkit | ||
contractkit | TS/JS | ✅ | ✅ | >5.0.0 | --- | |
Web3j | Java | ✅ | ❌ | --- | ||
rust-ethers | Rust | ✅ | ❌ | --- | ||
brownie | Python | ✅ | ❌ | --- |
Background
Legacy Transactions
Ethereum originally had one format for transactions (now called “legacy transactions”). A legacy transaction contains the following transaction parameters:nonce
, gasPrice
, gasLimit
, recipient
, amount
, data
, and chaindId
.
To produce a valid “legacy transaction”:
-
the transaction parameters are RLP-encoded:
- the RLP-encoded transaction is hashed (using Keccak256).
-
the hash is signed with a private key using the ECDSA algorithm, which generates the
v
,r
, ands
signature parameters. -
the transaction and signature parameters above are RLP-encoded to produce a valid signed
transaction:
Typed Transactions
Over time, the Ethereum community has sought to add new types of transactions such as dynamic fee transactions (EIP-1559: Fee market change for ETH 1.0 chain) or optional access list transactions (EIP-2930: Optional access lists) to supported new desired behaviors on the network. To allow new transactions to be supported without breaking support with the legacy transaction format, the concept of typed transactions was proposed in EIP-2718: Typed Transaction Envelope, which introduces a new high-level transaction format that is used to implement all future transaction types.Distinguishing Between Legacy and Typed Transactions
Whereas a valid “legacy transaction” is simply an RLP-encoded list of transaction parameters, a valid “typed transactions” is an arbitrary byte array prepended with a transaction type, where:-
a transaction type, is a number between 0 (
0x00
) and 127 (0x7f
) representing the type of the transaction, and - a transaction payload, is arbitrary byte data that encodes raw transaction parameters in compliance with the specified transaction type.
[0, 0x7f]
(or [0, 127]
), and instead always be in the range [0xc0, 0xfe]
(or [192, 254]
).
With that observation, transactions can be decoded with the following heuristic:
- read the first byte of a transaction
- if it’s bigger than
0x7f
(127
), then it’s a legacy transaction. To decode it, you must read all bytes (including the first byte just read) and interpret them as a legacy transaction. - else, if it’s smaller or equal to
0x7f
(127
), then it’s a typed transaction. To decode it you must read the remaining bytes (excluding the first byte just read) and interpret them according to the specified transaction type.
List of Transaction Types on Celo
Legacy Transaction (0
)
This transaction type is 100% compatible with Ethereum and has no Celo-specific parameters.
0x00
transaction type,
they are commonly referred to as “type 0” transactions.
-
This transaction is defined as follows:
- It was introduced on Ethereum during Mainnet launch on Jul 30, 2015 as specified in the Ethereum Yellow Paper.
- It was introduced on Celo during the Celo Donut hard fork on May 19, 2021 as specified in CIP-35: Support for Ethereum-compatible transactions.
Access List Transaction (1
)
This transaction type is 100% compatible with Ethereum and has no Celo-specific parameters.
-
This transaction is defined as follows:
- It was introduced on Ethereum during the Ethereum Berlin hard fork on Apr, 15 2021 as specified in EIP-2930: Optional access lists.
- It was introduced on Celo during the Celo Donut hard fork on May 19, 2021 as specified in CIP-35: Support for Ethereum-compatible transactions.
Dynamic Fee Transaction (2
)
This transaction type is 100% compatible with Ethereum and has no Celo-specific parameters.
-
This transaction is defined as follows:
- It was introduced on Ethereum during the Ethereum London hard fork on Aug, 5 2021 as specified in EIP-1559: Fee market change for ETH 1.0 chain.
- It was introduced on Celo during the Celo Espresso hard fork on Mar 8, 2022 as specified in CIP-42: Modification to EIP-1559
Set Code Transaction (4
)
This transaction type is 100% compatible with Ethereum and has no Celo-specific parameters.
-
This transaction is defined as follows:
- It was introduced on Ethereum during the Ethereum Pectra hard fork on May, 7 2025 as specified in EIP-7702: Set Code for EOAs.
- It is scheduled for support on Celo during the Celo Isthmus hardfork.
Legacy Transaction (0
)
This transaction type is no longer supported following the migration to Celo L2.
This transaction is not compatible with Ethereum and has three Celo-specific
parameters:
feecurrency
, gatewayfeerecipient
, and gatewayfee
.-
This transaction is defined as follows:
- It was introduced on Celo during Mainnet launch on Apr 22, 2020 as specified in Blockchain client v1.0.0.
Dynamic Fee Transaction (124
)
This transaction type is no longer supported following the migration to Celo L2.
This transaction is not compatible with Ethereum and has three Celo-specific
parameters:
feecurrency
, gatewayfeerecipient
, and gatewayfee
.Warning This transaction type is scheduled for deprecation. A deprecation warning was published in the Gingerbread hard fork on Sep 26, 2023.
-
This transaction is defined as follows:
- It was introduced on Celo during the Celo Espresso hard fork on Mar 8, 2022 as specified in CIP-42: Modification to EIP-1559.
Dynamic Fee Transaction v2 (123
)
This transaction is not compatible with Ethereum and has one Celo-specific
parameter:
feecurrency
.-
This transaction is defined as follows:
- It was introduced on Celo during the Celo Gingerbread hard fork on Sep 26, 2023 as specified in CIP-64: New Transaction Type: Celo Dynamic Fee v2