I’d like feedback on a small ERC-721 extension for service objects.
Abstract
This proposal defines a minimal ERC-721-compatible interface for service objects. A service object is a transferable token that represents control over an offchain service. The interface exposes a service manifest, service operator, and payment route so that wallets, indexers, marketplaces, and clients can resolve the current operational state of a service before interacting with it.
The proposal does not define service discovery, reputation, execution, payment settlement, smart-account behavior, MCP semantics, or x402 semantics.
Problem
ERC-721 provides ownership and transfer semantics, but it does not provide a standard way to answer operational questions about a service represented by a token.
Today, service marketplaces, API providers, agent registries, and payment middleware each define their own metadata formats and payment-route conventions.
As a result, wallets, clients, and indexers cannot reliably answer basic questions:
-
Which manifest currently describes this service?
-
Which operator is currently authorized to operate it?
-
Which payment route should paid endpoints use?
-
Has the payment route changed since the client last inspected it?
The absence of a common interface creates fragmentation across service-oriented applications and makes it difficult for generic infrastructure to support them.
Proposed Primitive
The proposed interface is intentionally small:
interface IERCServiceObject is IERC165 {
event ServiceManifestUpdated(
uint256 indexed serviceId,
string uri,
bytes32 indexed manifestHash
);
event ServiceOperatorUpdated(
uint256 indexed serviceId,
address indexed operator,
uint64 expiresAt
);
event ServicePaymentRouteUpdated(
uint256 indexed serviceId,
address indexed revenueRecipient,
string paymentURI,
bytes32 indexed paymentManifestHash,
uint64 routeNonce
);
function serviceManifest(uint256 serviceId)
external
view
returns (string memory uri, bytes32 manifestHash);
function serviceOperator(uint256 serviceId)
external
view
returns (address operator, uint64 expiresAt);
function servicePaymentRoute(uint256 serviceId)
external
view
returns (
address revenueRecipient,
string memory paymentURI,
bytes32 paymentManifestHash,
uint64 routeNonce
);
}
Current reduced interface ID:
0xf94c99e5
Non-Goals
This proposal does not define:
-
service discovery
-
reputation systems
-
validation systems
-
payment settlement
-
endpoint execution
-
escrow
-
revenue splitting
-
subscriptions
-
smart-account modules
-
MCP runtime behavior
-
x402 payment semantics
-
service quality guarantees
MCP and x402 may be referenced through manifests, but neither is required by the ERC.
Relationship To Existing Standards
ERC-721
This proposal reuses ERC-721 ownership and transfer semantics. It does not redefine ownership.
ERC-7656
ERC-7656 addresses generalized contract-linked services and linked infrastructure.
This proposal focuses on service object state:
-
service manifest
-
service operator
-
payment route
A future ERC-7656-linked implementation could expose the same interface.
ERC-8004
ERC-8004 focuses on agent identity, validation, and reputation.
This proposal does not define identity, trust, reputation, or registration. It only defines operational service state.
ERC-6551, ERC-4337, ERC-7579, ERC-6900
These standards address token-bound accounts, account abstraction, and smart-account execution.
Service accounts may be useful extensions, but they are intentionally excluded from the minimal interface.
Repository
Repository:
https://github.com/MeltedMindz/erc-service-object
Minimal Draft:
https://github.com/MeltedMindz/erc-service-object/blob/main/docs/ERC-draft-minimal.md
Hardening Review:
https://github.com/MeltedMindz/erc-service-object/blob/main/docs/final-hardening-review.md
Reference Implementation:
https://github.com/MeltedMindz/erc-service-object/tree/main/src
Questions For Review
-
Is this best framed as:
-
an ERC-721 extension,
-
an ERC-7656 profile,
-
or both?
-
-
Is
serviceOperatornecessary in the base interface, or should operator state be handled through a separate extension? -
Should payment route information include the revenue recipient, or should route discovery and recipient discovery be separated?
-
Is
routeNoncethe correct primitive for detecting stale payment routes and cached payment offers? -
Should ERC-1155 support remain out of scope for the base proposal?
-
Should signed usage receipts be standardized separately as a companion ERC rather than included in this proposal?
I am particularly interested in feedback from implementers working on ERC-7656, ERC-8004, wallets, marketplaces, indexers, smart accounts, x402 infrastructure, and MCP tooling.
ERC PR: Add ERC: Service Objects by MeltedMindz · Pull Request #1777 · ethereum/ERCs · GitHub