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 )
Bridging Functions
startBridgeTokensViaRelay
Bridges tokens to another chain using Relay Protocol.
function startBridgeTokensViaRelay (
BridgeData _bridgeData ,
RelayData _relayData
) external payable
Standard bridge data containing transaction details
Relay-specific bridging parameters Unique request identifier
Receiver address on non-EVM chains
Asset to receive on destination
Relay signature for verification
swapAndStartBridgeTokensViaRelay
Performs a token swap on the source chain before bridging via Relay.
function swapAndStartBridgeTokensViaRelay (
BridgeData _bridgeData ,
SwapData [] _swapData ,
RelayData _relayData
) external payable
Array of swap operations to execute before bridging
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