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