ETH Price: $3,578.68 (-0.92%)

Contract

0x8C3c25474530DF10046f7cDc197571F353F5AcA0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Convert147732302022-05-14 11:00:18934 days ago1652526018IN
0x8C3c2547...353F5AcA0
0 ETH0.0046270854.92671411
Convert147730742022-05-14 10:24:16934 days ago1652523856IN
0x8C3c2547...353F5AcA0
0 ETH0.0026678331.66909434
Convert133168812021-09-28 22:19:151161 days ago1632867555IN
0x8C3c2547...353F5AcA0
0 ETH0.0050075563.02533016
Convert133168122021-09-28 22:05:091161 days ago1632866709IN
0x8C3c2547...353F5AcA0
0 ETH0.0069078886.92995562
Convert132975002021-09-25 21:46:581164 days ago1632606418IN
0x8C3c2547...353F5AcA0
0 ETH0.0022880428.79305985
Convert132702692021-09-21 16:41:081169 days ago1632242468IN
0x8C3c2547...353F5AcA0
0 ETH0.00641181102.77314036
Convert132702102021-09-21 16:26:581169 days ago1632241618IN
0x8C3c2547...353F5AcA0
0 ETH0.0044522271.38987534
Convert132702102021-09-21 16:26:581169 days ago1632241618IN
0x8C3c2547...353F5AcA0
0 ETH0.0044522271.38987534
Convert132671552021-09-21 5:19:461169 days ago1632201586IN
0x8C3c2547...353F5AcA0
0 ETH0.0051671582.85351303
Convert132671522021-09-21 5:18:441169 days ago1632201524IN
0x8C3c2547...353F5AcA0
0 ETH0.0050519881.00665734
Convert132670242021-09-21 4:51:101169 days ago1632199870IN
0x8C3c2547...353F5AcA0
0 ETH0.00794276127.31232123
Convert132664292021-09-21 2:30:461169 days ago1632191446IN
0x8C3c2547...353F5AcA0
0 ETH0.0064663781.37386246
Convert132643802021-09-20 18:58:041170 days ago1632164284IN
0x8C3c2547...353F5AcA0
0 ETH0.004877378.22083843
Convert132630462021-09-20 14:03:521170 days ago1632146632IN
0x8C3c2547...353F5AcA0
0 ETH0.01091812175.0036506
Convert132629482021-09-20 13:44:411170 days ago1632145481IN
0x8C3c2547...353F5AcA0
0 ETH0.00813049130.36947767
Convert132628962021-09-20 13:29:531170 days ago1632144593IN
0x8C3c2547...353F5AcA0
0 ETH0.00547787.80636199
Convert132628912021-09-20 13:28:471170 days ago1632144527IN
0x8C3c2547...353F5AcA0
0 ETH0.0055149888.43069498
Convert132622262021-09-20 10:59:261170 days ago1632135566IN
0x8C3c2547...353F5AcA0
0 ETH0.002048532.83492448
Convert132621302021-09-20 10:37:061170 days ago1632134226IN
0x8C3c2547...353F5AcA0
0 ETH0.0041195551.84113299
Convert132619222021-09-20 9:49:271170 days ago1632131367IN
0x8C3c2547...353F5AcA0
0 ETH0.0029809347.78051698
Convert132595392021-09-20 0:49:311170 days ago1632098971IN
0x8C3c2547...353F5AcA0
0 ETH0.0035507956.91470234
Convert132595272021-09-20 0:47:291170 days ago1632098849IN
0x8C3c2547...353F5AcA0
0 ETH0.0037199959.64881767
Convert132586362021-09-19 21:29:401170 days ago1632086980IN
0x8C3c2547...353F5AcA0
0 ETH0.0066295383.40291696
Convert130291872021-08-15 10:24:061206 days ago1629023046IN
0x8C3c2547...353F5AcA0
0 ETH0.0018512529.67321508
Convert129743272021-08-06 23:18:201214 days ago1628291900IN
0x8C3c2547...353F5AcA0
0 ETH0.0040778151.30098836
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CUPMinter

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 999999 runs

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

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./Approvable.sol";



interface IERC20Short {
    function burnFrom(address account, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}


contract CUPMinter is Approvable {
    using SafeMath for uint256;

    address private _cup;
    mapping(address => bool) private _tokens;

    struct Proposal {
        uint256 id;
        bool applied;
        address token;
        uint256 approvalsWeight;
    }
    Proposal[] private _proposals;
    mapping(address => mapping(uint256 => bool)) private _approvalsProposal;

    event NewProposal(uint256 indexed id, address indexed token);
    event VoteForProposal(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight);
    event ProposalApplied(uint256 indexed id, address indexed token);


    constructor(uint256 weight, uint256 threshold) public {
        _setupApprover(_msgSender(), weight);
        _setupThreshold(threshold);
    }

    function convert(address token, uint256 amount) public {
        require(_tokens[token], "This token is not allowed to convert");
        address msgSender = _msgSender();
        IERC20Short(token).burnFrom(msgSender, amount);
        IERC20Short(cup()).mint(msgSender, amount);
    }

    function cup() public view returns (address) {
        return _cup;
    }

    function setCup(address token) public onlyApprover {
        require(token != address(0), "New CUP address is the zero address");
        require(cup() == address(0), "The CUP address is already setted");
        _cup = token;
    }

    function proposalsCount() public view returns (uint256) {
        return _proposals.length;
    }

    function getProposal(uint256 id) public view returns (Proposal memory) {
        return _proposals[id];
    }

    function addProposal(address token) public onlyApprover returns (uint256) {
        uint256 id = _addNewProposal(token);
        _voteForProposal(id);
        return id;
    }

    function approveProposal(uint256 id) public onlyApprover {
        require(_proposals[id].applied == false, "Proposal has already applied");
        require(_approvalsProposal[_msgSender()][id] == false, "Cannot approve transfer twice");
        _voteForProposal(id);
    }


    function _addNewProposal(address token) private returns (uint256) {
        require(token != address(0), "Token is the zero address");
        uint256 id = _proposals.length;
        _proposals.push(Proposal(id, false, token, 0));
        emit NewProposal(id, token);
        return id;
    }

    function _voteForProposal(uint256 id) private {
        address msgSender = _msgSender();
        _approvalsProposal[msgSender][id] = true;
        uint256 approverWeight = getApproverWeight(msgSender);
        _proposals[id].approvalsWeight = _proposals[id].approvalsWeight.add(approverWeight);
        emit VoteForProposal(id, msgSender, approverWeight, _proposals[id].approvalsWeight);
        if (_proposals[id].approvalsWeight >= getThreshold())
            _applyProposal(id);
    }

    function _applyProposal(uint256 id) private {
        _tokens[_proposals[id].token] = true;
        _proposals[id].applied = true;
        emit ProposalApplied(id, _proposals[id].token);
    }
}

File 2 of 5 : Approvable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
//pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 */
abstract contract Approvable is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    using SafeMath for uint256;

