ETH Price: $2,187.78 (-5.67%)

Contract

0xFd2eB7b77Ff18f3fea228790De4F45efA60bc4fd
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

6 Internal Transactions found.

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Lido Request Wit...237445462025-11-07 2:55:11132 days ago1762484111
0xFd2eB7b7...fA60bc4fd
0 ETH
Deposit By Lido237445312025-11-07 2:52:11132 days ago1762483931
0xFd2eB7b7...fA60bc4fd
0 ETH
Lido Request Wit...237445282025-11-07 2:51:35132 days ago1762483895
0xFd2eB7b7...fA60bc4fd
0 ETH
Deposit By Lido237445192025-11-07 2:49:47132 days ago1762483787
0xFd2eB7b7...fA60bc4fd
0 ETH
Init Managers237444302025-11-07 2:31:59132 days ago1762482719
0xFd2eB7b7...fA60bc4fd
0 ETH
Init Owner237444302025-11-07 2:31:59132 days ago1762482719
0xFd2eB7b7...fA60bc4fd
0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiSigColdStd

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./interfaces/IMultiSigCold.sol";
import "./interfaces/IERC20Minimal.sol";
import "./interfaces/IMultiSigAgent.sol";
import "./interfaces/IAsset.sol";
import "./interfaces/IAggregatedHelper.sol";
import "./interfaces/IPayPool.sol";

import "./MultiSig.sol";


contract MultiSigColdStd is IMultiSigCold,MultiSig{
    IPayPool public payPool;
    constructor() {

    }


    /// @dev 资金平衡间隔时间
    uint public lastBalancedTime;
    /// 商户配置
    Merchant public merchant;
    /// 项目多签地址
    IMultiSigUtc public multiSigUtc;

    uint public ownerStatus;
    address private _owner;
    address public emergencyWithdrawAddr;
    //平衡最大数量
    mapping(address => uint256) public hotCoinMaxNum;

    error OwnableUnauthorizedAccount(address account);
    receive() external payable {

    }
    fallback() external payable {

    }
    function initOwner() external{
        require(ownerStatus!=10,"only init once");
        address payPoolImpl;
        address impl=0x58833317b38D33F6f27Dd56F4C132e42ac14d82B;
        //keccak256(abi.encodePacked("SPayPoolFactory"));
        bytes32 salt=0x21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e;
        assembly {
            mstore(0x00, or(shr(0xe8, shl(0x60, impl)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            mstore(0x20, or(shl(0x78, impl), 0x5af43d82803e903d91602b57fd5bf3))
            payPoolImpl := create2(0, 0x09, 0x37, salt)
        }
        payPool=IPayPool(payPoolImpl);
        payPool.initOwner();
        ownerStatus=10;
        _owner = msg.sender;
    }
    modifier onlyOwner() {
        if (owner() !=msg.sender) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
        _;
    }
    function owner() public view returns (address) {
        return _owner;
    }

    /// @dev 初始化冷合约多签管理员列表
    /// @param data 商户配置
    /// @param _multiSigUtc utc多签地址
    /// @param ratio 多签通过比例
    /// @param _managers 多签管理员
    function initManagers(Merchant memory data,IMultiSigUtc _multiSigUtc,uint ratio,uint expirationTime,address[] memory _managers) external onlyOwner{
        require(status!=10,"only init once");
        require(ratio >= 60 && ratio <= 100);
        status=10;
        multiSigUtc=_multiSigUtc;
        uint length=_managers.length;
        require(length>=3,"Manager cannot be less than three");
        for (uint i=1;i<length;++i) {
            require(_managers[i] > _managers[i-1]);
        }
        managerInfo=ManagerInfo(getManagerNumber(length,ratio,1e2),expirationTime,_managers);
        merchant = data;
        _ratio=ratio;
    }
    /// @dev 获取商户代理配置
    function getMerAgentConfigData() external view returns (uint256 primAgentProfitPerc,uint256 feeRate,address multiSigAgentAddr,address feeAddr){
        Merchant memory _merchant=merchant;
        return (
            _merchant.primAgentProfitPerc,
            _merchant.feeRate,
            _merchant.multiSigAgentAddr,
            multiSigUtc.getUtcFeeAddr()
        );
    }

    /// @dev 费用计算
    function _calculateCommission(uint256 _amount,address primAgentFeeAddr,Merchant memory _merchant) internal pure returns (
        uint256 totalCommission,
        uint256 primCommission,
        uint256 web3PayCommission,
        uint256 transBalHot
    ) {
        totalCommission = (_amount * _merchant.feeRate) / 1e4;
        primCommission = primAgentFeeAddr != address(0)?(totalCommission * _merchant.primAgentProfitPerc) / 1e2:0;
        web3PayCommission = totalCommission - primCommission;
        transBalHot = _amount - totalCommission;
    }

    /// @dev 资金平衡
    function balFundsToHot(address[] memory erc20s) external nonReentrant {
        Merchant memory _merchant=merchant;
        require(block.timestamp - lastBalancedTime>_merchant.balancedTime, "Balance funds interval time limit");
        lastBalancedTime=block.timestamp;
        bytes memory ethTransactions;
        uint hotBalance=_merchant.hotPool.balance;
        uint coldBalance=_merchant.coldPool.balance;
        uint amount=getHotBalanceFunds(hotBalance,coldBalance,hotCoinMaxNum[address(0)]);
        uint256 totalCommission;
        uint256 primCommission;
        uint256 web3PayCommission;
        uint256 transBalHot;
        address primAgentFeeAddr = address(0);
        if(_merchant.multiSigAgentAddr!=address(0)){
            primAgentFeeAddr=IMultiSigAgent(_merchant.multiSigAgentAddr).getPrimAgentFeeAddr();
        }
        address utcFeeAddr=multiSigUtc.getUtcFeeAddr();

        /// Tokens are transferred to the hot contract
        if(amount > 0){
            (totalCommission,primCommission,web3PayCommission,transBalHot) = _calculateCommission(amount,primAgentFeeAddr,_merchant);
            ethTransactions=abi.encodePacked(ethTransactions,_merchant.hotPool,transBalHot);
            ethTransactions=abi.encodePacked(ethTransactions,utcFeeAddr,web3PayCommission);
            if(primAgentFeeAddr!= address(0)){
                ethTransactions=abi.encodePacked(ethTransactions,primAgentFeeAddr,primCommission);
            }
            emit TransferCommissionLogs(address(0), totalCommission, primCommission,  web3PayCommission, transBalHot);
            IAsset(_merchant.coldPool).sendEths(ethTransactions);
        }
        bytes memory erc20Transactions;
        for(uint i; i<erc20s.length; ++i) {
            hotBalance = _balance(erc20s[i],_merchant.hotPool);
            coldBalance=_balance(erc20s[i],_merchant.coldPool);
            {
                address erc20 = erc20s[i];
                /// Calculate the balance that needs to be transferred to the hot contract
                amount = getHotBalanceFunds(hotBalance,coldBalance, hotCoinMaxNum[erc20]);
            }
            /// Tokens are transferred to the merchant hot contract
            if(amount > 0){
                /// commission amount
                (totalCommission,primCommission,web3PayCommission,transBalHot) = _calculateCommission(amount,primAgentFeeAddr,_merchant);
                /// The balance funds transferred to the hot contract, after deducting the funds after continuing to pay
                erc20Transactions=abi.encodePacked(
                    erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, _merchant.hotPool,transBalHot)
                );
                /// transfer fee
                erc20Transactions=abi.encodePacked(
                    erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, utcFeeAddr,web3PayCommission)
                );
                if(primAgentFeeAddr!= address(0)){
                    erc20Transactions=abi.encodePacked(
                        erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, primAgentFeeAddr,primCommission)
                    );
                }
                emit TransferCommissionLogs(erc20s[i], totalCommission, primCommission,  web3PayCommission, transBalHot);
            }
        }
        if(erc20Transactions.length > 0){
            IAsset(_merchant.coldPool).sendErc20(erc20Transactions);
        }
    }

    function _balance(address _token,address holder) internal view returns (uint256) {
        (bool success, bytes memory data) = _token.staticcall(
            abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, holder)
        );
        require(success && data.length >= 32);
        return abi.decode(data, (uint256));
    }

    /// @dev 资金占比计算
    function getHotBalanceFunds(uint256 hotErc20BalanceOf,uint256 coldErc20BalanceOf,uint256 hotCoinMaxBal) internal pure returns(uint256 hotTransferErc20BalanceOf) {
        assembly {
            hotTransferErc20BalanceOf := 0
            if gt (hotCoinMaxBal,hotErc20BalanceOf){
                hotTransferErc20BalanceOf := sub(hotCoinMaxBal,hotErc20BalanceOf)
            }
            if gt (hotTransferErc20BalanceOf, 0) {
                if gt (hotTransferErc20BalanceOf,coldErc20BalanceOf) {
                    hotTransferErc20BalanceOf := coldErc20BalanceOf
                }
            }
        }
    }

    function _transfer(address token,address to,uint256 amount) internal  {
        if(token==address(0)){
            IAsset(merchant.coldPool).sendEths(abi.encodePacked(
                to,amount
            ));
        }else{
            IAsset(merchant.coldPool).sendErc20(abi.encodePacked(
                token,abi.encodeWithSelector(0xa9059cbb, to,amount)
            ));
        }
    }
    function getColdPool() external view returns(address)  {
        return merchant.coldPool;
    }
    function depositByAave(address token,uint256 assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                _transfer(token,address(payPool),assets);
                payPool.depositByAave(token);
                return;
            }
        }
    }
    function depositByLido(address token,uint256 assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                _transfer(token,address(payPool),assets);
                payPool.depositByLido(token);
                return;
            }
        }
    }
    function depositByEthenaStakeUsde(uint assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                _transfer(payPool.usdeToken(),address(payPool),assets);
                payPool.depositByEthenaStakeUsde();
                return;
            }
        }
    }

    function withdrawByAave(address token,uint256 assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                payPool.withdrawByAave(token,assets);
                return;
            }
        }
    }

    // 请求提现
    function lidoRequestWithdrawals(address token,uint256[] calldata _amounts)external returns (uint256[] memory requestIds){
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                return payPool.lidoRequestWithdrawals(token,_amounts);
            }
        }
    }
    function withdrawByLido(uint256[] memory requestIds,address token,uint assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                payPool.withdrawByLido(requestIds,token,assets);
                return;
            }
        }
    }

    function cooldownSharesForEthenaStake() external {
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                payPool.cooldownSharesForEthenaStake();
                return;
            }
        }
    }
    function withdrawByEthenaStakeUsde(uint assets) external{
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                payPool.withdrawByEthenaStakeUsde(assets);
                return;
            }
        }
    }
    function setHotCoinMaxRatio(uint hotCoinMaxRatio,bytes memory signatures) external {
        require(hotCoinMaxRatio<=100);
        ManagerInfo memory _managerInfo=managerInfo;
        uint managerNumber= _managerInfo.managerNumber;
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        address[] memory managers=_managerInfo.managers;
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotCoinMaxRatio.selector, hotCoinMaxRatio,new bytes(0)));
        address lastOwner = address(0);
        address currentOwner;
        uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<managerNumber;++i) {
            (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        merchant.hotCoinMaxRatio = hotCoinMaxRatio;
    }
    function setBalancedTime(uint balancedTime,bytes memory signatures) external {
        ManagerInfo memory _managerInfo=managerInfo;
        uint managerNumber= _managerInfo.managerNumber;
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        address[] memory managers=_managerInfo.managers;
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setBalancedTime.selector, balancedTime,new bytes(0)));
        address lastOwner = address(0);
        address currentOwner;
        uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<managerNumber;++i) {
            (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        merchant.balancedTime = balancedTime;
    }

    // @dev 修改hotpool地址
    function setHotPool(address payable hotPool,bytes memory signatures) external {
        ManagerInfo memory _managerInfo=managerInfo;
        uint managerNumber= _managerInfo.managerNumber;
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        address[] memory managers=_managerInfo.managers;
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotPool.selector, hotPool,new bytes(0)));
        address lastOwner = address(0);
        address currentOwner;
        uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<managerNumber;++i) {
            (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        merchant.hotPool = hotPool;
    }

    // @dev
    function setHotCoinMaxNum(address erc20,uint256 maxNum,bytes memory signatures) external {
        ManagerInfo memory _managerInfo=managerInfo;
        uint managerNumber= _managerInfo.managerNumber;
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        address[] memory managers=_managerInfo.managers;
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotCoinMaxNum.selector, erc20, maxNum,new bytes(0)));
        address lastOwner = address(0);
        address currentOwner;
        //uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<managerNumber;++i) {
            (uint t,uint8 j,uint8 v,bytes32 r,bytes32 s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        hotCoinMaxNum[erc20] = maxNum;
    }

    function setPrimAgentProfitPercAndFeeRate(uint primAgentProfitPerc,uint feeRate,bytes memory signatures) external {
        {
            bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setPrimAgentProfitPercAndFeeRate.selector,
                primAgentProfitPerc,feeRate,new bytes(0)));
            ManagerInfo memory _managerInfo=managerInfo;
            uint managerNumber= _managerInfo.managerNumber;
            uint expirationTime= block.timestamp-_managerInfo.expirationTime;
            address[] memory managers=_managerInfo.managers;
            address lastOwner = address(0);
            address currentOwner;
            uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
            for (uint i;i<managerNumber;++i) {
                (t,j,v, r, s) = signatureSplit(signatures, i);
                require(t > expirationTime);
                currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
                require(currentOwner > lastOwner);
                require(currentOwner==managers[j]);
                lastOwner = currentOwner;
            }
            (,uint _expirationTime,address[] memory utcManagers)=multiSigUtc.getManagerInfo();
            (t,j,v, r, s) = signatureSplit(signatures, managerNumber);
            require(t>_expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            //The Web3pay administrator is required to participate in a vote
            require(currentOwner==utcManagers[j],"Web3 Pay Manager Error");
        }

        merchant.primAgentProfitPerc =primAgentProfitPerc;
        merchant.feeRate =feeRate;
    }
    function setMultiSigAgentAddr(address multiSigAgentAddr,bytes memory signatures) external {
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setMultiSigAgentAddr.selector,multiSigAgentAddr,new bytes(0)));
        (uint utcManagerNumber,uint _expirationTime,address[] memory utcManagers)=multiSigUtc.getManagerInfo();
        uint expirationTime= block.timestamp-_expirationTime;
        address lastOwner = address(0);
        address currentOwner;
        uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<utcManagerNumber;++i) {
            (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==utcManagers[j]);
            lastOwner = currentOwner;
        }
        merchant.multiSigAgentAddr=multiSigAgentAddr;
    }
    function aggregatedHelperSetTokens(uint managerIndex,IAggregatedHelper aggregatedHelper,address[] memory _tokens) external{
        require(managerInfo.managers[managerIndex]==msg.sender,"only manager");
        aggregatedHelper.setTokens(_tokens);
    }
    function setEmergencyWithdrawAddr(address emergencyWithdrawAddress,bytes memory signatures) external {
        ManagerInfo memory _managerInfo=managerInfo;
        uint managerNumber= _managerInfo.managerNumber;
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        address[] memory managers=_managerInfo.managers;
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setEmergencyWithdrawAddr.selector, emergencyWithdrawAddress,new bytes(0)));
        address lastOwner = address(0);
        address currentOwner;
        //uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
        for (uint i;i<managerNumber;++i) {
            (uint t,uint8 j,uint8 v,bytes32 r,bytes32 s) = signatureSplit(signatures, i);
            require(t > expirationTime);
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        emergencyWithdrawAddr=emergencyWithdrawAddress;
    }

    function EmergencyCall(
        bytes calldata data,
        uint poolType,
        address expectLendingPool
    ) external returns(bool success,bytes memory returnData){
        address[] memory managers=managerInfo.managers;
        uint mlength=managers.length;
        address currentOwner=msg.sender;
        for (uint i;i<mlength;++i) {
            if(currentOwner==managers[i]){
                return payPool.EmergencyCall(data,poolType,expectLendingPool);
            }
        }
    }
}

