ETH Price: $3,131.46 (-4.37%)

Contract

0x9865EeBdD1cE65f45b6247AEEd2fA2252ECA7A08
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Swap204532692024-08-04 6:02:59102 days ago1722751379IN
TransitSwap: Router V4
0.007 ETH0.000091771
Cross204083492024-07-28 23:30:11108 days ago1722209411IN
TransitSwap: Router V4
0 ETH0.000147031
Cross204083492024-07-28 23:30:11108 days ago1722209411IN
TransitSwap: Router V4
0 ETH0.000147031
Swap158823312022-11-02 12:27:23743 days ago1667392043IN
TransitSwap: Router V4
0 ETH0.0047654613.2
Cross158823162022-11-02 12:24:23743 days ago1667391863IN
TransitSwap: Router V4
0.5 ETH0.001500613.75
Cross158822562022-11-02 12:11:47743 days ago1667391107IN
TransitSwap: Router V4
0.61 ETH0.001059689.71412577
Cross158821452022-11-02 11:49:23743 days ago1667389763IN
TransitSwap: Router V4
0 ETH0.001601619.37844546
Cross158821122022-11-02 11:42:47743 days ago1667389367IN
TransitSwap: Router V4
0.07935582 ETH0.0012003511
Swap158820852022-11-02 11:37:23743 days ago1667389043IN
TransitSwap: Router V4
1.29 ETH0.0025203511
Cross158820812022-11-02 11:36:35743 days ago1667388995IN
TransitSwap: Router V4
0 ETH0.0018753611
Cross158820532022-11-02 11:30:59743 days ago1667388659IN
TransitSwap: Router V4
0.1 ETH0.000963948.83647525
Cross158820282022-11-02 11:25:47743 days ago1667388347IN
TransitSwap: Router V4
0.15 ETH0.0012003511
Swap158820282022-11-02 11:25:47743 days ago1667388347IN
TransitSwap: Router V4
0.23 ETH0.0023475411
Cross158820232022-11-02 11:24:35743 days ago1667388275IN
TransitSwap: Router V4
0.1226532 ETH0.0011963911
Swap158820112022-11-02 11:22:11743 days ago1667388131IN
TransitSwap: Router V4
0 ETH0.0039282711
Cross158819962022-11-02 11:19:11743 days ago1667387951IN
TransitSwap: Router V4
0.124 ETH0.0012003511
Cross158819642022-11-02 11:12:47743 days ago1667387567IN
TransitSwap: Router V4
0.052 ETH0.00097968.98204115
Swap158818742022-11-02 10:54:47743 days ago1667386487IN
TransitSwap: Router V4
0.06475234 ETH0.0032316911
Cross158818652022-11-02 10:52:59743 days ago1667386379IN
TransitSwap: Router V4
0 ETH0.0018788511
Cross158818282022-11-02 10:45:35743 days ago1667385935IN
TransitSwap: Router V4
0.4 ETH0.001007969.23903063
Swap158817872022-11-02 10:37:23743 days ago1667385443IN
TransitSwap: Router V4
0 ETH0.0043734411
Swap158817862022-11-02 10:37:11743 days ago1667385431IN
TransitSwap: Router V4
0 ETH0.0025644811
Cross158817692022-11-02 10:33:47743 days ago1667385227IN
TransitSwap: Router V4
0 ETH0.00168839.9
Cross158817662022-11-02 10:33:11743 days ago1667385191IN
TransitSwap: Router V4
0 ETH0.0018755811
Cross158817642022-11-02 10:32:47743 days ago1667385167IN
TransitSwap: Router V4
0 ETH0.0018755811
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
204532692024-08-04 6:02:59102 days ago1722751379
TransitSwap: Router V4
0.006979 ETH
160748672022-11-29 9:51:23716 days ago1669715483
TransitSwap: Router V4
0.07491766 ETH
158823162022-11-02 12:24:23743 days ago1667391863
TransitSwap: Router V4
0.499 ETH
158822562022-11-02 12:11:47743 days ago1667391107
TransitSwap: Router V4
0.60878 ETH
158821122022-11-02 11:42:47743 days ago1667389367
TransitSwap: Router V4
0.07919711 ETH
158820852022-11-02 11:37:23743 days ago1667389043
TransitSwap: Router V4
1.28613 ETH
158820532022-11-02 11:30:59743 days ago1667388659
TransitSwap: Router V4
0.0998 ETH
158820282022-11-02 11:25:47743 days ago1667388347
TransitSwap: Router V4
0.1497 ETH
158820282022-11-02 11:25:47743 days ago1667388347
TransitSwap: Router V4
0.22931 ETH
158820232022-11-02 11:24:35743 days ago1667388275
TransitSwap: Router V4
0.12240789 ETH
158819962022-11-02 11:19:11743 days ago1667387951
TransitSwap: Router V4
0.123752 ETH
158819642022-11-02 11:12:47743 days ago1667387567
TransitSwap: Router V4
0.051896 ETH
158818742022-11-02 10:54:47743 days ago1667386487
TransitSwap: Router V4
0.06455809 ETH
158818282022-11-02 10:45:35743 days ago1667385935
TransitSwap: Router V4
0.3992 ETH
158817542022-11-02 10:30:47743 days ago1667385047
TransitSwap: Router V4
8.1754 ETH
158816812022-11-02 10:16:11743 days ago1667384171
TransitSwap: Router V4
0.19053641 ETH
158816532022-11-02 10:10:35743 days ago1667383835
TransitSwap: Router V4
0.11229055 ETH
158815942022-11-02 9:58:47743 days ago1667383127
TransitSwap: Router V4
0.0998 ETH
158815072022-11-02 9:41:23743 days ago1667382083
TransitSwap: Router V4
0.00500113 ETH
158814642022-11-02 9:32:47743 days ago1667381567
TransitSwap: Router V4
0.0997 ETH
158814332022-11-02 9:26:35743 days ago1667381195
TransitSwap: Router V4
0.50898 ETH
158813982022-11-02 9:19:35743 days ago1667380775
TransitSwap: Router V4
0.08982 ETH
158813272022-11-02 9:05:23743 days ago1667379923
TransitSwap: Router V4
0.20307762 ETH
158813172022-11-02 9:03:23743 days ago1667379803
TransitSwap: Router V4
0.587697 ETH
158812982022-11-02 8:59:35743 days ago1667379575
TransitSwap: Router V4
0.0516964 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TransitSwapRouter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : TransitSwapRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./libraries/ReentrancyGuard.sol";
import "./libraries/RevertReasonParser.sol";
import "./libraries/TransferHelper.sol";
import "./libraries/TransitStructs.sol";
import "./libraries/Ownable.sol";
import "./libraries/Pausable.sol";
import "./libraries/SafeMath.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/ITransitSwapFees.sol";