    EnumerableSet.AddressSet _approvers;
    mapping(address => uint256) private _weights;
    uint256 private _totalWeight;
    uint256 private _threshold;


    struct GrantApprover {
        uint256 id;
        bool executed;
        address account;
        uint256 weight;
        uint256 approvalsWeight;
    }
    GrantApprover[] private _grantApprovers;
    mapping(address => mapping(uint256 => bool)) private _approvalsGrantApprover;


    struct ChangeApproverWeight {
        uint256 id;
        bool executed;
        address account;
        uint256 weight;
        uint256 approvalsWeight;
    }
    ChangeApproverWeight[] private _changeApproverWeights;
    mapping(address => mapping(uint256 => bool)) private _approvalsChangeApproverWeight;


    struct RevokeApprover {
        uint256 id;
        bool executed;
        address account;
        uint256 approvalsWeight;
    }
    RevokeApprover[] private _revokeApprovers;
    mapping(address => mapping(uint256 => bool)) private _approvalsRevokeApprover;


    struct ChangeThreshold {
        uint256 id;
        bool executed;
        uint256 threshold;
        uint256 approvalsWeight;
    }
    ChangeThreshold[] private _changeThresholds;
    mapping(address => mapping(uint256 => bool)) private _approvalsChangeThreshold;


    event NewGrantApprover(uint256 indexed id, address indexed account, uint256 weight);
    event VoteForGrantApprover(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight);
    event ApproverGranted(address indexed account);

    event NewChangeApproverWeight(uint256 indexed id, address indexed account, uint256 weight);
    event VoteForChangeApproverWeight(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight);
    event ApproverWeightChanged(address indexed account, uint256 oldWeight, uint256 newWeight);

    event NewRevokeApprover(uint256 indexed id, address indexed account);
    event VoteForRevokeApprover(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight);
    event ApproverRevoked(address indexed account);

    event NewChangeThreshold(uint256 indexed id, uint256 threshold);
    event VoteForChangeThreshold(uint256 indexed id, address indexed voter, uint256 voterWeight, uint256 approvalsWeight);
    event ThresholdChanged(uint256 oldThreshold, uint256 newThreshold);

    event TotalWeightChanged(uint256 oldTotalWeight, uint256 newTotalWeight);


    function getThreshold() public view returns (uint256) {
        return _threshold;
    }

    function getTotalWeight() public view returns (uint256) {
        return _totalWeight;
    }

    function getApproversCount() public view returns (uint256) {
        return _approvers.length();
    }

    function isApprover(address account) public view returns (bool) {
        return _approvers.contains(account);
    }

    function getApprover(uint256 index) public view returns (address) {
        return _approvers.at(index);
    }

    function getApproverWeight(address account) public view returns (uint256) {
        return _weights[account];
    }


    // GrantApprovers
    function getGrantApproversCount() public view returns (uint256) {
        return _grantApprovers.length;
    }

    function getGrantApprover(uint256 id) public view returns (GrantApprover memory) {
        return _grantApprovers[id];
    }

    // ChangeApproverWeights
    function getChangeApproverWeightsCount() public view returns (uint256) {
        return _changeApproverWeights.length;
    }

    function getChangeApproverWeight(uint256 id) public view returns (ChangeApproverWeight memory) {
        return _changeApproverWeights[id];
    }

    // RevokeApprovers
    function getRevokeApproversCount() public view returns (uint256) {
        return _revokeApprovers.length;
    }

    function getRevokeApprover(uint256 id) public view returns (RevokeApprover memory) {
        return _revokeApprovers[id];
    }

    // ChangeThresholds
    function getChangeThresholdsCount() public view returns (uint256) {
        return _changeThresholds.length;
    }

    function getChangeThreshold(uint256 id) public view returns (ChangeThreshold memory) {
        return _changeThresholds[id];
    }


    // Grant Approver
    function grantApprover(address account, uint256 weight) public onlyApprover returns (uint256) {
        uint256 id = _addNewGrantApprover(account, weight);
        _voteForGrantApprover(id);
        return id;
    }

    function _addNewGrantApprover(address account, uint256 weight) private returns (uint256) {
        require(account != address(0), "Approvable: account is the zero address");
        uint256 id = _grantApprovers.length;
        _grantApprovers.push(GrantApprover(id, false, account, weight, 0));
        emit NewGrantApprover(id, account, weight);
        return id;
    }

    function _voteForGrantApprover(uint256 id) private returns (bool) {
        address msgSender = _msgSender();
        _approvalsGrantApprover[msgSender][id] = true;
        _grantApprovers[id].approvalsWeight = _grantApprovers[id].approvalsWeight.add(_weights[msgSender]);
        emit VoteForGrantApprover(id, msgSender, _weights[msgSender], _grantApprovers[id].approvalsWeight);
        return true;
    }

    function _grantApprover(address account, uint256 weight) private returns (bool) {
        if (_approvers.add(account)) {
            _changeApproverWeight(account, weight);
            emit ApproverGranted(account);
            return true;
        }
        return false;
    }

    function _setupApprover(address account, uint256 weight) internal returns (bool) {
        return _grantApprover(account, weight);
    }

    function approveGrantApprover(uint256 id) public onlyApprover returns (bool) {
        require(_grantApprovers[id].executed == false, "Approvable: action has already executed");
        require(_approvalsGrantApprover[_msgSender()][id] == false, "Approvable: Cannot approve action twice");
        return _voteForGrantApprover(id);
    }

