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