contract TransitSwapRouter is Ownable, ReentrancyGuard, Pausable {

    using SafeMath for uint256;

    address private _transit_swap;
    address private _transit_cross;
    address private _transit_fees;
    //default: Pre-trade fee model
    mapping(uint8 => bool) private _swap_type_mode;

    event Receipt(address from, uint256 amount);
    event Withdraw(address indexed token, address indexed executor, address indexed recipient, uint amount);
    event ChangeTransitSwap(address indexed previousTransit, address indexed newTransit);
    event ChangeTransitCross(address indexed previousTransit, address indexed newTransit);
    event ChangeTransitFees(address indexed previousTransitFees, address indexed newTransitFees);
    event ChangeSwapTypeMode(uint8[] types, bool[] newModes);
    event TransitSwapped(address indexed srcToken, address indexed dstToken, address indexed dstReceiver, address trader, bool feeMode, uint256 amount, uint256 returnAmount, uint256 minReturnAmount, uint256 fee, uint256 toChainID, string channel, uint256 time);


    constructor(address transitSwap_, address transitCross_, address transitFees_, address executor) Ownable (executor) {
        _transit_swap = transitSwap_;
        _transit_cross = transitCross_;
        _transit_fees = transitFees_;
    }

    receive() external payable {
        emit Receipt(msg.sender, msg.value);
    }

    function transitSwap() external view returns (address) {
        return _transit_swap;
    }

    function transitCross() external view returns (address) {
        return _transit_cross;
    }

    function transitFees() external view returns (address) {
        return _transit_fees;
    }

    function swapTypeMode(uint8 swapType) external view returns (bool) {
        return _swap_type_mode[swapType];
    }

    function changeTransitSwap(address newTransit) external onlyExecutor {
        address oldTransit = _transit_swap;
        _transit_swap = newTransit;
        emit ChangeTransitSwap(oldTransit, newTransit);
    }

    function changeTransitCross(address newTransit) external onlyExecutor {
        address oldTransit = _transit_cross;
        _transit_cross = newTransit;
        emit ChangeTransitCross(oldTransit, newTransit);
    }

    function changeTransitFees(address newTransitFees) external onlyExecutor {
        address oldTransitFees = _transit_fees;
        _transit_fees = newTransitFees;
        emit ChangeTransitFees(oldTransitFees, newTransitFees);
    }

    function changeSwapTypeMode(uint8[] memory swapTypes) external onlyExecutor {
        bool[] memory newModes = new bool[](swapTypes.length);
        for (uint index; index < swapTypes.length; index++) {
            _swap_type_mode[swapTypes[index]] = !_swap_type_mode[swapTypes[index]];
            newModes[index] = _swap_type_mode[swapTypes[index]];
        }
        emit ChangeSwapTypeMode(swapTypes, newModes);
    }

    function changePause(bool paused) external onlyExecutor {
        if (paused) {
            _pause();
        } else {
            _unpause();
        }
    }

    function _beforeSwap(bool preTradeModel, TransitStructs.TransitSwapDescription calldata desc) private returns (uint256 swapAmount, uint256 fee, uint256 beforeBalance) {
        if (preTradeModel) {
            fee = ITransitSwapFees(_transit_fees).getFeeRate(msg.sender, desc.amount, desc.swapType, desc.channel);
        }
        if (TransferHelper.isETH(desc.srcToken)) {
            require(msg.value == desc.amount, "TransitSwap: invalid msg.value");
            swapAmount = desc.amount.sub(fee);
        } else {
            if (preTradeModel) {
                TransferHelper.safeTransferFrom(desc.srcToken, msg.sender, address(this), desc.amount);
                TransferHelper.safeTransfer(desc.srcToken, desc.srcReceiver, desc.amount.sub(fee));
            } else {
                TransferHelper.safeTransferFrom(desc.srcToken, msg.sender, desc.srcReceiver, desc.amount);
            }
        }
        if (TransferHelper.isETH(desc.dstToken)) {
            if (preTradeModel) {
                beforeBalance = desc.dstReceiver.balance;
            } else {
                if (desc.swapType == uint8(TransitStructs.SwapTypes.swap)) {
                    beforeBalance = IERC20(desc.wrappedNative).balanceOf(address(this));
                } else {
                    beforeBalance = address(this).balance;
                }
            }
        } else {
            if (preTradeModel) {
                beforeBalance = IERC20(desc.dstToken).balanceOf(desc.dstReceiver);
            } else {
                beforeBalance = IERC20(desc.dstToken).balanceOf(address(this));
            }
        }
    }

    function _afterSwap(bool preTradeModel, TransitStructs.TransitSwapDescription calldata desc, uint256 beforeBalance) private returns (uint256 returnAmount, uint256 fee) {
        if (TransferHelper.isETH(desc.dstToken)) {
            if (preTradeModel) {
                returnAmount = desc.dstReceiver.balance.sub(beforeBalance);
                require(returnAmount >= desc.minReturnAmount, "TransitSwap: insufficient return amount");
            } else {
                if (desc.swapType == uint8(TransitStructs.SwapTypes.swap)) {
                    returnAmount = IERC20(desc.wrappedNative).balanceOf(address(this)).sub(beforeBalance);
                    TransferHelper.safeWithdraw(desc.wrappedNative, returnAmount);
                } else {
                    returnAmount = address(this).balance.sub(beforeBalance);
                }
                fee = ITransitSwapFees(_transit_fees).getFeeRate(msg.sender, returnAmount, desc.swapType, desc.channel);
                returnAmount = returnAmount.sub(fee);
                require(returnAmount >= desc.minReturnAmount, "TransitSwap: insufficient return amount");
                TransferHelper.safeTransferETH(desc.dstReceiver, returnAmount);
            }
        } else {
            if (preTradeModel) {
                returnAmount = IERC20(desc.dstToken).balanceOf(desc.dstReceiver).sub(beforeBalance);
                require(returnAmount >= desc.minReturnAmount, "TransitSwap: insufficient return amount");
            } else {
                returnAmount = IERC20(desc.dstToken).balanceOf(address(this)).sub(beforeBalance);
                fee = ITransitSwapFees(_transit_fees).getFeeRate(msg.sender, returnAmount, desc.swapType, desc.channel);
                returnAmount = returnAmount.sub(fee);
                uint256 receiverBeforeBalance = IERC20(desc.dstToken).balanceOf(desc.dstReceiver);
                TransferHelper.safeTransfer(desc.dstToken, desc.dstReceiver, returnAmount);
                returnAmount = IERC20(desc.dstToken).balanceOf(desc.dstReceiver).sub(receiverBeforeBalance);
                require(returnAmount >= desc.minReturnAmount, "TransitSwap: insufficient return amount");
            }
        }        
    }

    function swap(TransitStructs.TransitSwapDescription calldata desc, TransitStructs.CallbytesDescription calldata callbytesDesc) external payable nonReentrant whenNotPaused {
        require(callbytesDesc.calldatas.length > 0, "TransitSwap: data should be not zero");
        require(desc.amount > 0, "TransitSwap: amount should be greater than 0");
        require(desc.dstReceiver != address(0), "TransitSwap: receiver should be not address(0)");
        require(desc.minReturnAmount > 0, "TransitSwap: minReturnAmount should be greater than 0");
        if (callbytesDesc.flag == uint8(TransitStructs.Flag.aggregate)) {
            require(desc.srcToken == callbytesDesc.srcToken, "TransitSwap: invalid callbytesDesc");
        }
        bool preTradeModel = !_swap_type_mode[desc.swapType];
        (uint256 swapAmount, uint256 fee, uint256 beforeBalance) = _beforeSwap(preTradeModel, desc);

        {
            //bytes4(keccak256(bytes('callbytes(TransitStructs.CallbytesDescription)')));
            (bool success, bytes memory result) = _transit_swap.call{value:swapAmount}(abi.encodeWithSelector(0xccbe4007, callbytesDesc));
            if (!success) {
                revert(RevertReasonParser.parse(result,"TransitSwap:"));
            }
        }

        (uint256 returnAmount, uint256 postFee) = _afterSwap(preTradeModel, desc, beforeBalance);
        if (postFee > fee) {
            fee = postFee;
        }
        _emitTransit(desc, preTradeModel, fee, returnAmount);
    }

    function _beforeCross(TransitStructs.TransitSwapDescription calldata desc) private returns (uint256 swapAmount, uint256 fee, uint256 beforeBalance) {
        fee = ITransitSwapFees(_transit_fees).getFeeRate(msg.sender, desc.amount, desc.swapType, desc.channel);
        if (TransferHelper.isETH(desc.srcToken)) {
            require(msg.value == desc.amount, "TransitSwap: invalid msg.value");
            swapAmount = desc.amount.sub(fee);
        } else {
            beforeBalance = IERC20(desc.srcToken).balanceOf(_transit_cross);
            if (fee == 0) {
                TransferHelper.safeTransferFrom(desc.srcToken, msg.sender, _transit_cross, desc.amount);
            } else {
                TransferHelper.safeTransferFrom(desc.srcToken, msg.sender, address(this), desc.amount);
                TransferHelper.safeTransfer(desc.srcToken, _transit_cross, desc.amount.sub(fee));
            }
        }
    }

    function cross(TransitStructs.TransitSwapDescription calldata desc, TransitStructs.CallbytesDescription calldata callbytesDesc) external payable nonReentrant whenNotPaused {
        require(callbytesDesc.calldatas.length > 0, "TransitSwap: data should be not zero");
        require(desc.amount > 0, "TransitSwap: amount should be greater than 0");
        require(desc.srcToken == callbytesDesc.srcToken, "TransitSwap: invalid callbytesDesc");
        (uint256 swapAmount, uint256 fee, uint256 beforeBalance) = _beforeCross(desc);
        
        {
            //bytes4(keccak256(bytes('callbytes(TransitStructs.CallbytesDescription)')));
            (bool success, bytes memory result) = _transit_cross.call{value:swapAmount}(abi.encodeWithSelector(0xccbe4007, callbytesDesc));
            if (!success) {
                revert(RevertReasonParser.parse(result,"TransitSwap:"));
            }
        }
        
        if (!TransferHelper.isETH(desc.srcToken)) {
            require(IERC20(desc.srcToken).balanceOf(_transit_cross) >= beforeBalance, "TransitSwap: invalid cross");
        }

        _emitTransit(desc, true, fee, 0);
    }

    function _emitTransit(TransitStructs.TransitSwapDescription calldata desc, bool preTradeModel, uint256 fee, uint256 returnAmount) private {
        emit TransitSwapped(
            desc.srcToken, 
            desc.dstToken, 
            desc.dstReceiver, 
            msg.sender, 
            preTradeModel, 
            desc.amount, 
            returnAmount, 
            desc.minReturnAmount, 
            fee, 
            desc.toChainID, 
            desc.channel,
            block.timestamp
        );
    }

    function withdrawTokens(address[] memory tokens, address recipient) external onlyExecutor {
        for(uint index; index < tokens.length; index++) {
            uint amount;
            if(TransferHelper.isETH(tokens[index])) {
                amount = address(this).balance;
                TransferHelper.safeTransferETH(recipient, amount);
            } else {
                amount = IERC20(tokens[index]).balanceOf(address(this));
                TransferHelper.safeTransferWithoutRequire(tokens[index], recipient, amount);
            }
            emit Withdraw(tokens[index], msg.sender, recipient, amount);
        }
    }
}

File 2 of 10 : ITransitSwapFees.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9;

interface ITransitSwapFees {
    
    function getFeeRate(address trader, uint256 tradeAmount, uint8 swapType, string memory channel) external  view returns (uint payFees);

}

File 3 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.9;

interface IERC20 {
    
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
 
}

File 4 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
    
    function div(uint x, uint y) internal pure returns (uint z) {
        require(y != 0 , 'ds-math-div-zero');
        z = x / y;
    }
}

File 5 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

