On this page

Bridge gas

Omnigas funds a recipient with native currency on another chain. It buys destination delivery through LayerZero's Executor; it does not lock tokens and mint a wrapped asset.

Deployed routes

Version 1 connects Ethereum, BNB Chain, Arbitrum, Base and Robinhood in both directions: 20 routes across five chains. Every chain uses 0x1C05EeaD6d19B6e324f1d021442551F17735B09e. Arc is not enabled.

ChainChain IDLayerZero EIDDeployment block
Ethereum13010125977276
BNB Chain5630102121880034
Arbitrum4216130110505152083
Base84533018451307984
Robinhood Chain46633041662969589

Download the Omnigas integration ABI. The canonical registry is api/config/omnigas.json, synchronized to the web app. GET https://api.omnisea.io/omnigas returns API availability and enabled chains. Contract deployment alone does not guarantee the hosted API rollout is complete: if that endpoint is unavailable, use the direct contract flow below or wait for API availability.

Request and payment

struct Hook { address target; uint128 value; uint32 gasLimit; bytes data; }
struct Request { address recipient; uint128 amount; uint64 deadline; Hook hook; }

function quote(uint32 dstEid, Request request)
    external view returns (MessagingFee memory);
function bridge(uint32 dstEid, Request request)
    external payable returns (bytes32 requestId, bytes32 guid);

MessagingFee contains uint256 nativeFee and uint256 lzTokenFee. Pay exactly nativeFee as source msg.value. amount specifies how much native currency the destination recipient receives, in destination base units. It is not the source payment. BNB Chain uses BNB; the other supported chains use ETH. All use 18 decimals. For example, an ETH → BNB route pays ETH on the source and delivers BNB on the destination; never assume a 1:1 exchange rate.

V1 adds no Omnisea protocol fee. The quote still includes LayerZero delivery costs and destination funding; source transaction gas is additional. Executor native caps and prices can change. Quote rather than hardcoding a maximum transferable amount or a fee.

Direct contract example

Install ethers. This browser example sends from Base to Robinhood; reverse both IDs to send the other way. It assumes a connected EIP-1193 wallet and uses no hook.

import { BrowserProvider, Contract, ZeroAddress, parseEther } from "ethers";

const sourceChainId = 8453;
const destinationEid = 30416;
const omnigas = "0x1C05EeaD6d19B6e324f1d021442551F17735B09e";
await window.ethereum.request({
  method: "wallet_switchEthereumChain",
  params: [{ chainId: `0x${sourceChainId.toString(16)}` }],
});
const provider = new BrowserProvider(window.ethereum);
if (Number((await provider.getNetwork()).chainId) !== sourceChainId) throw Error("Wrong chain");
const signer = await provider.getSigner();
const abiResponse = await fetch("https://www.omnisea.io/docs/abi/omnigas-v1.json");
if (!abiResponse.ok) throw Error("ABI unavailable");
const gas = new Contract(omnigas, await abiResponse.json(), signer);
const request = {
  recipient: await signer.getAddress(), // Or another wallet controlled on Robinhood.
  amount: parseEther("0.001"),
  deadline: BigInt(Math.floor(Date.now() / 1000) + 3600),
  hook: { target: ZeroAddress, value: 0n, gasLimit: 0, data: "0x" },
};
if (!await gas.enabled() || !await gas.isPeerActive(destinationEid)) throw Error("Route unavailable");
const fee = await gas.quote(destinationEid, request);
if (fee.lzTokenFee !== 0n) throw Error("Unsupported fee currency");
// Display fee.nativeFee and require user approval of the total before signing.
await gas.bridge.staticCall(destinationEid, request, { value: fee.nativeFee });
const receipt = await (await gas.bridge(destinationEid, request, { value: fee.nativeFee })).wait();
if (!receipt || receipt.status !== 1) throw Error("Source transaction failed");
const sent = receipt.logs
  .filter(log => log.address.toLowerCase() === omnigas.toLowerCase())
  .map(log => { try { return gas.interface.parseLog(log); } catch { return null; } })
  .find(log => log?.name === "GasRequested");
if (!sent) throw Error("Missing source event");
console.log({ requestId: sent.args.requestId, guid: sent.args.guid, transactionHash: receipt.hash });

Pin the ABI in production. Configure unknown wallet chains from trusted metadata, enforce your own maximum payment, and re-quote if inputs or fees change. Never automatically resubmit a confirmed source transaction because delivery is slow.

The contract requires an explicit nonzero recipient; only the API/UI defaults it to the initiator. Do not use the destination transport or Endpoint as recipient. Source and destination must differ. The web picker switches the wallet and prevents identical chain selections.

Completion and security

Destination receive queues compose; compose delivers the native value. Only GasDelivered, or an equivalent verified destination state, confirms settlement. A recipient that rejects payment gets claimable credit instead of losing the transfer. See API and recovery.

Each deployment is non-upgradeable and owned by the chain's multisig. Peers are write-once; duplicate registration reverts. Activation starts at zero; same-address peers bypass a nonzero period. Both current paths use three required DVNs: LayerZero Labs, Horizen Labs and Luganodes. Pausing new sends does not block inbound delivery or credit claims. There is no owner sweep of recipient credits.

Introducing Omnipad-Launch tokens between chains