    function confirmGrantApprover(uint256 id) public returns (bool) {
        require(_grantApprovers[id].account == _msgSender(), "Approvable: only pending approver");
        require(_grantApprovers[id].executed == false, "Approvable: action has already executed");
        if (_grantApprovers[id].approvalsWeight >= _threshold) {
            _grantApprover(_grantApprovers[id].account, _grantApprovers[id].weight);
            _grantApprovers[id].executed = true;
            return true;
        }
        return false;
    }


    // Change Approver Weight
    function changeApproverWeight(address account, uint256 weight) public onlyApprover returns (uint256) {
        require(_totalWeight.sub(_weights[account]).add(weight) >= _threshold, "Approvable: The threshold is greater than new totalWeight");
        uint256 id = _addNewChangeApproverWeight(account, weight);
        _voteForChangeApproverWeight(id);
        return id;
    }

    function _addNewChangeApproverWeight(address account, uint256 weight) private returns (uint256) {
        require(account != address(0), "Approvable: account is the zero address");
        uint256 id = _changeApproverWeights.length;
        _changeApproverWeights.push(ChangeApproverWeight(id, false, account, weight, 0));
        emit NewChangeApproverWeight(id, account, weight);
        return id;
    }

    function _voteForChangeApproverWeight(uint256 id) private returns (bool) {
        address msgSender = _msgSender();
        _approvalsChangeApproverWeight[msgSender][id] = true;
        _changeApproverWeights[id].approvalsWeight = _changeApproverWeights[id].approvalsWeight.add(_weights[msgSender]);
        emit VoteForChangeApproverWeight(id, msgSender, _weights[msgSender], _changeApproverWeights[id].approvalsWeight);
        if (_changeApproverWeights[id].approvalsWeight >= _threshold) {
            _changeApproverWeight(_changeApproverWeights[id].account, _changeApproverWeights[id].weight);
            _changeApproverWeights[id].executed = true;
        }
        return true;
    }

    function _changeApproverWeight(address account, uint256 weight) private returns (bool) {
        uint256 newTotalWeight = _totalWeight.sub(_weights[account]).add(weight);
        require(newTotalWeight >= _threshold, "Approvable: The threshold is greater than new totalWeight");
        _setTotalWeight(newTotalWeight);
        emit ApproverWeightChanged(account, _weights[account], weight);
        _weights[account] = weight;
        return true;
    }

    function approveChangeApproverWeight(uint256 id) public onlyApprover returns (bool) {
        require(_changeApproverWeights[id].executed == false, "Approvable: action has already executed");
        require(_approvalsChangeApproverWeight[_msgSender()][id] == false, "Approvable: Cannot approve action twice");
        return _voteForChangeApproverWeight(id);
    }


    // Revoke Approver
    function revokeApprover(address account) public onlyApprover returns (uint256) {
        require(_totalWeight.sub(_weights[account]) >= _threshold, "Approvable: The threshold is greater than new totalWeight");
        uint256 id = _addNewRevokeApprover(account);
        _voteForRevokeApprover(id);
        return id;
    }

    function _addNewRevokeApprover(address account) private returns (uint256) {
        require(account != address(0), "Approvable: account is the zero address");
        uint256 id = _revokeApprovers.length;
        _revokeApprovers.push(RevokeApprover(id, false, account, 0));
        emit NewRevokeApprover(id, account);
        return id;
    }

    function _voteForRevokeApprover(uint256 id) private returns (bool) {
        address msgSender = _msgSender();
        _approvalsRevokeApprover[msgSender][id] = true;
        _revokeApprovers[id].approvalsWeight = _revokeApprovers[id].approvalsWeight.add(_weights[msgSender]);
        emit VoteForRevokeApprover(id, msgSender, _weights[msgSender], _revokeApprovers[id].approvalsWeight);
        if (_revokeApprovers[id].approvalsWeight >= _threshold) {
            _revokeApprover(_revokeApprovers[id].account);
            _revokeApprovers[id].executed = true;
        }
        return true;
    }

    function _revokeApprover(address account) private returns (bool) {
        uint256 newTotalWeight = _totalWeight.sub(_weights[account]);
        require(newTotalWeight >= _threshold, "Approvable: The threshold is greater than new totalWeight");
        if (_approvers.remove(account)) {
            _changeApproverWeight(account, 0);
            emit ApproverRevoked(account);
            return true;
        }
        return false;
    }

    function approveRevokeApprover(uint256 id) public onlyApprover returns (bool) {
        require(_revokeApprovers[id].executed == false, "Approvable: action has already executed");
        require(_approvalsRevokeApprover[_msgSender()][id] == false, "Approvable: Cannot approve action twice");
        return _voteForRevokeApprover(id);
    }

    function renounceApprover(address account) public returns (bool) {
        require(account == _msgSender(), "Approvable: can only renounce roles for self");
        return _revokeApprover(account);
    }


    // Change Threshold
    function changeThreshold(uint256 threshold) public onlyApprover returns (uint256) {
        require(getTotalWeight() >= threshold, "Approvable: The new threshold is greater than totalWeight");
        uint256 id = _addNewChangeThreshold(threshold);
        _voteForChangeThreshold(id);
        return id;
    }

    function _addNewChangeThreshold(uint256 threshold) private returns (uint256) {
        uint256 id = _changeThresholds.length;
        _changeThresholds.push(ChangeThreshold(id, false, threshold, 0));
        emit NewChangeThreshold(id, threshold);
        return id;
    }

    function _voteForChangeThreshold(uint256 id) private returns (bool) {
        address msgSender = _msgSender();
        _approvalsChangeThreshold[msgSender][id] = true;
        _changeThresholds[id].approvalsWeight = _changeThresholds[id].approvalsWeight.add(_weights[msgSender]);
        emit VoteForChangeThreshold(id, msgSender, _weights[msgSender], _changeThresholds[id].approvalsWeight);
        if (_changeThresholds[id].approvalsWeight >= _threshold) {
            _setThreshold(_changeThresholds[id].threshold);
            _changeThresholds[id].executed = true;
        }
        return true;
    }