File 6 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
// Add executor extension

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address private _owner;
    address private _pendingOwner;
    address private _executor;
    address private _pendingExecutor;
    bool internal _initialized;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event ExecutorshipTransferStarted(address indexed previousExecutor, address indexed newExecutor);
    event ExecutorshipTransferred(address indexed previousExecutor, address indexed newExecutor);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor(address newExecutor) {
        require(!_initialized, "Ownable: initialized");
        _transferOwnership(msg.sender);
        _transferExecutorship(newExecutor);
        _initialized = true;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Throws if called by any account other than the executor.
     */
    modifier onlyExecutor() {
        _checkExecutor();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Returns the address of the current executor.
     */
    function executor() public view virtual returns (address) {
        return _executor;
    }

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Returns the address of the pending executor.
     */
    function pendingExecutor() public view virtual returns (address) {
        return _pendingExecutor;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

    /**
     * @dev Throws if the sender is not the executor.
     */
    function _checkExecutor() internal view virtual {
        require(executor() == msg.sender, "Ownable: caller is not the executor");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers executorship of the contract to a new account (`newExecutor`).
     * Can only be called by the current executor.
     */
    function transferExecutorship(address newExecutor) public virtual onlyExecutor {
        _pendingExecutor = newExecutor;
        emit ExecutorshipTransferStarted(executor(), newExecutor);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        delete _pendingOwner;
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function _transferExecutorship(address newExecutor) internal virtual {
        delete _pendingExecutor;
        address oldExecutor = _executor;
        _executor = newExecutor;
        emit ExecutorshipTransferred(oldExecutor, newExecutor);
    }

    function acceptOwnership() external {
        address sender = msg.sender;
        require(pendingOwner() == sender, "Ownable: caller is not the new owner");
        _transferOwnership(sender);
    }

    function acceptExecutorship() external {
        address sender = msg.sender;
        require(pendingExecutor() == sender, "Ownable: caller is not the new executor");
        _transferExecutorship(sender);
    }
}

File 7 of 10 : TransitStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library TransitStructs {

    enum SwapTypes {aggregatePreMode, aggregatePostMode, swap, cross}
    enum Flag {aggregate, swap, cross}

    struct TransitSwapDescription {
        uint8 swapType;
        address srcToken;
        address dstToken;
        address srcReceiver;
        address dstReceiver;
        uint256 amount;
        uint256 minReturnAmount;
        string channel;
        uint256 toChainID;
        address wrappedNative;
    }

    struct CallbytesDescription {
        uint8 flag;
        address srcToken;
        bytes calldatas;
    }

    struct AggregateDescription {
        address dstToken;
        address receiver;
        uint[] amounts;
        uint[] needTransfer;
        address[] callers;
        address[] approveProxy;
        bytes[] calls;
    }

    struct SwapDescription {
        address[][] paths;
        address[][] pairs;
        uint[] fees;
        address receiver;
        uint deadline;
    }

    struct CrossDescription {
        address caller;
        uint256 amount;
        bool needWrapped;
        bytes calls;
    }

    function decodeAggregateDesc(bytes calldata calldatas) internal pure returns (AggregateDescription memory desc) {
        desc = abi.decode(calldatas, (AggregateDescription));
    }

    function decodeSwapDesc(bytes calldata calldatas) internal pure returns (SwapDescription memory desc) {
        desc = abi.decode(calldatas, (SwapDescription));
    }

    function decodeCrossDesc(bytes calldata calldatas) internal pure returns (CrossDescription memory desc) {
        desc = abi.decode(calldatas, (CrossDescription));
    }
}

File 8 of 10 : TransferHelper.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library TransferHelper {
    
    address private constant _ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    address private constant _ZERO_ADDRESS = address(0);
    
    function isETH(address token) internal pure returns (bool) {
        return (token == _ZERO_ADDRESS || token == _ETH_ADDRESS);
    }
    
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_TOKEN_FAILED');
    }
    
    function safeTransferWithoutRequire(address token, address to, uint256 value) internal returns (bool) {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        return (success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        // solium-disable-next-line
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: TRANSFER_FAILED');
    }

    function safeDeposit(address wrapped, uint value) internal {
        // bytes4(keccak256(bytes('deposit()')));
        (bool success, bytes memory data) = wrapped.call{value:value}(abi.encodeWithSelector(0xd0e30db0));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: DEPOSIT_FAILED');
    }

    function safeWithdraw(address wrapped, uint value) internal {
        // bytes4(keccak256(bytes('withdraw(uint256 wad)')));
        (bool success, bytes memory data) = wrapped.call{value:0}(abi.encodeWithSelector(0x2e1a7d4d, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: WITHDRAW_FAILED');
    }
}

File 9 of 10 : RevertReasonParser.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

library RevertReasonParser {
        function parse(bytes memory data, string memory prefix) internal pure returns (string memory) {
        // https://solidity.readthedocs.io/en/latest/control-structures.html#revert
        // We assume that revert reason is abi-encoded as Error(string)

        // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length
        if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") {
            string memory reason;
            // solhint-disable no-inline-assembly
            assembly {
                // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset
                reason := add(data, 68)
            }
            /*
                revert reason is padded up to 32 bytes with ABI encoder: Error(string)
                also sometimes there is extra 32 bytes of zeros padded in the end:
                https://github.com/ethereum/solidity/issues/10170
                because of that we can't check for equality and instead check
                that string length + extra 68 bytes is less than overall data length
            */
            require(data.length >= 68 + bytes(reason).length, "Invalid revert reason");
            return string(abi.encodePacked(prefix, "Error(", reason, ")"));
        }
        // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer
        else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") {
            uint256 code;
            // solhint-disable no-inline-assembly
            assembly {
                // 36 = 32 bytes data length + 4-byte selector
                code := mload(add(data, 36))
            }
            return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")"));
        }

        return string(abi.encodePacked(prefix, "Unknown(", _toHex(data), ")"));
    }
    
    function _toHex(uint256 value) private pure returns(string memory) {
        return _toHex(abi.encodePacked(value));
    }

    function _toHex(bytes memory data) private pure returns(string memory) {
        bytes16 alphabet = 0x30313233343536373839616263646566;
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < data.length; i++) {
            str[2 * i + 2] = alphabet[uint8(data[i] >> 4)];
            str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)];
        }
        return string(str);
    }
}

