Transfers are created by xApps calling xcall on the Spoke contracts:
/** * @notice creates a xcall new intent * @param_destination the destination chainId * @param_to The destination address of the intent * @param_inputAsset The asset address on origin * @param_outputAsset The asset address on destination * @param_amount The amount of the asset * @param_data The data of the intent * @return_intentId The ID of the intent * @return_intent The intent object */functionxcall(uint32_destination,address_to,address_inputAsset,address_outputAsset,uint256_amount,bytescalldata_data)externalreturns(bytes32_intentId,Intentmemory_intent);
Routers will watch for XCalled events, calculate the cost of execution, and submit a bid to the Auctioneer on the clearing chain. The Auctioneer selects the router by honoring the bid with the lowest fees.
Once the auction period elapses, the winning router will call execute on the Spoke contracts:
Copy
xcall and execute thinly wrap the newIntent and fillIntent functions. Once both messages arrive on the clearing chain, the transfer can be settled to the winning router.
What if no routers bid?
If no routers bid, users can increase the fees going to the solver by calling bumpTransfer with the native or input asset on the origin chain.
What if the winning router fails to execute?
The winning router will have a predefined window to execute the transfer. The timestamp of execution will be passed back to the clearing chain in the dispatched FillMessage for enforcement.
If this window elapses and the router fails to execute, the intent will be open to any router who will take the MAX_FEE as defined by the protocol plus any added fees.