Skip to main content

Overview

The RelayFacet enables cross-chain token transfers using the Relay Protocol. Relay provides fast and secure cross-chain transfers with support for non-EVM chains.

Contract Interface

State Functions

relayReceiver

Returns the address of the Relay receiver contract.
function relayReceiver() external view returns (address)

relaySolver

Returns the address of the Relay solver.
function relaySolver() external view returns (address)

consumedIds

Checks if a request ID has been consumed.
function consumedIds(bytes32 requestId) external view returns (bool)
requestId
bytes32
Request ID to check

Bridging Functions

startBridgeTokensViaRelay

Bridges tokens to another chain using Relay Protocol.
function startBridgeTokensViaRelay(
  BridgeData _bridgeData,
  RelayData _relayData
) external payable
_bridgeData
BridgeData
Standard bridge data containing transaction details
_relayData
RelayData
Relay-specific bridging parameters

swapAndStartBridgeTokensViaRelay

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

Data Structures

RelayData

struct RelayData {
  bytes32 requestId;           // Request ID
  bytes32 nonEVMReceiver;      // Non-EVM receiver
  bytes32 receivingAssetId;    // Receiving asset ID
  bytes signature;             // Relay signature
}

Usage Example

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

const relayFacet = RelayFacet__factory.connect(facetAddress, signer);

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

const relayData = {
  requestId: ethers.utils.randomBytes(32),
  nonEVMReceiver: '0x0000000000000000000000000000000000000000000000000000000000000000',
  receivingAssetId: '0x0000000000000000000000000000000000000000000000000000000000000000',
  signature: '0x...'
};

const tx = await relayFacet.startBridgeTokensViaRelay(
  bridgeData,
  relayData,
  { value: 0 }
);

await tx.wait();

Events

The facet emits standard LiFi events:
  • LiFiTransferStarted(BridgeData bridgeData)
  • LiFiTransferCompleted
  • AssetSwapped (when using swapAndStart variant)
  • BridgeToNonEVMChain (for non-EVM destinations)
  • BridgeToNonEVMChainBytes32 (for non-EVM destinations with bytes32 receiver)

See Also

Build docs developers (and LLMs) love