Hey everyone, first post here, so bear with me.
Quick intro so you know who’s talking: I’m a product designer and builder, and I’ve been participating in NFTs since 2021.
In chasing a better path for NFTs, because I think this is how they should have always worked: living on a surface people already use every day, not locked behind crypto wallets and seed phrases.
The surface I landed on is the wallet app that ships on every phone. Apple Wallet and Google Wallet are the biggest programmable surface in the world, and this ecosystem barely touches them.
So that’s where I’ve been building. An ERC-721 where the token IS the wallet pass: live state rendered right on the card, links on the pass that fire real on-chain transactions, push notifications when chain state changes. No app to download, no seed phrase, you onboard with an email address. It’s been live on a public testnet for a few days, and watching people who have never touched crypto play with an on-chain asset from their Apple Wallet without ever realizing there’s a blockchain underneath has honestly been the coolest thing I’ve ever shipped.
I think this is bigger than any one project. Tokenized real-world assets, a graded One Piece card sitting in a vault, tokenized equities, digital art, Government Identification, loyalty balances: anything with on-chain state wants a home on this surface. The chain should be invisible plumbing, and the pass should be the UI. For regular people, Apple and Google Wallet might be the best unexplored surface area on-chain assets will ever get, and right now our ecosystem treats it as an afterthought.
Here’s why I’m posting. Before writing anything I searched this forum and the ERCs repo for prior art and found nothing: no pkpass, no pass delivery, no mobile wallet passes at all. The closest thing was EthPass, a closed API service (Unlock Protocol used it for membership passes), and a service is not a standard. So right now every team that binds tokens to passes (tickets, memberships, loyalty, me) invents their own private bridge, and that has three real costs:
- Wallets, marketplaces, and indexers have no way to discover that a token even has a pass. The whole capability is invisible unless you’re on the issuer’s own site.
- There’s no shared signal for “this token’s pass content is stale, re-push it.”
- Everyone re-learns the same security lessons alone. I learned one the hard way: a pass is a bearer file. Someone can forward the .pkpass and add it to another phone, and in an early build the action links were derivable from the token’s serial, which meant anyone holding a shared pass could act as the owner. The fix was unguessable capability URLs that rotate on transfer. A standard should bake that scar tissue in so the next builder doesn’t ship the same hole.
Here’s the piece I believe is actually standardizable. It’s deliberately tiny, basically tokenURI’s sibling:
interface IERC721WalletPass {
event PassUpdate(uint256 indexed tokenId);
event BatchPassUpdate(uint256 fromTokenId, uint256 toTokenId);
/// Returns a URI resolving to a JSON pass manifest for the token
function passURI(uint256 tokenId) external view returns (string memory);
}
And the manifest it points to:
{
"formats": {
"apple": "https://issuer.example/passes/c3f1.../card.pkpass",
"google": "https://pay.google.com/gp/v/save/eyJhbGciOi..."
},
"updatedAt": 1754500000
}
Plus the normative rules where the security actually lives: acquisition URLs SHOULD be unguessable capability URLs (MUST when the installed pass exposes state-changing action links), they SHOULD rotate on transfer, holding a pass MUST NOT count as owning the token, and pass-reachable actions MUST be authorized independently. Pass generation itself (Apple certs, APNs, the Google Wallet API, the art) stays out of scope on purpose: that’s platform plumbing, and the interoperable seam is discovery.
Things I’d genuinely love to be challenged on:
- One fetched JSON manifest vs format query params. I want a marketplace to learn everything about a token’s pass options in one request. Am I missing a reason to prefer negotiation?
- A dedicated PassUpdate event vs just reusing ERC-4906’s MetadataUpdate. Pass content changes way more often than metadata (countdowns, balances), and the consumers are different (pass distributors, not NFT indexers). Does the separate event pull its weight?
- I kept ERC-1155 and fungibles out of scope because multi-holder semantics change how a pass binds to a person. But if this surface is ever going to carry RWAs and tokenized equities, a future extension has to cover them. Right call to start 721-only, or lazy call?
- Are the capability URL rules pitched at the right strength?
- To anyone building wallets or marketplaces: if this existed, would you actually surface an “Add to Apple Wallet / Save to Google Wallet” button on compliant tokens? Because that’s the whole prize.
I have the full draft in EIP-1 format ready to PR to ethereum/ERCs, with a working implementation behind it (closed source today; an open reference implementation would ship before this advances past Draft). I’m not the guy who usually writes interfaces, so I want this community to pressure-test the shape before I make it official. Tear it apart.
My hope for this is simple: give the next wave of people blockchain rails without blockchain complications, starting from the wallet already in their pocket.
Thanks for reading.