Skip to content

API Reference

Complete TypeScript API documentation for all Agglayer SDK methods, interfaces, and configuration options

AgglayerSDK

The main SDK class that orchestrates Multi-Bridge Routes and Agglayer Native Bridge modules.

Constructor

new AggLayerSDK(config?: SDKConfig)

Creates a new Agglayer SDK instance with optional configuration.

Parameters:

Parameter Type Description
config SDKConfig? Optional configuration object

Example:

// Zero configuration (uses defaults)
const sdk = new AggLayerSDK();

// With configuration
const sdk = new AggLayerSDK({
  mode: [SDK_MODES.CORE, SDK_MODES.NATIVE],
  core: {
    apiBaseUrl: 'https://arc-api.polygon.technology',
    apiTimeout: 30000,
  },
  native: {
    defaultNetwork: 1,
    customRpcUrls: {
      1: 'https://eth-mainnet.g.alchemy.com/v2/your-key',
    },
  },
});

Methods

getCore(): CoreClient

Returns the Multi-Bridge Routes (Core) module instance.

Returns: CoreClient instance for ARC API operations

Throws: Error if Core module not initialized (not in mode array)

Example:

const core = sdk.getCore();
const routes = await core.getRoutes({...});

getNative(): NativeClient

Returns the Native Bridge module instance.

Returns: NativeClient instance for direct blockchain operations

Throws: Error if Native module not initialized (not in mode array)

Example:

const native = sdk.getNative();
const token = native.erc20('0xTokenAddress', 1);

CoreClient (Multi-Bridge Routes)

Provides access to ARC API for route aggregation and optimization.

Methods

getAllChains(): Promise<ChainsResponse>

Retrieves metadata for all supported chains.

Returns: Promise resolving to chains response with pagination handling

Example:

const chains = await core.getAllChains();
console.log(`Found ${chains.chains.length} supported chains`);

chains.chains.forEach(chain => {
  console.log(`${chain.name}: ${chain.supportedRoutes.join(', ')}`);
});

getChainMetadataByChainIds(ids: number[]): Promise<ChainsResponse>

Retrieves metadata for specific chains by their IDs.

Parameters:

Parameter Type Description
ids number[] Array of chain IDs to retrieve

Returns: Promise resolving to filtered chains response

Example:

const specificChains = await core.getChainMetadataByChainIds([1, 747474]);
specificChains.chains.forEach(chain => {
  console.log(`${chain.name}: Chain ID ${chain.chainId}, Network ID ${chain.networkId}`);
});

getRoutes(params: RoutesRequestParams): Promise<RoutesResponse>

Discovers optimal cross-chain routes using ARC API aggregation.

Parameters:

Parameter Type Required Description
params.fromChainId number Source chain ID
params.toChainId number Destination chain ID
params.fromTokenAddress string Source token address
params.toTokenAddress string Destination token address
params.amount string Amount to bridge (in token units)
params.fromAddress string Sender address
params.toAddress string Recipient address
params.slippage number Slippage tolerance (0.5 = 0.5%)
params.preferences RoutePreferences Route optimization preferences

Returns: Promise resolving to array of available routes

Example:

const routes = await core.getRoutes({
  fromChainId: 8453,
  toChainId: 747474,
  fromTokenAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
  toTokenAddress: '0x203a662b0bd271a6ed5a60edfbd04bfce608fd36',
  amount: '1000000000',
  fromAddress: '0xUserAddress',
  slippage: 1.0,
  preferences: {
    prioritize: 'COST',
    minAmountToReceive: '995000000',
  },
});

getUnsignedTransaction(route: Route): Promise<UnsignedTransaction>

Converts a discovered route into an executable transaction. The transaction must be signed and sent to the blockchain for execution.

Parameters:

Parameter Type Description
route Route Route object from getRoutes()

Returns: Promise resolving to unsigned transaction ready for signing

Example:

const routes = await core.getRoutes({...});
const transaction = await core.getUnsignedTransaction(routes[0]);

// Sign and send to blockchain (swap below code with your own wallet client)
const receipt = await wallet.sendTransaction(transaction);
await receipt.wait(); // Wait for confirmation
console.log(`Transaction confirmed: ${receipt.hash}`);

getClaimUnsignedTransaction(params: BuildClaimTransactionRequestParam): Promise<UnsignedTransaction>

Builds claim transaction for Agglayer bridge operations. The transaction must be signed and sent to the blockchain for execution.

Parameters:

Parameter Type Description
params.sourceNetworkId number Source network ID (Agglayer network ID, not chain ID)
params.depositCount number Deposit count from bridge transaction

Returns: Promise resolving to claim transaction

Example:

const claimTx = await core.getClaimUnsignedTransaction({
  sourceNetworkId: 0, // Ethereum network ID
  depositCount: 12345,
});

