ERC-7758: Transfer With Authorization (modern)
ERC-7758 is the actively-maintained successor to ERC-3009. Same idea: a user signs an off-chain authorization to transfer tokens, a relayer broadcasts the signed authorization, the contract verifies and executes. ERC-3009 sat at "Stagnant" but reached production scale via USDC; ERC-7758 ports the same flow to the modern EIP standardisation track with cleaner typed-data shapes and broader fungible/NFT/multi-token support.
Differences from ERC-3009:
- Token-type-agnostic — works with ERC-20, ERC-721, ERC-1155 with the same signature shape.
- Cleaner EIP-712 typehash — uses the modern domain separator conventions (ERC-5267 lookup).
- Per-tokenId nonce isolation for NFTs — separate replay protection per-asset rather than per-account.
- Optional batch authorization — sign multiple transfers in one signature.
Required Interface (delta from ERC-3009)
interface IERC7758 {
/// Token-type-agnostic transfer-with-auth.
function executeTransfer(
address from, address to, uint256 amountOrId,
uint256 validAfter, uint256 validBefore,
bytes32 nonce,
bytes calldata signature
) external;
function cancelAuthorization(address authorizer, bytes32 nonce, bytes calldata signature) external;
function authorizationState(address authorizer, bytes32 nonce) external view returns (bool);
/// Optional: batch flow.
function executeTransferBatch(
address from, BatchEntry[] calldata transfers,
uint256 validAfter, uint256 validBefore,
bytes32 nonce,
bytes calldata signature
) external;
}The signature is verified via ERC-1271 when the authorizer is a contract, otherwise via ecrecover for EOAs. The flow otherwise matches ERC-3009.
Neo Equivalent: Native Witness Scopes (Same as ERC-3009)
The Neo answer is identical to the ERC-3009 mirror: Neo's witness model already provides signed, scoped transfer authorization at the protocol level. The user signs a transaction that names them as the from parameter; the relayer broadcasts; Runtime.CheckWitness(from) succeeds because the witness scope validates.
ERC-7758's improvements over ERC-3009 — token-type-agnostic shape, cleaner typed-data, batch authorisation — all map to native Neo features:
| ERC-7758 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
| Token-type-agnostic shape | NEP-17 / NEP-11 use the same transfer(from, to, …) signature | Already token-type-agnostic |
| Modern EIP-712 typed-data | Native witness over the canonical tx body — no per-call typed-data assembly | Cleaner because there's no "wrap calldata in EIP-712" indirection |
| Per-tokenId nonce isolation | Per-account transaction nonce; tokenId carried in the call args | Different replay model — the tx nonce already namespaces |
| Batch authorization | Single transaction, multiple transfer invocations in script | Native batch — no separate batch interface |
| ERC-1271 fallback for contract signers | NEP-30 Verify for contract signers | Native equivalent |
authorizationState(authorizer, nonce) | Implicit in tx replay protection (consumed nonces) | Same guarantee |
What This Mirror Page Adds vs ERC-3009
The two pages cover the same Neo-side answer (witness scopes) but clarify the migration story differently:
- The ERC-3009 mirror targets teams porting USDC-style flows (existing production deployments).
- This page targets teams adopting the modern shape from scratch — greenfield wallets and dApps that want forward-compatible code.
For new code, prefer the plain NEP-17 four-parameter transfer flow with witness-based auth; reach for an explicit "transfer with authorization" extension only if you're integrating with an off-chain service that specifically expects the ERC-7758 selector shape.
Composition
- ERC-3009 — predecessor mirror.
- ERC-1271 + ERC-6066 — signature validation for contract-held authorizations.
- ERC-2612 — permit-style approval. Also covered by Neo's witness scopes; ERC-7758 supersedes the per-token permit pattern.
- ERC-7677 — paymaster web service. Authorized transfers are commonly relayed through a sponsor; the ERC-7677 mirror covers that handshake.
Migration Notes
For Solidity contracts adopting ERC-7758:
- Drop the
executeTransfer(...)machinery forneo-solcports — the four-parameter NEP-17 / NEP-11Transferalready does this with witness auth. - For batch flows, build a multi-instruction Neo script that invokes
Transfermultiple times within a single transaction. The user signs once (the transaction); each invocation is witness-checked. - For ERC-1271-style contract-signed authorizations, expose a
Verifymethod (NEP-30) on the authorizing contract.
