Nested xCalls

Cross-chain calls can easily be composed together by xcalling within the xReceive function of a target contract. In effect, the target contract becomes the source contract of that nested xcall.

xCall in xReceive

contract Target is IXReceiver {
  function xReceive(
    bytes32 _transferId,
    uint256 _amount,
    address _asset,
    address _originSender,
    uint32 _origin,
    bytes memory _callData
  ) external returns (bytes memory) {
    // After handling the first xcall...
    ...

    // Send another xcall within the xReceive function!
    connext.xcall{value: relayerFee}(...);
  }
}

There are many ways to use nested xcalls to extend cross-chain functionality. With this technique, it's possible to:

  • Emulate the behavior of a "callback" between chains to verify state changes and/or followup asynchronously

  • Disperse data to multiple different chains at once

See this in action in the Ping Pong example.

Last updated