Address Details
contract

0xdf01312EDb4Ce2522cbB4991E3877774b1605a77

Contract Name
RevoFees
Creator
0xff0944–49a35b at 0x4d59e7–92ecac
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
16496085
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
RevoFees




Optimization enabled
false
Compiler version
v0.8.4+commit.c7e474f2




EVM Version
istanbul




Verified at
2022-06-20T18:12:07.451576Z

fees/RevoFees.sol

//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "../ubeswap-farming/contracts/Owned.sol";
import "./interfaces/IRevoFees.sol";

contract RevoFees is Owned, IRevoFees {
    // compounder fee: a performance fee (taken from farming rewards) to compensate someone who calls 'compound' method
    //  on a Revo Farm Bot. This is necessary because compounders incur gas costs and help users get compound interest
    //  (since the 'compound' method re-invests their farming rewards into the farm)
    uint256 public compounderFeeNumerator;
    uint256 public compounderFeeDenominator;

    // reserve fee: a performance fee (taken from farming rewards) sent to Revo reserves, to fund future development
    uint256 public reserveFeeNumerator;
    uint256 public reserveFeeDenominator;

    event CompounderFeeUpdated(
        address indexed by,
        uint256 compounderFeeNumerator,
        uint256 compounderFeeDenominator
    );
    event ReserveFeeUpdated(
        address indexed by,
        uint256 reserveFeeNumerator,
        uint256 reserveFeeDenominator
    );
    event WithdrawalFeeUpdated(
        address indexed by,
        uint256 withdrawalFeeNumerator,
        uint256 withdrawalFeeDenominator
    );
    event UseDynamicWithdrawalFeesUpdated(address indexed by, bool newValue);
    uint256 public withdrawalFeeNumerator;
    uint256 public withdrawalFeeDenominator;
    bool public useDynamicWithdrawalFees;

    constructor(
        address _owner,
        uint256 _compounderFeeNumerator,
        uint256 _compounderFeeDenominator,
        uint256 _reserveFeeNumerator,
        uint256 _reserveFeeDenominator,
        uint256 _withdrawalFeeNumerator,
        uint256 _withdrawalFeeDenominator,
        bool _useDynamicWithdrawalFees
    ) Owned(_owner) {
        require(
            _compounderFeeDenominator > 0 &&
                _reserveFeeDenominator > 0 &&
                _withdrawalFeeDenominator > 0,
            "Fee denoms must be >0"
        );
        compounderFeeNumerator = _compounderFeeNumerator;
        compounderFeeDenominator = _compounderFeeDenominator;
        reserveFeeNumerator = _reserveFeeNumerator;
        reserveFeeDenominator = _reserveFeeDenominator;
        withdrawalFeeNumerator = _withdrawalFeeNumerator;
        withdrawalFeeDenominator = _withdrawalFeeDenominator;
        useDynamicWithdrawalFees = _useDynamicWithdrawalFees;
    }

    function updateCompounderFee(
        uint256 _compounderFeeNumerator,
        uint256 _compounderFeeDenominator
    ) external onlyOwner {
        require(_compounderFeeDenominator > 0, "Denom must be >0");
        compounderFeeNumerator = _compounderFeeNumerator;
        compounderFeeDenominator = _compounderFeeDenominator;
        emit CompounderFeeUpdated(
            msg.sender,
            _compounderFeeNumerator,
            _compounderFeeDenominator
        );
    }

    function updateReserveFee(
        uint256 _reserveFeeNumerator,
        uint256 _reserveFeeDenominator
    ) external onlyOwner {
        require(_reserveFeeDenominator > 0, "Denom must be >0");
        reserveFeeNumerator = _reserveFeeNumerator;
        reserveFeeDenominator = _reserveFeeDenominator;
        emit ReserveFeeUpdated(
            msg.sender,
            _reserveFeeNumerator,
            _reserveFeeDenominator
        );
    }

    function updateWithdrawalFee(
        uint256 _withdrawalFeeNumerator,
        uint256 _withdrawalFeeDenominator
    ) external onlyOwner {
        require(_withdrawalFeeDenominator > 0, "Denom must be >0");
        withdrawalFeeNumerator = _withdrawalFeeNumerator;
        withdrawalFeeDenominator = _withdrawalFeeDenominator;
        emit WithdrawalFeeUpdated(
            msg.sender,
            _withdrawalFeeNumerator,
            _withdrawalFeeDenominator
        );
    }

    /**
     * Set a flag for whether dynamic withdrawal fees should be used.
     *
     * If true, only rewards earned in the last compounding interval will be counted towards fees.
     *
     * Otherwise, static withdrawal fees will be used.
     */
    function updateUseDynamicWithdrawalFees(bool _useDynamicWithdrawalFees)
        external
        onlyOwner
    {
        useDynamicWithdrawalFees = _useDynamicWithdrawalFees;
        emit UseDynamicWithdrawalFeesUpdated(
            msg.sender,
            _useDynamicWithdrawalFees
        );
    }

    /*
     * Check what the bonus will be for calling 'compound' on a Revo Farm Bot.
     *
     * In the future, bonuses may be issued to compounders that are not taken as performance fees. (Could be governance
     *   tokens, or issued from a community fund.) This may help us lower or eliminate the compounder fee.
     */
    function compounderBonus(TokenAmount memory _interestAccrued)
        external
        pure
        override
        returns (TokenAmount[] memory output)
    {
        return new TokenAmount[](0); // intentionally returns empty list
    }

    function compounderFee(uint256 _interestAccrued)
        external
        view
        override
        returns (uint256)
    {
        return
            (_interestAccrued * compounderFeeNumerator) /
            compounderFeeDenominator;
    }

    function reserveFee(uint256 _interestAccrued)
        external
        view
        override
        returns (uint256)
    {
        return (_interestAccrued * reserveFeeNumerator) / reserveFeeDenominator;
    }

    /*
     * Issue the bonus for calling 'compound' on a Revo Farm Bot.
     */
    function issueCompounderBonus(address recipient) external pure override {
        return; // intentionally does nothing
    }

    /*
     * Check the fee for withdrawing funds from a Revo Farm Bot.
     *
     * Withdrawal fees are used to prevent bad actors from depositing right before 'compound' is called, then withdrawing
     *   right after and taking some of the rewards. (Withdrawal fee should be >= the interest gained from the last time
     *   'compound' was called.)
     *
     * If useDynamicWithdrawalFees is true, sets the fee to interest earned in the last compounding interval.
     *
     * (Note that there is a maximum fee set in the Farm Bot contract to protect
     *   users from unreasonably high withdrawal fees.)
     */
    function withdrawalFee(
        uint256 interestEarnedNumerator,
        uint256 interestEarnedDenominator
    )
        external
        view
        override
        returns (uint256 feeNumerator, uint256 feeDenominator)
    {
        if (useDynamicWithdrawalFees && interestEarnedDenominator > 0) {
            feeNumerator = interestEarnedNumerator;
            feeDenominator = interestEarnedDenominator;
        } else {
            feeNumerator = withdrawalFeeNumerator;
            feeDenominator = withdrawalFeeDenominator;
        }
    }
}
        