File 10 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"transitSwap_","type":"address"},{"internalType":"address","name":"transitCross_","type":"address"},{"internalType":"address","name":"transitFees_","type":"address"},{"internalType":"address","name":"executor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8[]","name":"types","type":"uint8[]"},{"indexed":false,"internalType":"bool[]","name":"newModes","type":"bool[]"}],"name":"ChangeSwapTypeMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTransit","type":"address"},{"indexed":true,"internalType":"address","name":"newTransit","type":"address"}],"name":"ChangeTransitCross","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTransitFees","type":"address"},{"indexed":true,"internalType":"address","name":"newTransitFees","type":"address"}],"name":"ChangeTransitFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTransit","type":"address"},{"indexed":true,"internalType":"address","name":"newTransit","type":"address"}],"name":"ChangeTransitSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousExecutor","type":"address"},{"indexed":true,"internalType":"address","name":"newExecutor","type":"address"}],"name":"ExecutorshipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousExecutor","type":"address"},{"indexed":true,"internalType":"address","name":"newExecutor","type":"address"}],"name":"ExecutorshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Receipt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcToken","type":"address"},{"indexed":true,"internalType":"address","name":"dstToken","type":"address"},{"indexed":true,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"bool","name":"feeMode","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toChainID","type":"uint256"},{"indexed":false,"internalType":"string","name":"channel","type":"string"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TransitSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptExecutorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"changePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"swapTypes","type":"uint8[]"}],"name":"changeSwapTypeMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTransit","type":"address"}],"name":"changeTransitCross","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTransitFees","type":"address"}],"name":"changeTransitFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTransit","type":"address"}],"name":"changeTransitSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"swapType","type":"uint8"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"uint256","name":"toChainID","type":"uint256"},{"internalType":"address","name":"wrappedNative","type":"address"}],"internalType":"struct TransitStructs.TransitSwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"bytes","name":"calldatas","type":"bytes"}],"internalType":"struct TransitStructs.CallbytesDescription","name":"callbytesDesc","type":"tuple"}],"name":"cross","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"swapType","type":"uint8"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"string","name":"channel","type":"string"},{"internalType":"uint256","name":"toChainID","type":"uint256"},{"internalType":"address","name":"wrappedNative","type":"address"}],"internalType":"struct TransitStructs.TransitSwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"bytes","name":"calldatas","type":"bytes"}],"internalType":"struct TransitStructs.CallbytesDescription","name":"callbytesDesc","type":"tuple"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"swapType","type":"uint8"}],"name":"swapTypeMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newExecutor","type":"address"}],"name":"transferExecutorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transitCross","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transitFees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transitSwap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200338a3803806200338a8339810160408190526200003491620001e4565b6003548190600160a01b900460ff1615620000955760405162461bcd60e51b815260206004820152601460248201527f4f776e61626c653a20696e697469616c697a6564000000000000000000000000604482015260640160405180910390fd5b620000a03362000110565b620000ab816200016a565b50506003805460ff60a01b1916600160a01b1790556001600455600580546001600160a01b03948516610100026001600160a81b0319909116179055600680549284166001600160a01b03199384161790556007805491909316911617905562000241565b600180546001600160a01b0319908116909155600080546001600160a01b03848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600380546001600160a01b0319908116909155600280546001600160a01b0384811693821684179092556040519116919082907f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d90600090a35050565b80516001600160a01b0381168114620001df57600080fd5b919050565b60008060008060808587031215620001fb57600080fd5b6200020685620001c7565b93506200021660208601620001c7565b92506200022660408601620001c7565b91506200023660608601620001c7565b905092959194509250565b61313980620002516000396000f3fe6080604052600436106101395760003560e01c8063afed2d0e116100ab578063c6c465521161006f578063c6c465521461036f578063d63234e01461038f578063dc69bbad146103ad578063e30c3978146103cd578063e8e1bc5d146103eb578063f2fde38b1461040b57600080fd5b8063afed2d0e146102cb578063c10bea5c146102eb578063c34c08e5146102fe578063c3dc51fe1461031c578063c58dff5c1461033c57600080fd5b8063715018a6116100fd578063715018a61461022d57806379ba509714610242578063845b1f77146102575780638da5cb5b1461027a57806394752e821461029857806394d3d793146102b657600080fd5b8063017efb281461017d5780630e8cc7051461019257806351205349146101b25780635c975abb146101e95780635d4fead31461020d57600080fd5b3661017857604080513381523460208201527f7784f8d436dc514f0690e472c7e2d7f660a73e504c69b2350f6be5a5f02432ef910160405180910390a1005b600080fd5b61019061018b366004612ac0565b61042b565b005b34801561019e57600080fd5b506101906101ad366004612931565b61070b565b3480156101be57600080fd5b506007546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f557600080fd5b5060055460ff165b60405190151581526020016101e0565b34801561021957600080fd5b50610190610228366004612a86565b61089e565b34801561023957600080fd5b506101906108bf565b34801561024e57600080fd5b506101906108d3565b34801561026357600080fd5b5060055461010090046001600160a01b03166101cc565b34801561028657600080fd5b506000546001600160a01b03166101cc565b3480156102a457600080fd5b506006546001600160a01b03166101cc565b3480156102c257600080fd5b50610190610952565b3480156102d757600080fd5b506101906102e636600461290f565b6109d5565b6101906102f9366004612ac0565b610a46565b34801561030a57600080fd5b506002546001600160a01b03166101cc565b34801561032857600080fd5b506101906103373660046129e7565b610d6b565b34801561034857600080fd5b506101fd610357366004612b4d565b60ff9081166000908152600860205260409020541690565b34801561037b57600080fd5b5061019061038a36600461290f565b610f03565b34801561039b57600080fd5b506003546001600160a01b03166101cc565b3480156103b957600080fd5b506101906103c836600461290f565b610f5d565b3480156103d957600080fd5b506001546001600160a01b03166101cc565b3480156103f757600080fd5b5061019061040636600461290f565b610fbf565b34801561041757600080fd5b5061019061042636600461290f565b611019565b61043361108a565b61043b6110e4565b600061044a6040830183612f7b565b9050116104725760405162461bcd60e51b815260040161046990612e1f565b60405180910390fd5b60008260a00135116104965760405162461bcd60e51b815260040161046990612dd3565b6104a6604082016020830161290f565b6001600160a01b03166104bf604084016020850161290f565b6001600160a01b0316146104e55760405162461bcd60e51b815260040161046990612eaa565b60008060006104f38561112a565b600654604051939650919450925060009182916001600160a01b031690869063ccbe400790610526908a90602401612eec565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161055f9190612b91565b60006040518083038185875af1925050503d806000811461059c576040519150601f19603f3d011682016040523d82523d6000602084013e6105a1565b606091505b5091509150816105f2576105d9816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b81525061136f565b60405162461bcd60e51b81526004016104699190612da0565b5061060d9050610608604087016020880161290f565b6115e6565b6106ec5780610622604087016020880161290f565b6006546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a082319060240160206040518083038186803b15801561066657600080fd5b505afa15801561067a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069e9190612b34565b10156106ec5760405162461bcd60e51b815260206004820152601a60248201527f5472616e736974537761703a20696e76616c69642063726f73730000000000006044820152606401610469565b6106fa85600184600061161f565b5050506107076001600455565b5050565b6107136116d4565b60005b8251811015610899576000610743848381518110610736576107366130c9565b60200260200101516115e6565b156107595750476107548382611749565b610816565b83828151811061076b5761076b6130c9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107b657600080fd5b505afa1580156107ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ee9190612b34565b9050610814848381518110610805576108056130c9565b60200260200101518483611806565b505b826001600160a01b0316336001600160a01b031685848151811061083c5761083c6130c9565b60200260200101516001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f78460405161087e91815260200190565b60405180910390a4508061089181613098565b915050610716565b505050565b6108a66116d4565b80156108b7576108b46118f0565b50565b6108b461193b565b6108c761197d565b6108d160006119e6565b565b33806108e76001546001600160a01b031690565b6001600160a01b0316146109495760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e6577206f6044820152633bb732b960e11b6064820152608401610469565b6108b4816119e6565b33806109666003546001600160a01b031690565b6001600160a01b0316146109cc5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e657720656044820152663c32b1baba37b960c91b6064820152608401610469565b6108b481611a40565b6109dd6116d4565b600380546001600160a01b0383166001600160a01b03199091168117909155610a0e6002546001600160a01b031690565b6001600160a01b03167fdd01547fc40682edc3cd8d164d53f5a1ae6b46138a83f045658ed760823ddba860405160405180910390a350565b610a4e61108a565b610a566110e4565b6000610a656040830183612f7b565b905011610a845760405162461bcd60e51b815260040161046990612e1f565b60008260a0013511610aa85760405162461bcd60e51b815260040161046990612dd3565b6000610aba60a084016080850161290f565b6001600160a01b03161415610b285760405162461bcd60e51b815260206004820152602e60248201527f5472616e736974537761703a2072656365697665722073686f756c642062652060448201526d6e6f74206164647265737328302960901b6064820152608401610469565b60008260c0013511610b9a5760405162461bcd60e51b815260206004820152603560248201527f5472616e736974537761703a206d696e52657475726e416d6f756e742073686f6044820152740756c642062652067726561746572207468616e203605c1b6064820152608401610469565b6000610ba96020830183612b4d565b60ff161415610c0157610bc2604082016020830161290f565b6001600160a01b0316610bdb604084016020850161290f565b6001600160a01b031614610c015760405162461bcd60e51b815260040161046990612eaa565b6000600881610c136020860186612b4d565b60ff908116825260208201929092526040016000908120549091161591508080610c3d8487611a9d565b925092509250600080600560019054906101000a90046001600160a01b03166001600160a01b03168563ccbe400789604051602401610c7c9190612eec565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610cb59190612b91565b60006040518083038185875af1925050503d8060008114610cf2576040519150601f19603f3d011682016040523d82523d6000602084013e610cf7565b606091505b509150915081610d2f576105d9816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b81525061136f565b5050600080610d3f868985611e2d565b9150915083811115610d4f578093505b610d5b8887868561161f565b5050505050506107076001600455565b610d736116d4565b6000815167ffffffffffffffff811115610d8f57610d8f6130df565b604051908082528060200260200182016040528015610db8578160200160208202803683370190505b50905060005b8251811015610ec55760086000848381518110610ddd57610ddd6130c9565b602002602001015160ff1660ff16815260200190815260200160002060009054906101000a900460ff161560086000858481518110610e1e57610e1e6130c9565b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060086000848381518110610e6757610e676130c9565b602002602001015160ff1660ff16815260200190815260200160002060009054906101000a900460ff16828281518110610ea357610ea36130c9565b9115156020928302919091019091015280610ebd81613098565b915050610dbe565b507f5e69b8fb6404283a560ee2205dc0f225019578c56e3a6c52137e0aa995235b668282604051610ef7929190612d20565b60405180910390a15050565b610f0b6116d4565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907faf855a7e4074e8930caf657b3505942d4ba0e69b6b6e63553c653d7b1ffcc06190600090a35050565b610f656116d4565b600580546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907fbc071769e275808816d09db519c1888c355f7557cb63095ce21e26a97a5f0e9c90600090a35050565b610fc76116d4565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff2ef974bc2aedf0c322b1a97e8627e85114a789cadf8d172b5efb5d6c1d94f8d90600090a35050565b61102161197d565b600180546001600160a01b0383166001600160a01b031990911681179091556110526000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600260045414156110dd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610469565b6002600455565b60055460ff16156108d15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610469565b600754600090819081906001600160a01b03166319fa763a3360a08701356111556020890189612b4d565b61116260e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611182959493929190612ce4565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190612b34565b91506111e7610608604086016020870161290f565b15611254578360a00135341461123f5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736974537761703a20696e76616c6964206d73672e76616c756500006044820152606401610469565b61124d60a0850135836122bc565b9250611368565b611264604085016020860161290f565b6006546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a082319060240160206040518083038186803b1580156112a857600080fd5b505afa1580156112bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e09190612b34565b905081611317576113126112fa604086016020870161290f565b60065433906001600160a01b031660a0880135612312565b611368565b61133661132a604086016020870161290f565b33308760a00135612312565b611368611349604086016020870161290f565b6006546001600160a01b031661136360a0880135866122bc565b612442565b9193909250565b606060448351101580156113a8575082600081518110611391576113916130c9565b6020910101516001600160f81b031916600160fb1b145b80156113d95750826001815181106113c2576113c26130c9565b6020910101516001600160f81b03191660c360f81b145b801561140a5750826002815181106113f3576113f36130c9565b6020910101516001600160f81b031916607960f81b145b801561143b575082600381518110611424576114246130c9565b6020910101516001600160f81b031916600560fd1b145b156114c557604483810180519091611453919061301e565b8451101561149b5760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103932bb32b93a103932b0b9b7b760591b6044820152606401610469565b82816040516020016114ae929190612c4d565b6040516020818303038152906040529150506115e0565b825160241480156114fb5750826000815181106114e4576114e46130c9565b6020910101516001600160f81b031916602760f91b145b801561152c575082600181518110611515576115156130c9565b6020910101516001600160f81b031916600960fb1b145b801561155d575082600281518110611546576115466130c9565b6020910101516001600160f81b031916607b60f81b145b801561158e575082600381518110611577576115776130c9565b6020910101516001600160f81b031916607160f81b145b156115b3576024830151826115a28261256b565b6040516020016114ae929190612bad565b816115bd84612593565b6040516020016115ce929190612bfc565b60405160208183030381529060405290505b92915050565b60006001600160a01b03821615806115e057506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b61162f60a085016080860161290f565b6001600160a01b0316611648606086016040870161290f565b6001600160a01b0316611661604087016020880161290f565b6001600160a01b03167f7055e3d08e2c20429c6b162f3e3bee3f426d59896e66084c3580dc353e54129d33878960a00135878b60c001358a8d61010001358e8060e001906116af9190612f7b565b426040516116c69a99989796959493929190612c82565b60405180910390a450505050565b336116e76002546001600160a01b031690565b6001600160a01b0316146108d15760405162461bcd60e51b815260206004820152602360248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065786563756044820152623a37b960e91b6064820152608401610469565b604080516000808252602082019092526001600160a01b0384169083906040516117739190612b91565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806108995760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610469565b6000806000856001600160a01b031663a9059cbb86866040516024016118419291906001600160a01b03929092168252602082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161187a9190612b91565b6000604051808303816000865af19150503d80600081146118b7576040519150601f19603f3d011682016040523d82523d6000602084013e6118bc565b606091505b50915091508180156118e65750805115806118e65750808060200190518101906118e69190612aa3565b9695505050505050565b6118f86110e4565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b61194361277b565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611931565b336119906000546001600160a01b031690565b6001600160a01b0316146108d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610469565b600180546001600160a01b0319908116909155600080546001600160a01b03848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600380546001600160a01b0319908116909155600280546001600160a01b0384811693821684179092556040519116919082907f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d90600090a35050565b60008060008415611b4c576007546001600160a01b03166319fa763a3360a0870135611acc6020890189612b4d565b611ad960e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611af9959493929190612ce4565b60206040518083038186803b158015611b1157600080fd5b505afa158015611b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b499190612b34565b91505b611b5f610608604086016020870161290f565b15611bcc578360a001353414611bb75760405162461bcd60e51b815260206004820152601e60248201527f5472616e736974537761703a20696e76616c6964206d73672e76616c756500006044820152606401610469565b611bc560a0850135836122bc565b9250611c49565b8415611c1b57611be561132a604086016020870161290f565b611c16611bf8604086016020870161290f565b611c08608087016060880161290f565b61136360a0880135866122bc565b611c49565b611c49611c2e604086016020870161290f565b33611c3f608088016060890161290f565b8760a00135612312565b611c5c610608606086016040870161290f565b15611d3a578415611c8857611c7760a085016080860161290f565b6001600160a01b0316319050611e26565b6002611c976020860186612b4d565b60ff161415611d3357611cb26101408501610120860161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b60206040518083038186803b158015611cf457600080fd5b505afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c9190612b34565b9050611e26565b5047611e26565b8415611d9a57611d50606085016040860161290f565b6001600160a01b03166370a08231611d6e60a087016080880161290f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611cdc565b611daa606085016040860161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e239190612b34565b90505b9250925092565b600080611e43610608606086016040870161290f565b15612062578415611e9d57611e7283611e6260a087016080880161290f565b6001600160a01b031631906122bc565b91508360c00135821015611e985760405162461bcd60e51b815260040161046990612e63565b6122b4565b6002611eac6020860186612b4d565b60ff161415611f6d57611f4b83611ecb6101408701610120880161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b60206040518083038186803b158015611f0d57600080fd5b505afa158015611f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f459190612b34565b906122bc565b9150611f68611f626101408601610120870161290f565b836127c4565b611f7a565b611f7747846122bc565b91505b6007546001600160a01b03166319fa763a3384611f9a6020890189612b4d565b611fa760e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611fc7959493929190612ce4565b60206040518083038186803b158015611fdf57600080fd5b505afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612b34565b905061202382826122bc565b91508360c001358210156120495760405162461bcd60e51b815260040161046990612e63565b611e9861205c60a086016080870161290f565b83611749565b84156120c657611e728361207c606087016040880161290f565b6001600160a01b03166370a0823161209a60a0890160808a0161290f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611ef5565b6120da83611ecb606087016040880161290f565b6007549092506001600160a01b03166319fa763a33846120fd6020890189612b4d565b61210a60e08a018a612f7b565b6040518663ffffffff1660e01b815260040161212a959493929190612ce4565b60206040518083038186803b15801561214257600080fd5b505afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a9190612b34565b905061218682826122bc565b9150600061219a606086016040870161290f565b6001600160a01b03166370a082316121b860a088016080890161290f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156121f757600080fd5b505afa15801561220b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222f9190612b34565b905061225a612244606087016040880161290f565b61225460a088016080890161290f565b85612442565b61228c8161226e606088016040890161290f565b6001600160a01b03166370a0823161209a60a08a0160808b0161290f565b92508460c001358310156122b25760405162461bcd60e51b815260040161046990612e63565b505b935093915050565b6000826122c98382613055565b91508111156115e05760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610469565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916123769190612b91565b6000604051808303816000865af19150503d80600081146123b3576040519150601f19603f3d011682016040523d82523d6000602084013e6123b8565b606091505b50915091508180156123e25750805115806123e25750808060200190518101906123e29190612aa3565b61243a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610469565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161249e9190612b91565b6000604051808303816000865af19150503d80600081146124db576040519150601f19603f3d011682016040523d82523d6000602084013e6124e0565b606091505b509150915081801561250a57508051158061250a57508080602001905181019061250a9190612aa3565b6125645760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657248656c7065723a205452414e534645525f544f4b454e5f46604482015264105253115160da1b6064820152608401610469565b5050505050565b60606115e08260405160200161258391815260200190565b6040516020818303038152906040525b80516060906f181899199a1a9b1b9c1cb0b131b232b360811b906000906125bb906002613036565b6125c690600261301e565b67ffffffffffffffff8111156125de576125de6130df565b6040519080825280601f01601f191660200182016040528015612608576020820181803683370190505b509050600360fc1b81600081518110612623576126236130c9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612652576126526130c9565b60200101906001600160f81b031916908160001a90535060005b84518110156127735782600486838151811061268a5761268a6130c9565b01602001516001600160f81b031916901c60f81c601081106126ae576126ae6130c9565b1a60f81b826126be836002613036565b6126c990600261301e565b815181106126d9576126d96130c9565b60200101906001600160f81b031916908160001a90535082858281518110612703576127036130c9565b60209101015160f81c600f166010811061271f5761271f6130c9565b1a60f81b8261272f836002613036565b61273a90600361301e565b8151811061274a5761274a6130c9565b60200101906001600160f81b031916908160001a9053508061276b81613098565b91505061266c565b509392505050565b60055460ff166108d15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610469565b600080836001600160a01b03166000632e1a7d4d856040516024016127eb91815260200190565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516128249190612b91565b60006040518083038185875af1925050503d8060008114612861576040519150601f19603f3d011682016040523d82523d6000602084013e612866565b606091505b50915091508180156128905750805115806128905750808060200190518101906128909190612aa3565b6128dc5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a2057495448445241575f4641494c4544006044820152606401610469565b50505050565b80356001600160a01b03811681146128f957600080fd5b919050565b803560ff811681146128f957600080fd5b60006020828403121561292157600080fd5b61292a826128e2565b9392505050565b6000806040838503121561294457600080fd5b823567ffffffffffffffff81111561295b57600080fd5b8301601f8101851361296c57600080fd5b8035602061298161297c83612ffa565b612fc9565b80838252828201915082850189848660051b88010111156129a157600080fd5b600095505b848610156129cb576129b7816128e2565b8352600195909501949183019183016129a6565b5095506129db90508682016128e2565b93505050509250929050565b600060208083850312156129fa57600080fd5b823567ffffffffffffffff811115612a1157600080fd5b8301601f81018513612a2257600080fd5b8035612a3061297c82612ffa565b80828252848201915084840188868560051b8701011115612a5057600080fd5b600094505b83851015612a7a57612a66816128fe565b835260019490940193918501918501612a55565b50979650505050505050565b600060208284031215612a9857600080fd5b813561292a816130f5565b600060208284031215612ab557600080fd5b815161292a816130f5565b60008060408385031215612ad357600080fd5b823567ffffffffffffffff80821115612aeb57600080fd5b908401906101408287031215612b0057600080fd5b90925060208401359080821115612b1657600080fd5b50830160608186031215612b2957600080fd5b809150509250929050565b600060208284031215612b4657600080fd5b5051919050565b600060208284031215612b5f57600080fd5b61292a826128fe565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008251612ba381846020870161306c565b9190910192915050565b60008351612bbf81846020880161306c565b650a0c2dcd2c6560d31b9083019081528351612be281600684016020880161306c565b602960f81b60069290910191820152600701949350505050565b60008351612c0e81846020880161306c565b670aadcd6dcdeeedc560c31b9083019081528351612c3381600884016020880161306c565b602960f81b60089290910191820152600901949350505050565b60008351612c5f81846020880161306c565b6508ae4e4dee4560d31b9083019081528351612be281600684016020880161306c565b600061012060018060a01b038d1683528b151560208401528a60408401528960608401528860808401528760a08401528660c08401528060e0840152612ccb8184018688612b68565b915050826101008301529b9a5050505050505050505050565b60018060a01b038616815284602082015260ff84166040820152608060608201526000612d15608083018486612b68565b979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d5c57815160ff1684529284019290840190600101612d3d565b5050508381038285015284518082528583019183019060005b81811015612d93578351151583529284019291840191600101612d75565b5090979650505050505050565b6020815260008251806020840152612dbf81604085016020870161306c565b601f01601f19169190910160400192915050565b6020808252602c908201527f5472616e736974537761703a20616d6f756e742073686f756c6420626520677260408201526b06561746572207468616e20360a41b606082015260800190565b60208082526024908201527f5472616e736974537761703a20646174612073686f756c64206265206e6f74206040820152637a65726f60e01b606082015260800190565b60208082526027908201527f5472616e736974537761703a20696e73756666696369656e742072657475726e60408201526608185b5bdd5b9d60ca1b606082015260800190565b60208082526022908201527f5472616e736974537761703a20696e76616c69642063616c6c62797465734465604082015261736360f01b606082015260800190565b6020815260ff612efb836128fe565b16602082015260018060a01b03612f14602084016128e2565b16604082015260006040830135601e19843603018112612f3357600080fd5b8301803567ffffffffffffffff811115612f4c57600080fd5b803603851315612f5b57600080fd5b606080850152612f72608085018260208501612b68565b95945050505050565b6000808335601e19843603018112612f9257600080fd5b83018035915067ffffffffffffffff821115612fad57600080fd5b602001915036819003821315612fc257600080fd5b9250929050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff257612ff26130df565b604052919050565b600067ffffffffffffffff821115613014576130146130df565b5060051b60200190565b60008219821115613031576130316130b3565b500190565b6000816000190483118215151615613050576130506130b3565b500290565b600082821015613067576130676130b3565b500390565b60005b8381101561308757818101518382015260200161306f565b838111156128dc5750506000910152565b60006000198214156130ac576130ac6130b3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146108b457600080fdfea26469706673582212202568280db7122de81915bbff6786f79470fb83608b7e6bb39a932810629f779c64736f6c63430008070033000000000000000000000000f7a2f863299c17dfa11cd8a14e7c7dca92f315b90000000000000000000000008755773dc777b9f9b2e2c86402a03f099f8236910000000000000000000000001f6e41c47349634fe261403a18f8515546f58826000000000000000000000000490494393fb90599365c1303e486afe52bbab866

