The Omni Bridge is a multi-chain asset bridge that facilitates secure and efficient asset transfers between different blockchain networks. It leverages Chain Signatures and it's decentralized Multi-Party Computation (MPC) service to ensure trustless and decentralized cross-chain asset transfers.
For more information on how it works, please see Omni Bridge Documentation.
NEAR → Foreign Chain: All outbound transfers use Chain Signatures (MPC).
Foreign Chain → NEAR: Inbound transfers are verified using:
- Ethereum, Bitcoin, Zcash: Light clients
- Solana, BNB and EVM L2s (Base, Arbitrum, Polygon): Wormhole
Mainnet Addresses
Bridge Contracts:
- Arbitrum:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989 - Base:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989 - Bnb:
0x073C8a225c8Cf9d3f9157F5C1a1DbE02407f5720 - Polygon:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989 - Ethereum:
0xe00c629aFaCCb0510995A2B95560E446A24c85B9 - NEAR:
omni.bridge.near - Solana:
dahPEoZGXfyV58JqqH85okdHmpN8U2q8owgPUXSCPxe
Helper Contracts:
Testnet Addresses
Bridge Contracts:
- Arbitrum:
0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA - Base:
0xa56b860017152cD296ad723E8409Abd6e5D86d4d - Bnb:
0xEC81aFc3485a425347Ac03316675e58a680b283A - Polygon:
0xEC81aFc3485a425347Ac03316675e58a680b283A - Ethereum:
0x68a86e0Ea5B1d39F385c1326e4d493526dFe4401 - NEAR:
omni.n-bridge.testnet - Solana:
Gy1XPwYZURfBzHiGAxnw3SYC33SfqsEpGSS5zeBge28p
Helper Contracts:
Development Testnet Addresses
Bridge Contracts:
- Arbitrum:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989 - Base:
0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA - Ethereum:
0x3701B9859Dbb9a4333A3dd933ab18e9011ddf2C8 - NEAR:
omni-locker.testnet - Solana:
Gy1XPwYZURfBzHiGAxnw3SYC33SfqsEpGSS5zeBge28p
Helper Contracts:
Transfer Times Overview
- Average processing time: ~30 seconds (MPC signatures)
Current finality times:
- Solana: 14s
- Arbitrum: 1066s
- Base: 1026s
- Ethereum: 960s
Additional processing delays:
- OmniBridge transfers relayer: 2s
- Wormhole off-chain validators: 60s
- Ethereum blocks relayer: 60s
Logging Token Metadata
function logMetadata(address tokenAddress) externalpub fn log_metadata(&self, token_id: &AccountId) -> Promise pub fn log_metadata(ctx: Context<LogMetadata>) -> Result<()>cargo run mainnet omni-connector log-metadata --token base:0x<TOKEN_ADDRESS> --base-private-key <KEY>import { getClient } from "omni-bridge-sdk";
// Initialize client for source chain
const client = getClient(ChainKind.Near, wallet);
// Example: Deploy NEAR token to Ethereum
const txHash = await client.logMetadata("near:token.near");
console.log(`Metadata logged with tx: ${txHash}`);Deploying Tokens
function deployToken(bytes calldata signatureData, BridgeTypes.MetadataPayload calldata metadata) payable external returns (address)pub fn deploy_token(&mut self, #[serializer(borsh)] args: DeployTokenArgs) -> Promisepub fn deploy_token(ctx: Context<DeployToken>, data: SignedPayload<DeployTokenPayload>)cargo run mainnet omni-connector deploy-token --chain <ChainKind> --source-chain <ChainKind> --tx-hash <LogMetadataTxHash> --base-private-key <KEY>Binding Tokens (NEAR-specific)
Only needed for NEAR tokens that have been deployed on other chains. This action is typically applied automatically by the relayer.
pub fn bind_token(&mut self, #[serializer(borsh)] args: BindTokenArgs) -> PromiseInitiating Transfers
Transfers require a fee, which can be paid in either:
- The transferred token
- Native chain token (e.g., ETH, SOL)
Note: On NEAR, it isn't possible to attach a deposit in the ft_transfer_call, so the native fee should be attached by a separate call to the storage deposit
// 1. Approve tokens
function approve(address spender, uint256 amount)
// 2. Initiate transfer
function initTransfer(
address tokenAddress,
uint128 amount,
uint128 fee,
uint128 nativeFee,
string calldata recipient,
string calldata message
) payable external// 1. Storage deposit
pub fn storage_deposit(&mut self, account_id: Option<AccountId>) -> StorageBalance
// Helper functions
pub fn required_balance_for_account(&self) -> NearToken
pub fn required_balance_for_init_transfer(&self) -> NearToken
// 2. Transfer
fn ft_transfer_call(&mut self, receiver_id: AccountId, amount: U128, memo: Option<String>, msg: String) -> PromiseOrValue<U128>// For SPL tokens
pub fn init_transfer(ctx: Context<InitTransfer>, payload: InitTransferPayload) -> Result<()>
// For native SOL
pub fn init_transfer_sol(ctx: Context<InitTransferSol>, payload: InitTransferPayload) -> Result<()>API Details
API Endpoints:
- Mainnet:
https://mainnet.api.bridge.nearone.org/api/v1 - Testnet:
https://testnet.api.bridge.nearone.org/api/v1 - OpenAPI Specification
Note: Custom relayers can process transfers with zero fees.
Please refer to our Security Policy for information on reporting vulnerabilities. Security issues should be reported through our bug bounty program on HackenProof — please do not open public GitHub issues for security vulnerabilities.
We welcome contributions from the community! The code is open source and there are many ways to make meaningful contributions.
- Chain Integrations: Help expand support for new blockchain networks
- Performance Optimization: Improve transaction speeds and efficiency
- Security Analysis: Strengthen the security infrastructure
- Developer Tools: Build better tooling and documentation
Bridge infrastructure is a fundamental component of a multi-chain future. Through Chain Signatures, we're creating a more efficient, secure, and scalable approach to cross-chain communication.
Join us in building the future of cross-chain interoperability!