Skip to content

EIP-7702 authorizations

EIP-7702 lets an externally owned account (EOA) delegate its execution to a smart contract. The account owner signs an authorization tuple naming a delegate contract. When the tuple is applied on-chain, the EOA's code becomes the 23-byte delegation designator 0xef0100 || delegateAddress, and calls to the EOA from then on run the delegate's code in the account's context. The account keeps its address, balance, and nonce — it gains contract behavior without migrating to a new address.

Photon relays these for you. Pass signed tuples in the authorizationList field of Submit a transaction (or the tx object of Submit and wait), and the relayer includes them in the transaction it broadcasts. The relayer pays the gas — the authority account needs no native token to become delegated.

Authorization tuple format

Each entry in authorizationList is an object:

Field Type Description
chainId number Chain the authorization is valid for. 0 is a wildcard accepted on every EIP-7702 chain.
address string Delegate contract address: 0x-prefixed, 40 hex characters.
nonce number Authority nonce the tuple is valid for — see the nonce rule below.
r string Signature r as a 0x-prefixed hex quantity (at most 32 bytes).
s string Signature s as a 0x-prefixed hex quantity (at most 32 bytes).
yParity number Signature parity: 0 or 1. Any other value is rejected.
v number Optional legacy field. Accepted for compatibility and ignored — yParity is authoritative.

The signed payload is keccak256(0x05 || rlp([chainId, address, nonce])). Wallet libraries that support EIP-7702 produce this signature for you.

The nonce rule

An authorization is only valid if its nonce equals the authority's account nonce at the moment the tuple is applied.

Warning

Photon's relayer sends the transaction, so the authority's own nonce is not consumed by it. Sign the tuple with the authority's current nonce — do not add 1. The +1 adjustment only applies when an EOA sponsors its own type-0x04 transaction, because that transaction increments the sender's nonce before the authorization list is processed.

Concretely: if the authority's account nonce is 7 and Photon relays, sign the tuple with nonce: 7.

Submit an authorization

Requires an api-key header — Get API access.

curl -X POST https://photon.example.com/api/submit-tx \
  -H "api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
    "callData": "0xb61d27f60000000000000000000000003dbe34f2c21b3b2980d4dc53f3c7e51e39663f49",
    "chainId": 84532,
    "authorizationList": [
      {
        "chainId": 84532,
        "address": "0xd6CEDDe84be40893d153Be9d467CD6aD37875a28",
        "nonce": 7,
        "r": "0x1b5e1e14fc2b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3",
        "s": "0x0b5e1e14fc2b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3",
        "yParity": 1
      }
    ]
  }'
const res = await fetch("https://photon.example.com/api/submit-tx", {
  method: "POST",
  headers: { "api-key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    to: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", // the authority EOA
    callData: "0xb61d27f60000000000000000000000003dbe34f2c21b3b2980d4dc53f3c7e51e39663f49",
    chainId: 84532,
    authorizationList: [
      {
        chainId: 84532,
        address: "0xd6CEDDe84be40893d153Be9d467CD6aD37875a28", // the delegate
        nonce: 7, // authority's CURRENT nonce
        r: "0x1b5e1e14fc2b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3",
        s: "0x0b5e1e14fc2b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3b1b96b56b8ec8c1b3",
        yParity: 1,
      },
    ],
  }),
});
const body = await res.json();

Response — 201 Created:

{
  "success": true,
  "data": {
    "txId": "68fa3450539a3c9d28bbca33",
    "estimatedCostUSD": 0.02
  },
  "timestamp": "2026-07-29T09:15:12.345Z"
}

Once the transaction executes, the authority's on-chain code is exactly 0xef0100 followed by the delegate address (23 bytes). You can verify a delegation at any time by reading the account's code and checking for that prefix.

Constraints

  • authorizationList is not allowed with transactionType: "flash-blocks" — the submission is rejected with a validation error.
  • Transactions carrying an authorizationList never join a Multicall batch; they always relay solo, even when shouldBatchInMulticall is set.
  • yParity must be 0 or 1; address, r, and s must be well-formed 0x-prefixed hex, or the request fails validation. See Error codes.

Chain availability

EIP-7702 is an EVM feature, supported on:

Network Chain ID
Ethereum 1
OP Mainnet 10
Base 8453
Arbitrum One 42161
Sepolia 11155111
OP Sepolia 11155420
Base Sepolia 84532
Arbitrum Sepolia 421614

Solana does not support EIP-7702. For what is relayable right now, see Supported networks.

Next