Deployed Bytecode

0x6080604052600436106101395760003560e01c8063afed2d0e116100ab578063c6c465521161006f578063c6c465521461036f578063d63234e01461038f578063dc69bbad146103ad578063e30c3978146103cd578063e8e1bc5d146103eb578063f2fde38b1461040b57600080fd5b8063afed2d0e146102cb578063c10bea5c146102eb578063c34c08e5146102fe578063c3dc51fe1461031c578063c58dff5c1461033c57600080fd5b8063715018a6116100fd578063715018a61461022d57806379ba509714610242578063845b1f77146102575780638da5cb5b1461027a57806394752e821461029857806394d3d793146102b657600080fd5b8063017efb281461017d5780630e8cc7051461019257806351205349146101b25780635c975abb146101e95780635d4fead31461020d57600080fd5b3661017857604080513381523460208201527f7784f8d436dc514f0690e472c7e2d7f660a73e504c69b2350f6be5a5f02432ef910160405180910390a1005b600080fd5b61019061018b366004612ac0565b61042b565b005b34801561019e57600080fd5b506101906101ad366004612931565b61070b565b3480156101be57600080fd5b506007546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f557600080fd5b5060055460ff165b60405190151581526020016101e0565b34801561021957600080fd5b50610190610228366004612a86565b61089e565b34801561023957600080fd5b506101906108bf565b34801561024e57600080fd5b506101906108d3565b34801561026357600080fd5b5060055461010090046001600160a01b03166101cc565b34801561028657600080fd5b506000546001600160a01b03166101cc565b3480156102a457600080fd5b506006546001600160a01b03166101cc565b3480156102c257600080fd5b50610190610952565b3480156102d757600080fd5b506101906102e636600461290f565b6109d5565b6101906102f9366004612ac0565b610a46565b34801561030a57600080fd5b506002546001600160a01b03166101cc565b34801561032857600080fd5b506101906103373660046129e7565b610d6b565b34801561034857600080fd5b506101fd610357366004612b4d565b60ff9081166000908152600860205260409020541690565b34801561037b57600080fd5b5061019061038a36600461290f565b610f03565b34801561039b57600080fd5b506003546001600160a01b03166101cc565b3480156103b957600080fd5b506101906103c836600461290f565b610f5d565b3480156103d957600080fd5b506001546001600160a01b03166101cc565b3480156103f757600080fd5b5061019061040636600461290f565b610fbf565b34801561041757600080fd5b5061019061042636600461290f565b611019565b61043361108a565b61043b6110e4565b600061044a6040830183612f7b565b9050116104725760405162461bcd60e51b815260040161046990612e1f565b60405180910390fd5b60008260a00135116104965760405162461bcd60e51b815260040161046990612dd3565b6104a6604082016020830161290f565b6001600160a01b03166104bf604084016020850161290f565b6001600160a01b0316146104e55760405162461bcd60e51b815260040161046990612eaa565b60008060006104f38561112a565b600654604051939650919450925060009182916001600160a01b031690869063ccbe400790610526908a90602401612eec565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161055f9190612b91565b60006040518083038185875af1925050503d806000811461059c576040519150601f19603f3d011682016040523d82523d6000602084013e6105a1565b606091505b5091509150816105f2576105d9816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b81525061136f565b60405162461bcd60e51b81526004016104699190612da0565b5061060d9050610608604087016020880161290f565b6115e6565b6106ec5780610622604087016020880161290f565b6006546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a082319060240160206040518083038186803b15801561066657600080fd5b505afa15801561067a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069e9190612b34565b10156106ec5760405162461bcd60e51b815260206004820152601a60248201527f5472616e736974537761703a20696e76616c69642063726f73730000000000006044820152606401610469565b6106fa85600184600061161f565b5050506107076001600455565b5050565b6107136116d4565b60005b8251811015610899576000610743848381518110610736576107366130c9565b60200260200101516115e6565b156107595750476107548382611749565b610816565b83828151811061076b5761076b6130c9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156107b657600080fd5b505afa1580156107ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ee9190612b34565b9050610814848381518110610805576108056130c9565b60200260200101518483611806565b505b826001600160a01b0316336001600160a01b031685848151811061083c5761083c6130c9565b60200260200101516001600160a01b03167f3115d1449a7b732c986cba18244e897a450f61e1bb8d589cd2e69e6c8924f9f78460405161087e91815260200190565b60405180910390a4508061089181613098565b915050610716565b505050565b6108a66116d4565b80156108b7576108b46118f0565b50565b6108b461193b565b6108c761197d565b6108d160006119e6565b565b33806108e76001546001600160a01b031690565b6001600160a01b0316146109495760405162461bcd60e51b8152602060048201526024808201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e6577206f6044820152633bb732b960e11b6064820152608401610469565b6108b4816119e6565b33806109666003546001600160a01b031690565b6001600160a01b0316146109cc5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206e657720656044820152663c32b1baba37b960c91b6064820152608401610469565b6108b481611a40565b6109dd6116d4565b600380546001600160a01b0383166001600160a01b03199091168117909155610a0e6002546001600160a01b031690565b6001600160a01b03167fdd01547fc40682edc3cd8d164d53f5a1ae6b46138a83f045658ed760823ddba860405160405180910390a350565b610a4e61108a565b610a566110e4565b6000610a656040830183612f7b565b905011610a845760405162461bcd60e51b815260040161046990612e1f565b60008260a0013511610aa85760405162461bcd60e51b815260040161046990612dd3565b6000610aba60a084016080850161290f565b6001600160a01b03161415610b285760405162461bcd60e51b815260206004820152602e60248201527f5472616e736974537761703a2072656365697665722073686f756c642062652060448201526d6e6f74206164647265737328302960901b6064820152608401610469565b60008260c0013511610b9a5760405162461bcd60e51b815260206004820152603560248201527f5472616e736974537761703a206d696e52657475726e416d6f756e742073686f6044820152740756c642062652067726561746572207468616e203605c1b6064820152608401610469565b6000610ba96020830183612b4d565b60ff161415610c0157610bc2604082016020830161290f565b6001600160a01b0316610bdb604084016020850161290f565b6001600160a01b031614610c015760405162461bcd60e51b815260040161046990612eaa565b6000600881610c136020860186612b4d565b60ff908116825260208201929092526040016000908120549091161591508080610c3d8487611a9d565b925092509250600080600560019054906101000a90046001600160a01b03166001600160a01b03168563ccbe400789604051602401610c7c9190612eec565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051610cb59190612b91565b60006040518083038185875af1925050503d8060008114610cf2576040519150601f19603f3d011682016040523d82523d6000602084013e610cf7565b606091505b509150915081610d2f576105d9816040518060400160405280600c81526020016b2a3930b739b4ba29bbb0b81d60a11b81525061136f565b5050600080610d3f868985611e2d565b9150915083811115610d4f578093505b610d5b8887868561161f565b5050505050506107076001600455565b610d736116d4565b6000815167ffffffffffffffff811115610d8f57610d8f6130df565b604051908082528060200260200182016040528015610db8578160200160208202803683370190505b50905060005b8251811015610ec55760086000848381518110610ddd57610ddd6130c9565b602002602001015160ff1660ff16815260200190815260200160002060009054906101000a900460ff161560086000858481518110610e1e57610e1e6130c9565b602002602001015160ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060086000848381518110610e6757610e676130c9565b602002602001015160ff1660ff16815260200190815260200160002060009054906101000a900460ff16828281518110610ea357610ea36130c9565b9115156020928302919091019091015280610ebd81613098565b915050610dbe565b507f5e69b8fb6404283a560ee2205dc0f225019578c56e3a6c52137e0aa995235b668282604051610ef7929190612d20565b60405180910390a15050565b610f0b6116d4565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907faf855a7e4074e8930caf657b3505942d4ba0e69b6b6e63553c653d7b1ffcc06190600090a35050565b610f656116d4565b600580546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907fbc071769e275808816d09db519c1888c355f7557cb63095ce21e26a97a5f0e9c90600090a35050565b610fc76116d4565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff2ef974bc2aedf0c322b1a97e8627e85114a789cadf8d172b5efb5d6c1d94f8d90600090a35050565b61102161197d565b600180546001600160a01b0383166001600160a01b031990911681179091556110526000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600260045414156110dd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610469565b6002600455565b60055460ff16156108d15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610469565b600754600090819081906001600160a01b03166319fa763a3360a08701356111556020890189612b4d565b61116260e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611182959493929190612ce4565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d29190612b34565b91506111e7610608604086016020870161290f565b15611254578360a00135341461123f5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736974537761703a20696e76616c6964206d73672e76616c756500006044820152606401610469565b61124d60a0850135836122bc565b9250611368565b611264604085016020860161290f565b6006546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a082319060240160206040518083038186803b1580156112a857600080fd5b505afa1580156112bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e09190612b34565b905081611317576113126112fa604086016020870161290f565b60065433906001600160a01b031660a0880135612312565b611368565b61133661132a604086016020870161290f565b33308760a00135612312565b611368611349604086016020870161290f565b6006546001600160a01b031661136360a0880135866122bc565b612442565b9193909250565b606060448351101580156113a8575082600081518110611391576113916130c9565b6020910101516001600160f81b031916600160fb1b145b80156113d95750826001815181106113c2576113c26130c9565b6020910101516001600160f81b03191660c360f81b145b801561140a5750826002815181106113f3576113f36130c9565b6020910101516001600160f81b031916607960f81b145b801561143b575082600381518110611424576114246130c9565b6020910101516001600160f81b031916600560fd1b145b156114c557604483810180519091611453919061301e565b8451101561149b5760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103932bb32b93a103932b0b9b7b760591b6044820152606401610469565b82816040516020016114ae929190612c4d565b6040516020818303038152906040529150506115e0565b825160241480156114fb5750826000815181106114e4576114e46130c9565b6020910101516001600160f81b031916602760f91b145b801561152c575082600181518110611515576115156130c9565b6020910101516001600160f81b031916600960fb1b145b801561155d575082600281518110611546576115466130c9565b6020910101516001600160f81b031916607b60f81b145b801561158e575082600381518110611577576115776130c9565b6020910101516001600160f81b031916607160f81b145b156115b3576024830151826115a28261256b565b6040516020016114ae929190612bad565b816115bd84612593565b6040516020016115ce929190612bfc565b60405160208183030381529060405290505b92915050565b60006001600160a01b03821615806115e057506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b61162f60a085016080860161290f565b6001600160a01b0316611648606086016040870161290f565b6001600160a01b0316611661604087016020880161290f565b6001600160a01b03167f7055e3d08e2c20429c6b162f3e3bee3f426d59896e66084c3580dc353e54129d33878960a00135878b60c001358a8d61010001358e8060e001906116af9190612f7b565b426040516116c69a99989796959493929190612c82565b60405180910390a450505050565b336116e76002546001600160a01b031690565b6001600160a01b0316146108d15760405162461bcd60e51b815260206004820152602360248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652065786563756044820152623a37b960e91b6064820152608401610469565b604080516000808252602082019092526001600160a01b0384169083906040516117739190612b91565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806108995760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610469565b6000806000856001600160a01b031663a9059cbb86866040516024016118419291906001600160a01b03929092168252602082015260400190565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161187a9190612b91565b6000604051808303816000865af19150503d80600081146118b7576040519150601f19603f3d011682016040523d82523d6000602084013e6118bc565b606091505b50915091508180156118e65750805115806118e65750808060200190518101906118e69190612aa3565b9695505050505050565b6118f86110e4565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b61194361277b565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611931565b336119906000546001600160a01b031690565b6001600160a01b0316146108d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610469565b600180546001600160a01b0319908116909155600080546001600160a01b03848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600380546001600160a01b0319908116909155600280546001600160a01b0384811693821684179092556040519116919082907f88436636ea40d5bb1bcc55ff9cd54788af71da886f4147a87f199adcca733d4d90600090a35050565b60008060008415611b4c576007546001600160a01b03166319fa763a3360a0870135611acc6020890189612b4d565b611ad960e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611af9959493929190612ce4565b60206040518083038186803b158015611b1157600080fd5b505afa158015611b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b499190612b34565b91505b611b5f610608604086016020870161290f565b15611bcc578360a001353414611bb75760405162461bcd60e51b815260206004820152601e60248201527f5472616e736974537761703a20696e76616c6964206d73672e76616c756500006044820152606401610469565b611bc560a0850135836122bc565b9250611c49565b8415611c1b57611be561132a604086016020870161290f565b611c16611bf8604086016020870161290f565b611c08608087016060880161290f565b61136360a0880135866122bc565b611c49565b611c49611c2e604086016020870161290f565b33611c3f608088016060890161290f565b8760a00135612312565b611c5c610608606086016040870161290f565b15611d3a578415611c8857611c7760a085016080860161290f565b6001600160a01b0316319050611e26565b6002611c976020860186612b4d565b60ff161415611d3357611cb26101408501610120860161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b60206040518083038186803b158015611cf457600080fd5b505afa158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c9190612b34565b9050611e26565b5047611e26565b8415611d9a57611d50606085016040860161290f565b6001600160a01b03166370a08231611d6e60a087016080880161290f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611cdc565b611daa606085016040860161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e239190612b34565b90505b9250925092565b600080611e43610608606086016040870161290f565b15612062578415611e9d57611e7283611e6260a087016080880161290f565b6001600160a01b031631906122bc565b91508360c00135821015611e985760405162461bcd60e51b815260040161046990612e63565b6122b4565b6002611eac6020860186612b4d565b60ff161415611f6d57611f4b83611ecb6101408701610120880161290f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a08231906024015b60206040518083038186803b158015611f0d57600080fd5b505afa158015611f21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f459190612b34565b906122bc565b9150611f68611f626101408601610120870161290f565b836127c4565b611f7a565b611f7747846122bc565b91505b6007546001600160a01b03166319fa763a3384611f9a6020890189612b4d565b611fa760e08a018a612f7b565b6040518663ffffffff1660e01b8152600401611fc7959493929190612ce4565b60206040518083038186803b158015611fdf57600080fd5b505afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612b34565b905061202382826122bc565b91508360c001358210156120495760405162461bcd60e51b815260040161046990612e63565b611e9861205c60a086016080870161290f565b83611749565b84156120c657611e728361207c606087016040880161290f565b6001600160a01b03166370a0823161209a60a0890160808a0161290f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401611ef5565b6120da83611ecb606087016040880161290f565b6007549092506001600160a01b03166319fa763a33846120fd6020890189612b4d565b61210a60e08a018a612f7b565b6040518663ffffffff1660e01b815260040161212a959493929190612ce4565b60206040518083038186803b15801561214257600080fd5b505afa158015612156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217a9190612b34565b905061218682826122bc565b9150600061219a606086016040870161290f565b6001600160a01b03166370a082316121b860a088016080890161290f565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156121f757600080fd5b505afa15801561220b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222f9190612b34565b905061225a612244606087016040880161290f565b61225460a088016080890161290f565b85612442565b61228c8161226e606088016040890161290f565b6001600160a01b03166370a0823161209a60a08a0160808b0161290f565b92508460c001358310156122b25760405162461bcd60e51b815260040161046990612e63565b505b935093915050565b6000826122c98382613055565b91508111156115e05760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610469565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916123769190612b91565b6000604051808303816000865af19150503d80600081146123b3576040519150601f19603f3d011682016040523d82523d6000602084013e6123b8565b606091505b50915091508180156123e25750805115806123e25750808060200190518101906123e29190612aa3565b61243a5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b6064820152608401610469565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161249e9190612b91565b6000604051808303816000865af19150503d80600081146124db576040519150601f19603f3d011682016040523d82523d6000602084013e6124e0565b606091505b509150915081801561250a57508051158061250a57508080602001905181019061250a9190612aa3565b6125645760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657248656c7065723a205452414e534645525f544f4b454e5f46604482015264105253115160da1b6064820152608401610469565b5050505050565b60606115e08260405160200161258391815260200190565b6040516020818303038152906040525b80516060906f181899199a1a9b1b9c1cb0b131b232b360811b906000906125bb906002613036565b6125c690600261301e565b67ffffffffffffffff8111156125de576125de6130df565b6040519080825280601f01601f191660200182016040528015612608576020820181803683370190505b509050600360fc1b81600081518110612623576126236130c9565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612652576126526130c9565b60200101906001600160f81b031916908160001a90535060005b84518110156127735782600486838151811061268a5761268a6130c9565b01602001516001600160f81b031916901c60f81c601081106126ae576126ae6130c9565b1a60f81b826126be836002613036565b6126c990600261301e565b815181106126d9576126d96130c9565b60200101906001600160f81b031916908160001a90535082858281518110612703576127036130c9565b60209101015160f81c600f166010811061271f5761271f6130c9565b1a60f81b8261272f836002613036565b61273a90600361301e565b8151811061274a5761274a6130c9565b60200101906001600160f81b031916908160001a9053508061276b81613098565b91505061266c565b509392505050565b60055460ff166108d15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610469565b600080836001600160a01b03166000632e1a7d4d856040516024016127eb91815260200190565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516128249190612b91565b60006040518083038185875af1925050503d8060008114612861576040519150601f19603f3d011682016040523d82523d6000602084013e612866565b606091505b50915091508180156128905750805115806128905750808060200190518101906128909190612aa3565b6128dc5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a2057495448445241575f4641494c4544006044820152606401610469565b50505050565b80356001600160a01b03811681146128f957600080fd5b919050565b803560ff811681146128f957600080fd5b60006020828403121561292157600080fd5b61292a826128e2565b9392505050565b6000806040838503121561294457600080fd5b823567ffffffffffffffff81111561295b57600080fd5b8301601f8101851361296c57600080fd5b8035602061298161297c83612ffa565b612fc9565b80838252828201915082850189848660051b88010111156129a157600080fd5b600095505b848610156129cb576129b7816128e2565b8352600195909501949183019183016129a6565b5095506129db90508682016128e2565b93505050509250929050565b600060208083850312156129fa57600080fd5b823567ffffffffffffffff811115612a1157600080fd5b8301601f81018513612a2257600080fd5b8035612a3061297c82612ffa565b80828252848201915084840188868560051b8701011115612a5057600080fd5b600094505b83851015612a7a57612a66816128fe565b835260019490940193918501918501612a55565b50979650505050505050565b600060208284031215612a9857600080fd5b813561292a816130f5565b600060208284031215612ab557600080fd5b815161292a816130f5565b60008060408385031215612ad357600080fd5b823567ffffffffffffffff80821115612aeb57600080fd5b908401906101408287031215612b0057600080fd5b90925060208401359080821115612b1657600080fd5b50830160608186031215612b2957600080fd5b809150509250929050565b600060208284031215612b4657600080fd5b5051919050565b600060208284031215612b5f57600080fd5b61292a826128fe565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60008251612ba381846020870161306c565b9190910192915050565b60008351612bbf81846020880161306c565b650a0c2dcd2c6560d31b9083019081528351612be281600684016020880161306c565b602960f81b60069290910191820152600701949350505050565b60008351612c0e81846020880161306c565b670aadcd6dcdeeedc560c31b9083019081528351612c3381600884016020880161306c565b602960f81b60089290910191820152600901949350505050565b60008351612c5f81846020880161306c565b6508ae4e4dee4560d31b9083019081528351612be281600684016020880161306c565b600061012060018060a01b038d1683528b151560208401528a60408401528960608401528860808401528760a08401528660c08401528060e0840152612ccb8184018688612b68565b915050826101008301529b9a5050505050505050505050565b60018060a01b038616815284602082015260ff84166040820152608060608201526000612d15608083018486612b68565b979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612d5c57815160ff1684529284019290840190600101612d3d565b5050508381038285015284518082528583019183019060005b81811015612d93578351151583529284019291840191600101612d75565b5090979650505050505050565b6020815260008251806020840152612dbf81604085016020870161306c565b601f01601f19169190910160400192915050565b6020808252602c908201527f5472616e736974537761703a20616d6f756e742073686f756c6420626520677260408201526b06561746572207468616e20360a41b606082015260800190565b60208082526024908201527f5472616e736974537761703a20646174612073686f756c64206265206e6f74206040820152637a65726f60e01b606082015260800190565b60208082526027908201527f5472616e736974537761703a20696e73756666696369656e742072657475726e60408201526608185b5bdd5b9d60ca1b606082015260800190565b60208082526022908201527f5472616e736974537761703a20696e76616c69642063616c6c62797465734465604082015261736360f01b606082015260800190565b6020815260ff612efb836128fe565b16602082015260018060a01b03612f14602084016128e2565b16604082015260006040830135601e19843603018112612f3357600080fd5b8301803567ffffffffffffffff811115612f4c57600080fd5b803603851315612f5b57600080fd5b606080850152612f72608085018260208501612b68565b95945050505050565b6000808335601e19843603018112612f9257600080fd5b83018035915067ffffffffffffffff821115612fad57600080fd5b602001915036819003821315612fc257600080fd5b9250929050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612ff257612ff26130df565b604052919050565b600067ffffffffffffffff821115613014576130146130df565b5060051b60200190565b60008219821115613031576130316130b3565b500190565b6000816000190483118215151615613050576130506130b3565b500290565b600082821015613067576130676130b3565b500390565b60005b8381101561308757818101518382015260200161306f565b838111156128dc5750506000910152565b60006000198214156130ac576130ac6130b3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146108b457600080fdfea26469706673582212202568280db7122de81915bbff6786f79470fb83608b7e6bb39a932810629f779c64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f7a2f863299c17dfa11cd8a14e7c7dca92f315b90000000000000000000000008755773dc777b9f9b2e2c86402a03f099f8236910000000000000000000000001f6e41c47349634fe261403a18f8515546f58826000000000000000000000000490494393fb90599365c1303e486afe52bbab866