//0x291459D95e4c915Ca4922Bd779476e95A05b4c71

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./interfaces/ReentrancyGuard.sol";
import "./interfaces/IMultiSig.sol";
//多签抽象共用合约,被冷合约多签和热合约多签继承的公用方法
abstract contract MultiSig is ReentrancyGuard,IMultiSig{
    //多签合约管理员信息
    struct ManagerInfo {
        uint256 managerNumber; /// 至少需要多签的签名数量
        uint256 expirationTime;/// 签名有效期限
        address[] managers; ///多签管理员名单列表,地址是有序的,顺序是从小到大
    }
    ManagerInfo managerInfo;
    //为了首次初始化操作使用,如果等于10代表已经初始化过
    uint public status;
    /// 至少需要多签的签名比例,用于计算至少需要多签的签名数量
    uint _ratio;
    function getManagerRatio() external view returns(uint){
        return _ratio;
    }
    function getManagerInfo() external virtual view returns(uint managerNumber,uint expirationTime,address[] memory managers){
        ManagerInfo memory _managerInfo=managerInfo;
        managerNumber= _managerInfo.managerNumber;
        expirationTime= _managerInfo.expirationTime;
        managers=_managerInfo.managers;
    }
    //通过多签的签名比例计算出至少需要多签的签名数量
    function getManagerNumber(uint managerLength,uint ratio,uint base)internal pure returns (uint managerNumber) {
        assembly {
            let numerator := mul(managerLength, ratio)
            let addendum  := sub(base, 1)
            managerNumber := div(add(numerator, addendum), base)
        }
    }
    //设置多签的签名比例
    //ratio为签名比例,精度为100,比如ratio为70代表百分之七十(70%)
    //signatures是签名数据
    function setManagerRatio(uint ratio,bytes memory signatures) external virtual nonReentrant{
        //获取管理员信息
        ManagerInfo memory _managerInfo=managerInfo;
        //获取需要多签的签名数量
        uint managerNumber= _managerInfo.managerNumber;
        //获取签名有效期限(截止时间,单位为妙)
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        //获多签管理员名单列表
        address[] memory managers=_managerInfo.managers;
        //最近签名过的管理员地址,用于排重用途
        address lastOwner = address(0);
        //当前签名的管理员地址,用于验签用途
        address currentOwner;
        uint t;//签名的时间戳(秒为单位)
        uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
        uint8 v;//签名数据V
        bytes32 r;//签名数据R
        bytes32 s;//签名数据S

        //签名的原始数据datahash,满足EIP712并包括合约nonce等信息
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setManagerRatio.selector, ratio,new bytes(0)));
        for (uint i;i<managerNumber;++i) {
             (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t >expirationTime);//验证是否过期
            //获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);//保证账户不会重复
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        managerNumber=getManagerNumber(managers.length,ratio,1e2);
        require(managerNumber>=2,"Manager cannot be less than two");
        managerInfo.managerNumber=managerNumber;
        _ratio=ratio;
    }
    //设置多签的签名有效时间
    //_expirationTime为签名有效时间,单位为秒
    //signatures是签名数据
    function setManagerExpTime(uint _expirationTime,bytes memory signatures) external virtual nonReentrant{
        //获取管理员信息
        ManagerInfo memory _managerInfo=managerInfo;
        //获取需要多签的签名数量
        uint managerNumber= _managerInfo.managerNumber;
        //获取签名有效期限(截止时间,单位为妙)
        uint expirationTime= block.timestamp-_managerInfo.expirationTime;
        //获多签管理员名单列表
        address[] memory managers=_managerInfo.managers;
        //最近签名过的管理员地址,用于排重用途
        address lastOwner = address(0);
        //当前签名的管理员地址,用于验签用途
        address currentOwner;
        uint t;//签名的时间戳(秒为单位)
        uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
        uint8 v;//签名数据V
        bytes32 r;//签名数据R
        bytes32 s;//签名数据S

        //签名的原始数据datahash,满足EIP712并包括合约nonce等信息
        bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setManagerExpTime.selector, _expirationTime,new bytes(0)));
        for (uint i;i<managerNumber;++i) {
             (t,j,v, r, s) = signatureSplit(signatures, i);
            require(t >expirationTime);//验证是否过期
            //获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
            currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
            require(currentOwner > lastOwner);//保证账户不会重复
            require(currentOwner==managers[j]);
            lastOwner = currentOwner;
        }
        managerInfo.expirationTime=_expirationTime;
    }
    //添加新的管理员
    //_target为新的管理员地址,_index为提前链下计算好的在管理员数组列表中插入的位置
    //signatures是签名数据
    function addManager(address _target,uint256 _index,bytes memory signatures) external virtual nonReentrant{
        //获取管理员信息
        ManagerInfo memory _managerInfo=managerInfo;
        //获多签管理员名单列表
        address[] memory managers=_managerInfo.managers;
        //获取需要多签的签名数量
        uint managerNumber= _managerInfo.managerNumber;
        {
            //签名的原始数据datahash,满足EIP712并包括合约nonce等信息
            bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.addManager.selector, _target,_index,new bytes(0)));
            //获取签名有效期限(截止时间,单位为妙)
            uint expirationTime= block.timestamp-_managerInfo.expirationTime;
            //最近签名过的管理员地址,用于排重用途
            address lastOwner = address(0);
            //当前签名的管理员地址,用于验签用途
            address currentOwner;
            uint t;//签名的时间戳(秒为单位)
            uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
            uint8 v;//签名数据V
            bytes32 r;//签名数据R
            bytes32 s;//签名数据S
            for (uint i;i<managerNumber;++i) {
                (t,j,v, r, s) = signatureSplit(signatures, i);
                require(t >expirationTime);//验证是否过期
                //获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
                currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
                require(currentOwner > lastOwner);//保证账户不会重复
                require(currentOwner==managers[j]);
                lastOwner = currentOwner;
            }
        }
        uint length=managers.length;
        //验证新添加地址的位置,保证顺序性
        if(_index==0){
            require(_target<managers[0]);
        }else if(_index<length){
            require(
                _target<managers[_index]&&
                _target>managers[_index-1]
            );
        }else{
            require(_index==length&&_target>managers[_index-1]);
        }
        //添加新的管理员空间
        managerInfo.managers.push();

        //重新赋值给临时内存变量managers,便于后面使用从而节省gas费用
        managers=managerInfo.managers;
        //从数组末尾向前遍列,后一位重新赋值为前一位数据直到需要插入数据的位置
        for(uint i=length;i>_index;--i){
            managers[i]=managers[i-1];
        }
        //插入数据位置替换为新添加的管理员
        managers[_index]=_target;
        managerInfo.managers=managers;
        //根据多签的签名比例,计算需要多签的签名数量进而重新设置多签的签名数量
        managerInfo.managerNumber=getManagerNumber(managers.length,_ratio,1e2);
    }
    //删除管理员
    //_target为需要删除的管理员地址,_index为提前链下计算好的在管理员数组列表中的位置
    //signatures是签名数据
    function rmManager(address _target,uint256 _index,bytes memory signatures) external virtual nonReentrant{
        //获取管理员信息
        ManagerInfo memory _managerInfo=managerInfo;
        //获多签管理员名单列表
        address[] memory managers=_managerInfo.managers;
        //获取需要多签的签名数量
        uint managerNumber= _managerInfo.managerNumber;
        {
            //签名的原始数据datahash,满足EIP712并包括合约nonce等信息
            bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.rmManager.selector,_target,_index,new bytes(0)));
            //获取签名有效期限(截止时间,单位为妙)
            uint expirationTime= block.timestamp-_managerInfo.expirationTime;
            //最近签名过的管理员地址,用于排重用途
            address lastOwner = address(0);
            //当前签名的管理员地址,用于验签用途
            address currentOwner;
            uint t;//签名的时间戳(秒为单位)
            uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
            uint8 v;//签名数据V
            bytes32 r;//签名数据R
            bytes32 s;//签名数据S
            for (uint i;i<managerNumber;++i) {
                (t,j,v, r, s) = signatureSplit(signatures, i);
                require(t >expirationTime);//验证是否过期
                //获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
                currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
                require(currentOwner > lastOwner);//保证账户不会重复
                require(currentOwner==managers[j]);
                lastOwner = currentOwner;
            }
        }
        uint length=managers.length;
        require(length >= 3 , "Manager cannot be less than three");
        require(managers[_index]==_target, "address is not exist");
        length=length-1;
        //从需要删除的管理员数组列表中的位置开始遍列,前一位重新赋值为后一位的数据直到数组末尾
        for (uint i=_index; i<length; ++i) {
            managers[i]=managers[i+1];
        }
        managerInfo.managers=managers;
        managerInfo.managers.pop();
        //根据多签的签名比例,计算需要多签的签名数量进而重新设置多签的签名数量
        managerInfo.managerNumber=getManagerNumber(length,_ratio,1e2);
    }
    
    //用于防止签名重复使用
    uint256 public nonce;
    // keccak256(
    //     "EIP712Domain(uint256 chainId,address verifyingContract)"
    // );
    bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;
    
    //满足EIP712以防止多链重入
    function _getTransactionHash(bytes memory transactions) internal returns (bytes32 txHash) {
        txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce++))));
    }
    function getTransactionHash(bytes memory transactions) external view returns (bytes32 txHash) {
        txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce))));
    }
    function _domainSeparator() internal view returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this));
    }
    //解析签名数据
    //signatures是签名数据,pos是签名分割的位置
    //t;签名的时间戳(秒为单位)
    //j;签名管理员在合约管理员信息的名单列表里面的位置(下标)
    //v;签名数据V
    //r;签名数据R
    //s;签名数据S
    function signatureSplit(bytes memory signatures, uint256 pos) internal pure returns (
        uint t,uint8 j,uint8 v,bytes32 r,bytes32 s
    ) {
        assembly {
            let signaturePos := mul(0x62, pos)
            r := mload(add(signatures, add(signaturePos, 0x20)))
            s := mload(add(signatures, add(signaturePos, 0x40)))
            t := mload(add(signatures, add(signaturePos, 0x60)))
            j := byte(0, mload(add(signatures, add(signaturePos, 0x80))))
            v := byte(0, mload(add(signatures, add(signaturePos, 0x81))))
        }
    }
    //混淆txHash和签名期限t的hash,然后加入以太坊签名前缀串
    function getHashWithTimestamp(bytes32 txHash,uint t)internal pure returns (bytes32 digest) {
        bytes32 messageHash=keccak256(abi.encodePacked(txHash, t));
        assembly {
            mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
        }
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./ILendingPool.sol";
import "./ICommonConfigs.sol";
import "./IWETH.sol";
interface IPayPool{
    event DepositByAave(address token,uint assets);
    event WithdrawByAave(address token,uint assets,uint amount,uint256 reward);

    event DepositByLido(address token,uint assets);
    event WithdrawByLido(address token,uint assets,uint amount,uint256 reward);

    event DepositByEthena(address token,uint assets);
    event WithdrawByEthena(address token,uint assets,uint amount,uint256 reward);
    function aaveLendingPool() external pure returns (ILendingPool);
    function lidoLendingPool() external pure returns (ILendingPool);
    function ethenaLendingPool() external pure returns (ILendingPool);
    function commonConfigs() external pure returns (ICommonConfigs);
    function usdeToken() external pure returns (address);
    function lendingAmount(uint _type,address _user) external view returns (uint);

    error OwnableUnauthorizedAccount(address account);
    error EthTransfer(address recipient, uint256 amount);
    error EthenaCooldownNotStart(address account);
    error EthenaCooldownNotEnd(address account);
    function initOwner()external;

    function depositByAave(address token) external returns (uint assets);
    function withdrawByAave(address token,uint assets) external returns(uint amount,uint256 reward);

    function depositByLido(address token) external returns (uint assets);
    function withdrawByLido(uint256[] memory requestIds,address token,uint assets)external returns(uint amount,uint256 reward);
    // 请求提现
    function lidoRequestWithdrawals(address token,uint256[] calldata _amounts)external returns (uint256[] memory requestIds);

    function depositByEthenaStakeUsde() external returns (uint assets);
    function cooldownSharesForEthenaStake() external returns (uint256 assets);
    function withdrawByEthenaStakeUsde(uint assets) external returns (uint amount,uint256 reward);

    function EmergencyCall(
        bytes calldata data,
        uint callType,
        address callAddr
    ) external returns(bool success,bytes memory returnData);

}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IAggregatedHelper{
    function aggregateAsset() external payable;
    function initConfig(address[] memory _tokens,address payable _coldPool,address _multiSigCold) external;
    function setTokens(address[] memory _tokens) external;
    event PaymentReceived(address indexed sender, address indexed token, uint256 indexed amount, uint256 orderId);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IAsset{
    function sendErc20(bytes memory transactions) external;
    function sendEths(bytes memory transactions) external payable;
    function initOwner(address initialOwner) external;
    event TransferEthTo(address indexed to, uint256 indexed timestamp, uint256 value);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IMultiSigAgent{
    function initManagers(uint ratio,uint expirationTime,address _primAgentFeeAddr,address[] memory _managers) external;
    function getPrimAgentFeeAddr() external view returns(address);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IERC20Minimal {
    function balanceOf(address account) external view returns (uint256);
    function transferFrom(address sender,address recipient,uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

import "./IMultiSigUtc.sol";
struct Merchant {
    /// Set the storage balance ratio of each merchant's hot contract
    uint256 hotCoinMaxRatio;
    /// Fee payment ratio for each merchant
    uint256 feeRate;
    /// Each merchant balance funds limit time
    uint256 balancedTime;
    /// The minimum voting ratio for multiple signatures for each merchant is at least 50 and the maximum is 100
    uint256 primAgentProfitPerc;
    /// Hot contract storage pool address
    address payable hotPool;
    /// Cold contract storage pool address
    address payable coldPool;
    /// Agent’s multi-signature address
    address multiSigAgentAddr;
}

interface IMultiSigCold{
    function initManagers(Merchant memory data,IMultiSigUtc _multiSigUtc,uint ratio,uint expirationTime,address[] memory _managers) external;
    function initOwner() external;
    event TransferCommissionLogs(address indexed token, uint256 indexed totalCommission,uint256 indexed primCommission,uint256 web3PayCommission,uint256 transBalHot);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IWETH {
    function deposit() external payable;
    function withdraw(uint256) external;
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./IMultiSigCold.sol";
interface ICommonConfigs{
     struct FeeInfo{
          address feeTo;
          uint16 feeRate;
     }
     function getFeeInfo(IMultiSigCold user)external view returns(uint,address);

     function setSupportEmergencyCalls(uint callType,address callAddr,bytes4 methodId,bytes memory signatures) external ;
     function setFeeRate(uint16 _feeRate,IMultiSigCold user,bytes memory signatures) external ;
     function setFreeFeeRate(IMultiSigCold user,bytes memory signatures) external ;
     function checkEmergencyCall(bytes memory data,uint callType,address callAddr)external view;
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./ILidoWithdrawalQueueERC721.sol";

interface ILendingPool {
     function withdraw(
          address asset,
          uint256 amount,
          address to
     ) external returns (uint256);
     function supply(
          address asset,
          uint256 amount,
          address onBehalfOf,
          uint16 referralCode
     ) external;

     //ethena---start
     function cooldownShares(uint256 shares) external returns (uint256 assets);
     function unstake(address receiver) external;
     function deposit(uint256 assets, address receiver) external returns (uint256 shares);
     function cooldowns(address receiver) external view returns(uint104 cooldownEnd,uint152 underlyingAmount);
     function cooldownDuration() external view returns(uint24);
     //ethena---end
     // 质押到指定模块

     function submit(address _referral) external payable returns (uint256);//ldo

}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IMultiSigUtc{
    function getManagerInfo()external view returns(uint managerNumber,uint expirationTime,address[] memory managers);
    function getUtcFeeAddr() external view returns(address);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;

interface IMultiSig {
    function getManagerInfo() external view returns(uint managerNumber,uint expirationTime,address[] memory managers);
    function getTransactionHash(bytes memory transactions) external view returns (bytes32 txHash);
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
abstract contract ReentrancyGuard {
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;
    uint256 private _status;
    error ReentrancyGuardReentrantCall();
    constructor() {
        _status = NOT_ENTERED;
    }
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }
    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // 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;
    }

    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface ILidoWithdrawalQueueERC721{
    // 请求提现
    function requestWithdrawals(uint256[] calldata _amounts, address _owner)external returns (uint256[] memory requestIds);
    // 领取提现
    function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints) external;
    //获取提款请求
    function getWithdrawalRequests(address _owner)external view returns (uint256[] memory requestsIds);

    function findCheckpointHints(uint256[] calldata _requestIds,uint256 _firstIndex,uint256 _lastIndex) external view returns (uint256[] memory hintIds);
    function getLastCheckpointIndex() external view returns (uint256);

}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"totalCommission","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"primCommission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"web3PayCommission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transBalHot","type":"uint256"}],"name":"TransferCommissionLogs","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"address","name":"expectLendingPool","type":"address"}],"name":"EmergencyCall","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"managerIndex","type":"uint256"},{"internalType":"contract IAggregatedHelper","name":"aggregatedHelper","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"aggregatedHelperSetTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"erc20s","type":"address[]"}],"name":"balFundsToHot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownSharesForEthenaStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByEthenaStakeUsde","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByLido","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getColdPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManagerInfo","outputs":[{"internalType":"uint256","name":"managerNumber","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"address[]","name":"managers","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManagerRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerAgentConfigData","outputs":[{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"},{"internalType":"address","name":"feeAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"transactions","type":"bytes"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hotCoinMaxNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"address payable","name":"coldPool","type":"address"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"}],"internalType":"struct Merchant","name":"data","type":"tuple"},{"internalType":"contract IMultiSigUtc","name":"_multiSigUtc","type":"address"},{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"address[]","name":"_managers","type":"address[]"}],"name":"initManagers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastBalancedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"lidoRequestWithdrawals","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merchant","outputs":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"address payable","name":"coldPool","type":"address"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiSigUtc","outputs":[{"internalType":"contract IMultiSigUtc","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payPool","outputs":[{"internalType":"contract IPayPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"rmManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setBalancedTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"emergencyWithdrawAddress","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setEmergencyWithdrawAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"maxNum","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotCoinMaxNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotCoinMaxRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirationTime","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setManagerExpTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setManagerRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multiSigAgentAddr","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setMultiSigAgentAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setPrimAgentProfitPercAndFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByEthenaStakeUsde","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByLido","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b506001600055614c8d806100256000396000f3fe60806040526004361061021c5760003560e01c80638e83e0ab11610122578063cd19f95f116100a5578063ec797d251161006c578063ec797d25146106d0578063ef0b792214610714578063f42c660314610734578063f72a60fd14610754578063fa378a4f1461077457005b8063cd19f95f1461062c578063d0efff9614610650578063d163642114610670578063d890bdf414610690578063e1c32502146106b057005b8063affed0e0116100e9578063affed0e0146105a3578063b5e1e3bf146105b9578063c2d53eb4146105d7578063c39bf23e146105ec578063cd119ca91461060c57005b80638e83e0ab146104a257806395722e66146104c2578063a2deadbd146104e2578063a5ff765114610502578063aa2651381461058357005b806345e06903116101aa5780635c21b103116101715780635c21b103146103f4578063606dbcbf14610422578063822dd9a41461044f57806384e7fc8b1461046f5780638da5cb5b1461048457005b806345e069031461032f57806347a131f91461034f578063495069e21461036f57806351165755146103a757806357a98b7a146103c757005b80632c35ec4e116101ee5780632c35ec4e146102995780632c49d169146102b957806337ba1dbd146102d95780633b4a0032146102f95780633d5ec7691461030f57005b806312a69b48146102255780631902fe6f1461024e578063200d2ed2146102635780632b8b19901461027957005b3661022357005b005b34801561023157600080fd5b5061023b60085481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5060055461023b565b34801561026f57600080fd5b5061023b60045481565b34801561028557600080fd5b5061022361029436600461402f565b610794565b3480156102a557600080fd5b506102236102b4366004614087565b610c15565b3480156102c557600080fd5b506102236102d43660046140d6565b610e36565b3480156102e557600080fd5b506102236102f4366004614194565b610f86565b34801561030557600080fd5b5061023b60115481565b34801561031b57600080fd5b5061022361032a3660046141e2565b61104d565b34801561033b57600080fd5b5061022361034a366004614087565b611724565b34801561035b57600080fd5b5061022361036a3660046140d6565b61190f565b34801561037b57600080fd5b5060105461038f906001600160a01b031681565b6040516001600160a01b039091168152602001610245565b3480156103b357600080fd5b506102236103c236600461421e565b611a0f565b3480156103d357600080fd5b5061023b6103e23660046142c9565b60146020526000908152604090205481565b34801561040057600080fd5b5061041461040f3660046142e6565b611b46565b6040516102459291906143c8565b34801561042e57600080fd5b5061044261043d3660046143e3565b611c91565b60405161024591906144a5565b34801561045b57600080fd5b5061022361046a3660046144b8565b611ddb565b34801561047b57600080fd5b50610223612156565b34801561049057600080fd5b506012546001600160a01b031661038f565b3480156104ae57600080fd5b506102236104bd3660046144f1565b612292565b3480156104ce57600080fd5b5060075461038f906001600160a01b031681565b3480156104ee57600080fd5b5061023b6104fd366004614521565b6124a9565b34801561050e57600080fd5b50600954600a54600b54600c54600d54600e54600f5461053f96959493926001600160a01b03908116928116911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e001610245565b34801561058f57600080fd5b5061022361059e3660046140d6565b612530565b3480156105af57600080fd5b5061023b60065481565b3480156105c557600080fd5b50600e546001600160a01b031661038f565b3480156105e357600080fd5b50610223612666565b3480156105f857600080fd5b50610223610607366004614087565b6127b6565b34801561061857600080fd5b506102236106273660046144f1565b61299b565b34801561063857600080fd5b50610641612b6b565b6040516102459392919061458e565b34801561065c57600080fd5b5061022361066b3660046145ad565b612c10565b34801561067c57600080fd5b5061022361068b3660046145ad565b612dc0565b34801561069c57600080fd5b506102236106ab36600461402f565b612ee4565b3480156106bc57600080fd5b506102236106cb3660046144f1565b6130ca565b3480156106dc57600080fd5b506106e56132a8565b6040805194855260208501939093526001600160a01b0391821692840192909252166060820152608001610245565b34801561072057600080fd5b5061022361072f3660046144f1565b613378565b34801561074057600080fd5b5060135461038f906001600160a01b031681565b34801561076057600080fd5b5061022361076f3660046145c6565b6135bf565b34801561078057600080fd5b5061022361078f36600461402f565b6137cb565b61079c613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561080d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107ef575b50505091909252505050604081015181519192509060006108a76302b8b19960e41b8888845b6040519080825280601f01601f19166020018201604052801561085d576020820181803683370190505b50604051602401610870939291906146a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b28565b905060008460200151426108bb91906146e2565b90506000808060008060008060005b8a8110156109c6576108dc8e82613b62565b9399509197509550935091508886116108f457600080fd5b60016109008b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561094e573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161097857600080fd5b8b8560ff168151811061098d5761098d6146f9565b60200260200101516001600160a01b0316876001600160a01b0316146109b257600080fd5b869750806109bf9061470f565b90506108ca565b50508951975050508a15159450610a19935050505057826000815181106109ef576109ef6146f9565b60200260200101516001600160a01b0316876001600160a01b031610610a1457600080fd5b610ae4565b80861015610a9857828681518110610a3357610a336146f9565b60200260200101516001600160a01b0316876001600160a01b0316108015610a8f575082610a626001886146e2565b81518110610a7257610a726146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610a1457600080fd5b8086148015610adb575082610aae6001886146e2565b81518110610abe57610abe6146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610ae457600080fd5b60038054600101808255600082905260408051602080840282018101909252828152929190830182828015610b4257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b24575b509396508493505050505b86811115610bb35783610b616001836146e2565b81518110610b7157610b716146f9565b6020026020010151848281518110610b8b57610b8b6146f9565b6001600160a01b0390921660209283029190910190910152610bac8161472a565b9050610b4d565b5086838781518110610bc757610bc76146f9565b6001600160a01b039092166020928302919091018201528351610bf09160039190860190613ea5565b50825160055460649102606301045b60015550610c109250613bfe915050565b505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015610c8657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c68575b505050919092525050815160208301519293509160009150610ca890426146e2565b60408401519091506000610cfc63161af62760e11b88835b6040519080825280601f01601f191660200182016040528015610cea576020820181803683370190505b50604051602401610870929190614741565b9050600080805b86811015610e0a576000806000806000610d1d8e87613b62565b945094509450945094508a8511610d3357600080fd5b6001610d3f8a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015610d8d573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611610db757600080fd5b898460ff1681518110610dcc57610dcc6146f9565b60200260200101516001600160a01b0316876001600160a01b031614610df157600080fd5b869750505050505080610e039061470f565b9050610d03565b5050601380546001600160a01b0319166001600160a01b03999099169890981790975550505050505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015610e9157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e73575b5050835193945033925060009150505b82811015610f7e57838181518110610ebb57610ebb6146f9565b60200260200101516001600160a01b0316826001600160a01b03161415610f6e57600754610ef49087906001600160a01b031687613c05565b600754604051631c05ca9160e21b81526001600160a01b038881166004830152909116906370172a44906024015b6020604051808303816000875af1158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614765565b50505050505050565b610f778161470f565b9050610ea1565b505050505050565b6003805433919085908110610f9d57610f9d6146f9565b6000918252602090912001546001600160a01b031614610ff35760405162461bcd60e51b815260206004820152600c60248201526b37b7363c9036b0b730b3b2b960a11b60448201526064015b60405180910390fd5b60405163312d6d7960e11b81526001600160a01b0383169063625adaf29061101f90849060040161477e565b600060405180830381600087803b15801561103957600080fd5b505af1158015610f65573d6000803e3d6000fd5b611055613afd565b6040805160e0810182526009548152600a546020820152600b54918101829052600c546060820152600d546001600160a01b039081166080830152600e54811660a0830152600f541660c08201526008549091906110b390426146e2565b1161110a5760405162461bcd60e51b815260206004820152602160248201527f42616c616e63652066756e647320696e74657276616c2074696d65206c696d696044820152601d60fa1b6064820152608401610fea565b42600855608081015160a0820151600080805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c546060936001600160a01b039081163193163191906111659084908490613cd9565b90506000806000806000806001600160a01b03168a60c001516001600160a01b0316146111f5578960c001516001600160a01b031663dfdf3c0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190614791565b90505b601054604080516321d5e88b60e11b815290516000926001600160a01b0316916343abd1169160048083019260209291908290030181865afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190614791565b905086156113ab5761127687838d613cfe565b60808f0151604051949a50929850909650945061129a918c919086906020016147ae565b60405160208183030381529060405299508981856040516020016112c0939291906147ae565b60408051601f1981840301815291905299506001600160a01b03821615611308578982866040516020016112f6939291906147ae565b60405160208183030381529060405299505b6040805185815260208101859052869188916000917f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e910160405180910390a48a60a001516001600160a01b031663baaad1be8b6040518263ffffffff1660e01b815260040161137891906147e8565b600060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505b606060005b8d518110156116a0576113e08e82815181106113ce576113ce6146f9565b60200260200101518e60800151613d77565b9a506114098e82815181106113f7576113f76146f9565b60200260200101518e60a00151613d77565b995060008e828151811061141f5761141f6146f9565b602002602001015190506114598c8c60146000856001600160a01b03166001600160a01b0316815260200190815260200160002054613cd9565b99505088156116905761146d89858f613cfe565b809850819950829a50839b5050505050818e8281518110611490576114906146f9565b602002602001015163a9059cbb8f60800151886040516024016114c89291906001600160a01b03929092168252602082015260400190565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935251611502949392016147fb565b6040516020818303038152906040529150818e8281518110611526576115266146f9565b602090810291909101810151604080516001600160a01b038816602482015260448082018c9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516115849493016147fb565b60408051601f1981840301815291905291506001600160a01b0384161561162857818e82815181106115b8576115b86146f9565b602090810291909101810151604080516001600160a01b038916602482015260448082018d9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516116169493016147fb565b60405160208183030381529060405291505b86888f838151811061163c5761163c6146f9565b60200260200101516001600160a01b03167f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e8989604051611687929190918252602082015260400190565b60405180910390a45b6116998161470f565b90506113b0565b5080511561170b578b60a001516001600160a01b0316637dd393ea826040518263ffffffff1660e01b81526004016116d891906147e8565b600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050505b5050505050505050505050506117216001600055565b50565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561179557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611777575b5050509190925250508151602083015192935091600091506117b790426146e2565b604084015190915060006117d36345e0690360e01b8883610cc0565b90506000808060008060008060005b8b8110156118de576117f48e82613b62565b9399509197509550935091508a861161180c57600080fd5b60016118188a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611866573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161189057600080fd5b898560ff16815181106118a5576118a56146f9565b60200260200101516001600160a01b0316876001600160a01b0316146118ca57600080fd5b869750806118d79061470f565b90506117e2565b5050600d80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561196a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161194c575b5050835193945033925060009150505b82811015610f7e57838181518110611994576119946146f9565b60200260200101516001600160a01b0316826001600160a01b031614156119ff576007546119cd9087906001600160a01b031687613c05565b600754604051632c0856db60e21b81526001600160a01b0388811660048301529091169063b0215b6c90602401610f22565b611a088161470f565b905061197a565b60006001600201805480602002602001604051908101604052809291908181526020018280548015611a6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a4c575b5050835193945033925060009150505b82811015610f6557838181518110611a9457611a946146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611b3657600754604051635116575560e01b81526001600160a01b0390911690635116575590611ae9908a908a908a90600401614842565b60408051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190614870565b505050505050505050565b611b3f8161470f565b9050611a7a565b60038054604080516020808402820181019092528281526000936060938593830182828015611b9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b80575b5050835193945033925060009150505b82811015611c8357838181518110611bc857611bc86146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611c7357600754604051635c21b10360e01b81526001600160a01b0390911690635c21b10390611c1f908d908d908d908d90600401614894565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c6691908101906148dd565b9550955050505050611c88565b611c7c8161470f565b9050611bae565b505050505b94509492505050565b606060006001600201805480602002602001604051908101604052809291908181526020018280548015611cee57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cd0575b5050835193945033925060009150505b82811015611dcf57838181518110611d1857611d186146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611dbf5760075460405163606dbcbf60e01b81526001600160a01b039091169063606dbcbf90611d6d908b908b908b9060040161496e565b6000604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db491908101906149bb565b945050505050611dd4565b611dc88161470f565b9050611cfe565b505050505b9392505050565b60408051600080825260208201909252611e099063208b766960e21b90610870908790879060448101614a4b565b905060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611e8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e69575b505050919092525050815160208301519293509160009150611ea990426146e2565b60408401519091506000808080808080805b8a811015611fb757611ecd8e82613b62565b939950919750955093509150898611611ee557600080fd5b6001611ef18e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611f3f573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611611f6957600080fd5b888560ff1681518110611f7e57611f7e6146f9565b60200260200101516001600160a01b0316876001600160a01b031614611fa357600080fd5b86975080611fb09061470f565b9050611ebb565b50600080601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561200e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120369190810190614a6a565b92509250506120458f8d613b62565b939a5091985096509450925081871161205d57600080fd5b60016120698f89613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b7573d6000803e3d6000fd5b505050602060405103519750808660ff16815181106120d8576120d86146f9565b60200260200101516001600160a01b0316886001600160a01b0316146121395760405162461bcd60e51b81526020600482015260166024820152752bb2b119902830bc9026b0b730b3b2b91022b93937b960511b6044820152606401610fea565b505050600c9d909d55505050600a98909855505050505050505050565b600060016002018054806020026020016040519081016040528092919081815260200182805480156121b157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612193575b5050835193945033925060009150505b8281101561228c578381815181106121db576121db6146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561227c57600760009054906101000a90046001600160a01b03166001600160a01b03166384e7fc8b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614765565b5050505050565b6122858161470f565b90506121c1565b50505050565b61229a613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561230b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122ed575b50505091909252505081516020830151929350916000915061232d90426146e2565b6040840151909150600080808080808080612388638e83e0ab60e01b8f835b6040519080825280601f01601f191660200182016040528015612376576020820181803683370190505b50604051602401610870929190614b18565b905060005b8b8110156124895761239f8e82613b62565b939a509198509650945092508a87116123b757600080fd5b60016123c38389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612411573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b03161161243b57600080fd5b898660ff1681518110612450576124506146f9565b60200260200101516001600160a01b0316886001600160a01b03161461247557600080fd5b879850806124829061470f565b905061238d565b50505060028c9055506124a59850613bfe975050505050505050565b5050565b6000601960f81b600160f81b6124bd613e4b565b6006546040516124d1918791602001614b31565b60408051808303601f190181529082905280516020918201206001600160f81b03199586169183019190915292909316602184015260228301526042820152606201604051602081830303815290604052805190602001209050919050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561258b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161256d575b5050835193945033925060009150505b82811015610f7e578381815181106125b5576125b56146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561265657600754604051631544ca2760e31b81526001600160a01b038881166004830152602482018890529091169063aa2651389060440160408051808303816000875af1158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614870565b5050505050505050565b61265f8161470f565b905061259b565b601154600a14156126aa5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b763d602d80600a3d3981f3363d3d373d3d3d363d7358833360009081527f17b38d33f6f27dd56f4c132e42ac14d82b5af43d82803e903d91602b57fd5bf36020527358833317b38d33f6f27dd56f4c132e42ac14d82b7f21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e806037600985f5600780546001600160a01b0319166001600160a01b038316908117909155604080516330b54fad60e21b81529051929550909163c2d53eb49160048082019260009290919082900301818387803b15801561278257600080fd5b505af1158015612796573d6000803e3d6000fd5b5050600a6011555050601280546001600160a01b03191633179055505050565b60006127ca6361cdf91f60e11b8483610cc0565b90506000806000601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261284c9190810190614a6a565b91945092509050600061285f83426146e2565b90506000808060008060008060005b8b81101561296a576128808e82613b62565b93995091975095509350915088861161289857600080fd5b60016128a48e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156128f2573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161291c57600080fd5b898560ff1681518110612931576129316146f9565b60200260200101516001600160a01b0316876001600160a01b03161461295657600080fd5b869750806129639061470f565b905061286e565b5050600f80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612a0c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129ee575b505050919092525050815160208301519293509160009150612a2e90426146e2565b60408401519091506000612a4a63cd119ca960e01b888361234c565b90506000808060008060008060005b8b811015612b5557612a6b8e82613b62565b9399509197509550935091508a8611612a8357600080fd5b6001612a8f8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612add573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611612b0757600080fd5b898560ff1681518110612b1c57612b1c6146f9565b60200260200101516001600160a01b0316876001600160a01b031614612b4157600080fd5b86975080612b4e9061470f565b9050612a59565b505050600b9b909b555050505050505050505050565b600080606060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015612bec57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bce575b50505091909252505081516020830151604090930151909792965094509092505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612c6b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c4d575b5050835193945033925060009150505b8281101561227557838181518110612c9557612c956146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612db0576007546040805163bc14ebe760e01b81529051612d37926001600160a01b03169163bc14ebe79160048083019260209291908290030181865afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d259190614791565b6007546001600160a01b031687613c05565b600760009054906101000a90046001600160a01b03166001600160a01b03166358e8d3006040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190614765565b612db98161470f565b9050612c7b565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612e1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dfd575b5050835193945033925060009150505b8281101561227557838181518110612e4557612e456146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612ed45760075460405163d163642160e01b8152600481018790526001600160a01b039091169063d16364219060240160408051808303816000875af1158015612eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614870565b612edd8161470f565b9050612e2b565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612f5557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f37575b505050919092525050815160208301519293509160009150612f7790426146e2565b60408401519091506000612f946336242f7d60e21b898984610833565b9050600080805b868110156130a2576000806000806000612fb58e87613b62565b945094509450945094508a8511612fcb57600080fd5b6001612fd78a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015613025573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161304f57600080fd5b898460ff1681518110613064576130646146f9565b60200260200101516001600160a01b0316876001600160a01b03161461308957600080fd5b86975050505050508061309b9061470f565b9050612f9b565b5050506001600160a01b03909716600090815260146020526040902095909555505050505050565b60648211156130d857600080fd5b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561314957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161312b575b50505091909252505081516020830151929350916000915061316b90426146e2565b604084015190915060006131876370e1928160e11b888361234c565b90506000808060008060008060005b8b811015613292576131a88e82613b62565b9399509197509550935091508a86116131c057600080fd5b60016131cc8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561321a573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161324457600080fd5b898560ff1681518110613259576132596146f9565b60200260200101516001600160a01b0316876001600160a01b03161461327e57600080fd5b8697508061328b9061470f565b9050613196565b50505060099b909b555050505050505050505050565b6040805160e0810182526009548152600a546020808301829052600b5483850152600c5460608401819052600d546001600160a01b039081166080860152600e54811660a0860152600f54811660c0860181905260105487516321d5e88b60e11b8152975160009889988998899891979690959416926343abd1169260048181019392918290030181865afa158015613345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133699190614791565b94509450945094505090919293565b613380613afd565b60408051606081018252600180548252600254602080840191909152600380548551818402810184018752818152600096860193909291908301828280156133f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133d3575b50505091909252505081516020830151929350916000915061341390426146e2565b6040840151909150600080808080808080613436637785bc9160e11b8f8361234c565b905060005b8b8110156135375761344d8e82613b62565b939a509198509650945092508a871161346557600080fd5b60016134718389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156134bf573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b0316116134e957600080fd5b898660ff16815181106134fe576134fe6146f9565b60200260200101516001600160a01b0316886001600160a01b03161461352357600080fd5b879850806135309061470f565b905061343b565b5061354c89518f606491028101600019010490565b9a5060028b101561359f5760405162461bcd60e51b815260206004820152601f60248201527f4d616e616765722063616e6e6f74206265206c657373207468616e2074776f006044820152606401610fea565b5050506001979097555050506005879055506124a59350613bfe92505050565b336135d26012546001600160a01b031690565b6001600160a01b0316146135fb5760405163118cdaa760e01b8152336004820152602401610fea565b600454600a141561363f5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b603c8310158015613651575060648311155b61365a57600080fd5b600a600455601080546001600160a01b0319166001600160a01b0386161790558051600381101561369d5760405162461bcd60e51b8152600401610fea90614b53565b60015b8181101561371257826136b46001836146e2565b815181106136c4576136c46146f9565b60200260200101516001600160a01b03168382815181106136e7576136e76146f9565b60200260200101516001600160a01b03161161370257600080fd5b61370b8161470f565b90506136a0565b50604080516060810182526064838702606301048082526020808301879052928201859052600190815560028690558451919290916137579160039190870190613ea5565b505086516009555050506020840151600a55506040830151600b556060830151600c556080830151600d80546001600160a01b03199081166001600160a01b039384161790915560a0850151600e8054831691841691909117905560c090940151600f805490951691161790925550600555565b6137d3613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561384457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613826575b505050919092525050506040810151815191925090600061386e63fa378a4f60e01b888884610833565b9050600084602001514261388291906146e2565b90506000808060008060008060005b8a81101561398d576138a38e82613b62565b9399509197509550935091508886116138bb57600080fd5b60016138c78b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015613915573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161393f57600080fd5b8b8560ff1681518110613954576139546146f9565b60200260200101516001600160a01b0316876001600160a01b03161461397957600080fd5b869750806139869061470f565b9050613891565b5050505050505050505060008251905060038110156139be5760405162461bcd60e51b8152600401610fea90614b53565b866001600160a01b03168387815181106139da576139da6146f9565b60200260200101516001600160a01b031614613a2f5760405162461bcd60e51b81526020600482015260146024820152731859191c995cdcc81a5cc81b9bdd08195e1a5cdd60621b6044820152606401610fea565b613a3a6001826146e2565b9050855b81811015613aa45783613a52826001614b94565b81518110613a6257613a626146f9565b6020026020010151848281518110613a7c57613a7c6146f9565b6001600160a01b0390921660209283029190910190910152613a9d8161470f565b9050613a3e565b508251613ab8906003906020860190613ea5565b506003805480613aca57613aca614bac565b600082815260209020810160001990810180546001600160a01b0319169055019055600554606490820260630104610bff565b60026000541415613b2157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6000601960f81b600160f81b613b3c613e4b565b6006805486916000613b4d8361470f565b919050556040516020016124d1929190614b31565b6062020160208101516040820151606083015160808401516081909401519094600094851a949190911a929190565b6000808383604051602001613bb0929190918252602082015260400190565b6040516020818303038152906040528051906020012090507f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005280601c52603c60002091505092915050565b6001600055565b6001600160a01b038316613c7557600e546040516001600160601b0319606085901b166020820152603481018390526001600160a01b039091169063baaad1be906054015b6040516020818303038152906040526040518263ffffffff1660e01b815260040161101f91906147e8565b600e54604080516001600160a01b03858116602483015260448083018690528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b1790529251931692637dd393ea92613c4a928892909101614bc2565b600083821115613ce857508281035b8015611dd45782811115611dd457509092915050565b600080600080612710856020015188613d179190614bfa565b613d219190614c19565b93506001600160a01b038616613d38576000613d54565b6064856060015185613d4a9190614bfa565b613d549190614c19565b9250613d6083856146e2565b9150613d6c84886146e2565b905093509350935093565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691613dd19190614c3b565b600060405180830381855afa9150503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150818015613e2557506020815110155b613e2e57600080fd5b80806020019051810190613e429190614765565b95945050505050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101829052306060820152600091906080016040516020818303038152906040528051906020012091505090565b828054828255906000526020600020908101928215613efa579160200282015b82811115613efa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ec5565b50613f06929150613f0a565b5090565b5b80821115613f065760008155600101613f0b565b6001600160a01b038116811461172157600080fd5b8035613f3f81613f1f565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715613f7c57613f7c613f44565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613faa57613faa613f44565b604052919050565b60006001600160401b03821115613fcb57613fcb613f44565b50601f01601f191660200190565b600082601f830112613fea57600080fd5b8135613ffd613ff882613fb2565b613f82565b81815284602083860101111561401257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561404457600080fd5b833561404f81613f1f565b92506020840135915060408401356001600160401b0381111561407157600080fd5b61407d86828701613fd9565b9150509250925092565b6000806040838503121561409a57600080fd5b82356140a581613f1f565b915060208301356001600160401b038111156140c057600080fd5b6140cc85828601613fd9565b9150509250929050565b600080604083850312156140e957600080fd5b82356140f481613f1f565b946020939093013593505050565b60006001600160401b0382111561411b5761411b613f44565b5060051b60200190565b600082601f83011261413657600080fd5b81356020614146613ff883614102565b82815260059290921b8401810191818101908684111561416557600080fd5b8286015b8481101561418957803561417c81613f1f565b8352918301918301614169565b509695505050505050565b6000806000606084860312156141a957600080fd5b8335925060208401356141bb81613f1f565b915060408401356001600160401b038111156141d657600080fd5b61407d86828701614125565b6000602082840312156141f457600080fd5b81356001600160401b0381111561420a57600080fd5b61421684828501614125565b949350505050565b60008060006060848603121561423357600080fd5b83356001600160401b0381111561424957600080fd5b8401601f8101861361425a57600080fd5b8035602061426a613ff883614102565b82815260059290921b8301810191818101908984111561428957600080fd5b938201935b838510156142a75784358252938201939082019061428e565b96506142b69050878201613f34565b9450505050604084013590509250925092565b6000602082840312156142db57600080fd5b8135611dd481613f1f565b600080600080606085870312156142fc57600080fd5b84356001600160401b038082111561431357600080fd5b818701915087601f83011261432757600080fd5b81358181111561433657600080fd5b88602082850101111561434857600080fd5b602092830196509450508501359150604085013561436581613f1f565b939692955090935050565b60005b8381101561438b578181015183820152602001614373565b8381111561228c5750506000910152565b600081518084526143b4816020860160208601614370565b601f01601f19169290920160200192915050565b8215158152604060208201526000614216604083018461439c565b6000806000604084860312156143f857600080fd5b833561440381613f1f565b925060208401356001600160401b038082111561441f57600080fd5b818601915086601f83011261443357600080fd5b81358181111561444257600080fd5b8760208260051b850101111561445757600080fd5b6020830194508093505050509250925092565b600081518084526020808501945080840160005b8381101561449a5781518752958201959082019060010161447e565b509495945050505050565b602081526000611dd4602083018461446a565b6000806000606084860312156144cd57600080fd5b833592506020840135915060408401356001600160401b0381111561407157600080fd5b6000806040838503121561450457600080fd5b8235915060208301356001600160401b038111156140c057600080fd5b60006020828403121561453357600080fd5b81356001600160401b0381111561454957600080fd5b61421684828501613fd9565b600081518084526020808501945080840160005b8381101561449a5781516001600160a01b031687529582019590820190600101614569565b838152826020820152606060408201526000613e426060830184614555565b6000602082840312156145bf57600080fd5b5035919050565b60008060008060008587036101608112156145e057600080fd5b60e08112156145ee57600080fd5b506145f7613f5a565b86358152602087013560208201526040870135604082015260608701356060820152608087013561462781613f1f565b608082015260a087013561463a81613f1f565b60a082015260c087013561464d81613f1f565b60c0820152945061466060e08701613f34565b9350610100860135925061012086013591506101408601356001600160401b0381111561468c57600080fd5b61469888828901614125565b9150509295509295909350565b60018060a01b0384168152826020820152606060408201526000613e42606083018461439c565b634e487b7160e01b600052601160045260246000fd5b6000828210156146f4576146f46146cc565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614723576147236146cc565b5060010190565b600081614739576147396146cc565b506000190190565b6001600160a01b03831681526040602082018190526000906142169083018461439c565b60006020828403121561477757600080fd5b5051919050565b602081526000611dd46020830184614555565b6000602082840312156147a357600080fd5b8151611dd481613f1f565b600084516147c0818460208901614370565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b602081526000611dd4602083018461439c565b6000845161480d818460208901614370565b606085901b6001600160601b0319169083019081528351614835816014840160208801614370565b0160140195945050505050565b606081526000614855606083018661446a565b6001600160a01b039490941660208301525060400152919050565b6000806040838503121561488357600080fd5b505080516020909101519092909150565b60608152836060820152838560808301376000608085830181019190915260208201939093526001600160a01b03919091166040820152601f909201601f191690910101919050565b600080604083850312156148f057600080fd5b8251801515811461490057600080fd5b60208401519092506001600160401b0381111561491c57600080fd5b8301601f8101851361492d57600080fd5b805161493b613ff882613fb2565b81815286602083850101111561495057600080fd5b614961826020830160208601614370565b8093505050509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561499e57600080fd5b8260051b8085606085013760009201606001918252509392505050565b600060208083850312156149ce57600080fd5b82516001600160401b038111156149e457600080fd5b8301601f810185136149f557600080fd5b8051614a03613ff882614102565b81815260059190911b82018301908381019087831115614a2257600080fd5b928401925b82841015614a4057835182529284019290840190614a27565b979650505050505050565b838152826020820152606060408201526000613e42606083018461439c565b600080600060608486031215614a7f57600080fd5b83519250602080850151925060408501516001600160401b03811115614aa457600080fd5b8501601f81018713614ab557600080fd5b8051614ac3613ff882614102565b81815260059190911b82018301908381019089831115614ae257600080fd5b928401925b82841015614b09578351614afa81613f1f565b82529284019290840190614ae7565b80955050505050509250925092565b828152604060208201526000614216604083018461439c565b604081526000614b44604083018561439c565b90508260208301529392505050565b60208082526021908201527f4d616e616765722063616e6e6f74206265206c657373207468616e20746872656040820152606560f81b606082015260800190565b60008219821115614ba757614ba76146cc565b500190565b634e487b7160e01b600052603160045260246000fd5b6bffffffffffffffffffffffff198360601b16815260008251614bec816014850160208701614370565b919091016014019392505050565b6000816000190483118215151615614c1457614c146146cc565b500290565b600082614c3657634e487b7160e01b600052601260045260246000fd5b500490565b60008251614c4d818460208701614370565b919091019291505056fea26469706673582212202a2692f32a12b9c2506b095ed9baedc9aa85e16dbfa3604372af967c23236cf764736f6c634300080c0033

Deployed Bytecode

0x60806040526004361061021c5760003560e01c80638e83e0ab11610122578063cd19f95f116100a5578063ec797d251161006c578063ec797d25146106d0578063ef0b792214610714578063f42c660314610734578063f72a60fd14610754578063fa378a4f1461077457005b8063cd19f95f1461062c578063d0efff9614610650578063d163642114610670578063d890bdf414610690578063e1c32502146106b057005b8063affed0e0116100e9578063affed0e0146105a3578063b5e1e3bf146105b9578063c2d53eb4146105d7578063c39bf23e146105ec578063cd119ca91461060c57005b80638e83e0ab146104a257806395722e66146104c2578063a2deadbd146104e2578063a5ff765114610502578063aa2651381461058357005b806345e06903116101aa5780635c21b103116101715780635c21b103146103f4578063606dbcbf14610422578063822dd9a41461044f57806384e7fc8b1461046f5780638da5cb5b1461048457005b806345e069031461032f57806347a131f91461034f578063495069e21461036f57806351165755146103a757806357a98b7a146103c757005b80632c35ec4e116101ee5780632c35ec4e146102995780632c49d169146102b957806337ba1dbd146102d95780633b4a0032146102f95780633d5ec7691461030f57005b806312a69b48146102255780631902fe6f1461024e578063200d2ed2146102635780632b8b19901461027957005b3661022357005b005b34801561023157600080fd5b5061023b60085481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5060055461023b565b34801561026f57600080fd5b5061023b60045481565b34801561028557600080fd5b5061022361029436600461402f565b610794565b3480156102a557600080fd5b506102236102b4366004614087565b610c15565b3480156102c557600080fd5b506102236102d43660046140d6565b610e36565b3480156102e557600080fd5b506102236102f4366004614194565b610f86565b34801561030557600080fd5b5061023b60115481565b34801561031b57600080fd5b5061022361032a3660046141e2565b61104d565b34801561033b57600080fd5b5061022361034a366004614087565b611724565b34801561035b57600080fd5b5061022361036a3660046140d6565b61190f565b34801561037b57600080fd5b5060105461038f906001600160a01b031681565b6040516001600160a01b039091168152602001610245565b3480156103b357600080fd5b506102236103c236600461421e565b611a0f565b3480156103d357600080fd5b5061023b6103e23660046142c9565b60146020526000908152604090205481565b34801561040057600080fd5b5061041461040f3660046142e6565b611b46565b6040516102459291906143c8565b34801561042e57600080fd5b5061044261043d3660046143e3565b611c91565b60405161024591906144a5565b34801561045b57600080fd5b5061022361046a3660046144b8565b611ddb565b34801561047b57600080fd5b50610223612156565b34801561049057600080fd5b506012546001600160a01b031661038f565b3480156104ae57600080fd5b506102236104bd3660046144f1565b612292565b3480156104ce57600080fd5b5060075461038f906001600160a01b031681565b3480156104ee57600080fd5b5061023b6104fd366004614521565b6124a9565b34801561050e57600080fd5b50600954600a54600b54600c54600d54600e54600f5461053f96959493926001600160a01b03908116928116911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e001610245565b34801561058f57600080fd5b5061022361059e3660046140d6565b612530565b3480156105af57600080fd5b5061023b60065481565b3480156105c557600080fd5b50600e546001600160a01b031661038f565b3480156105e357600080fd5b50610223612666565b3480156105f857600080fd5b50610223610607366004614087565b6127b6565b34801561061857600080fd5b506102236106273660046144f1565b61299b565b34801561063857600080fd5b50610641612b6b565b6040516102459392919061458e565b34801561065c57600080fd5b5061022361066b3660046145ad565b612c10565b34801561067c57600080fd5b5061022361068b3660046145ad565b612dc0565b34801561069c57600080fd5b506102236106ab36600461402f565b612ee4565b3480156106bc57600080fd5b506102236106cb3660046144f1565b6130ca565b3480156106dc57600080fd5b506106e56132a8565b6040805194855260208501939093526001600160a01b0391821692840192909252166060820152608001610245565b34801561072057600080fd5b5061022361072f3660046144f1565b613378565b34801561074057600080fd5b5060135461038f906001600160a01b031681565b34801561076057600080fd5b5061022361076f3660046145c6565b6135bf565b34801561078057600080fd5b5061022361078f36600461402f565b6137cb565b61079c613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561080d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107ef575b50505091909252505050604081015181519192509060006108a76302b8b19960e41b8888845b6040519080825280601f01601f19166020018201604052801561085d576020820181803683370190505b50604051602401610870939291906146a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b28565b905060008460200151426108bb91906146e2565b90506000808060008060008060005b8a8110156109c6576108dc8e82613b62565b9399509197509550935091508886116108f457600080fd5b60016109008b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561094e573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161097857600080fd5b8b8560ff168151811061098d5761098d6146f9565b60200260200101516001600160a01b0316876001600160a01b0316146109b257600080fd5b869750806109bf9061470f565b90506108ca565b50508951975050508a15159450610a19935050505057826000815181106109ef576109ef6146f9565b60200260200101516001600160a01b0316876001600160a01b031610610a1457600080fd5b610ae4565b80861015610a9857828681518110610a3357610a336146f9565b60200260200101516001600160a01b0316876001600160a01b0316108015610a8f575082610a626001886146e2565b81518110610a7257610a726146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610a1457600080fd5b8086148015610adb575082610aae6001886146e2565b81518110610abe57610abe6146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610ae457600080fd5b60038054600101808255600082905260408051602080840282018101909252828152929190830182828015610b4257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b24575b509396508493505050505b86811115610bb35783610b616001836146e2565b81518110610b7157610b716146f9565b6020026020010151848281518110610b8b57610b8b6146f9565b6001600160a01b0390921660209283029190910190910152610bac8161472a565b9050610b4d565b5086838781518110610bc757610bc76146f9565b6001600160a01b039092166020928302919091018201528351610bf09160039190860190613ea5565b50825160055460649102606301045b60015550610c109250613bfe915050565b505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015610c8657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c68575b505050919092525050815160208301519293509160009150610ca890426146e2565b60408401519091506000610cfc63161af62760e11b88835b6040519080825280601f01601f191660200182016040528015610cea576020820181803683370190505b50604051602401610870929190614741565b9050600080805b86811015610e0a576000806000806000610d1d8e87613b62565b945094509450945094508a8511610d3357600080fd5b6001610d3f8a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015610d8d573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611610db757600080fd5b898460ff1681518110610dcc57610dcc6146f9565b60200260200101516001600160a01b0316876001600160a01b031614610df157600080fd5b869750505050505080610e039061470f565b9050610d03565b5050601380546001600160a01b0319166001600160a01b03999099169890981790975550505050505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015610e9157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e73575b5050835193945033925060009150505b82811015610f7e57838181518110610ebb57610ebb6146f9565b60200260200101516001600160a01b0316826001600160a01b03161415610f6e57600754610ef49087906001600160a01b031687613c05565b600754604051631c05ca9160e21b81526001600160a01b038881166004830152909116906370172a44906024015b6020604051808303816000875af1158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614765565b50505050505050565b610f778161470f565b9050610ea1565b505050505050565b6003805433919085908110610f9d57610f9d6146f9565b6000918252602090912001546001600160a01b031614610ff35760405162461bcd60e51b815260206004820152600c60248201526b37b7363c9036b0b730b3b2b960a11b60448201526064015b60405180910390fd5b60405163312d6d7960e11b81526001600160a01b0383169063625adaf29061101f90849060040161477e565b600060405180830381600087803b15801561103957600080fd5b505af1158015610f65573d6000803e3d6000fd5b611055613afd565b6040805160e0810182526009548152600a546020820152600b54918101829052600c546060820152600d546001600160a01b039081166080830152600e54811660a0830152600f541660c08201526008549091906110b390426146e2565b1161110a5760405162461bcd60e51b815260206004820152602160248201527f42616c616e63652066756e647320696e74657276616c2074696d65206c696d696044820152601d60fa1b6064820152608401610fea565b42600855608081015160a0820151600080805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c546060936001600160a01b039081163193163191906111659084908490613cd9565b90506000806000806000806001600160a01b03168a60c001516001600160a01b0316146111f5578960c001516001600160a01b031663dfdf3c0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190614791565b90505b601054604080516321d5e88b60e11b815290516000926001600160a01b0316916343abd1169160048083019260209291908290030181865afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190614791565b905086156113ab5761127687838d613cfe565b60808f0151604051949a50929850909650945061129a918c919086906020016147ae565b60405160208183030381529060405299508981856040516020016112c0939291906147ae565b60408051601f1981840301815291905299506001600160a01b03821615611308578982866040516020016112f6939291906147ae565b60405160208183030381529060405299505b6040805185815260208101859052869188916000917f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e910160405180910390a48a60a001516001600160a01b031663baaad1be8b6040518263ffffffff1660e01b815260040161137891906147e8565b600060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505b606060005b8d518110156116a0576113e08e82815181106113ce576113ce6146f9565b60200260200101518e60800151613d77565b9a506114098e82815181106113f7576113f76146f9565b60200260200101518e60a00151613d77565b995060008e828151811061141f5761141f6146f9565b602002602001015190506114598c8c60146000856001600160a01b03166001600160a01b0316815260200190815260200160002054613cd9565b99505088156116905761146d89858f613cfe565b809850819950829a50839b5050505050818e8281518110611490576114906146f9565b602002602001015163a9059cbb8f60800151886040516024016114c89291906001600160a01b03929092168252602082015260400190565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935251611502949392016147fb565b6040516020818303038152906040529150818e8281518110611526576115266146f9565b602090810291909101810151604080516001600160a01b038816602482015260448082018c9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516115849493016147fb565b60408051601f1981840301815291905291506001600160a01b0384161561162857818e82815181106115b8576115b86146f9565b602090810291909101810151604080516001600160a01b038916602482015260448082018d9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516116169493016147fb565b60405160208183030381529060405291505b86888f838151811061163c5761163c6146f9565b60200260200101516001600160a01b03167f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e8989604051611687929190918252602082015260400190565b60405180910390a45b6116998161470f565b90506113b0565b5080511561170b578b60a001516001600160a01b0316637dd393ea826040518263ffffffff1660e01b81526004016116d891906147e8565b600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050505b5050505050505050505050506117216001600055565b50565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561179557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611777575b5050509190925250508151602083015192935091600091506117b790426146e2565b604084015190915060006117d36345e0690360e01b8883610cc0565b90506000808060008060008060005b8b8110156118de576117f48e82613b62565b9399509197509550935091508a861161180c57600080fd5b60016118188a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611866573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161189057600080fd5b898560ff16815181106118a5576118a56146f9565b60200260200101516001600160a01b0316876001600160a01b0316146118ca57600080fd5b869750806118d79061470f565b90506117e2565b5050600d80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561196a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161194c575b5050835193945033925060009150505b82811015610f7e57838181518110611994576119946146f9565b60200260200101516001600160a01b0316826001600160a01b031614156119ff576007546119cd9087906001600160a01b031687613c05565b600754604051632c0856db60e21b81526001600160a01b0388811660048301529091169063b0215b6c90602401610f22565b611a088161470f565b905061197a565b60006001600201805480602002602001604051908101604052809291908181526020018280548015611a6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a4c575b5050835193945033925060009150505b82811015610f6557838181518110611a9457611a946146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611b3657600754604051635116575560e01b81526001600160a01b0390911690635116575590611ae9908a908a908a90600401614842565b60408051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190614870565b505050505050505050565b611b3f8161470f565b9050611a7a565b60038054604080516020808402820181019092528281526000936060938593830182828015611b9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b80575b5050835193945033925060009150505b82811015611c8357838181518110611bc857611bc86146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611c7357600754604051635c21b10360e01b81526001600160a01b0390911690635c21b10390611c1f908d908d908d908d90600401614894565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c6691908101906148dd565b9550955050505050611c88565b611c7c8161470f565b9050611bae565b505050505b94509492505050565b606060006001600201805480602002602001604051908101604052809291908181526020018280548015611cee57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cd0575b5050835193945033925060009150505b82811015611dcf57838181518110611d1857611d186146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611dbf5760075460405163606dbcbf60e01b81526001600160a01b039091169063606dbcbf90611d6d908b908b908b9060040161496e565b6000604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db491908101906149bb565b945050505050611dd4565b611dc88161470f565b9050611cfe565b505050505b9392505050565b60408051600080825260208201909252611e099063208b766960e21b90610870908790879060448101614a4b565b905060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611e8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e69575b505050919092525050815160208301519293509160009150611ea990426146e2565b60408401519091506000808080808080805b8a811015611fb757611ecd8e82613b62565b939950919750955093509150898611611ee557600080fd5b6001611ef18e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611f3f573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611611f6957600080fd5b888560ff1681518110611f7e57611f7e6146f9565b60200260200101516001600160a01b0316876001600160a01b031614611fa357600080fd5b86975080611fb09061470f565b9050611ebb565b50600080601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561200e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120369190810190614a6a565b92509250506120458f8d613b62565b939a5091985096509450925081871161205d57600080fd5b60016120698f89613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b7573d6000803e3d6000fd5b505050602060405103519750808660ff16815181106120d8576120d86146f9565b60200260200101516001600160a01b0316886001600160a01b0316146121395760405162461bcd60e51b81526020600482015260166024820152752bb2b119902830bc9026b0b730b3b2b91022b93937b960511b6044820152606401610fea565b505050600c9d909d55505050600a98909855505050505050505050565b600060016002018054806020026020016040519081016040528092919081815260200182805480156121b157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612193575b5050835193945033925060009150505b8281101561228c578381815181106121db576121db6146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561227c57600760009054906101000a90046001600160a01b03166001600160a01b03166384e7fc8b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614765565b5050505050565b6122858161470f565b90506121c1565b50505050565b61229a613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561230b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122ed575b50505091909252505081516020830151929350916000915061232d90426146e2565b6040840151909150600080808080808080612388638e83e0ab60e01b8f835b6040519080825280601f01601f191660200182016040528015612376576020820181803683370190505b50604051602401610870929190614b18565b905060005b8b8110156124895761239f8e82613b62565b939a509198509650945092508a87116123b757600080fd5b60016123c38389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612411573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b03161161243b57600080fd5b898660ff1681518110612450576124506146f9565b60200260200101516001600160a01b0316886001600160a01b03161461247557600080fd5b879850806124829061470f565b905061238d565b50505060028c9055506124a59850613bfe975050505050505050565b5050565b6000601960f81b600160f81b6124bd613e4b565b6006546040516124d1918791602001614b31565b60408051808303601f190181529082905280516020918201206001600160f81b03199586169183019190915292909316602184015260228301526042820152606201604051602081830303815290604052805190602001209050919050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561258b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161256d575b5050835193945033925060009150505b82811015610f7e578381815181106125b5576125b56146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561265657600754604051631544ca2760e31b81526001600160a01b038881166004830152602482018890529091169063aa2651389060440160408051808303816000875af1158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614870565b5050505050505050565b61265f8161470f565b905061259b565b601154600a14156126aa5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b763d602d80600a3d3981f3363d3d373d3d3d363d7358833360009081527f17b38d33f6f27dd56f4c132e42ac14d82b5af43d82803e903d91602b57fd5bf36020527358833317b38d33f6f27dd56f4c132e42ac14d82b7f21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e806037600985f5600780546001600160a01b0319166001600160a01b038316908117909155604080516330b54fad60e21b81529051929550909163c2d53eb49160048082019260009290919082900301818387803b15801561278257600080fd5b505af1158015612796573d6000803e3d6000fd5b5050600a6011555050601280546001600160a01b03191633179055505050565b60006127ca6361cdf91f60e11b8483610cc0565b90506000806000601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261284c9190810190614a6a565b91945092509050600061285f83426146e2565b90506000808060008060008060005b8b81101561296a576128808e82613b62565b93995091975095509350915088861161289857600080fd5b60016128a48e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156128f2573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161291c57600080fd5b898560ff1681518110612931576129316146f9565b60200260200101516001600160a01b0316876001600160a01b03161461295657600080fd5b869750806129639061470f565b905061286e565b5050600f80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612a0c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129ee575b505050919092525050815160208301519293509160009150612a2e90426146e2565b60408401519091506000612a4a63cd119ca960e01b888361234c565b90506000808060008060008060005b8b811015612b5557612a6b8e82613b62565b9399509197509550935091508a8611612a8357600080fd5b6001612a8f8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612add573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611612b0757600080fd5b898560ff1681518110612b1c57612b1c6146f9565b60200260200101516001600160a01b0316876001600160a01b031614612b4157600080fd5b86975080612b4e9061470f565b9050612a59565b505050600b9b909b555050505050505050505050565b600080606060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015612bec57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bce575b50505091909252505081516020830151604090930151909792965094509092505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612c6b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c4d575b5050835193945033925060009150505b8281101561227557838181518110612c9557612c956146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612db0576007546040805163bc14ebe760e01b81529051612d37926001600160a01b03169163bc14ebe79160048083019260209291908290030181865afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d259190614791565b6007546001600160a01b031687613c05565b600760009054906101000a90046001600160a01b03166001600160a01b03166358e8d3006040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190614765565b612db98161470f565b9050612c7b565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612e1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dfd575b5050835193945033925060009150505b8281101561227557838181518110612e4557612e456146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612ed45760075460405163d163642160e01b8152600481018790526001600160a01b039091169063d16364219060240160408051808303816000875af1158015612eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614870565b612edd8161470f565b9050612e2b565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612f5557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f37575b505050919092525050815160208301519293509160009150612f7790426146e2565b60408401519091506000612f946336242f7d60e21b898984610833565b9050600080805b868110156130a2576000806000806000612fb58e87613b62565b945094509450945094508a8511612fcb57600080fd5b6001612fd78a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015613025573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161304f57600080fd5b898460ff1681518110613064576130646146f9565b60200260200101516001600160a01b0316876001600160a01b03161461308957600080fd5b86975050505050508061309b9061470f565b9050612f9b565b5050506001600160a01b03909716600090815260146020526040902095909555505050505050565b60648211156130d857600080fd5b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561314957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161312b575b50505091909252505081516020830151929350916000915061316b90426146e2565b604084015190915060006131876370e1928160e11b888361234c565b90506000808060008060008060005b8b811015613292576131a88e82613b62565b9399509197509550935091508a86116131c057600080fd5b60016131cc8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561321a573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161324457600080fd5b898560ff1681518110613259576132596146f9565b60200260200101516001600160a01b0316876001600160a01b03161461327e57600080fd5b8697508061328b9061470f565b9050613196565b50505060099b909b555050505050505050505050565b6040805160e0810182526009548152600a546020808301829052600b5483850152600c5460608401819052600d546001600160a01b039081166080860152600e54811660a0860152600f54811660c0860181905260105487516321d5e88b60e11b8152975160009889988998899891979690959416926343abd1169260048181019392918290030181865afa158015613345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133699190614791565b94509450945094505090919293565b613380613afd565b60408051606081018252600180548252600254602080840191909152600380548551818402810184018752818152600096860193909291908301828280156133f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133d3575b50505091909252505081516020830151929350916000915061341390426146e2565b6040840151909150600080808080808080613436637785bc9160e11b8f8361234c565b905060005b8b8110156135375761344d8e82613b62565b939a509198509650945092508a871161346557600080fd5b60016134718389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156134bf573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b0316116134e957600080fd5b898660ff16815181106134fe576134fe6146f9565b60200260200101516001600160a01b0316886001600160a01b03161461352357600080fd5b879850806135309061470f565b905061343b565b5061354c89518f606491028101600019010490565b9a5060028b101561359f5760405162461bcd60e51b815260206004820152601f60248201527f4d616e616765722063616e6e6f74206265206c657373207468616e2074776f006044820152606401610fea565b5050506001979097555050506005879055506124a59350613bfe92505050565b336135d26012546001600160a01b031690565b6001600160a01b0316146135fb5760405163118cdaa760e01b8152336004820152602401610fea565b600454600a141561363f5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b603c8310158015613651575060648311155b61365a57600080fd5b600a600455601080546001600160a01b0319166001600160a01b0386161790558051600381101561369d5760405162461bcd60e51b8152600401610fea90614b53565b60015b8181101561371257826136b46001836146e2565b815181106136c4576136c46146f9565b60200260200101516001600160a01b03168382815181106136e7576136e76146f9565b60200260200101516001600160a01b03161161370257600080fd5b61370b8161470f565b90506136a0565b50604080516060810182526064838702606301048082526020808301879052928201859052600190815560028690558451919290916137579160039190870190613ea5565b505086516009555050506020840151600a55506040830151600b556060830151600c556080830151600d80546001600160a01b03199081166001600160a01b039384161790915560a0850151600e8054831691841691909117905560c090940151600f805490951691161790925550600555565b6137d3613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561384457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613826575b505050919092525050506040810151815191925090600061386e63fa378a4f60e01b888884610833565b9050600084602001514261388291906146e2565b90506000808060008060008060005b8a81101561398d576138a38e82613b62565b9399509197509550935091508886116138bb57600080fd5b60016138c78b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015613915573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161393f57600080fd5b8b8560ff1681518110613954576139546146f9565b60200260200101516001600160a01b0316876001600160a01b03161461397957600080fd5b869750806139869061470f565b9050613891565b5050505050505050505060008251905060038110156139be5760405162461bcd60e51b8152600401610fea90614b53565b866001600160a01b03168387815181106139da576139da6146f9565b60200260200101516001600160a01b031614613a2f5760405162461bcd60e51b81526020600482015260146024820152731859191c995cdcc81a5cc81b9bdd08195e1a5cdd60621b6044820152606401610fea565b613a3a6001826146e2565b9050855b81811015613aa45783613a52826001614b94565b81518110613a6257613a626146f9565b6020026020010151848281518110613a7c57613a7c6146f9565b6001600160a01b0390921660209283029190910190910152613a9d8161470f565b9050613a3e565b508251613ab8906003906020860190613ea5565b506003805480613aca57613aca614bac565b600082815260209020810160001990810180546001600160a01b0319169055019055600554606490820260630104610bff565b60026000541415613b2157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6000601960f81b600160f81b613b3c613e4b565b6006805486916000613b4d8361470f565b919050556040516020016124d1929190614b31565b6062020160208101516040820151606083015160808401516081909401519094600094851a949190911a929190565b6000808383604051602001613bb0929190918252602082015260400190565b6040516020818303038152906040528051906020012090507f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005280601c52603c60002091505092915050565b6001600055565b6001600160a01b038316613c7557600e546040516001600160601b0319606085901b166020820152603481018390526001600160a01b039091169063baaad1be906054015b6040516020818303038152906040526040518263ffffffff1660e01b815260040161101f91906147e8565b600e54604080516001600160a01b03858116602483015260448083018690528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b1790529251931692637dd393ea92613c4a928892909101614bc2565b600083821115613ce857508281035b8015611dd45782811115611dd457509092915050565b600080600080612710856020015188613d179190614bfa565b613d219190614c19565b93506001600160a01b038616613d38576000613d54565b6064856060015185613d4a9190614bfa565b613d549190614c19565b9250613d6083856146e2565b9150613d6c84886146e2565b905093509350935093565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691613dd19190614c3b565b600060405180830381855afa9150503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150818015613e2557506020815110155b613e2e57600080fd5b80806020019051810190613e429190614765565b95945050505050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101829052306060820152600091906080016040516020818303038152906040528051906020012091505090565b828054828255906000526020600020908101928215613efa579160200282015b82811115613efa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ec5565b50613f06929150613f0a565b5090565b5b80821115613f065760008155600101613f0b565b6001600160a01b038116811461172157600080fd5b8035613f3f81613f1f565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715613f7c57613f7c613f44565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613faa57613faa613f44565b604052919050565b60006001600160401b03821115613fcb57613fcb613f44565b50601f01601f191660200190565b600082601f830112613fea57600080fd5b8135613ffd613ff882613fb2565b613f82565b81815284602083860101111561401257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561404457600080fd5b833561404f81613f1f565b92506020840135915060408401356001600160401b0381111561407157600080fd5b61407d86828701613fd9565b9150509250925092565b6000806040838503121561409a57600080fd5b82356140a581613f1f565b915060208301356001600160401b038111156140c057600080fd5b6140cc85828601613fd9565b9150509250929050565b600080604083850312156140e957600080fd5b82356140f481613f1f565b946020939093013593505050565b60006001600160401b0382111561411b5761411b613f44565b5060051b60200190565b600082601f83011261413657600080fd5b81356020614146613ff883614102565b82815260059290921b8401810191818101908684111561416557600080fd5b8286015b8481101561418957803561417c81613f1f565b8352918301918301614169565b509695505050505050565b6000806000606084860312156141a957600080fd5b8335925060208401356141bb81613f1f565b915060408401356001600160401b038111156141d657600080fd5b61407d86828701614125565b6000602082840312156141f457600080fd5b81356001600160401b0381111561420a57600080fd5b61421684828501614125565b949350505050565b60008060006060848603121561423357600080fd5b83356001600160401b0381111561424957600080fd5b8401601f8101861361425a57600080fd5b8035602061426a613ff883614102565b82815260059290921b8301810191818101908984111561428957600080fd5b938201935b838510156142a75784358252938201939082019061428e565b96506142b69050878201613f34565b9450505050604084013590509250925092565b6000602082840312156142db57600080fd5b8135611dd481613f1f565b600080600080606085870312156142fc57600080fd5b84356001600160401b038082111561431357600080fd5b818701915087601f83011261432757600080fd5b81358181111561433657600080fd5b88602082850101111561434857600080fd5b602092830196509450508501359150604085013561436581613f1f565b939692955090935050565b60005b8381101561438b578181015183820152602001614373565b8381111561228c5750506000910152565b600081518084526143b4816020860160208601614370565b601f01601f19169290920160200192915050565b8215158152604060208201526000614216604083018461439c565b6000806000604084860312156143f857600080fd5b833561440381613f1f565b925060208401356001600160401b038082111561441f57600080fd5b818601915086601f83011261443357600080fd5b81358181111561444257600080fd5b8760208260051b850101111561445757600080fd5b6020830194508093505050509250925092565b600081518084526020808501945080840160005b8381101561449a5781518752958201959082019060010161447e565b509495945050505050565b602081526000611dd4602083018461446a565b6000806000606084860312156144cd57600080fd5b833592506020840135915060408401356001600160401b0381111561407157600080fd5b6000806040838503121561450457600080fd5b8235915060208301356001600160401b038111156140c057600080fd5b60006020828403121561453357600080fd5b81356001600160401b0381111561454957600080fd5b61421684828501613fd9565b600081518084526020808501945080840160005b8381101561449a5781516001600160a01b031687529582019590820190600101614569565b838152826020820152606060408201526000613e426060830184614555565b6000602082840312156145bf57600080fd5b5035919050565b60008060008060008587036101608112156145e057600080fd5b60e08112156145ee57600080fd5b506145f7613f5a565b86358152602087013560208201526040870135604082015260608701356060820152608087013561462781613f1f565b608082015260a087013561463a81613f1f565b60a082015260c087013561464d81613f1f565b60c0820152945061466060e08701613f34565b9350610100860135925061012086013591506101408601356001600160401b0381111561468c57600080fd5b61469888828901614125565b9150509295509295909350565b60018060a01b0384168152826020820152606060408201526000613e42606083018461439c565b634e487b7160e01b600052601160045260246000fd5b6000828210156146f4576146f46146cc565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614723576147236146cc565b5060010190565b600081614739576147396146cc565b506000190190565b6001600160a01b03831681526040602082018190526000906142169083018461439c565b60006020828403121561477757600080fd5b5051919050565b602081526000611dd46020830184614555565b6000602082840312156147a357600080fd5b8151611dd481613f1f565b600084516147c0818460208901614370565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b602081526000611dd4602083018461439c565b6000845161480d818460208901614370565b606085901b6001600160601b0319169083019081528351614835816014840160208801614370565b0160140195945050505050565b606081526000614855606083018661446a565b6001600160a01b039490941660208301525060400152919050565b6000806040838503121561488357600080fd5b505080516020909101519092909150565b60608152836060820152838560808301376000608085830181019190915260208201939093526001600160a01b03919091166040820152601f909201601f191690910101919050565b600080604083850312156148f057600080fd5b8251801515811461490057600080fd5b60208401519092506001600160401b0381111561491c57600080fd5b8301601f8101851361492d57600080fd5b805161493b613ff882613fb2565b81815286602083850101111561495057600080fd5b614961826020830160208601614370565b8093505050509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561499e57600080fd5b8260051b8085606085013760009201606001918252509392505050565b600060208083850312156149ce57600080fd5b82516001600160401b038111156149e457600080fd5b8301601f810185136149f557600080fd5b8051614a03613ff882614102565b81815260059190911b82018301908381019087831115614a2257600080fd5b928401925b82841015614a4057835182529284019290840190614a27565b979650505050505050565b838152826020820152606060408201526000613e42606083018461439c565b600080600060608486031215614a7f57600080fd5b83519250602080850151925060408501516001600160401b03811115614aa457600080fd5b8501601f81018713614ab557600080fd5b8051614ac3613ff882614102565b81815260059190911b82018301908381019089831115614ae257600080fd5b928401925b82841015614b09578351614afa81613f1f565b82529284019290840190614ae7565b80955050505050509250925092565b828152604060208201526000614216604083018461439c565b604081526000614b44604083018561439c565b90508260208301529392505050565b60208082526021908201527f4d616e616765722063616e6e6f74206265206c657373207468616e20746872656040820152606560f81b606082015260800190565b60008219821115614ba757614ba76146cc565b500190565b634e487b7160e01b600052603160045260246000fd5b6bffffffffffffffffffffffff198360601b16815260008251614bec816014850160208701614370565b919091016014019392505050565b6000816000190483118215151615614c1457614c146146cc565b500290565b600082614c3657634e487b7160e01b600052601260045260246000fd5b500490565b60008251614c4d818460208701614370565b919091019291505056fea26469706673582212202a2692f32a12b9c2506b095ed9baedc9aa85e16dbfa3604372af967c23236cf764736f6c634300080c0033

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

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.