Assets → chains

VLBridge

One Axelar bridge for VLMint assets, wrappers, and native VOW. VOW is burned through VLBurn at the source and minted after authenticated delivery.

What VLBridge is for.

One Axelar bridge for VLMint assets, wrappers, and native VOW. VOW is burned through VLBurn at the source and minted after authenticated delivery.

Anyone may initiate a configured transfer. The owner configures trusted remote bridges, local wrappers, holds, and approvers; Axelar authenticates the remote message and VLNotary certifies destination VLMint issuance. The destination VOW must grant this bridge mint authority.

How it fits together.

  1. A holder supplies a canonical ERC-1155 balance or a configured ERC-777 wrapper.
  2. The source bridge burns canonical units and Axelar authenticates a payload identified by token class and symbol.
  3. The destination bridge certifies issuance through VLNotary and delivers either canonical units or the destination chain's local wrapper.

Declared public interface.

These are the public and external methods declared directly by VLBridge. Inherited token, ownership, and upgrade methods follow their respective standards.

registryName() returns (string memory)Read

Returns the human-readable name used for contract registration.

pause()Transaction · onlyOwner

Executes the pause operation.

unpause()Transaction · onlyOwner

Executes the unpause operation.

setTrustedRemote(string calldata chainName, string calldata remoteAddress)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

setWrapper(uint256 tokenId, address wrapper)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

setBridgeHoldThreshold(uint256 tokenId, uint256 threshold)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

setBridgeHoldWindowDays(uint32 value)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

setBridgeHoldApprover(address account, bool enabled)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

setBridgeHoldThresholdUpdater(address account, bool enabled)Transaction · onlyOwner

Updates the named protocol configuration value or permission.

updateBridgeHoldThreshold(uint256 tokenId, uint256 threshold)Transaction

Executes the update bridge hold threshold operation.

bridgeCanonical(string calldata destinationChain, address recipient, uint256 tokenId, uint256 amount, bool deliverWrapped)Transaction

Executes the bridge canonical operation.

bridgeWrapped(string calldata destinationChain, address recipient, address wrapper, uint256 amount, bool deliverWrapped)Transaction

Executes the bridge wrapped operation.

bridgeVOW(string calldata destinationChain, address recipient, uint256 amount)Transaction

Executes the bridge vow operation.

tokensReceived(address, address, address, uint256, bytes calldata, bytes calldata)Read

Handles an ERC-777 token-receipt callback.

approveHeldTransfer(bytes32 holdId)Transaction

Executes the approve held transfer operation.

rejectHeldTransfer(bytes32 holdId)Transaction

Executes the reject held transfer operation.

pendingTransfer(bytes32 holdId) returns (PendingTransfer memory)Read

Executes the pending transfer operation.

execute(bytes32 commandId, string calldata sourceChain, string calldata sourceAddress, bytes calldata payload)Transaction

Executes the execute operation.

Connect with ethers v6.

import { Contract, JsonRpcProvider, Wallet, encodeBytes32String, parseUnits } from "ethers";

const provider = new JsonRpcProvider(process.env.RPC_URL);
const signer = new Wallet(process.env.SIGNER_PRIVATE_KEY, provider);
const at = (address, abi, writable = false) =>
  new Contract(address, abi, writable ? signer : provider);

const bridge = at(VL_BRIDGE, [
  "function bridgeVOW(string,address,uint256) payable",
  "function bridgeCanonical(string,address,uint256,uint256,bool) payable"
], true);
await vow.approve(VL_BRIDGE, amount);
await (await bridge.bridgeVOW("Arbitrum", recipient, amount, { value: gasFee })).wait();

Use the address for the chain you selected.

Read the deployment manifest or resolve the configured registry entry for the target network. Test on a local or test network before using a privileged signer. See the contract source and contract index for the full interface.