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.
- Ethereum (Light client + Chain Signatures)
- Bitcoin (Light client + Chain Signatures)
- Solana (Currently Wormhole, transitioning to Chain Signatures)
- Base (Currently Wormhole, transitioning to Chain Signatures)
- Arbitrum (Currently Wormhole, transitioning to Chain Signatures)
Mainnet Addresses
Bridge Contracts:
- Arbitrum:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989
- Base:
0xd025b38762B4A4E36F0Cde483b86CB13ea00D989
- NEAR:
omni.bridge.near
- Solana:
dahPEoZGXfyV58JqqH85okdHmpN8U2q8owgPUXSCPxe
Helper Contracts:
Testnet Addresses
Bridge Contracts:
- Arbitrum:
0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA
- Base:
0xa56b860017152cD296ad723E8409Abd6e5D86d4d
- 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) external
pub 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) -> Promise
pub 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) -> Promise
Initiating 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.
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!