/fees/interfaces/IRevoFees.sol

//SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "../../openzeppelin-solidity/contracts/IERC20.sol";

struct TokenAmount {
    IERC20 token;
    uint256 amount;
}

interface IRevoFees {
    function compounderFee(uint256 _interestAccrued)
        external
        view
        returns (uint256);

    function compounderBonus(TokenAmount calldata interestAccrued)
        external
        view
        returns (TokenAmount[] memory);

    function reserveFee(uint256 _interestAccrued)
        external
        view
        returns (uint256);

    function withdrawalFee(
        uint256 interestEarnedNumerator,
        uint256 interestEarnedDenominator
    ) external view returns (uint256 feeNumerator, uint256 feeDenominator);

    function issueCompounderBonus(address recipient) external;
}
          

/openzeppelin-solidity/contracts/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}
          

/ubeswap-farming/contracts/Owned.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;


// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"uint256","name":"_compounderFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_compounderFeeDenominator","internalType":"uint256"},{"type":"uint256","name":"_reserveFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_reserveFeeDenominator","internalType":"uint256"},{"type":"uint256","name":"_withdrawalFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_withdrawalFeeDenominator","internalType":"uint256"},{"type":"bool","name":"_useDynamicWithdrawalFees","internalType":"bool"}]},{"type":"event","name":"CompounderFeeUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"compounderFeeNumerator","internalType":"uint256","indexed":false},{"type":"uint256","name":"compounderFeeDenominator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnerChanged","inputs":[{"type":"address","name":"oldOwner","internalType":"address","indexed":false},{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnerNominated","inputs":[{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ReserveFeeUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"reserveFeeNumerator","internalType":"uint256","indexed":false},{"type":"uint256","name":"reserveFeeDenominator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UseDynamicWithdrawalFeesUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"bool","name":"newValue","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawalFeeUpdated","inputs":[{"type":"address","name":"by","internalType":"address","indexed":true},{"type":"uint256","name":"withdrawalFeeNumerator","internalType":"uint256","indexed":false},{"type":"uint256","name":"withdrawalFeeDenominator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple[]","name":"output","internalType":"struct TokenAmount[]","components":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"uint256","name":"amount","internalType":"uint256"}]}],"name":"compounderBonus","inputs":[{"type":"tuple","name":"_interestAccrued","internalType":"struct TokenAmount","components":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"uint256","name":"amount","internalType":"uint256"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"compounderFee","inputs":[{"type":"uint256","name":"_interestAccrued","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"compounderFeeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"compounderFeeNumerator","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[],"name":"issueCompounderBonus","inputs":[{"type":"address","name":"recipient","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"nominateNewOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"nominatedOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reserveFee","inputs":[{"type":"uint256","name":"_interestAccrued","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reserveFeeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reserveFeeNumerator","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateCompounderFee","inputs":[{"type":"uint256","name":"_compounderFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_compounderFeeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateReserveFee","inputs":[{"type":"uint256","name":"_reserveFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_reserveFeeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateUseDynamicWithdrawalFees","inputs":[{"type":"bool","name":"_useDynamicWithdrawalFees","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateWithdrawalFee","inputs":[{"type":"uint256","name":"_withdrawalFeeNumerator","internalType":"uint256"},{"type":"uint256","name":"_withdrawalFeeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"useDynamicWithdrawalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"feeNumerator","internalType":"uint256"},{"type":"uint256","name":"feeDenominator","internalType":"uint256"}],"name":"withdrawalFee","inputs":[{"type":"uint256","name":"interestEarnedNumerator","internalType":"uint256"},{"type":"uint256","name":"interestEarnedDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalFeeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawalFeeNumerator","inputs":[]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040516200170c3803806200170c83398181016040528101906200003791906200021f565b87600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a2906200036e565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000826040516200011f92919062000341565b60405180910390a150600086118015620001395750600084115b8015620001465750600082115b62000188576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017f9062000390565b60405180910390fd5b86600281905550856003819055508460048190555083600581905550826006819055508160078190555080600860006101000a81548160ff0219169083151502179055505050505050505050620004ad565b600081519050620001eb816200045f565b92915050565b600081519050620002028162000479565b92915050565b600081519050620002198162000493565b92915050565b600080600080600080600080610100898b0312156200023d57600080fd5b60006200024d8b828c01620001da565b9850506020620002608b828c0162000208565b9750506040620002738b828c0162000208565b9650506060620002868b828c0162000208565b9550506080620002998b828c0162000208565b94505060a0620002ac8b828c0162000208565b93505060c0620002bf8b828c0162000208565b92505060e0620002d28b828c01620001f1565b9150509295985092959890939650565b620002ed81620003c3565b82525050565b600062000302601983620003b2565b91506200030f826200040d565b602082019050919050565b600062000329601583620003b2565b9150620003368262000436565b602082019050919050565b6000604082019050620003586000830185620002e2565b620003676020830184620002e2565b9392505050565b600060208201905081810360008301526200038981620002f3565b9050919050565b60006020820190508181036000830152620003ab816200031a565b9050919050565b600082825260208201905092915050565b6000620003d082620003e3565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b7f4f776e657220616464726573732063616e6e6f74206265203000000000000000600082015250565b7f4665652064656e6f6d73206d757374206265203e300000000000000000000000600082015250565b6200046a81620003c3565b81146200047657600080fd5b50565b6200048481620003d7565b81146200049057600080fd5b50565b6200049e8162000403565b8114620004aa57600080fd5b50565b61124f80620004bd6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063611eb353116100ad578063a1a1466711610071578063a1a146671461030c578063a264362514610328578063caf4882b14610346578063ea57fd5714610364578063f58eee65146103825761012c565b8063611eb3531461027a578063708d59d21461029857806379ba5097146102b45780638da5cb5b146102be57806392ce27f8146102dc5761012c565b80632a564992116100f45780632a564992146101d757806337d07f46146101f35780634ae2859c1461020f578063533e03f41461024057806353a47bb71461025c5761012c565b80631627540c146101315780631823a05c1461014d5780631deae18c1461016b57806321d6d4af1461019b578063232ceecc146101b9575b600080fd5b61014b60048036038101906101469190610b51565b6103b2565b005b610155610435565b6040516101629190610e6b565b60405180910390f35b61018560048036038101906101809190610bcc565b61043b565b6040516101929190610e6b565b60405180910390f35b6101a361045f565b6040516101b09190610e6b565b60405180910390f35b6101c1610465565b6040516101ce9190610e6b565b60405180910390f35b6101f160048036038101906101ec9190610b51565b61046b565b005b61020d60048036038101906102089190610bf5565b61046e565b005b61022960048036038101906102249190610bf5565b61051b565b604051610237929190610e86565b60405180910390f35b61025a60048036038101906102559190610bf5565b61055c565b005b610264610609565b6040516102719190610d8a565b60405180910390f35b61028261062f565b60405161028f9190610e6b565b60405180910390f35b6102b260048036038101906102ad9190610b7a565b610635565b005b6102bc6106a8565b005b6102c6610859565b6040516102d39190610d8a565b60405180910390f35b6102f660048036038101906102f19190610bcc565b61087d565b6040516103039190610e6b565b60405180910390f35b61032660048036038101906103219190610bf5565b6108a1565b005b61033061094e565b60405161033d9190610e6b565b60405180910390f35b61034e610954565b60405161035b9190610e6b565b60405180910390f35b61036c61095a565b6040516103799190610df0565b60405180910390f35b61039c60048036038101906103979190610ba3565b61096d565b6040516103a99190610dce565b60405180910390f35b6103ba6109f1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce228160405161042a9190610d8a565b60405180910390a150565b60065481565b60006005546004548361044e9190610f4f565b6104589190610f1e565b9050919050565b60025481565b60055481565b50565b6104766109f1565b600081116104b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090610e4b565b60405180910390fd5b81600481905550806005819055503373ffffffffffffffffffffffffffffffffffffffff167ff35610eb852efc886bc5d0a594ebd2fb807b06a2e1c0c10230f5513cb7fa21c5838360405161050f929190610e86565b60405180910390a25050565b600080600860009054906101000a900460ff16801561053a5750600083115b1561054a57839150829050610555565b600654915060075490505b9250929050565b6105646109f1565b600081116105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e90610e4b565b60405180910390fd5b81600281905550806003819055503373ffffffffffffffffffffffffffffffffffffffff167ffe1aba736e0f3a6cabe2c2c10aeade49d8231ac34b0e40f77dffd4e1281ce4de83836040516105fd929190610e86565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b61063d6109f1565b80600860006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8c9ff0a82cce576e0c3a771ee5897c15e08e7a6b9ddfa89132d97766ca81a95c8260405161069d9190610df0565b60405180910390a250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072f90610e0b565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516107ab929190610da5565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354600254836108909190610f4f565b61089a9190610f1e565b9050919050565b6108a96109f1565b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390610e4b565b60405180910390fd5b81600681905550806007819055503373ffffffffffffffffffffffffffffffffffffffff167f7ca0d2dbba159af2bb244623b5b7561d79dd54e3c91486656416903f91b395a28383604051610942929190610e86565b60405180910390a25050565b60045481565b60035481565b600860009054906101000a900460ff1681565b6060600067ffffffffffffffff8111156109b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e957816020015b6109d6610a81565b8152602001906001900390816109ce5790505b509050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690610e2b565b60405180910390fd5b565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600081359050610ac0816111bd565b92915050565b600081359050610ad5816111d4565b92915050565b600081359050610aea816111eb565b92915050565b600060408284031215610b0257600080fd5b610b0c6040610eaf565b90506000610b1c84828501610adb565b6000830152506020610b3084828501610b3c565b60208301525092915050565b600081359050610b4b81611202565b92915050565b600060208284031215610b6357600080fd5b6000610b7184828501610ab1565b91505092915050565b600060208284031215610b8c57600080fd5b6000610b9a84828501610ac6565b91505092915050565b600060408284031215610bb557600080fd5b6000610bc384828501610af0565b91505092915050565b600060208284031215610bde57600080fd5b6000610bec84828501610b3c565b91505092915050565b60008060408385031215610c0857600080fd5b6000610c1685828601610b3c565b9250506020610c2785828601610b3c565b9150509250929050565b6000610c3d8383610d3d565b60408301905092915050565b610c5281610fa9565b82525050565b6000610c6382610ee4565b610c6d8185610efc565b9350610c7883610ed4565b8060005b83811015610ca9578151610c908882610c31565b9750610c9b83610eef565b925050600181019050610c7c565b5085935050505092915050565b610cbf81610fbb565b82525050565b610cce81611003565b82525050565b6000610ce1603583610f0d565b9150610cec826110f6565b604082019050919050565b6000610d04602f83610f0d565b9150610d0f82611145565b604082019050919050565b6000610d27601083610f0d565b9150610d3282611194565b602082019050919050565b604082016000820151610d536000850182610cc5565b506020820151610d666020850182610d6c565b50505050565b610d7581610ff9565b82525050565b610d8481610ff9565b82525050565b6000602082019050610d9f6000830184610c49565b92915050565b6000604082019050610dba6000830185610c49565b610dc76020830184610c49565b9392505050565b60006020820190508181036000830152610de88184610c58565b905092915050565b6000602082019050610e056000830184610cb6565b92915050565b60006020820190508181036000830152610e2481610cd4565b9050919050565b60006020820190508181036000830152610e4481610cf7565b9050919050565b60006020820190508181036000830152610e6481610d1a565b9050919050565b6000602082019050610e806000830184610d7b565b92915050565b6000604082019050610e9b6000830185610d7b565b610ea86020830184610d7b565b9392505050565b6000610eb9610eca565b9050610ec58282611027565b919050565b6000604051905090565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610f2982610ff9565b9150610f3483610ff9565b925082610f4457610f43611087565b5b828204905092915050565b6000610f5a82610ff9565b9150610f6583610ff9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610f9e57610f9d611058565b5b828202905092915050565b6000610fb482610fd9565b9050919050565b60008115159050919050565b6000610fd282610fa9565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061100e82611015565b9050919050565b600061102082610fd9565b9050919050565b611030826110e5565b810181811067ffffffffffffffff8211171561104f5761104e6110b6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008201527f2063616e20616363657074206f776e6572736869700000000000000000000000602082015250565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008201527f6f726d207468697320616374696f6e0000000000000000000000000000000000602082015250565b7f44656e6f6d206d757374206265203e3000000000000000000000000000000000600082015250565b6111c681610fa9565b81146111d157600080fd5b50565b6111dd81610fbb565b81146111e857600080fd5b50565b6111f481610fc7565b81146111ff57600080fd5b50565b61120b81610ff9565b811461121657600080fd5b5056fea2646970667358221220402655eb47fd42fa5b3cb011427eaad6b6e4d72896676eb35382209e43a4b98c64736f6c634300080400330000000000000000000000001ce0269266a3d50ca0a1a00c205b3afad296e546000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063611eb353116100ad578063a1a1466711610071578063a1a146671461030c578063a264362514610328578063caf4882b14610346578063ea57fd5714610364578063f58eee65146103825761012c565b8063611eb3531461027a578063708d59d21461029857806379ba5097146102b45780638da5cb5b146102be57806392ce27f8146102dc5761012c565b80632a564992116100f45780632a564992146101d757806337d07f46146101f35780634ae2859c1461020f578063533e03f41461024057806353a47bb71461025c5761012c565b80631627540c146101315780631823a05c1461014d5780631deae18c1461016b57806321d6d4af1461019b578063232ceecc146101b9575b600080fd5b61014b60048036038101906101469190610b51565b6103b2565b005b610155610435565b6040516101629190610e6b565b60405180910390f35b61018560048036038101906101809190610bcc565b61043b565b6040516101929190610e6b565b60405180910390f35b6101a361045f565b6040516101b09190610e6b565b60405180910390f35b6101c1610465565b6040516101ce9190610e6b565b60405180910390f35b6101f160048036038101906101ec9190610b51565b61046b565b005b61020d60048036038101906102089190610bf5565b61046e565b005b61022960048036038101906102249190610bf5565b61051b565b604051610237929190610e86565b60405180910390f35b61025a60048036038101906102559190610bf5565b61055c565b005b610264610609565b6040516102719190610d8a565b60405180910390f35b61028261062f565b60405161028f9190610e6b565b60405180910390f35b6102b260048036038101906102ad9190610b7a565b610635565b005b6102bc6106a8565b005b6102c6610859565b6040516102d39190610d8a565b60405180910390f35b6102f660048036038101906102f19190610bcc565b61087d565b6040516103039190610e6b565b60405180910390f35b61032660048036038101906103219190610bf5565b6108a1565b005b61033061094e565b60405161033d9190610e6b565b60405180910390f35b61034e610954565b60405161035b9190610e6b565b60405180910390f35b61036c61095a565b6040516103799190610df0565b60405180910390f35b61039c60048036038101906103979190610ba3565b61096d565b6040516103a99190610dce565b60405180910390f35b6103ba6109f1565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce228160405161042a9190610d8a565b60405180910390a150565b60065481565b60006005546004548361044e9190610f4f565b6104589190610f1e565b9050919050565b60025481565b60055481565b50565b6104766109f1565b600081116104b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090610e4b565b60405180910390fd5b81600481905550806005819055503373ffffffffffffffffffffffffffffffffffffffff167ff35610eb852efc886bc5d0a594ebd2fb807b06a2e1c0c10230f5513cb7fa21c5838360405161050f929190610e86565b60405180910390a25050565b600080600860009054906101000a900460ff16801561053a5750600083115b1561054a57839150829050610555565b600654915060075490505b9250929050565b6105646109f1565b600081116105a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059e90610e4b565b60405180910390fd5b81600281905550806003819055503373ffffffffffffffffffffffffffffffffffffffff167ffe1aba736e0f3a6cabe2c2c10aeade49d8231ac34b0e40f77dffd4e1281ce4de83836040516105fd929190610e86565b60405180910390a25050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b61063d6109f1565b80600860006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8c9ff0a82cce576e0c3a771ee5897c15e08e7a6b9ddfa89132d97766ca81a95c8260405161069d9190610df0565b60405180910390a250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072f90610e0b565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516107ab929190610da5565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354600254836108909190610f4f565b61089a9190610f1e565b9050919050565b6108a96109f1565b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390610e4b565b60405180910390fd5b81600681905550806007819055503373ffffffffffffffffffffffffffffffffffffffff167f7ca0d2dbba159af2bb244623b5b7561d79dd54e3c91486656416903f91b395a28383604051610942929190610e86565b60405180910390a25050565b60045481565b60035481565b600860009054906101000a900460ff1681565b6060600067ffffffffffffffff8111156109b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e957816020015b6109d6610a81565b8152602001906001900390816109ce5790505b509050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7690610e2b565b60405180910390fd5b565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600081359050610ac0816111bd565b92915050565b600081359050610ad5816111d4565b92915050565b600081359050610aea816111eb565b92915050565b600060408284031215610b0257600080fd5b610b0c6040610eaf565b90506000610b1c84828501610adb565b6000830152506020610b3084828501610b3c565b60208301525092915050565b600081359050610b4b81611202565b92915050565b600060208284031215610b6357600080fd5b6000610b7184828501610ab1565b91505092915050565b600060208284031215610b8c57600080fd5b6000610b9a84828501610ac6565b91505092915050565b600060408284031215610bb557600080fd5b6000610bc384828501610af0565b91505092915050565b600060208284031215610bde57600080fd5b6000610bec84828501610b3c565b91505092915050565b60008060408385031215610c0857600080fd5b6000610c1685828601610b3c565b9250506020610c2785828601610b3c565b9150509250929050565b6000610c3d8383610d3d565b60408301905092915050565b610c5281610fa9565b82525050565b6000610c6382610ee4565b610c6d8185610efc565b9350610c7883610ed4565b8060005b83811015610ca9578151610c908882610c31565b9750610c9b83610eef565b925050600181019050610c7c565b5085935050505092915050565b610cbf81610fbb565b82525050565b610cce81611003565b82525050565b6000610ce1603583610f0d565b9150610cec826110f6565b604082019050919050565b6000610d04602f83610f0d565b9150610d0f82611145565b604082019050919050565b6000610d27601083610f0d565b9150610d3282611194565b602082019050919050565b604082016000820151610d536000850182610cc5565b506020820151610d666020850182610d6c565b50505050565b610d7581610ff9565b82525050565b610d8481610ff9565b82525050565b6000602082019050610d9f6000830184610c49565b92915050565b6000604082019050610dba6000830185610c49565b610dc76020830184610c49565b9392505050565b60006020820190508181036000830152610de88184610c58565b905092915050565b6000602082019050610e056000830184610cb6565b92915050565b60006020820190508181036000830152610e2481610cd4565b9050919050565b60006020820190508181036000830152610e4481610cf7565b9050919050565b60006020820190508181036000830152610e6481610d1a565b9050919050565b6000602082019050610e806000830184610d7b565b92915050565b6000604082019050610e9b6000830185610d7b565b610ea86020830184610d7b565b9392505050565b6000610eb9610eca565b9050610ec58282611027565b919050565b6000604051905090565b6000819050602082019050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610f2982610ff9565b9150610f3483610ff9565b925082610f4457610f43611087565b5b828204905092915050565b6000610f5a82610ff9565b9150610f6583610ff9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610f9e57610f9d611058565b5b828202905092915050565b6000610fb482610fd9565b9050919050565b60008115159050919050565b6000610fd282610fa9565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061100e82611015565b9050919050565b600061102082610fd9565b9050919050565b611030826110e5565b810181811067ffffffffffffffff8211171561104f5761104e6110b6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008201527f2063616e20616363657074206f776e6572736869700000000000000000000000602082015250565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008201527f6f726d207468697320616374696f6e0000000000000000000000000000000000602082015250565b7f44656e6f6d206d757374206265203e3000000000000000000000000000000000600082015250565b6111c681610fa9565b81146111d157600080fd5b50565b6111dd81610fbb565b81146111e857600080fd5b50565b6111f481610fc7565b81146111ff57600080fd5b50565b61120b81610ff9565b811461121657600080fd5b5056fea2646970667358221220402655eb47fd42fa5b3cb011427eaad6b6e4d72896676eb35382209e43a4b98c64736f6c63430008040033