Solidity Integration
π¨π»βπ» Integrate Circulator with Solidity
For contract integration, use the Standard approach. Here's a simple contract example:
src/ExampleContract.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
import "./interfaces/ITest.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract ExampleContract {
/// @dev v0.1 Circulator address on Base Sepolia, refer to deployed addresses for full addresses list
ICirculator public constant circulator = ICirculator(0x538d78c2d84eFa321F68c115A59058eE5f671674);
IERC20 public usdc;
constructor(address _usdc) {
usdc = IERC20(_usdc);
usdc.approve(address(circulator), type(uint256).max);
}
/// @dev example function that handle teleport USDC to any other chains
function _handleCrossChain(address _from, uint256 _amount, address _recipient, uint32 _destDomain) internal {
usdc.transferFrom(_from, address(circulator), _amount);
uint8 type = 0; // CCTP, suitable for large order
// handle fee logic if necessary
uint256 expectedFee = circulator.totalFee(_amount, _destDomain, type);
uint256 minAmount = _amount - expectedFee;
// other parameters
uint32 deadline = uint32(block.timestamp) + 120;
circulator.circulate(_amount, minAmount, _recipient, _destDomain, deadline, type);
}
function _toBytes32(address _addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(_addr)));
}
}
Circulator Interface
src/interfaces/ICirculator.sol
Last updated