-----Decoded View---------------
Arg [0] : transitSwap_ (address): 0xf7A2f863299C17dfA11CD8a14e7c7DCA92f315B9
Arg [1] : transitCross_ (address): 0x8755773dc777B9F9B2E2c86402A03F099F823691
Arg [2] : transitFees_ (address): 0x1F6E41c47349634Fe261403A18F8515546f58826
Arg [3] : executor (address): 0x490494393fb90599365c1303E486AfE52BBab866

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f7a2f863299c17dfa11cd8a14e7c7dca92f315b9
Arg [1] : 0000000000000000000000008755773dc777b9f9b2e2c86402a03f099f823691
Arg [2] : 0000000000000000000000001f6e41c47349634fe261403a18f8515546f58826
Arg [3] : 000000000000000000000000490494393fb90599365c1303e486afe52bbab866


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Chain Token Portfolio % Price Amount Value
BSC63.70%$0.009053463,360.8915$4,194.57
BSC5.33%$0.0300211,694.9809$351.08
BSC2.55%$0.00689624,378.326$168.12
BSC1.57%$89,125.380.00115905$103.3
BSC1.52%$2.8335.421$100.24
BSC0.98%$0.087484735.8915$64.38
BSC0.94%$3.9515.719$62.02
BSC0.86%$0.0000252,260,737.0381$56.77
BSC0.63%$0.99996341.3676$41.37
BSC0.57%$0.00258914,465.6247$37.46
BSC0.53%$8.394.1442$34.78
BSC0.39%$636.080.0404$25.68
BSC0.38%$83.160.2983$24.81
BSC0.30%$0.64254430.8725$19.84
BSC0.28%$21.980.8512$18.71
BSC0.25%$214.990.0752$16.17
BSC0.23%$1.848.3268$15.32
BSC0.22%$0.00020571,936.3708$14.71
BSC0.22%<$0.00000115,306,388,863.4125$14.7
BSC0.22%$0.0026925,406.1308$14.56
BSC0.15%$4.932.0415$10.06
BSC0.09%<$0.0000017,523,285,261.766$6.02
BSC0.09%$0.0091626.9752$5.71
BSC0.09%$0.16159835.1513$5.68
BSC0.08%$5.480.9691$5.31
BSC0.08%$0.9989125.1055$5.1
BSC0.08%$0.0000013,951,776.4537$4.98
BSC0.06%$0.14790328.9192$4.28
BSC0.05%$0.028801124.2614$3.58
BSC0.05%$0.0000012,400,000$3.09
BSC0.04%<$0.00000171,006,433.1887$2.96
BSC0.04%<$0.0000012,822,000,088.2853$2.82
BSC0.04%$0.7668193.6027$2.76
BSC0.04%<$0.00000167,176,130.8352$2.67
BSC0.04%$0.13547218.993$2.57
BSC0.03%$7.580.2815$2.13
BSC0.03%$0.0005373,895.9812$2.09
BSC0.03%$2.160.9536$2.06
BSC0.03%$0.002329856.1557$1.99
BSC0.03%$0.0003136,119.871$1.91
BSC0.03%$0.1827219.15$1.67
BSC0.02%$0.1655119.7854$1.62
BSC0.02%$0.01708874.8046$1.28
BSC0.02%$635.70.00191094$1.21
BSC0.02%$13.320.087$1.16
BSC0.02%$0.0000011,094,764.0365$1.11
BSC0.02%$0.0004162,639.1934$1.1
BSC0.02%$0.004626234.4716$1.08
BSC0.02%$0.201315.3609$1.08
BSC0.02%$0.9996951.0493$1.05
BSC0.02%<$0.000001477,900,359.0479$1.01
BSC0.01%$0.00891107.5923$0.9586
BSC0.01%$0.01550455.0945$0.8541
BSC0.01%<$0.0000015,187,161.906$0.8413
BSC0.01%$0.04602817.0512$0.7848
BSC0.01%$3.970.1857$0.7369
BSC0.01%$0.0001654,198.9865$0.6948
BSC0.01%$0.06206210.6569$0.6613
BSC<0.01%$0.001047600$0.6283
BSC<0.01%$0.002508249.137$0.6248
BSC<0.01%$0.5577511.0202$0.569
BSC<0.01%$0.001848300$0.5545
BSC<0.01%$0.001526300.6277$0.4586
BSC<0.01%$10.4298$0.4302
BSC<0.01%$0.00460892.1331$0.4245
BSC<0.01%$0.01346930.244$0.4073
BSC<0.01%$0.02990913.5849$0.4063
BSC<0.01%$0.001169345.2912$0.4036
BSC<0.01%$2.930.1327$0.389
BSC<0.01%$0.00413293.9645$0.3882
BSC<0.01%$0.1539342.484$0.3823
BSC<0.01%$0.00849942.0765$0.3576
BSC<0.01%$0.001803196.0487$0.3535
BSC<0.01%$0.1017943.1103$0.3166
BSC<0.01%$0.0337638.982$0.3032
BSC<0.01%$0.5424630.5484$0.2974
BSC<0.01%$0.002696108.9856$0.2938
BSC<0.01%$0.2845481$0.2845
BSC<0.01%$0.0001152,212.9919$0.2552
BSC<0.01%$0.02026112.1653$0.2464
BSC<0.01%$0.00594139.9045$0.237
BSC<0.01%$0.000995234.6285$0.2335
BSC<0.01%<$0.00000171,624,669.4848$0.2005
BSC<0.01%$0.2619650.754$0.1975
BSC<0.01%$0.1464681.2404$0.1816
BSC<0.01%$0.000424426.3924$0.1807
BSC<0.01%$0.01220714.4614$0.1765
BSC<0.01%$0.0570853.0362$0.1733
BSC<0.01%$0.0032453.3311$0.1727
BSC<0.01%<$0.0000017,036,607.3786$0.1706
BSC<0.01%$0.00527930.9605$0.1634
BSC<0.01%$0.01177913.797$0.1625
BSC<0.01%$0.00456335.5167$0.162
BSC<0.01%$0.1303431.1524$0.1502
BSC<0.01%$0.00000722,138.8298$0.1467
BSC<0.01%$0.000944151.6376$0.1432
BSC<0.01%$6.860.0206$0.1415
BSC<0.01%$0.2487550.54$0.1343
BSC<0.01%$0.1371830.8996$0.1234
BSC<0.01%$0.0000148,740.7929$0.1223
BSC<0.01%$10.1099$0.11
BSC<0.01%$0.000207496.382$0.1025
POL7.86%$1515.7979$517.35
POL1.26%$183.065$83.23
POL1.17%$3,133.370.0245$76.77
POL0.57%$1.8919.9803$37.76
POL0.28%$0.27493268.1731$18.74
POL0.12%$17.5798$7.59
POL0.11%$0.0063541,173$7.45
POL0.10%$0.36388117.6778$6.43
POL<0.01%$1650.0015114$0.2493
POL<0.01%$0.0480252.721$0.1306
POL<0.01%$0.0388952.9269$0.1138
POL<0.01%<$0.0000016,988,856.8506$0.1132
POL<0.01%$0.0000254,298.0768$0.1079
ETH0.95%$0.0000252,501,064.2832$62.8
ETH0.36%$0.00121119,510.5188$23.63
ETH0.35%$0.00000122,075,996.1837$22.98
ETH0.19%$0.5030824.3226$12.24
ETH0.14%$0.0000019,136,558.8462$9.41
ETH0.14%$0.37001124.8883$9.21
ETH0.12%$17.7778$7.79
ETH0.10%$0.00050813,239.4165$6.73
ETH0.10%<$0.00000184,111,742.394$6.49
ETH0.08%$0.32875415.6915$5.16
ETH0.06%$0.4839398.3846$4.06
ETH0.06%$3,131.460.00123988$3.88
ETH0.06%$0.06856555.3536$3.8
ETH0.04%$12.7222$2.73
ETH0.04%<$0.00000119,963,276.7667$2.65
ETH0.03%$0.0004964,592.8372$2.28
ETH0.03%<$0.0000011,382,220,359.3416$2.18
ETH0.03%$17.810.1119$1.99
ETH0.03%$0.6062623.1004$1.88
ETH0.03%$0.09771717.298$1.69
ETH0.02%$1.11.1192$1.23
ETH0.02%$0.0370828.7549$1.07
ETH0.01%$0.06444115.2185$0.9806
ETH0.01%$16.780.057$0.9564
ETH0.01%$0.005667166.5919$0.944
ETH0.01%$0.000998815.771$0.8137
ETH0.01%<$0.000001676,392,656.4279$0.7953
ETH0.01%$0.001058702.7969$0.7432
ETH0.01%$0.00494150$0.741
ETH0.01%<$0.0000011,217,810,189.9807$0.6911
ETH<0.01%$0.01120555$0.6162
ETH<0.01%$0.2762321.9697$0.544
ETH<0.01%<$0.00000141,182,281.2616$0.5121
ETH<0.01%$0.0004251,160.6915$0.4928
ETH<0.01%$0.00316136.0772$0.4299
ETH<0.01%$0.0003181,171.8553$0.3731
ETH<0.01%$0.002909105.4733$0.3068
ETH<0.01%$0.0157518.5179$0.2916
ETH<0.01%<$0.0000011,518,523.9146$0.2476
ETH<0.01%$0.000345333.849$0.115
ETH<0.01%$0.000409251$0.1025
FTM0.65%$0.6988961.5424$43.01
FTM<0.01%$0.0234657.5$0.1759
FTM<0.01%<$0.000001726,499.3845$0.1164
GLMR0.64%$0.99982742.144$42.14
GLMR<0.01%$0.1716982.1092$0.362147
AVAX0.28%$32.380.5636$18.25
AVAX0.15%$110.0827$10.09
AVAX0.10%$0.9999636.3673$6.37
AVAX0.03%$11.955$1.96
AVAX<0.01%$0.8610150.6377$0.549
AVAX<0.01%$0.1303362.4678$0.3216
AVAX<0.01%$4,707.690.00005726$0.2695
AVAX<0.01%$0.6141280.3675$0.2256
ARB0.07%<$0.00000112,566,938.1126$4.46
ARB0.02%$3,131.950.00045758$1.43
OP0.05%$1.592.2438$3.56
OP0.02%$3,131.550.00044456$1.39
OP<0.01%$10.4363$0.4363
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.