Skip to content

executeBridgeTransaction

The executeBridgeTransaction function executes bridge transactions by handling chain switching and transaction sending. It works with any wallet client that implements the viem WalletClient interface.

Import

import { executeBridgeTransaction } from '@silentswap/sdk';

Basic Usage

import { 
  executeBridgeTransaction, 
  getBridgeQuote, 
  convertQuoteResultToQuote 
} from '@silentswap/sdk';
import { createWalletClient, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { ethereum } from 'viem/chains';
 
// Create wallet client
const account = privateKeyToAccount('0x...');
const walletClient = createWalletClient({
  account,
  chain: ethereum,
  transport: http(),
});
 
// Get quote (compares providers and selects best)
const quoteResult = await getBridgeQuote(
  1, // Source chain ID (Ethereum)
  '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // Source token (USDC)
  '1000000', // Amount in token units
  43114, // Destination chain ID (Avalanche)
  '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', // Destination token (USDC.e)
  account.address // User address
);
 
// Convert to BridgeQuote with transaction data
const quote = convertQuoteResultToQuote(quoteResult, 1);
 
// Execute transaction
const status = await executeBridgeTransaction(
  quote,
  walletClient,
  connector, // Your connector implementation
  (step) => console.log('Step:', step)
);
 
console.log('Status:', status.status);
console.log('Transaction Hashes:', status.txHashes);
console.log('Request ID:', status.requestId);

API Reference

Function Signature

function executeBridgeTransaction(
  quote: BridgeQuote,
  walletClient: WalletClient,
  connector: Connector,
  setStep: (step: string) => void
): Promise<BridgeStatus>

Parameters

  • quote (BridgeQuote): Bridge quote with transaction data. Use convertQuoteResultToQuote to convert a BridgeQuoteResult from getBridgeQuote to a BridgeQuote.
  • walletClient (WalletClient): viem wallet client for signing transactions
  • connector (Connector): Wagmi connector for chain switching (must implement switchChain)
  • setStep ((step: string) => void): Callback function to track execution progress

Return Value

interface BridgeStatus {
  status: 'pending' | 'success' | 'failed' | 'refund' | 'fallback';
  txHashes?: Hex[];
  details?: string;
  requestId?: string;
}

Examples

Node.js Backend

import { 
  executeBridgeTransaction, 
  getBridgeQuote, 
  convertQuoteResultToQuote 
} from '@silentswap/sdk';
import { createWalletClient, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { ethereum } from 'viem/chains';
 
// Create wallet client
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const walletClient = createWalletClient({
  account,
  chain: ethereum,
  transport: http(),
});
 
// Simple connector implementation
const connector = {
  switchChain: async ({ chainId }: { chainId: number }) => {
    // Implement chain switching logic
    // For viem, you might need to create a new client for the target chain
  },
};
 
// Get quote (compares providers)
const quoteResult = await getBridgeQuote(
  1, // Ethereum
  '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
  '1000000',
  43114, // Avalanche
  '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', // USDC.e
  account.address
);
 
// Convert to BridgeQuote with transactions
const quote = convertQuoteResultToQuote(quoteResult, 1);
 
// Execute
const status = await executeBridgeTransaction(
  quote,
  walletClient,
  connector,
  (step) => {
    console.log(`[${new Date().toISOString()}] ${step}`);
  }
);
 
if (status.status === 'pending') {
  console.log('Transaction submitted:', status.txHashes);
  console.log('Request ID:', status.requestId);
}

With Progress Tracking

import { executeBridgeTransaction } from '@silentswap/sdk';
 
const steps: string[] = [];
 
const status = await executeBridgeTransaction(
  quote,
  walletClient,
  connector,
  (step) => {
    steps.push(step);
    console.log(`Progress: ${steps.length} - ${step}`);
  }
);
 
console.log('All steps:', steps);

Error Handling

import { executeBridgeTransaction } from '@silentswap/sdk';
 
try {
  const status = await executeBridgeTransaction(
    quote,
    walletClient,
    connector,
    (step) => console.log(step)
  );
  
  if (status.status === 'pending') {
    // Transaction submitted successfully
    console.log('Pending:', status.txHashes);
  }
} catch (err) {
  if (err.message.includes('Failed to switch to chain')) {
    console.error('Chain switching failed:', err);
  } else if (err.message.includes('No transactions')) {
    console.error('Invalid quote - no transactions found');
  } else {
    console.error('Execution error:', err);
  }
}

How It Works

  1. Provider Detection: Determines which provider was used
  2. Chain Switching: Automatically switches to the correct chain for each transaction
  3. Transaction Execution: Sends transactions in sequence
  4. Status Return: Returns initial status with transaction hashes and request ID

Using convertQuoteResultToQuote

The convertQuoteResultToQuote function extracts transaction data from the quote result:

import { getBridgeQuote, convertQuoteResultToQuote } from '@silentswap/sdk';
 
// Get quote result (without transactions)
const quoteResult = await getBridgeQuote(/* ... */);
 
// Convert to BridgeQuote with transactions
const quote = convertQuoteResultToQuote(quoteResult, srcChainId);
 
// Now you can execute
await executeBridgeTransaction(quote, walletClient, connector, console.log);

Best Practices

  1. Implement Chain Switching: Ensure your connector properly implements switchChain
  2. Handle Errors: Wrap in try/catch to handle transaction failures
  3. Track Progress: Use the setStep callback to provide user feedback
  4. Monitor Status: After execution, use getBridgeStatus to monitor completion
  5. Gas Limits: Ensure sufficient gas limits for transactions

Related Functions