// Sign and send to blockchain (swap below code with your own wallet client)
const receipt = await wallet.sendTransaction(claimTx);
await receipt.wait(); // Wait for confirmation
console.log(`Claim transaction confirmed: ${receipt.hash}`);

getTransactions(params: TransactionsRequestQueryParams): Promise<PaginatedTransactionsResponse>

Retrieves transaction history with filtering and pagination.

Parameters:

Parameter Type Description
params.address string? Filter by user address
params.sourceNetworkIds string? Comma-separated source network IDs
params.destinationNetworkIds string? Comma-separated destination network IDs
params.limit number? Number of transactions to return (max 100)
params.startAfter string? Cursor for pagination

Returns: Promise resolving to paginated transactions response

Example:

const transactions = await core.getTransactions({
  address: '0xUserAddress',
  limit: 20,
  sourceNetworkIds: '1,8453',
  destinationNetworkIds: '747474',
});

console.log(`Found ${transactions.transactions.length} transactions`);

NativeClient (Native Bridge)

Provides direct blockchain operations and bridge contract interactions.

Methods

erc20(tokenAddress: string, networkId?: number): ERC20

Creates an ERC20 token instance for the specified network.

Parameters:

Parameter Type Description
tokenAddress string Token contract address (use ‘0x0000…’ for native ETH)
networkId number? Network ID (uses default if not provided)

Returns: ERC20 token instance

Example:

