Fee delegation allows a separate account (
FeePayer) to pay the transaction gas costs, while the transaction sender (From) only provides the value transfer.This feature enables use cases where application operators subsidize transaction fees for users. For gas fee policies and tip requirements, refer to Gas Fee Policy.
For the general transaction processing flow, refer to Transaction Lifecycle.
Purpose and Scope
Fee delegation clearly separates the financial responsibilities of a transaction between two parties.- Sender (
From)
Signs the transaction intent, provides theValueto be transferred, and must hold a valid nonce. - Fee Payer (
FeePayer)
Separately signs to approve gas payment and must hold sufficient balance to cover gas costs.
FeeDelegateDynamicFeeTxType = 0x16, and requires the Applepie fork to be active.
Transaction Type and Structure
Transaction Type Definition
Fee delegation uses transaction type0x16 (decimal 22).
| Constant | Value | Description |
|---|---|---|
FeeDelegateDynamicFeeTxType | 0x16 | Fee-delegated EIP-1559 style transaction |
Core Data Structures
TheMessage structure includes fee delegation fields.
TxData interface includes fee delegation–related methods.
Dual Signature Requirement
Fee-delegated transactions require two independent signatures.Signature 1: Transaction Sender
- Signs the transaction data (to, value, data, gas parameters, nonce).
- Signature values:
V,R,S - Proves transaction intent and authorization.
Signature 2: Fee Payer
- Signs consent to pay gas for the transaction.
- Signature values:
FV,FR,FS - Retrieved via the
rawFeePayerSignatureValues()method.
State Transition Process
Transaction-to-Message Conversion
A fee-delegated transaction is converted into aMessage upon entering the state transition.
TransactionToMessage recovers the From address from the sender’s signature (V/R/S) and sets the FeePayer field via tx.FeePayer().The fee payer’s signature is used only to authorize gas payment and is not used to derive the
From address.
Gas Purchase (buyGas)
When fee delegation is active, buyGas performs separated balance checks and deductions.
Balance Validation Rules
| Scenario | FeePayer Balance Check | Sender Balance Check |
|---|---|---|
| Fee Delegation Active | ≥ gasLimit × gasPrice + blob fees | ≥ value |
| Standard Transaction | N/A | ≥ gasLimit × gasPrice + value + blob fees |
EVM Execution Context
Fee delegation does not alter EVM execution semantics.- tx.origin: Always the transaction sender (
From) - Top-level caller: Transaction sender
- FeePayer: Not exposed to the EVM context
Gas Refund Process
After execution, unused gas is refunded to the account that actually paid for gas.Fee Payment to Coinbase
Validators receive fees based on actual gas usage.Fee payment is processed in the later stages of state transition and includes blacklist checks for the fee payer.
Fork Activation Requirement
Fee delegation is only permitted after the Applepie fork.preCheck stage.
Transaction Construction via RPC
TransactionArgs Fields
| Field | Type | Purpose |
|---|---|---|
From | *common.Address | Transaction sender |
FeePayer | *common.Address | Optional fee payer |
V,R,S | *hexutil.Big | Sender signature |
FV,FR,FS | raw tx only | FeePayer signature |
JSON Representation
Key Invariants
- Balance Isolation
The fee payer covers gas only, while the sender covers value only. - Origin Preservation
tx.originis always the sender. - Dual Consent
Both accounts must sign for the transaction to be valid. - Fork Gate
Available only after Applepie activation. - Refund Consistency
Unused gas is refunded to the actual payer.

