Bridge Operations

Direct bridge contract interactions including asset bridging, message bridging, and claim operations

Overview

Bridge operations provide direct interaction with Agglayer bridge contracts, enabling asset bridging, message bridging, claim operations, and comprehensive bridge event management across networks.

Creating Bridge Instances

Basic Bridge Instance Creation

import { AggLayerSDK, SDK_MODES } from '@agglayer/sdk';

const sdk = new AggLayerSDK({
  mode: [SDK_MODES.NATIVE],
  native: {
    defaultNetwork: 1,
    customRpcUrls: {
      1: 'https://eth-mainnet.g.alchemy.com/v2/your-key',
      747474: 'https://rpc.katana.network',
    },
  },
});

const native = sdk.getNative();

// Create bridge instance
const bridge = native.bridge('0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe', 1); // Ethereum mainnet
console.log(`Bridge instance created: ${bridge.getBridgeAddress()}`);

Bridge Instance Methods

Network information:

interface Bridge {
  getNetworkId(): Promise<number>;
  getBridgeAddress(): string;
}

Asset bridging methods:

interface Bridge {
  buildBridgeAsset(params: BridgeAssetParams, from?: string): Promise<TransactionParams>;
  buildClaimAsset(params: ClaimAssetParams, claimer: string): Promise<TransactionParams>;
  buildClaimAssetFromHash(bridgeTxHash: string, sourceNetwork: number, bridgeIndex: number, claimer: string): Promise<TransactionParams>;
}

Message bridging methods:

interface Bridge {
  buildBridgeMessage(params: BridgeMessageParams, from?: string): Promise<TransactionParams>;
  buildClaimMessage(params: ClaimMessageParams, claimer: string): Promise<TransactionParams>;
  buildClaimMessageFromHash(bridgeTxHash: string, sourceNetwork: number, bridgeIndex: number, claimer: string): Promise<TransactionParams>;
}

Token information methods:

interface Bridge {
  getWrappedTokenAddress(params: TokenAddressParams): Promise<string>;
  getPrecalculatedWrapperAddress(params: TokenAddressParams): Promise<string>;
  getOriginTokenInfo(params: WrappedTokenParams): Promise<[number, string]>;
}

Claim status and event methods:

interface Bridge {
  isClaimed(params: ClaimStatusParams): Promise<boolean>;
  getBridgeEventInfo(bridgeTxHash: string, sourceNetwork: number, bridgeIndex: number): Promise<BridgeEventInfo>;
}

Asset Bridging Operations

Building Asset Bridge Transactions

Build bridge transactions for ERC20 tokens and native currencies to transfer assets between networks.

// Build asset bridge transaction
const bridgeAssetTx = await bridge.buildBridgeAsset(
  {
    destinationNetwork: 747474,
    destinationAddress: '0xRecipientOnKatana',
    amount: '1000000000000000000',
    token: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
    forceUpdateGlobalExitRoot: true,
    permitData: '0x',
  },
  '0xUserAddress'
);

// Bridge native ETH
const ethBridgeTx = await bridge.buildBridgeAsset(
  {
    destinationNetwork: 747474,
    destinationAddress: '0xRecipientOnKatana',
    amount: '1000000000000000000', // 1 ETH
    token: '0x0000000000000000000000000000000000000000',
    forceUpdateGlobalExitRoot: true,
    permitData: '0x',
  },
  '0xUserAddress'
);

Message Bridging Operations

Building Message Bridge Transactions

Build bridge transactions for contract-to-contract communication across chains using arbitrary message data.

Important: The destination contract must implement the onMessageReceived function to receive and process bridged messages. See the Unified Bridge Message Bridging documentation for details on the IBridgeMessageReceiver interface.

// Build message bridge transaction
const bridgeMessageTx = await bridge.buildBridgeMessage(
  {
    destinationNetwork: 747474,
    destinationAddress: '0xContractOnKatana', // Must implement onMessageReceived
    forceUpdateGlobalExitRoot: true,
    permitData: '0x1234', // Message data
  },
  '0xUserAddress'
);

Required Interface for Destination Contract

The destination contract must implement this interface:

interface IBridgeMessageReceiver {
  function onMessageReceived(
    address originAddress,
    uint32 originNetwork,
    bytes calldata data
  ) external payable;
}

Claim Operations

Claiming Bridged Assets and Messages

Claim bridged assets and messages on the destination network after AggKit processes the bridge transaction. Note: SDK claiming doesn't work with AggSandbox locally due to API endpoint differences.

Claim bridged assets using deposit count:

const claimAssetTx = await bridge.buildClaimAsset(
  {
    sourceNetworkId: 0, // Ethereum network ID
    depositCount: 12345,
  },
  '0xClaimerAddress'
);

Claim using bridge transaction hash:

const claimFromHashTx = await bridge.buildClaimAssetFromHash(
  '0xBridgeTransactionHash',
  0, // Source network
  0, // Bridge index
  '0xClaimerAddress'
);

Claim bridge messages:

const claimMessageTx = await bridge.buildClaimMessage(
  {
    sourceNetworkId: 0,
    depositCount: 12345,
  },
  '0xClaimerAddress'
);

Token Information Operations

Getting Token Addresses and Origin Info

Retrieve wrapped token addresses for destination networks and origin token information from wrapped tokens.

// Get wrapped token address
const wrappedTokenAddress = await bridge.getWrappedTokenAddress({
  originNetwork: 0,
  originTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
});

// Get precalculated wrapper address
const precalculatedAddress = await bridge.getPrecalculatedWrapperAddress({
  originNetwork: 0,
  originTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
});

// Get origin token info
const originInfo = await bridge.getOriginTokenInfo({
  wrappedToken: '0xWrappedTokenAddress',
});

Claim Status and Verification

Checking Claim Status and Bridge Events

Verify if assets have been claimed, get bridge event details, and retrieve network information for the bridge contract.

// Check if bridge deposit is claimed
const isClaimed = await bridge.isClaimed({
  leafIndex: 12345,
  sourceBridgeNetwork: 0,
});

// Get bridge event information
const bridgeEventInfo = await bridge.getBridgeEventInfo(
  '0xBridgeTransactionHash',
  0, // Source network
  0  // Bridge index
);

// Get bridge network ID
const networkId = await bridge.getNetworkId();
const bridgeAddress = bridge.getBridgeAddress();

Working Example

import { AggLayerSDK, SDK_MODES } from '@agglayer/sdk';

const sdk = new AggLayerSDK({
  mode: [SDK_MODES.NATIVE],
  native: {
    defaultNetwork: 1,
    customRpcUrls: {
      1: 'https://eth-mainnet.g.alchemy.com/v2/your-key',
      747474: 'https://rpc.katana.network',
    },
  },
});

const native = sdk.getNative();
const bridge = native.bridge('0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe', 1);

// Build bridge asset transaction
const bridgeAssetTx = await bridge.buildBridgeAsset(
  {
    destinationNetwork: 20,
    destinationAddress: '0xRecipientAddress',
    amount: '10000000000',
    token: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
    forceUpdateGlobalExitRoot: true,
    permitData: '0x',
  },
  '0xUserAddress'
);

// Check claim status
const isClaimed = await bridge.isClaimed({
  leafIndex: 12345,
  sourceBridgeNetwork: 0,
});

// Get wrapped token address
const wrappedAddress = await bridge.getWrappedTokenAddress({
  originNetwork: 0,
  originTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
});
Edit on GitHub

Last updated on