const usdc = native.erc20('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 1);
const eth = native.erc20('0x0000000000000000000000000000000000000000', 1);

bridge(bridgeAddress: string, networkId?: number): Bridge

Creates a bridge instance for direct bridge contract interactions.

Parameters:

Parameter Type Description
bridgeAddress string Bridge contract address
networkId number? Network ID (uses default if not provided)

Returns: Bridge instance

Example:

const bridge = native.bridge('0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe', 1);
const networkId = await bridge.getNetworkId();

getNativeBalance(address: string, networkId?: number): Promise<string>

Gets native token balance (ETH, MATIC, etc.) for an address.

Parameters:

Parameter Type Description
address string Address to check balance for
networkId number? Network ID (uses default if not provided)

Returns: Promise resolving to balance in wei

Example:

const balance = await native.getNativeBalance('0xUserAddress', 1);
console.log(`ETH Balance: ${formatAmount(balance)} ETH`);

ERC20 Class

Represents an ERC20 token instance with bridge capabilities.

Methods

getBalance(address: string): Promise<string>

Gets token balance for an address.

Parameters:

Parameter Type Description
address string Address to check balance for

Returns: Promise resolving to balance in token units

getAllowance(owner: string, spender: string): Promise<string>

Gets current allowance for a spender.

Parameters:

Parameter Type Description
owner string Token owner address
spender string Spender address

Returns: Promise resolving to allowance amount

buildApprove(spender: string, amount: string, from?: string): Promise<TransactionParams>

Builds an approve transaction. The transaction must be signed and sent to the blockchain for execution.

Parameters:

Parameter Type Description
spender string Address to approve
amount string Amount to approve
from string? From address

Returns: Promise resolving to transaction parameters

Example:

const approvalTx = await token.buildApprove(
  bridgeAddress,
  '1000000',
  userAddress
);

// Sign and send to blockchain (swap below code with your own wallet client)
const receipt = await wallet.sendTransaction(approvalTx);
await receipt.wait(); // Wait for confirmation

bridgeTo(destinationNetwork: number, destinationAddress: string, amount: string, from?: string, options?: BridgeOptions): Promise<TransactionParams>

Builds a bridge transaction to another network. The transaction must be signed and sent to the blockchain for execution.

Parameters:

Parameter Type Description
destinationNetwork number Destination network ID
destinationAddress string Recipient address
amount string Amount to bridge
from string? From address
options BridgeOptions? Bridge options

Returns: Promise resolving to bridge transaction parameters

Example:

const bridgeTx = await token.bridgeTo(
  20, // Destination network ID
  userAddress,
  '1000000',
  userAddress
);

// Sign and send to blockchain (swap below code with your own wallet client)
const receipt = await wallet.sendTransaction(bridgeTx);
await receipt.wait(); // Wait for confirmation
console.log(`Bridge transaction confirmed: ${receipt.hash}`);

Type Definitions

SDKConfig

interface SDKConfig {
  mode?: SDKMode[];
  core?: CoreConfig;
  native?: NativeConfig;
}

type SDKMode = 'CORE' | 'NATIVE';

CoreConfig

interface CoreConfig {
  apiBaseUrl?: string;    // Default: 'https://arc-api.polygon.technology'
  apiTimeout?: number;    // Default: 30000 (30 seconds)
  websocketBaseUrl?: string; // Future: WebSocket endpoint
}

NativeConfig

interface NativeConfig {
  defaultNetwork?: number;              // Default: 1 (Ethereum)
  chains?: ChainConfig[];              // Custom chain configurations
  customRpcUrls?: Record<number, string>; // Override RPC URLs by chain ID
}

Route

interface Route {
  id: string;
  provider: string[];           // ['agglayer'] or ['lifi', 'agglayer']
  fromChainId: number;
  toChainId: number;
  fromAmount: string;
  toAmount: string;
  toAmountMin: string;
  executionDuration: number;    // Seconds
  totalCostUSD: string;
  gasCostUSD: string;
  steps: Step[];
  feeCosts: FeeCost[];
  gasCosts: GasCost[];
  riskFactors: RiskFactors;
  transactionRequest?: UnsignedTransaction;
}

TransactionParams

interface TransactionParams {
  from?: string;
  to: string;
  data: string;
  value?: string;
  gas?: string;
  gasPrice?: string;
  maxFeePerGas?: string;
  maxPriorityFeePerGas?: string;
  nonce?: string;
}

Constants

SDK_MODES

const SDK_MODES = {
  CORE: 'CORE',     // Multi-Bridge Routes
  NATIVE: 'NATIVE', // Native Bridge
} as const;

Built-in Networks

const NETWORKS = {
  ETHEREUM: 1,
  KATANA: 747474,
} as const;

Usage Patterns

Module Selection

Choose the modules you need based on your use case:

// Multi-Bridge Routes only (for route aggregation)
const sdk = new AggLayerSDK({
  mode: [SDK_MODES.CORE],
});

// Native Bridge only (for direct bridge operations)
const sdk = new AggLayerSDK({
  mode: [SDK_MODES.NATIVE],
});

// Both modules (for complete functionality)
const sdk = new AggLayerSDK({
  mode: [SDK_MODES.CORE, SDK_MODES.NATIVE],
});

Environment-Specific Configuration

Configure the SDK for different environments:

const config = {
  development: {
    mode: [SDK_MODES.CORE, SDK_MODES.NATIVE],
    core: { apiBaseUrl: 'https://arc-api.polygon.technology' },
    native: { 
      defaultNetwork: 11155111, // Sepolia
      customRpcUrls: { 
        11155111: process.env.SEPOLIA_RPC_URL,
        747474: process.env.KATANA_RPC_URL,
      }
    },
  },
  production: {
    mode: [SDK_MODES.CORE, SDK_MODES.NATIVE],
    core: { apiBaseUrl: 'https://arc-api.polygon.technology' },
    native: {
      defaultNetwork: 1,
      customRpcUrls: {
        1: process.env.ETHEREUM_RPC_URL,
        747474: process.env.KATANA_RPC_URL,
      },
    },
  },
};

const sdk = new AggLayerSDK(config[process.env.NODE_ENV || 'development']);

Error Handling

Common Error Patterns

Handle errors gracefully in your application:

// Network errors from ARC API
try {
  const routes = await core.getRoutes({...});
} catch (error) {
  console.error('Failed to discover routes:', error);
  // Fallback to cached routes or show error to user
}

// Configuration errors
try {
  const native = sdk.getNative();
} catch (error) {
  console.error('Native module not initialized. Add SDK_MODES.NATIVE to mode array.');
}

// Transaction errors
try {
  const tx = await core.getUnsignedTransaction(route);
  const receipt = await wallet.sendTransaction(tx);
  await receipt.wait();
} catch (error) {
  console.error('Transaction failed:', error);
  // Handle insufficient gas, reverted transaction, etc.
}

Retry with Exponential Backoff

Implement retry logic for network operations:

async function retryOperation<T>(
  operation: () => Promise<T>,
  maxRetries: number = 3
): Promise<T> {
  let lastError: Error;

  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await operation();
    } catch (error) {
      lastError = error as Error;

      if (attempt < maxRetries - 1) {
        const delay = 1000 * Math.pow(2, attempt);
        await new Promise(resolve => setTimeout(resolve, delay));
      }
    }
  }

  throw lastError!;
}

// Usage
const routes = await retryOperation(() => core.getRoutes({...}));

Migration Guide

From Lxly.js to Agglayer SDK

// Old (Lxly.js)
const client = new LxLyClient();
await client.init(config);
const token = client.erc20('0xTokenAddress', 0);

// New (Agglayer SDK)
const sdk = new AggLayerSDK({
  mode: [SDK_MODES.NATIVE],
  native: { defaultNetwork: 1 }
});
const native = sdk.getNative();
const token = native.erc20('0xTokenAddress', 1);

Key Differences

Feature Lxly.js Agglayer SDK
Route Aggregation ❌ Not available ✅ ARC API integration
Cross-Chain Bridging ❌ Manual integration ✅ Automatic via ARC API
TypeScript Support ⚠️ Partial ✅ Full type safety
Configuration Complex setup Zero-config defaults