Skip to main content

Overview

The SymbiosisFacet enables cross-chain token transfers using the Symbiosis Protocol. Symbiosis supports complex cross-chain swaps with intermediate tokens and multiple DEX routers.

Contract Interface

Bridging Functions

startBridgeTokensViaSymbiosis

Bridges tokens to another chain using Symbiosis Protocol.
function startBridgeTokensViaSymbiosis(
  BridgeData _bridgeData,
  SymbiosisData _symbiosisData
) external payable
_bridgeData
BridgeData
Standard bridge data containing transaction details
_symbiosisData
SymbiosisData
Symbiosis-specific bridging parameters

swapAndStartBridgeTokensViaSymbiosis

Performs a token swap on the source chain before bridging via Symbiosis.
function swapAndStartBridgeTokensViaSymbiosis(
  BridgeData _bridgeData,
  SwapData[] _swapData,
  SymbiosisData _symbiosisData
) external payable
_bridgeData
BridgeData
Standard bridge data
_swapData
SwapData[]
Array of swap operations to execute before bridging
_symbiosisData
SymbiosisData
Symbiosis-specific parameters

Data Structures

SymbiosisData

struct SymbiosisData {
  bytes firstSwapCalldata;       // First swap calldata
  bytes secondSwapCalldata;      // Second swap calldata
  address intermediateToken;     // Intermediate token
  address firstDexRouter;        // First DEX router
  address secondDexRouter;       // Second DEX router
  address[] approvedTokens;      // Tokens to approve
  address callTo;                // Bridge contract
  bytes callData;                // Bridge calldata
}

Usage Example

import { SymbiosisFacet } from '@lifi/contract-types';

const symbiosisFacet = SymbiosisFacet__factory.connect(facetAddress, signer);

const bridgeData = {
  transactionId: '0x...',
  bridge: 'symbiosis',
  integrator: 'my-dapp',
  referrer: '0x0000000000000000000000000000000000000000',
  sendingAssetId: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
  receiver: '0x...',
  minAmount: ethers.utils.parseUnits('100', 6),
  destinationChainId: 56, // BSC
  hasSourceSwaps: false,
  hasDestinationCall: false
};

const symbiosisData = {
  firstSwapCalldata: '0x...',
  secondSwapCalldata: '0x...',
  intermediateToken: '0x...',
  firstDexRouter: '0x...',
  secondDexRouter: '0x...',
  approvedTokens: ['0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'],
  callTo: '0x...', // Symbiosis Portal
  callData: '0x...'
};

const tx = await symbiosisFacet.startBridgeTokensViaSymbiosis(
  bridgeData,
  symbiosisData,
  { value: 0 }
);

await tx.wait();

Events

The facet emits standard LiFi events:
  • LiFiTransferStarted(BridgeData bridgeData)
  • LiFiTransferCompleted
  • AssetSwapped (when using swapAndStart variant)

See Also

Build docs developers (and LLMs) love