The Announcer and the registry
The two shared contracts every ERC-5564 payment uses, their interfaces, and the byte layout of announcement metadata.
ephemeral deploys no contract in the payment path. It uses two singletons that the ERC-5564 ecosystem shares, at the same address on Ethereum, Arbitrum, Base, Optimism and Polygon.
| Contract | Address |
|---|---|
| ERC5564Announcer | 0x55649E01B5Df198D18D95b5cc5051630cfD45564 |
| ERC6538Registry | 0x6538E6bf4B0eBd30A8Ea093027Ac2422ce5d6538 |
Addresses as listed in the configuration of the ScopeLift stealth-address SDK. Check them on a block explorer before you rely on them.
ERC-5564 Announcer
function announce(
uint256 schemeId, // 1 = secp256k1 with view tags
address stealthAddress,
bytes memory ephemeralPubKey,
bytes memory metadata
) external;
event Announcement(
uint256 indexed schemeId,
address indexed stealthAddress,
address indexed caller,
bytes ephemeralPubKey,
bytes metadata
);Anyone can call announce. The contract only emits the event: it holds nothing and checks nothing. A receiver therefore treats every announcement as a claim to verify, never as proof. Fake announcements cost the scanner time, not safety.
Metadata layout
The first byte is always the view tag. The rest describes what was paid, so the receiver can show the payment before touching the chain again.
| Bytes | ETH payment | Token payment |
|---|---|---|
| 0 | view tag | view tag |
| 1–4 | 0xeeeeeeee | the token's transfer function selector |
| 5–24 | 0xeeee…eeee | the token contract address |
| 25–56 | amount in wei | amount, or token id for an NFT |
Our scanner reads the asset this way: selector 0xeeeeeeee is ETH, known ERC-20, ERC-721 and ERC-1155 transfer selectors are tokens, anything else is unknown.
ERC-6538 Registry
function registerKeys(uint256 schemeId, bytes calldata stealthMetaAddress) external;
function registerKeysOnBehalf(address registrant, uint256 schemeId, bytes memory signature, bytes calldata stealthMetaAddress) external;
function stealthMetaAddressOf(address registrant, uint256 schemeId) external view returns (bytes memory);
event StealthMetaAddressSet(address indexed registrant, uint256 indexed schemeId, bytes stealthMetaAddress);A registry entry links your public address to your meta-address. That is public by design: it tells senders how to pay you privately. It does not link any stealth address to you. It does, however, mark the registering address as one never to withdraw to: that is leak H1.
View tags and scanning cost
How a receiver finds its payments among everyone's, what one byte saves, and what scanning costs today.
Private names: ENS and CCIP-Read
How name.ephmrl.eth will resolve to a fresh stealth address on every lookup, who publishes the announcement, and what the gateway can and cannot do.