    function approveChangeThreshold(uint256 id) public onlyApprover returns (bool) {
        require(_changeThresholds[id].executed == false, "Approvable: action has already executed");
        require(_approvalsChangeThreshold[_msgSender()][id] == false, "Approvable: Cannot approve action twice");
        return _voteForChangeThreshold(id);
    }

    function _setThreshold(uint256 threshold) private returns (bool) {
        require(getTotalWeight() >= threshold, "Approvable: The new threshold is greater than totalWeight");
        emit ThresholdChanged(_threshold, threshold);
        _threshold = threshold;
        return true;
    }

    function _setupThreshold(uint256 threshold) internal returns (bool) {
        return _setThreshold(threshold);
    }


    // Total Weight
    function _setTotalWeight(uint256 totalWeight) private returns (bool) {
        emit TotalWeightChanged(_totalWeight, totalWeight);
        _totalWeight = totalWeight;
        return true;
    }

    modifier onlyApprover() {
        require(isApprover(_msgSender()), "Approvable: caller is not the approver");
        _;
    }
}

File 3 of 5 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 5 of 5 : EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ApproverGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ApproverRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeight","type":"uint256"}],"name":"ApproverWeightChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NewChangeApproverWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"NewChangeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"NewGrantApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"NewRevokeApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"ProposalApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"ThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTotalWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalWeight","type":"uint256"}],"name":"TotalWeightChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForChangeApproverWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForChangeThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForGrantApprover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"voterWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"name":"VoteForRevokeApprover","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveChangeApproverWeight","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveChangeThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveGrantApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approveRevokeApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"changeApproverWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"changeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"confirmGrantApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cup","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getApprover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getApproverWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getChangeApproverWeight","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.ChangeApproverWeight","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChangeApproverWeightsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getChangeThreshold","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.ChangeThreshold","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChangeThresholdsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getGrantApprover","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.GrantApprover","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGrantApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"applied","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct CUPMinter.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRevokeApprover","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"approvalsWeight","type":"uint256"}],"internalType":"struct Approvable.RevokeApprover","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevokeApproversCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"grantApprover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"renounceApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeApprover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setCup","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200409038038062004090833981016040819052620000349162000367565b62000049620000426200005e565b8362000062565b50620000558162000079565b5050506200049e565b3390565b600062000070838362000086565b90505b92915050565b60006200007382620000fc565b6000620000a38360006200017960201b6200169b1790919060201c565b15620000f357620000b5838362000190565b506040516001600160a01b038416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a250600162000073565b50600092915050565b6000816200010962000296565b1015620001335760405162461bcd60e51b81526004016200012a90620003e8565b60405180910390fd5b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a600454836040516200016892919062000445565b60405180910390a150600455600190565b600062000070836001600160a01b0384166200029c565b600080620001ed83620001d960026000886001600160a01b03166001600160a01b0316815260200190815260200160002054600354620002eb60201b620016c41790919060201c565b620002f960201b620016d01790919060201c565b9050600454811015620002145760405162461bcd60e51b81526004016200012a906200038b565b6200021f8162000307565b506001600160a01b038416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b80916200026c91879062000445565b60405180910390a250506001600160a01b0391909116600090815260026020526040902055600190565b60035490565b6000620002aa83836200034f565b620002e25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000073565b50600062000073565b60006200007082846200046e565b600062000070828462000453565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f577600354836040516200033e92919062000445565b60405180910390a150600355600190565b60009081526001919091016020526040902054151590565b600080604083850312156200037a578182fd5b505080516020909101519092909150565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b918252602082015260400190565b6000821982111562000469576200046962000488565b500190565b60008282101562000483576200048362000488565b500390565b634e487b7160e01b600052601160045260246000fd5b613be280620004ae6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806387fd3a431161010f578063a29b9e63116100a2578063c7f758a811610071578063c7f758a8146103ec578063cb7b8ee7146103ff578063dbc44d1814610412578063e75235b814610425576101e5565b8063a29b9e63146103ab578063a9ed484e146103be578063aa8a7eeb146103d1578063aca1638d146103d9576101e5565b80639be99d7e116100de5780639be99d7e146103755780639d9a402d1461037d5780639e9fb6ab14610385578063a02300f614610398576101e5565b806387fd3a43146103325780638d99a6d31461033a5780638dd255a01461034257806398951b5614610362576101e5565b806347c89187116101875780636d218e48116101565780636d218e48146102e65780637157e493146102f95780637f8b35bf1461030c578063839208711461031f576101e5565b806347c891871461028b57806367c6e39c146102ab578063694e80c3146102c05780636c222797146102d3576101e5565b806318d13ef7116101c357806318d13ef7146102305780631b284686146102435780633ad10beb146102635780633f30190f14610278576101e5565b806306aba0e1146101ea5780630a9f46ad146102085780631094ef0e14610210575b600080fd5b6101f261042d565b6040516101ff9190613b37565b60405180910390f35b6101f2610433565b61022361021e3660046134fd565b610439565b6040516101ff91906135e2565b6101f261023e3660046134ba565b610715565b6102566102513660046134fd565b6107e2565b6040516101ff9190613b29565b61026b610889565b6040516101ff919061359b565b6102236102863660046134fd565b6108a5565b61029e6102993660046134fd565b6109f9565b6040516101ff9190613aee565b6102be6102b93660046134d4565b610aaa565b005b6101f26102ce3660046134fd565b610c15565b6102236102e13660046134fd565b610caf565b6102236102f43660046134ba565b610dfd565b61026b6103073660046134fd565b610e09565b61022361031a3660046134ba565b610e15565b6101f261032d3660046134ba565b610e8c565b6101f2610ee5565b6101f2610eeb565b6103556103503660046134fd565b610ef1565b6040516101ff9190613afc565b6102be6103703660046134fd565b610f80565b6101f26110cf565b6101f26110d5565b61029e6103933660046134fd565b6110db565b6101f26103a63660046134d4565b61111d565b6101f26103b93660046134ba565b6111f8565b6101f26103cc3660046134d4565b611220565b6101f261127a565b6102be6103e73660046134ba565b61128b565b6102566103fa3660046134fd565b6113b7565b61022361040d3660046134fd565b6113f9565b6102236104203660046134fd565b611547565b6101f2611695565b60035490565b600f5490565b60006104436116dc565b73ffffffffffffffffffffffffffffffffffffffff1660058381548110610493577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060049091020160010154610100900473ffffffffffffffffffffffffffffffffffffffff1614610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906139d7565b60405180910390fd5b6005828154811061053c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff161561058a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600454600583815481106105c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301541061070c5761069e6005838154811061061b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058481548110610687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201546116e0565b506001600583815481106106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160006101000a81548160ff02191690831515021790555060019050610710565b5060005b919050565b60006107226102f46116dc565b610758576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205460035461078d916116c4565b10156107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006107d08361174e565b90506107db816118f0565b5092915050565b6107ea6133e5565b60098281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160808101825260039390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff1690820152600290910154606082015292915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1690565b60006108b26102f46116dc565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60098281548110610922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615610970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600a600061097c6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff16156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826118f0565b92915050565b610a01613425565b60078281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160a08101825260049390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff169082015260028201546060820152600390910154608082015292915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205460ff16610b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a34565b6000610b136116dc565b6040517f79cc679000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8416906379cc679090610b6a90849086906004016135bc565b600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50505050610ba4610889565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401610bde9291906135bc565b600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505050565b6000610c226102f46116dc565b610c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b81610c6161042d565b1015610c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b6000610ca483611c0a565b90506107db81611d45565b6000610cbc6102f46116dc565b610cf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600b8281548110610d2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615610d7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600c6000610d866116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff1615610df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382611d45565b60006109f3818361206d565b60006109f3818361208f565b6000610e1f6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906136a7565b6109f38261209b565b6000610e996102f46116dc565b610ecf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b6000610eda83612175565b90506109f381612317565b60075490565b60095490565b610ef961346c565b600b8281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209182902060408051608081018252600490930290910180548352600181015460ff1615159383019390935260028301549082015260039091015460608201529050919050565b610f8b6102f46116dc565b610fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600f8181548110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613852565b601060006110556116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812084825290925290205460ff16156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613943565b6110cc81612317565b50565b60055490565b600b5490565b6110e3613425565b60058281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061112a6102f46116dc565b611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020546003546111a191859161119b916116c4565b906116d0565b10156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006111e58484612518565b90506111f0816126f9565b509392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600061122d6102f46116dc565b611263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600061126f8484612a23565b90506111f081612bf5565b60006112866000612dd7565b905090565b6112966102f46116dc565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b73ffffffffffffffffffffffffffffffffffffffff8116611319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613889565b6000611323610889565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613704565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6113bf6133e5565b600f8281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006114066102f46116dc565b61143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60078281548110611476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff16156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600860006114d06116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561153e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826126f9565b60006115546102f46116dc565b61158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600582815481106115c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b6006600061161e6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561168c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382612bf5565b60045490565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612de2565b9392505050565b60006116bd8284613b66565b60006116bd8284613b4e565b3390565b60006116ec818461169b565b15611745576116fb8383612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a25060016109f3565b50600092915050565b600073ffffffffffffffffffffffffffffffffffffffff821661179d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600980546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019190915592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19095019490945590519192909183917f1d39206c8e3cd201c842c81ae9224e33082724e413c304ab6389e5481c46d21b91a392915050565b6000806118fb6116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600980549293506119bf928690811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546116d090919063ffffffff16565b600984815481106119f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600260039093020182019390935573ffffffffffffffffffffffffffffffffffffffff8416808352925260409020546009805486927fac75b371f7933ebd35b9aa47812296e8a5ad91693bb2555cf60936f0534cf4ed92909184908110611a93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160020154604051611ab3929190613b40565b60405180910390a360045460098481548110611af8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410611c0157611b8360098481548110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661209b565b50600160098481548110611bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060039091020160010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b50600192915050565b600b8054604080516080810182528281526000602082018181528284018781526060840183815260018701885596835292517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600487029081019190915590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb83015593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc909101555181907f12b35ad5b7e8a6cfd25ea301368d40ad7b8d4524abfd2e8a0dcf85b0188225f890611d37908690613b37565b60405180910390a292915050565b600080611d506116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600c60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600b8054929350611e149286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546116d090919063ffffffff16565b600b8481548110611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f8e25f3df762afe3a2ae2bc7a362f8b6b3fd3732b211b6f8dcc7567030598e84b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b8781548110611f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051611f36929190613b40565b60405180910390a3600454600b8481548110611f7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c0157611fe6600b8481548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612f3d565b506001600b8481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020909120600490910201600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091559392505050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612fc4565b60006116bd8383612fdc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081205460035482916120d091906116c4565b905060045481101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612119600084613068565b1561174557612129836000612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907f3bb10f2bb5b56b26e5c3344dbe0cb08aedbcc3ab4c6efe07c6af4a363110788390600090a26001915050610710565b600073ffffffffffffffffffffffffffffffffffffffff82166121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137be565b600f80546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac803840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8049095019490945590519192909183917f4a1fe915f1472308c702e9bb92fd3d7d9de39fc6398bff038bb57e4ccf63430e91a392915050565b60006123216116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060209081526040808320868452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055909150612386826111f8565b90506123c681600f858154811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600f8481548110612400577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201819055508173ffffffffffffffffffffffffffffffffffffffff16837ff84c1372869777505c71774bb13e519483c806d164119279b870b77a3067208483600f8781548110612489577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546040516124a9929190613b40565b60405180910390a36124b9611695565b600f84815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410612513576125138361308a565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612567576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600780546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68881019190915592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b909401939093555190919082907f8f7bb76b3d1bab37c77523a5b9974c3aee5a37a2bf6c08e66e0919ee368dd002906126ea908790613b37565b60405180910390a39392505050565b6000806127046116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600780549293506127a89286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600784815481106127e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f6a9e925d29b44724a0de11438eee7bc3deffcaa056b13621dc04b09716ddb03e600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600787815481106128aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546040516128ca929190613b40565b60405180910390a36004546007848154811061290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c01576129e660078481548110612963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600785815481106129cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612e2c565b50600160078481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8316612a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600580546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db081019190915592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db3909401939093555190919082907f0ead3127d96e64c9483bc260b66e9876d37a97afded6cce4e15f0f9829a7b6e9906126ea908790613b37565b600080612c006116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600660209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905592825260029052205460058054929350612ca49286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60058481548110612cde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f09d269f611287207293fe95f8af8920c0aff4c3405977e0df82085459ca2905b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460058781548110612da6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051612dc6929190613b40565b60405180910390a350600192915050565b60006109f382613233565b6000612dee8383612fc4565b612e24575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f3565b5060006109f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120546003548291612e6791859161119b91906116c4565b9050600454811015612ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612eae81613237565b5073ffffffffffffffffffffffffffffffffffffffff8416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b8091612f06918790613b40565b60405180910390a2505073ffffffffffffffffffffffffffffffffffffffff91909116600090815260026020526040902055600190565b600081612f4861042d565b1015612f80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a60045483604051612fb3929190613b40565b60405180910390a150600455600190565b60009081526001919091016020526040902054151590565b81546000908210613019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906135ed565b826000018281548110613055577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff841661327d565b6001600e6000600f84815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600160039093020182015473ffffffffffffffffffffffffffffffffffffffff6101009091041684528301939093526040909101902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090931692909217909155600f805483908110613175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160006101000a81548160ff021916908315150217905550600f81815481106131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208220600391909102016001015460405161010090910473ffffffffffffffffffffffffffffffffffffffff169183917ef5ff25e03a2523678350d5f0d11556f67e2501434eeb4e86820428ad42e1f79190a350565b5490565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f5776003548360405161326c929190613b40565b60405180910390a150600355600190565b600081815260018301602052604081205480156133db5760006132a1600183613b66565b85549091506000906132b590600190613b66565b905060008660000182815481106132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061333f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200155613356836001613b4e565b6000828152600189016020526040902055865487908061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f3565b60009150506109f3565b604051806080016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60405180608001604052806000815260200160001515815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071057600080fd5b6000602082840312156134cb578081fd5b6116bd82613496565b600080604083850312156134e6578081fd5b6134ef83613496565b946020939093013593505050565b60006020828403121561350e578081fd5b5035919050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff604082015116604083015260608101516060830152608081015160808301525050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff6040820151166040830152606081015160608301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b6020808252602c908201527f417070726f7661626c653a2063616e206f6e6c792072656e6f756e636520726f60408201527f6c657320666f722073656c660000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f54686520435550206164647265737320697320616c726561647920736574746560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a2043616e6e6f7420617070726f766520616374696f60408201527f6e20747769636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f546f6b656e20697320746865207a65726f206164647265737300000000000000604082015260600190565b60208082526026908201527f417070726f7661626c653a2063616c6c6572206973206e6f742074686520617060408201527f70726f7665720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f50726f706f73616c2068617320616c7265616479206170706c69656400000000604082015260600190565b60208082526023908201527f4e657720435550206164647265737320697320746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b6020808252601d908201527f43616e6e6f7420617070726f7665207472616e73666572207477696365000000604082015260600190565b60208082526027908201527f417070726f7661626c653a206163636f756e7420697320746865207a65726f2060408201527f6164647265737300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f417070726f7661626c653a206f6e6c792070656e64696e6720617070726f766560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5468697320746f6b656e206973206e6f7420616c6c6f77656420746f20636f6e60408201527f7665727400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a20616374696f6e2068617320616c7265616479206560408201527f7865637574656400000000000000000000000000000000000000000000000000606082015260800190565b60a081016109f38284613515565b81518152602080830151151590820152604080830151908201526060918201519181019190915260800190565b608081016109f3828461355d565b90815260200190565b918252602082015260400190565b60008219821115613b6157613b61613b7d565b500190565b600082821015613b7857613b78613b7d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220547b4051cbaf50078487bc3dc382cc3c0a4f0254123564829ab43016abac67e664736f6c6343000801003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806387fd3a431161010f578063a29b9e63116100a2578063c7f758a811610071578063c7f758a8146103ec578063cb7b8ee7146103ff578063dbc44d1814610412578063e75235b814610425576101e5565b8063a29b9e63146103ab578063a9ed484e146103be578063aa8a7eeb146103d1578063aca1638d146103d9576101e5565b80639be99d7e116100de5780639be99d7e146103755780639d9a402d1461037d5780639e9fb6ab14610385578063a02300f614610398576101e5565b806387fd3a43146103325780638d99a6d31461033a5780638dd255a01461034257806398951b5614610362576101e5565b806347c89187116101875780636d218e48116101565780636d218e48146102e65780637157e493146102f95780637f8b35bf1461030c578063839208711461031f576101e5565b806347c891871461028b57806367c6e39c146102ab578063694e80c3146102c05780636c222797146102d3576101e5565b806318d13ef7116101c357806318d13ef7146102305780631b284686146102435780633ad10beb146102635780633f30190f14610278576101e5565b806306aba0e1146101ea5780630a9f46ad146102085780631094ef0e14610210575b600080fd5b6101f261042d565b6040516101ff9190613b37565b60405180910390f35b6101f2610433565b61022361021e3660046134fd565b610439565b6040516101ff91906135e2565b6101f261023e3660046134ba565b610715565b6102566102513660046134fd565b6107e2565b6040516101ff9190613b29565b61026b610889565b6040516101ff919061359b565b6102236102863660046134fd565b6108a5565b61029e6102993660046134fd565b6109f9565b6040516101ff9190613aee565b6102be6102b93660046134d4565b610aaa565b005b6101f26102ce3660046134fd565b610c15565b6102236102e13660046134fd565b610caf565b6102236102f43660046134ba565b610dfd565b61026b6103073660046134fd565b610e09565b61022361031a3660046134ba565b610e15565b6101f261032d3660046134ba565b610e8c565b6101f2610ee5565b6101f2610eeb565b6103556103503660046134fd565b610ef1565b6040516101ff9190613afc565b6102be6103703660046134fd565b610f80565b6101f26110cf565b6101f26110d5565b61029e6103933660046134fd565b6110db565b6101f26103a63660046134d4565b61111d565b6101f26103b93660046134ba565b6111f8565b6101f26103cc3660046134d4565b611220565b6101f261127a565b6102be6103e73660046134ba565b61128b565b6102566103fa3660046134fd565b6113b7565b61022361040d3660046134fd565b6113f9565b6102236104203660046134fd565b611547565b6101f2611695565b60035490565b600f5490565b60006104436116dc565b73ffffffffffffffffffffffffffffffffffffffff1660058381548110610493577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060049091020160010154610100900473ffffffffffffffffffffffffffffffffffffffff1614610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906139d7565b60405180910390fd5b6005828154811061053c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff161561058a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600454600583815481106105c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301541061070c5761069e6005838154811061061b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660058481548110610687577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201546116e0565b506001600583815481106106db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160006101000a81548160ff02191690831515021790555060019050610710565b5060005b919050565b60006107226102f46116dc565b610758576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205460035461078d916116c4565b10156107c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006107d08361174e565b90506107db816118f0565b5092915050565b6107ea6133e5565b60098281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160808101825260039390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff1690820152600290910154606082015292915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1690565b60006108b26102f46116dc565b6108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60098281548110610922577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615610970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600a600061097c6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff16156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826118f0565b92915050565b610a01613425565b60078281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020918290206040805160a08101825260049390930290910180548352600181015460ff811615159484019490945261010090930473ffffffffffffffffffffffffffffffffffffffff169082015260028201546060820152600390910154608082015292915050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090205460ff16610b09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a34565b6000610b136116dc565b6040517f79cc679000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8416906379cc679090610b6a90849086906004016135bc565b600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50505050610ba4610889565b73ffffffffffffffffffffffffffffffffffffffff166340c10f1982846040518363ffffffff1660e01b8152600401610bde9291906135bc565b600060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b50505050505050565b6000610c226102f46116dc565b610c58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b81610c6161042d565b1015610c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b6000610ca483611c0a565b90506107db81611d45565b6000610cbc6102f46116dc565b610cf2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600b8281548110610d2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615610d7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600c6000610d866116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff1615610df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382611d45565b60006109f3818361206d565b60006109f3818361208f565b6000610e1f6116dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906136a7565b6109f38261209b565b6000610e996102f46116dc565b610ecf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b6000610eda83612175565b90506109f381612317565b60075490565b60095490565b610ef961346c565b600b8281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209182902060408051608081018252600490930290910180548352600181015460ff1615159383019390935260028301549082015260039091015460608201529050919050565b610f8b6102f46116dc565b610fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600f8181548110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600390920201015460ff1615611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613852565b601060006110556116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812084825290925290205460ff16156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613943565b6110cc81612317565b50565b60055490565b600b5490565b6110e3613425565b60058281548110610a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061112a6102f46116dc565b611160576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60045473ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020546003546111a191859161119b916116c4565b906116d0565b10156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b60006111e58484612518565b90506111f0816126f9565b509392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600061122d6102f46116dc565b611263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600061126f8484612a23565b90506111f081612bf5565b60006112866000612dd7565b905090565b6112966102f46116dc565b6112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b73ffffffffffffffffffffffffffffffffffffffff8116611319576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613889565b6000611323610889565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613704565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6113bf6133e5565b600f8281548110610824577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006114066102f46116dc565b61143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b60078281548110611476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff16156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b600860006114d06116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561153e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f3826126f9565b60006115546102f46116dc565b61158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137f5565b600582815481106115c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091206001600490920201015460ff1615611612576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613a91565b6006600061161e6116dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020808201929092526040908101600090812085825290925290205460ff161561168c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990613761565b6109f382612bf5565b60045490565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612de2565b9392505050565b60006116bd8284613b66565b60006116bd8284613b4e565b3390565b60006116ec818461169b565b15611745576116fb8383612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907ff0ae6fd40737b5ce1fb2141bbf66a994ae5f330dc1d96514b0318ef4bdacd96790600090a25060016109f3565b50600092915050565b600073ffffffffffffffffffffffffffffffffffffffff821661179d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600980546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81019190915592517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b19095019490945590519192909183917f1d39206c8e3cd201c842c81ae9224e33082724e413c304ab6389e5481c46d21b91a392915050565b6000806118fb6116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600980549293506119bf928690811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546116d090919063ffffffff16565b600984815481106119f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600260039093020182019390935573ffffffffffffffffffffffffffffffffffffffff8416808352925260409020546009805486927fac75b371f7933ebd35b9aa47812296e8a5ad91693bb2555cf60936f0534cf4ed92909184908110611a93577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160020154604051611ab3929190613b40565b60405180910390a360045460098481548110611af8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410611c0157611b8360098481548110611b4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661209b565b50600160098481548110611bc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000918252602090912060039091020160010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790555b50600192915050565b600b8054604080516080810182528281526000602082018181528284018781526060840183815260018701885596835292517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600487029081019190915590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb83015593517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc909101555181907f12b35ad5b7e8a6cfd25ea301368d40ad7b8d4524abfd2e8a0dcf85b0188225f890611d37908690613b37565b60405180910390a292915050565b600080611d506116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600c60209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600b8054929350611e149286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546116d090919063ffffffff16565b600b8481548110611e4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f8e25f3df762afe3a2ae2bc7a362f8b6b3fd3732b211b6f8dcc7567030598e84b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b8781548110611f16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051611f36929190613b40565b60405180910390a3600454600b8481548110611f7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c0157611fe6600b8481548110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612f3d565b506001600b8481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020909120600490910201600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091559392505050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff8416612fc4565b60006116bd8383612fdc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526002602052604081205460035482916120d091906116c4565b905060045481101561210e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612119600084613068565b1561174557612129836000612e2c565b5060405173ffffffffffffffffffffffffffffffffffffffff8416907f3bb10f2bb5b56b26e5c3344dbe0cb08aedbcc3ab4c6efe07c6af4a363110788390600090a26001915050610710565b600073ffffffffffffffffffffffffffffffffffffffff82166121c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906137be565b600f80546040805160808101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff80891684860181815260608601858152600189018a559885529451600388027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281019190915592517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac803840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905594517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8049095019490945590519192909183917f4a1fe915f1472308c702e9bb92fd3d7d9de39fc6398bff038bb57e4ccf63430e91a392915050565b60006123216116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060209081526040808320868452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055909150612386826111f8565b90506123c681600f858154811061199f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600f8481548110612400577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201819055508173ffffffffffffffffffffffffffffffffffffffff16837ff84c1372869777505c71774bb13e519483c806d164119279b870b77a3067208483600f8781548110612489577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201546040516124a9929190613b40565b60405180910390a36124b9611695565b600f84815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016002015410612513576125138361308a565b505050565b600073ffffffffffffffffffffffffffffffffffffffff8316612567576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600780546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68881019190915592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015593517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b909401939093555190919082907f8f7bb76b3d1bab37c77523a5b9974c3aee5a37a2bf6c08e66e0919ee368dd002906126ea908790613b37565b60405180910390a39392505050565b6000806127046116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055928252600290522054600780549293506127a89286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600784815481106127e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f6a9e925d29b44724a0de11438eee7bc3deffcaa056b13621dc04b09716ddb03e600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600787815481106128aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301546040516128ca929190613b40565b60405180910390a36004546007848154811061290f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600402016003015410611c01576129e660078481548110612963577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600785815481106129cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160020154612e2c565b50600160078481548110612023577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8316612a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061397a565b600580546040805160a08101825282815260006020820181815273ffffffffffffffffffffffffffffffffffffffff808a16848601818152606086018b81526080870186815260018a018b55999095529451600488027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db081019190915592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840180549651909316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909716969096171694909417905590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db3909401939093555190919082907f0ead3127d96e64c9483bc260b66e9876d37a97afded6cce4e15f0f9829a7b6e9906126ea908790613b37565b600080612c006116dc565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600660209081526040808320888452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905592825260029052205460058054929350612ca49286908110611df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60058481548110612cde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301819055508073ffffffffffffffffffffffffffffffffffffffff16837f09d269f611287207293fe95f8af8920c0aff4c3405977e0df82085459ca2905b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460058781548110612da6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906004020160030154604051612dc6929190613b40565b60405180910390a350600192915050565b60006109f382613233565b6000612dee8383612fc4565b612e24575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109f3565b5060006109f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120546003548291612e6791859161119b91906116c4565b9050600454811015612ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f99061364a565b612eae81613237565b5073ffffffffffffffffffffffffffffffffffffffff8416600081815260026020526040908190205490517f274b4c7584d3dcc2fda481d0e4025e95e7600d781f176fcac8f58098cfdb8b8091612f06918790613b40565b60405180910390a2505073ffffffffffffffffffffffffffffffffffffffff91909116600090815260026020526040902055600190565b600081612f4861042d565b1015612f80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906138e6565b7f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a60045483604051612fb3929190613b40565b60405180910390a150600455600190565b60009081526001919091016020526040902054151590565b81546000908210613019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f9906135ed565b826000018281548110613055577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60006116bd8373ffffffffffffffffffffffffffffffffffffffff841661327d565b6001600e6000600f84815481106130ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60009182526020808320600160039093020182015473ffffffffffffffffffffffffffffffffffffffff6101009091041684528301939093526040909101902080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090931692909217909155600f805483908110613175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160010160006101000a81548160ff021916908315150217905550600f81815481106131d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208220600391909102016001015460405161010090910473ffffffffffffffffffffffffffffffffffffffff169183917ef5ff25e03a2523678350d5f0d11556f67e2501434eeb4e86820428ad42e1f79190a350565b5490565b60007fabbc9adcab7e01850b9dc2a971c755d65c9edf702c4bf6d52c6bbe166407f5776003548360405161326c929190613b40565b60405180910390a150600355600190565b600081815260018301602052604081205480156133db5760006132a1600183613b66565b85549091506000906132b590600190613b66565b905060008660000182815481106132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508087600001848154811061333f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260209091200155613356836001613b4e565b6000828152600189016020526040902055865487908061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506109f3565b60009150506109f3565b604051806080016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060a0016040528060008152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60405180608001604052806000815260200160001515815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461071057600080fd5b6000602082840312156134cb578081fd5b6116bd82613496565b600080604083850312156134e6578081fd5b6134ef83613496565b946020939093013593505050565b60006020828403121561350e578081fd5b5035919050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff604082015116604083015260608101516060830152608081015160808301525050565b8051825260208101511515602083015273ffffffffffffffffffffffffffffffffffffffff6040820151166040830152606081015160608301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60408201527f6473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865207468726573686f6c642069732067726560408201527f61746572207468616e206e657720746f74616c57656967687400000000000000606082015260800190565b6020808252602c908201527f417070726f7661626c653a2063616e206f6e6c792072656e6f756e636520726f60408201527f6c657320666f722073656c660000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f54686520435550206164647265737320697320616c726561647920736574746560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a2043616e6e6f7420617070726f766520616374696f60408201527f6e20747769636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f546f6b656e20697320746865207a65726f206164647265737300000000000000604082015260600190565b60208082526026908201527f417070726f7661626c653a2063616c6c6572206973206e6f742074686520617060408201527f70726f7665720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f50726f706f73616c2068617320616c7265616479206170706c69656400000000604082015260600190565b60208082526023908201527f4e657720435550206164647265737320697320746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f417070726f7661626c653a20546865206e6577207468726573686f6c6420697360408201527f2067726561746572207468616e20746f74616c57656967687400000000000000606082015260800190565b6020808252601d908201527f43616e6e6f7420617070726f7665207472616e73666572207477696365000000604082015260600190565b60208082526027908201527f417070726f7661626c653a206163636f756e7420697320746865207a65726f2060408201527f6164647265737300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f417070726f7661626c653a206f6e6c792070656e64696e6720617070726f766560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f5468697320746f6b656e206973206e6f7420616c6c6f77656420746f20636f6e60408201527f7665727400000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417070726f7661626c653a20616374696f6e2068617320616c7265616479206560408201527f7865637574656400000000000000000000000000000000000000000000000000606082015260800190565b60a081016109f38284613515565b81518152602080830151151590820152604080830151908201526060918201519181019190915260800190565b608081016109f3828461355d565b90815260200190565b918252602082015260400190565b60008219821115613b6157613b61613b7d565b500190565b600082821015613b7857613b78613b7d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220547b4051cbaf50078487bc3dc382cc3c0a4f0254123564829ab43016abac67e664736f6c63430008010033

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

00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : weight (uint256): 1
Arg [1] : threshold (uint256): 1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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