Build
Integrate eDeed in an afternoon.
Two contracts and a seal. On the chain where it circulates, a DEED is a plain ERC-20 with permit — any wallet, any contract takes it. No SDK, no relayer, no API key.
Sealed lanes
The lanes on the desk. On the other chain the deed is a plain ERC-20 with permit — any wallet, any contract takes it. It is minted only from a departure the home chain's own validators sealed and goes home by the wallet's own Send to the token. Every contract — home, departure vault, mirror and both readers — is source-verified on Sourcify.
// DEED: the coin is locked at home, the DEED appears on the other chain
await home.departCoin(to, refundTo, { value }) // one click at home
await mirror.mint(seal, block, txIndex, proof, logIndex) // with the home chain's own seal
// BOZDUR: the DEED goes home, the coin comes back
await mirror.transfer(mirror.address, amount) // the wallet's own Send to the token
await home.release(seal, block, txIndex, proof, logIndex) // with the other chain's own seal
// seal: built from public endpoints by web/src/lib/seal.ts — ethSeal · bnbSeal · monadSealOnDemand| Lane | Office (home) | Deed (mirror) | Departure vault |
|---|---|---|---|
| ETH · Ethereum → Monad | 0x1f3836…92E8 | 0x1f3836…92E8 | 0x88c69a…ae36 |
| MON · Monad → Ethereum | 0x0146F9…f1A4 | 0x0146F9…f1A4 | 0x5f3125…adF3 |
| ETH · Ethereum → BNB Chain | 0x49d488…3a46 | 0x49d488…3a46 | 0xD7D790…3638 |
| BNB · BNB Chain → Ethereum | 0x561F6B…FDc6 | 0x561F6B…FDc6 | 0x9aAbD8…cfC2 |
Accept a DEED
Your contract takes a DEED like any token: transferFrom, or a permit and the purchase in one transaction. It never needs to know eDeed exists — every scenario on the Market page is exactly this.
// A DEED is an ERC-20 with EIP-2612 permit: take it like any token.
// (contracts/evm/src/demo/EdeedDemoNft.sol — the Market's NFT drop)
function buyWithPermit(uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
external returns (uint256 id)
{
try IERC20Permit(address(token)).permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
token.safeTransferFrom(msg.sender, seller, price); // paid in the DEED, one transaction
_mint(msg.sender, id = ++totalMinted); // delivered at once
}Readers
Each chain reads the other through one reader: Ethereum's sync committee, BNB Chain's fast-finality votes, Monad's quorum certificates. A reader learns each new signer set only from the one it already trusts. A public warm-up teaches every new set before the users arrive; a crossing that finds its reader behind carries the update itself — nothing waits on the warm-up.
# keeps every reader warm — run by .github/workflows/readers.yml every 15 minutes
node --experimental-strip-types deploy/deed-readers.mjs # warm every reader
node --experimental-strip-types deploy/deed-readers.mjs --dry # report only| Reader | Address |
|---|---|
| BNB Chain's seal, read on Ethereum | 0x39Cf8d…d384 |
| Ethereum's seal, read on BNB Chain | 0xA45C20…7D53 |
| Monad's seal, read on Ethereum | 0x22AA94…d6C4 |
| Ethereum's seal, read on Monad | 0xA45C20…7D53 |
| Echo of Monad's signer set, on Monad | 0x94F5FE…0005 |
Contracts
One address per lane on both chains (CREATE3). Every contract is source-verified.
Every contract verified — MonadVision (Monad) and Sourcify (Ethereum, BNB Chain)
Ethereum
Live on testnet
Monad
Live on testnet
BNB Chain
Live on testnet