Skip to content
eDeed

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
LaneOffice (home)Deed (mirror)Departure vault
ETH · Ethereum → Monad0x1f3836…92E80x1f3836…92E80x88c69a…ae36
MON · Monad → Ethereum0x0146F9…f1A40x0146F9…f1A40x5f3125…adF3
ETH · Ethereum → BNB Chain0x49d488…3a460x49d488…3a460xD7D790…3638
BNB · BNB Chain → Ethereum0x561F6B…FDc60x561F6B…FDc60x9aAbD8…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
ReaderAddress
BNB Chain's seal, read on Ethereum0x39Cf8d…d384
Ethereum's seal, read on BNB Chain0xA45C20…7D53
Monad's seal, read on Ethereum0x22AA94…d6C4
Ethereum's seal, read on Monad0xA45C20…7D53
Echo of Monad's signer set, on Monad0x94F5FE…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