On this page

Bridge an ERC-721 (Coming soon)

NFT routes are coming soon. The current production deployment supports OFT transfers for ERC-20 assets only.

This page is kept as a preview of the planned ERC-721 integration shape. Do not use old ONFT beta addresses or the examples below for live transfers until Omnisea publishes verified ONFT deployments in Deployments.

Direction check

const ONFT_BRIDGE = "0x..."; // Coming soon: use the verified deployment address once published.

const [originalChainId, originalToken, isRepresentation] = await client.readContract({
  address: ONFT_BRIDGE,
  abi: onftBridgeAbi,
  functionName: "onftToOriginal",
  args: [collection],
});
  • Original collection -> quoteSendOriginal / sendOriginal (the NFT is locked in the bridge).
  • Representation -> quoteSendONFT / sendONFT (the representation is burned; the original unlocks when it returns home).

Approve

Either a single token or operator approval works:

await walletClient.writeContract({
  address: collection,
  abi: erc721Abi,
  functionName: "approve",
  args: [ONFT_BRIDGE, tokenId],
});

The bridge checks getApproved(tokenId) or isApprovedForAll(owner, bridge) before pulling the token.

Quote and send

const options = lzReceiveOptions(isFirstTransfer ? 900_000n : 500_000n);

const totalFee = await client.readContract({
  address: ONFT_BRIDGE,
  abi: onftBridgeAbi,
  functionName: "quoteSendOriginal",
  args: [DST_EID, collection, tokenId, recipient, isFirstTransfer, options],
});

await walletClient.writeContract({
  address: ONFT_BRIDGE,
  abi: onftBridgeAbi,
  functionName: "sendOriginal",
  args: [DST_EID, collection, tokenId, recipient, isFirstTransfer, options],
  value: totalFee,
});

isFirstTransfer works exactly as for ERC-20s: true when the collection has no representation on the destination yet (representationFor(originalChainId, originalToken) == address(0)), which buys the deployment gas.

Metadata

Once NFT routes are live, the first transfer will deploy an ONFT representation initialized with the original collection's name, symbol, and contractURI. Per-token tokenURI values will resolve through the representation so marketplaces can render bridged NFTs correctly.

Tracking and recovery

Once NFT routes are live, tracking and recovery will mirror ERC-20 transfers: follow the guid from BridgeMessageSent -> BridgeMessageReceived, inspect on LayerZero Scan, and use failed-message recovery if destination execution fails.

Experimental Beta is Live-Learn more about the Pilot