Developer documentation
Every token, every chain.
Move existing tokens across eight EVM chains, turn their destination representations into Morpho collateral, and compose authenticated actions after delivery.
What you can build
Bridge an asset, use its representation in a verified lending market, borrow across chains, or relay deterministic source-chain data.
Bridge
Move an ERC-20 between supported chains through one deterministic Omnisea address.
Omnimarkets
Use assets from other chains as collateral in isolated Morpho lending markets.
Cross-chain borrow
Send collateral from BNB Chain and receive borrowed USDC directly on Base.
Omnilink
Relay an approved price, NAV, vault rate, or other view result between chains.
Core routes
Begin with the path closest to your integration, then follow its linked contract and failure references.
Borrow USDC against an Omniasset
Follow authorization, bridge composition, Morpho settlement, and refund outcomes.
Build a destination composer
Run authenticated application logic after the destination asset is credited.
Recover a transfer
Retry or restore a failed cross-chain delivery permissionlessly.
Security model
Understand trust boundaries, message validation, and recovery behavior.
API reference
Read indexed Omniasset transfers and delivery state across supported chains.
Relay a source-chain read
Configure a deterministic read path, send its result, and optionally fulfill an OMNI reward.
Programmatic start
This example moves WBNB from BNB Chain to its existing Base representation. Quote and send use byte-identical recipient, transfer mode, composition, and LayerZero options.
import { erc20Abi, parseEther, zeroAddress } from "viem";
const omniseaAddress = "0x1bb251457EECB885075405fc215098b393E98DF8";
const wbnbAddress = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c";
const compose = {
composer: zeroAddress,
gasLimit: 0n,
message: "0x",
};
const u128 = (value: bigint) => value.toString(16).padStart(32, "0");
const options = `0x000301002101${u128(500_000n)}${u128(0n)}`;
const amount = parseEther("0.01");
await walletClient.writeContract({
account,
address: wbnbAddress,
abi: erc20Abi,
functionName: "approve",
args: [omniseaAddress, amount],
});
const fee = await publicClient.readContract({
address: omniseaAddress,
abi: omniseaAbi,
functionName: "quoteSendOriginal",
args: [30184, wbnbAddress, amount, account, false, compose, options],
});
await walletClient.writeContract({
account,
address: omniseaAddress,
abi: omniseaAbi,
functionName: "sendOriginal",
args: [30184, wbnbAddress, amount, account, false, compose, options],
value: fee,
});Documentation directory
Architecture, operational guides, issuer workflows, contract references, and deployments.