ephemeral

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.

ContractAddress
ERC5564Announcer0x55649E01B5Df198D18D95b5cc5051630cfD45564
ERC6538Registry0x6538E6bf4B0eBd30A8Ea093027Ac2422ce5d6538

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.

BytesETH paymentToken payment
0view tagview tag
1–40xeeeeeeeethe token's transfer function selector
5–240xeeee…eeeethe token contract address
25–56amount in weiamount, 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.

On this page