Transaction Types
Arbitrum extends the EIP-2718 typed transaction envelope with six custom transaction types. These are used for L1-to-L2 messaging, internal protocol operations, and retryable tickets.
Type Bytes
| Type | Byte | Name | Origin |
|---|---|---|---|
| Deposit | 0x64 | ArbitrumDepositTx | L1 bridge |
| Unsigned | 0x65 | ArbitrumUnsignedTx | L1 (no signature) |
| Contract | 0x66 | ArbitrumContractTx | L1 contract call |
| Retry | 0x68 | ArbitrumRetryTx | Auto/manual redeem |
| SubmitRetryable | 0x69 | ArbitrumSubmitRetryableTx | L1 retryable ticket |
| Internal | 0x6A | ArbitrumInternalTx | ArbOS protocol |
Standard Ethereum transaction types (Legacy, EIP-2930, EIP-1559) are also supported for regular L2 transactions.
Deposit Transactions (0x64)
Deposits move ETH from L1 to L2. They are included in blocks when the bridge contract emits a deposit event on L1.
- Sender: Set to the L1 depositor (with address aliasing for contracts)
- No signature: Authenticated by L1 inclusion proof
- Always succeeds: Value is minted on L2 regardless of execution outcome
- No gas cost: Gas is paid on L1
Unsigned Transactions (0x65)
L1-originated transactions without an ECDSA signature. The sender is determined by the L1 message rather than signature recovery.
Contract Transactions (0x66)
Similar to unsigned transactions but specifically for contract-to-contract L1-to-L2 calls. The sender address is aliased (offset by 0x1111000000000000000000000000000000001111) to prevent address collisions between L1 and L2.
Retryable Tickets (0x69)
Retryable tickets are the primary mechanism for L1-to-L2 message passing with guaranteed delivery.
Lifecycle
- Submit - L1 transaction creates a retryable ticket on L2 with a deposit covering fees and call value
- Auto-redeem - ArbOS automatically attempts to execute the ticket immediately
- Manual redeem - if auto-redeem fails, anyone can redeem the ticket later via
ArbRetryableTx.redeem() - Expiry - unredeemed tickets expire after 7 days (configurable) and deposits are refunded to the beneficiary
Fee Structure
- Submission fee:
(1400 + 6 * calldata_length) * l1_base_fee - Call value: Held in escrow at a derived address (
keccak256("retryable escrow" || ticket_id)) - Excess deposit: Refunded to the designated refund address
Retry Transactions (0x68)
Generated when a retryable ticket is redeemed (either automatically or manually). These carry the original call parameters from the retryable submission.
Internal Transactions (0x6A)
Protocol-level transactions generated by ArbOS itself, not by any external account. Two primary types:
- StartBlock (
0x6bf6a42d) - initializes ArbOS state at the beginning of each block (pricing updates, retryable reaping, L1 block number caching) - BatchPostingReport - records L1 batch posting costs for the L1 pricing model
Internal transactions are always the first transactions in a block and have no gas cost.
Receipt Extensions
Arbitrum receipts include additional fields beyond standard Ethereum receipts:
| Field | Description |
|---|---|
gasUsedForL1 | Gas attributable to L1 data posting costs |
Receipt type bytes mirror the transaction type bytes (0x64-0x6A), each with its own RLP encoding.
