Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Lock | 16959093 | 664 days ago | IN | 0 ETH | 0.00625142 | ||||
Lock | 16930646 | 668 days ago | IN | 0 ETH | 0.00694891 | ||||
Lock | 16926802 | 669 days ago | IN | 0 ETH | 0.0088233 | ||||
Lock | 16862374 | 678 days ago | IN | 0 ETH | 0.00489085 | ||||
Lock | 16847982 | 680 days ago | IN | 0 ETH | 0.00883213 | ||||
Max Lock | 16798501 | 687 days ago | IN | 0 ETH | 0.01153988 | ||||
Lock | 16671185 | 705 days ago | IN | 0 ETH | 0.01382164 | ||||
Lock | 16634747 | 710 days ago | IN | 0 ETH | 0.0118673 | ||||
Set Governance | 16199738 | 771 days ago | IN | 0 ETH | 0.00042605 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StrategyProxy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; import "IERC20.sol"; import "SafeMath.sol"; import "Address.sol"; import "SafeERC20.sol"; import "IProxy.sol"; import "Mintr.sol"; import "FeeDistribution.sol"; import "Gauge.sol"; library SafeProxy { function safeExecute( IProxy proxy, address to, uint256 value, bytes memory data ) internal { (bool success, ) = proxy.execute(to, value, data); require(success); } } interface VeCRV { function increase_unlock_time(uint256 _time) external; function locked__end(address user) external returns (uint); } interface IMetaRegistry { function get_pool_from_lp_token(address _lp) external view returns (address); } interface IGaugeController { function gauge_types(address _gauge) external view returns (int128); } contract StrategyProxy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; using SafeProxy for IProxy; uint256 private constant WEEK = 604800; // Number of seconds in a week /// @notice Yearn's voter proxy. Typically referred to as "voter". IProxy public constant proxy = IProxy(0xF147b8125d2ef93FB6965Db97D6746952a133934); /// @notice Curve's token minter. address public constant mintr = 0xd061D61a4d941c39E5453435B6345Dc261C2fcE0; /// @notice Curve's CRV token address. address public constant crv = 0xD533a949740bb3306d119CC777fa900bA034cd52; /// @notice Curve's 3CRV address (weekly fees paid in this token). address public constant CRV3 = 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490; /// @notice Recipient of weekly 3CRV admin fees. Default of yveCRV address. address public feeRecipient = 0xc5bDdf9843308380375a611c18B50Fb9341f502A; /// @notice Curve's fee distributor contract. FeeDistribution public constant feeDistribution = FeeDistribution(0xA464e6DCda8AC41e03616F95f4BC98a13b8922Dc); /// @notice Curve's vote-escrowed Curve address. VeCRV public constant veCRV = VeCRV(0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2); /// @notice Curve's meta-registry. Can pull data from the many existing curve registries. IMetaRegistry public constant metaRegistry = IMetaRegistry(0xF98B45FA17DE75FB1aD0e7aFD971b0ca00e379fC); /// @notice Curve's gauge controller. IGaugeController public constant gaugeController = IGaugeController(0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB); /// @notice Look up the strategy approved for a given Curve gauge. mapping(address => address) public strategies; /// @notice Check if a gauge reward token is approved for claiming. mapping(address => bool) public rewardTokenApproved; /// @notice Look up the recipient approved for a given extra token (typically from bribes). mapping(address => address) public extraTokenRecipient; /// @notice Check if an address is an approved voter for gauge weights. mapping(address => bool) public voters; /// @notice Check if an address is an approved locker of CRV tokens. mapping(address => bool) public lockers; /// @notice Current governance address. address public governance; /// @notice Curve vault factory address. address public factory; /// @notice This voter's last time cursor, updated on each claim of admin fees. uint256 public lastTimeCursor; // Events so that indexers can keep track of key actions event GovernanceSet(address indexed governance); event FeeRecipientSet(address indexed feeRecipient); event StrategyApproved(address indexed gauge, address indexed strategy); event StrategyRevoked(address indexed gauge, address indexed strategy); event VoterApproved(address indexed voter); event VoterRevoked(address indexed voter); event LockerApproved(address indexed locker); event LockerRevoked(address indexed locker); event AdminFeesClaimed(address indexed recipient, uint256 amount); event ExtraTokenRecipientApproved(address indexed token, address indexed recipient); event ExtraTokenRecipientRevoked(address indexed token, address indexed recipient); event RewardTokenApproved(address indexed token, bool approved); event FactorySet(address indexed factory); event TokenClaimed(address indexed token, address indexed recipient, uint balance); constructor() public { governance = msg.sender; } /// @notice Set curve vault factory address. /// @dev Must be called by governance. /// @param _factory Address to set as curve vault factory. function setFactory(address _factory) external { require(msg.sender == governance, "!governance"); require(_factory != factory, "already set"); factory = _factory; emit FactorySet(_factory); } /// @notice Set governance address. /// @dev Must be called by current governance. /// @param _governance Address to set as governance. function setGovernance(address _governance) external { require(msg.sender == governance, "!governance"); require(_governance != governance, "already set"); governance = _governance; emit GovernanceSet(_governance); } /// @notice Set recipient of weekly 3CRV admin fees. /// @dev Only a single address can be approved at any time. /// Must be called by governance. /// @param _feeRecipient Address to approve for fees. function setFeeRecipient(address _feeRecipient) external { require(msg.sender == governance, "!governance"); require(_feeRecipient != address(0), "!zeroaddress"); require(_feeRecipient != feeRecipient, "already set"); feeRecipient = _feeRecipient; emit FeeRecipientSet(_feeRecipient); } /// @notice Add strategy to a gauge. /// @dev Must be called by governance or factory. /// @param _gauge Gauge to permit strategy on. /// @param _strategy Strategy to approve on gauge. function approveStrategy(address _gauge, address _strategy) external { require(msg.sender == governance || msg.sender == factory, "!access"); require(_strategy != address(0), "disallow zero"); require(strategies[_gauge] != _strategy, "already approved"); strategies[_gauge] = _strategy; emit StrategyApproved(_gauge, _strategy); } /// @notice Clear any previously approved strategy to a gauge. /// @dev Must be called by governance. /// @param _gauge Gauge from which to remove strategy. function revokeStrategy(address _gauge) external { require(msg.sender == governance, "!governance"); address _strategy = strategies[_gauge]; require(_strategy != address(0), "already revoked"); strategies[_gauge] = address(0); emit StrategyRevoked(_gauge, _strategy); } /// @notice Use to approve a recipient. Recipients have privileges to claim tokens directly from the voter. /// @dev For safety: Recipients cannot be added for LP tokens or gauge tokens (approved via gauge controller). /// Must be called by governance. /// @param _token Token to permit a recpient for. /// @param _recipient Recipient to approve for token. function approveExtraTokenRecipient(address _token, address _recipient) external { require(msg.sender == governance, "!governance"); require(_recipient != address(0), "disallow zero"); require(extraTokenRecipient[_token] != _recipient, "already approved"); require(_isSafeToken(_token), "!safeToken"); extraTokenRecipient[_token] = _recipient; emit ExtraTokenRecipientApproved(_token, _recipient); } /// @notice Clear any previously approved token recipient. /// @dev Must be called by governance. /// @param _token Token from which to clearn recipient. function revokeExtraTokenRecipient(address _token) external { require(msg.sender == governance, "!governance"); address recipient = extraTokenRecipient[_token]; require(recipient != address(0), "already revoked"); extraTokenRecipient[_token] = address(0); emit ExtraTokenRecipientRevoked(_token, recipient); } /// @notice Claim extra tokens sitting in the voter. /// @dev Must be called by an approved recipient. See approveExtraTokenRecipient() /// for more info. /// @param _token Token to claim. function claimExtraToken(address _token) external { address recipient = extraTokenRecipient[_token]; require(msg.sender == recipient); uint256 _balance = IERC20(_token).balanceOf(address(proxy)); if (_balance > 0) { proxy.safeExecute(_token, 0, abi.encodeWithSignature("transfer(address,uint256)", recipient, _balance)); emit TokenClaimed(_token, recipient, _balance); } } /// @notice Approve an address for voting on gauge weights. /// @dev Must be called by governance. /// @param _voter Voter to add. function approveVoter(address _voter) external { require(msg.sender == governance, "!governance"); require(!voters[_voter], "already approved"); voters[_voter] = true; emit VoterApproved(_voter); } /// @notice Remove ability to vote on gauge weights. /// @dev Must be called by governance. /// @param _voter Voter to remove. function revokeVoter(address _voter) external { require(msg.sender == governance, "!governance"); require(voters[_voter], "already revoked"); voters[_voter] = false; emit VoterRevoked(_voter); } /// @notice Approve an address for locking CRV. /// @dev Must be called by governance. /// @param _locker Locker to add. function approveLocker(address _locker) external { require(msg.sender == governance, "!governance"); require(!lockers[_locker], "already approved"); lockers[_locker] = true; emit LockerApproved(_locker); } /// @notice Remove ability to max lock CRV. /// @dev Must be called by governance. /// @param _locker Locker to remove. function revokeLocker(address _locker) external { require(msg.sender == governance, "!governance"); require(lockers[_locker], "already revoked"); lockers[_locker] = false; emit LockerRevoked(_locker); } /// @notice Lock CRV into veCRV contract. /// @dev Must be called by governance or locker. function lock() external { require(msg.sender == governance || lockers[msg.sender], "!locker"); uint256 amount = IERC20(crv).balanceOf(address(proxy)); if (amount > 0) proxy.increaseAmount(amount); } /// @notice Extend veCRV lock time to maximum amount of 4 years. /// @dev Must be called by governance or locker. function maxLock() external { require(msg.sender == governance || lockers[msg.sender], "!locker"); uint max = now + (365 days * 4); uint lock_end = veCRV.locked__end(address(proxy)); if(lock_end < (max / WEEK) * WEEK){ proxy.safeExecute( address(veCRV), 0, abi.encodeWithSignature("increase_unlock_time(uint256)", max) ); } } /// @notice Vote on a gauge. /// @dev Must be called by governance or voter. /// @param _gauge The gauge to vote on. /// @param _weight Weight to vote with. function vote(address _gauge, uint256 _weight) external { require(msg.sender == governance || voters[msg.sender], "!voter"); _vote(_gauge, _weight); } /// @notice Vote on a multiple gauges. /// @dev Must be called by governance or voter. /// @param _gauges List of gauges to vote on. /// @param _weights List of weight to vote with. function vote_many(address[] calldata _gauges, uint256[] calldata _weights) external { require(msg.sender == governance || voters[msg.sender], "!voter"); require(_gauges.length == _weights.length, "!mismatch"); for(uint256 i = 0; i < _gauges.length; i++) { _vote(_gauges[i], _weights[i]); } } function _vote(address _gauge, uint256 _weight) internal { proxy.safeExecute(address(gaugeController), 0, abi.encodeWithSignature("vote_for_gauge_weights(address,uint256)", _gauge, _weight)); } /// @notice Withdraw exact amount of LPs from gauge. /// @dev Must be called by the strategy approved for the given gauge. /// @param _gauge The gauge from which to withdraw. /// @param _token The LP token to withdraw from gauge. /// @param _amount The exact amount of LPs with withdraw. function withdraw( address _gauge, address _token, uint256 _amount ) public returns (uint256) { require(strategies[_gauge] == msg.sender, "!strategy"); uint256 _balance = IERC20(_token).balanceOf(address(proxy)); proxy.safeExecute(_gauge, 0, abi.encodeWithSignature("withdraw(uint256)", _amount)); _balance = IERC20(_token).balanceOf(address(proxy)).sub(_balance); proxy.safeExecute(_token, 0, abi.encodeWithSignature("transfer(address,uint256)", msg.sender, _balance)); return _balance; } /// @notice Find Yearn voter's full balance within a given gauge. /// @param _gauge The gauge from which to check balance. function balanceOf(address _gauge) public view returns (uint256) { return IERC20(_gauge).balanceOf(address(proxy)); } /// @notice Withdraw full balance of voter's LPs from gauge. /// @param _gauge The gauge from which to withdraw. /// @param _token The LP token to withdraw from gauge. function withdrawAll(address _gauge, address _token) external returns (uint256) { return withdraw(_gauge, _token, balanceOf(_gauge)); } /// @notice Takes care of depositing Curve LPs into gauge. /// @dev Strategy must first transfer LPs to this contract prior to calling. /// Must be called by strategy approved for this gauge. /// @param _gauge The gauge to deposit LP token into. /// @param _token The LP token to deposit into gauge. function deposit(address _gauge, address _token) external { require(strategies[_gauge] == msg.sender, "!strategy"); uint256 _balance = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(address(proxy), _balance); _balance = IERC20(_token).balanceOf(address(proxy)); proxy.safeExecute(_token, 0, abi.encodeWithSignature("approve(address,uint256)", _gauge, 0)); proxy.safeExecute(_token, 0, abi.encodeWithSignature("approve(address,uint256)", _gauge, _balance)); proxy.safeExecute(_gauge, 0, abi.encodeWithSignature("deposit(uint256)", _balance)); } /// @notice Abstracts the CRV minting and transfers to an approved strategy with CRV earnings. /// @dev Designed to be called within the harvest function of a strategy. /// @param _gauge The gauge which this strategy is claiming CRV from. function harvest(address _gauge) external { require(strategies[_gauge] == msg.sender, "!strategy"); uint256 _balance = IERC20(crv).balanceOf(address(proxy)); proxy.safeExecute(mintr, 0, abi.encodeWithSignature("mint(address)", _gauge)); _balance = (IERC20(crv).balanceOf(address(proxy))).sub(_balance); proxy.safeExecute(crv, 0, abi.encodeWithSignature("transfer(address,uint256)", msg.sender, _balance)); } /// @notice Claim share of weekly admin fees from Curve fee distributor. /// @dev Admin fees become available every Thursday, so we run this expensive /// logic only once per week. May only be called by feeRecipient. /// @param _recipient The address to which we transfer 3CRV. function claim(address _recipient) external { require(msg.sender == feeRecipient, "!approved"); if (!claimable()) return; address p = address(proxy); feeDistribution.claim_many([p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p, p]); lastTimeCursor = feeDistribution.time_cursor_of(address(proxy)); uint256 amount = IERC20(CRV3).balanceOf(address(proxy)); if (amount > 0) { proxy.safeExecute(CRV3, 0, abi.encodeWithSignature("transfer(address,uint256)", _recipient, amount)); emit AdminFeesClaimed(_recipient, amount); } } /// @notice Check if it has been one week since last admin fee claim. function claimable() public view returns (bool) { /// @dev add 1 day buffer since fees come available mid-day if (now < lastTimeCursor.add(WEEK) + 1 days) return false; return true; } /// @notice Claim non-CRV token incentives from the gauge and transfer to strategy. /// @dev Reward tokens must first be approved via approveRewardToken() before claiming. /// Must be called by the strategy approved for the given gauge. /// @param _gauge The gauge which this strategy is claiming rewards. /// @param _token The token to be claimed to the approved strategy. function claimRewards(address _gauge, address _token) external { require(strategies[_gauge] == msg.sender, "!strategy"); require(rewardTokenApproved[_token], "!approvedToken"); Gauge(_gauge).claim_rewards(address(proxy)); _transferBalance(_token); } /// @notice Claim non-CRV token incentives from the gauge and transfer to strategy. /// @dev Must be called by the strategy approved for the given gauge. /// @param _gauge The gauge which this strategy is claiming rewards. /// @param _tokens The token(s) to be claimed to the approved strategy. function claimManyRewards(address _gauge, address[] memory _tokens) external { require(strategies[_gauge] == msg.sender, "!strategy"); Gauge(_gauge).claim_rewards(address(proxy)); for (uint256 i; i < _tokens.length; ++i) { require(rewardTokenApproved[_tokens[i]], "!approvedToken"); _transferBalance(_tokens[i]); } } /// @notice Approve reward tokens to be claimed by strategies. /// @dev Must be called by governance. /// @param _token The token to be claimed. function approveRewardToken(address _token) external { require(msg.sender == governance, "!governance"); require(_isSafeToken(_token),"!safeToken"); require(!rewardTokenApproved[_token]); rewardTokenApproved[_token] = true; emit RewardTokenApproved(_token, true); } /// @notice Revoke approval of reward tokens to be claimed by strategies. /// @dev Must be called by governance. /// @param _token The token to be revoked. function revokeRewardToken(address _token) external { require(msg.sender == governance, "!governance"); require(rewardTokenApproved[_token]); rewardTokenApproved[_token] = false; emit RewardTokenApproved(_token, false); } // make sure a strategy can't yoink gauge or LP tokens. function _isSafeToken(address _token) internal returns (bool) { if (_token == crv) return false; try gaugeController.gauge_types(_token) { return false; } catch {} // @dev: Since we expect try should fail, proceed without any catch logic error here. address pool = metaRegistry.get_pool_from_lp_token(_token); if (pool != address(0)) return false; return true; } function _transferBalance(address _token) internal { proxy.safeExecute(_token, 0, abi.encodeWithSignature("transfer(address,uint256)", msg.sender, IERC20(_token).balanceOf(address(proxy)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "IERC20.sol"; import "SafeMath.sol"; import "Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface IProxy { function execute( address to, uint256 value, bytes calldata data ) external returns (bool, bytes memory); function increaseAmount(uint256) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface Mintr { function mint(address) external; }
pragma solidity ^0.6.12; interface FeeDistribution { function claim_many(address[20] calldata) external returns (bool); function last_token_time() external view returns (uint256); function time_cursor() external view returns (uint256); function time_cursor_of(address) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface Gauge { function deposit(uint256) external; function balanceOf(address) external view returns (uint256); function withdraw(uint256) external; function claim_rewards(address) external; function rewarded_token() external returns (address); function reward_tokens(uint256) external returns (address); }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "StrategyProxy.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminFeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"ExtraTokenRecipientApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"ExtraTokenRecipientRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory","type":"address"}],"name":"FactorySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeRecipient","type":"address"}],"name":"FeeRecipientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"}],"name":"LockerApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"locker","type":"address"}],"name":"LockerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"RewardTokenApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"address","name":"strategy","type":"address"}],"name":"StrategyApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"address","name":"strategy","type":"address"}],"name":"StrategyRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"TokenClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"}],"name":"VoterApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"}],"name":"VoterRevoked","type":"event"},{"inputs":[],"name":"CRV3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"approveExtraTokenRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_locker","type":"address"}],"name":"approveLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"approveRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_strategy","type":"address"}],"name":"approveStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"approveVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimExtraToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"claimManyRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extraTokenRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDistribution","outputs":[{"internalType":"contract FeeDistribution","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeController","outputs":[{"internalType":"contract IGaugeController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastTimeCursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metaRegistry","outputs":[{"internalType":"contract IMetaRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxy","outputs":[{"internalType":"contract IProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"revokeExtraTokenRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_locker","type":"address"}],"name":"revokeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"revokeRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"revokeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"revokeVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokenApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"setFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veCRV","outputs":[{"internalType":"contract VeCRV","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"uint256[]","name":"_weights","type":"uint256[]"}],"name":"vote_many","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600080546001600160a01b03191673c5bddf9843308380375a611c18b50fb9341f502a17905534801561003657600080fd5b50600680546001600160a01b031916331790556134bf806100586000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80636c0b3e4611610151578063c45a0155116100c3578063e74b981b11610087578063e74b981b1461082c578063ec55688914610852578063f1e42ccd1461085a578063f83d08ba14610888578063f9609f0814610890578063fea422c9146108be57610274565b8063c45a015514610792578063c494448e1461079a578063d1e61dcb146107c8578063d9caed12146107d0578063e14b795f1461080657610274565b8063aa80304c11610115578063aa80304c14610639578063ab033ea914610667578063af38d7571461068d578063b9565c7414610695578063bb994d48146106bb578063bfad6f8c146106e157610274565b80636c0b3e46146105b757806370a08231146105bf578063779a6b21146105e557806399eecb3b1461060b578063a3ec138d1461061357610274565b806339ebf823116101ea578063510b78d0116101ae578063510b78d0146105455780635aa6e6751461054d5780635bb47808146105555780635f74bbde1461057b578063661ada78146105a75780636a4874a1146105af57610274565b806339ebf8231461042b57806344693a4b1461045157806346904840146104595780634b9526c9146104615780634f904d1a1461048757610274565b806322a2f07d1161023c57806322a2f07d146103535780632479b1771461037757806325ff742d1461037f5780632a1fac16146103a55780632c8e7a21146103cb5780632fa7dcf51461040557610274565b806309cae2c8146102795780630e5c011e146102b9578063119d4ddb146102e15780631b397f21146103075780631e83409a1461032d575b600080fd5b6102a76004803603604081101561028f57600080fd5b506001600160a01b03813581169160200135166108e4565b60408051918252519081900360200190f35b6102df600480360360208110156102cf57600080fd5b50356001600160a01b0316610900565b005b6102df600480360360208110156102f757600080fd5b50356001600160a01b0316610b6f565b6102df6004803603602081101561031d57600080fd5b50356001600160a01b0316610c69565b6102df6004803603602081101561034357600080fd5b50356001600160a01b0316610d6a565b61035b6110f8565b604080516001600160a01b039092168252519081900360200190f35b61035b611110565b6102df6004803603602081101561039557600080fd5b50356001600160a01b0316611128565b6102df600480360360208110156103bb57600080fd5b50356001600160a01b031661123f565b6103f1600480360360208110156103e157600080fd5b50356001600160a01b0316611334565b604080519115158252519081900360200190f35b6103f16004803603602081101561041b57600080fd5b50356001600160a01b0316611349565b61035b6004803603602081101561044157600080fd5b50356001600160a01b031661135e565b61035b611379565b61035b611391565b61035b6004803603602081101561047757600080fd5b50356001600160a01b03166113a0565b6102df6004803603604081101561049d57600080fd5b810190602081018135600160201b8111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460208302840111600160201b831117156104ea57600080fd5b919390929091602081019035600160201b81111561050757600080fd5b82018360208201111561051957600080fd5b803590602001918460208302840111600160201b8311171561053a57600080fd5b5090925090506113bb565b61035b6114ae565b61035b6114c6565b6102df6004803603602081101561056b57600080fd5b50356001600160a01b03166114d5565b6102df6004803603604081101561059157600080fd5b506001600160a01b0381351690602001356115bd565b6102a7611629565b61035b61162f565b6102df611647565b6102a7600480360360208110156105d557600080fd5b50356001600160a01b03166117bc565b6102df600480360360208110156105fb57600080fd5b50356001600160a01b031661184d565b61035b6119ba565b6103f16004803603602081101561062957600080fd5b50356001600160a01b03166119d2565b6102df6004803603604081101561064f57600080fd5b506001600160a01b03813581169160200135166119e7565b6102df6004803603602081101561067d57600080fd5b50356001600160a01b0316611b82565b6103f1611c6a565b6102df600480360360208110156106ab57600080fd5b50356001600160a01b0316611c98565b6102df600480360360208110156106d157600080fd5b50356001600160a01b0316611d5f565b6102df600480360360408110156106f757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561072157600080fd5b82018360208201111561073357600080fd5b803590602001918460208302840111600160201b8311171561075457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e60945050505050565b61035b611fd0565b6102df600480360360408110156107b057600080fd5b506001600160a01b0381358116916020013516611fdf565b61035b612144565b6102a7600480360360608110156107e657600080fd5b506001600160a01b0381358116916020810135909116906040013561215c565b6102df6004803603602081101561081c57600080fd5b50356001600160a01b0316612360565b6102df6004803603602081101561084257600080fd5b50356001600160a01b031661245a565b61035b61258a565b6102df6004803603604081101561087057600080fd5b506001600160a01b038135811691602001351661259c565b6102df6126ca565b6102df600480360360408110156108a657600080fd5b506001600160a01b038135811691602001351661282c565b6102df600480360360208110156108d457600080fd5b50356001600160a01b0316612ac7565b60006108f983836108f4866117bc565b61215c565b9392505050565b6001600160a01b0381811660009081526001602052604090205416331461095a576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b604080516370a0823160e01b815260008051602061346a8339815191526004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b5051604080516001600160a01b0385166024808301919091528251808303909101815260449091019091526020810180516001600160e01b03166335313c2160e11b179052909150610a619060008051602061346a8339815191529073d061d61a4d941c39e5453435b6345dc261c2fce090600090612bbc565b604080516370a0823160e01b815260008051602061346a83398151915260048201529051610af891839173d533a949740bb3306d119cc777fa900ba034cd52916370a08231916024808301926020929190829003018186803b158015610ac657600080fd5b505afa158015610ada573d6000803e3d6000fd5b505050506040513d6020811015610af057600080fd5b505190612d7e565b6040805133602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052909150610b6b9060008051602061346a8339815191529073d533a949740bb3306d119cc777fa900ba034cd5290600090612bbc565b5050565b6006546001600160a01b03163314610bbc576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1615610c1d576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f85e209912e11195144f49695f608785c8a31876f9d5d831813c396126a21b4849190a250565b6006546001600160a01b03163314610cb6576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038082166000908152600360205260409020541680610d15576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b0380831660008181526003602052604080822080546001600160a01b031916905551928416927f544362db0a3b53f67ced029f025c790316069e960821415a357f85b9c680b3169190a35050565b6000546001600160a01b03163314610db5576040805162461bcd60e51b815260206004820152600960248201526808585c1c1c9bdd995960ba1b604482015290519081900360640190fd5b610dbd611c6a565b610dc6576110f5565b60408051610280808201835260008051602061346a83398151915280835260208301819052828401819052606083018190526080830181905260a0830181905260c0830181905260e08301819052610100830181905261012083018190526101408301819052610160830181905261018083018190526101a083018190526101c083018190526101e0830181905261020083018190526102208301819052610240830181905261026083018190529251637b935a2360e01b815273a464e6dcda8ac41e03616f95f4bc98a13b8922dc92637b935a23929091600401908190839080838360005b83811015610ec4578181015183820152602001610eac565b50505050905001915050602060405180830381600087803b158015610ee857600080fd5b505af1158015610efc573d6000803e3d6000fd5b505050506040513d6020811015610f1257600080fd5b505060408051632a2a314b60e01b815260008051602061346a8339815191526004820152905173a464e6dcda8ac41e03616f95f4bc98a13b8922dc91632a2a314b916024808301926020929190829003018186803b158015610f7357600080fd5b505afa158015610f87573d6000803e3d6000fd5b505050506040513d6020811015610f9d57600080fd5b5051600855604080516370a0823160e01b815260008051602061346a83398151915260048201529051600091736c3f90f043a72fa612cbac8115ee7e52bde6e490916370a0823191602480820192602092909190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b5051905080156110f257604080516001600160a01b038516602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110b29060008051602061346a83398151915290736c3f90f043a72fa612cbac8115ee7e52bde6e49090600090612bbc565b6040805182815290516001600160a01b038516917f6dda1c050330bbf19404606d86eb8277c7a84ee0b310a5311f255750f72e71ea919081900360200190a25b50505b50565b735f3b5dfeb7b28cdbd7faba78963ee202a494e2a281565b73a464e6dcda8ac41e03616f95f4bc98a13b8922dc81565b6006546001600160a01b03163314611175576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b61117e81612dc0565b6111bc576040805162461bcd60e51b815260206004820152600a60248201526910b9b0b332aa37b5b2b760b11b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156111e257600080fd5b6001600160a01b038116600081815260026020908152604091829020805460ff19166001908117909155825190815291517e6bcfa46dd5e628966b2935ff6a6e5785252152f1310d65131ec28ca46ef48d9281900390910190a250565b6006546001600160a01b0316331461128c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff166112eb576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260046020526040808220805460ff19169055517f8bd8971f91a5fea9c7ec31a7cd7a7cc467c75c932ea4bc73be16a0253d79eb879190a250565b60056020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6001602052600090815260409020546001600160a01b031681565b73f98b45fa17de75fb1ad0e7afd971b0ca00e379fc81565b6000546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6006546001600160a01b03163314806113e357503360009081526004602052604090205460ff165b61141d576040805162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b604482015290519081900360640190fd5b82811461145d576040805162461bcd60e51b8152602060048201526009602482015268042dad2e6dac2e8c6d60bb1b604482015290519081900360640190fd5b60005b838110156114a75761149f85858381811061147757fe5b905060200201356001600160a01b031684848481811061149357fe5b90506020020135612f34565b600101611460565b5050505050565b736c3f90f043a72fa612cbac8115ee7e52bde6e49081565b6006546001600160a01b031681565b6006546001600160a01b03163314611522576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007546001600160a01b0382811691161415611573576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b190600090a250565b6006546001600160a01b03163314806115e557503360009081526004602052604090205460ff165b61161f576040805162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b604482015290519081900360640190fd5b610b6b8282612f34565b60085481565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6006546001600160a01b031633148061166f57503360009081526005602052604090205460ff165b6116aa576040805162461bcd60e51b815260206004820152600760248201526610b637b1b5b2b960c91b604482015290519081900360640190fd5b6040805163adc6358960e01b815260008051602061346a83398151915260048201529051630784ce00420191600091735f3b5dfeb7b28cdbd7faba78963ee202a494e2a29163adc6358991602480830192602092919082900301818787803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b505050506040513d602081101561173f57600080fd5b5051905062093a8080830402811015610b6b576040805160248082018590528251808303909101815260449091019091526020810180516001600160e01b03166377fbd30960e11b179052610b6b9060008051602061346a83398151915290735f3b5dfeb7b28cdbd7faba78963ee202a494e2a290600090612bbc565b6000816001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d602081101561184357600080fd5b505190505b919050565b6001600160a01b038082166000908152600360205260409020541633811461187457600080fd5b6000826001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118d157600080fd5b505afa1580156118e5573d6000803e3d6000fd5b505050506040513d60208110156118fb57600080fd5b5051905080156110f257604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261196a9060008051602061346a833981519152908590600090612bbc565b816001600160a01b0316836001600160a01b03167f4831bdd9dcf3048a28319ce81d3cab7a15366bcf449bc7803a539107440809cc836040518082815260200191505060405180910390a3505050565b732f50d538606fa9edd2b11e2446beb18c9d5846bb81565b60046020526000908152604090205460ff1681565b6006546001600160a01b03163314611a34576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038116611a7f576040805162461bcd60e51b815260206004820152600d60248201526c646973616c6c6f77207a65726f60981b604482015290519081900360640190fd5b6001600160a01b0382811660009081526003602052604090205481169082161415611ae4576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b611aed82612dc0565b611b2b576040805162461bcd60e51b815260206004820152600a60248201526910b9b0b332aa37b5b2b760b11b604482015290519081900360640190fd5b6001600160a01b0382811660008181526003602052604080822080546001600160a01b0319169486169485179055517fd0f1ad6998c43c422175023b8d72a819bc76d53debaa27846748bbb72e9a0eac9190a35050565b6006546001600160a01b03163314611bcf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6006546001600160a01b0382811691161415611c20576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b690600090a250565b600854600090611c7d9062093a80612fad565b6201518001421015611c9157506000611c95565b5060015b90565b6006546001600160a01b03163314611ce5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16611d0a57600080fd5b6001600160a01b0381166000818152600260209081526040808320805460ff191690558051928352517e6bcfa46dd5e628966b2935ff6a6e5785252152f1310d65131ec28ca46ef48d9281900390910190a250565b6006546001600160a01b03163314611dac576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038082166000908152600160205260409020541680611e0b576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b0380831660008181526001602052604080822080546001600160a01b031916905551928416927f9e679fbbc4023ee1b3717af256f455ff2631ef94af1a29e2303085ac0e41127f9190a35050565b6001600160a01b03828116600090815260016020526040902054163314611eba576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b60408051634274debf60e11b815260008051602061346a833981519152600482015290516001600160a01b038416916384e9bd7e91602480830192600092919082900301818387803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b5050505060005b81518110156110f25760026000838381518110611f4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611fac576040805162461bcd60e51b815260206004820152600e60248201526d10b0b8383937bb32b22a37b5b2b760911b604482015290519081900360640190fd5b611fc8828281518110611fbb57fe5b6020026020010151613007565b600101611f2a565b6007546001600160a01b031681565b6006546001600160a01b031633148061200257506007546001600160a01b031633145b61203d576040805162461bcd60e51b81526020600482015260076024820152662161636365737360c81b604482015290519081900360640190fd5b6001600160a01b038116612088576040805162461bcd60e51b815260206004820152600d60248201526c646973616c6c6f77207a65726f60981b604482015290519081900360640190fd5b6001600160a01b03828116600090815260016020526040902054811690821614156120ed576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f44fc9c54afeb78716cfdca7c7b65d327c824a43d9d7f3842489b1047e0858d859190a35050565b73d061d61a4d941c39e5453435b6345dc261c2fce081565b6001600160a01b0383811660009081526001602052604081205490911633146121b8576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6000836001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561221557600080fd5b505afa158015612229573d6000803e3d6000fd5b505050506040513d602081101561223f57600080fd5b50516040805160248082018790528251808303909101815260449091019091526020810180516001600160e01b0316632e1a7d4d60e01b17905290915061229a9060008051602061346a833981519152908790600090612bbc565b6122f981856001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ac657600080fd5b6040805133602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790529091506123589060008051602061346a833981519152908690600090612bbc565b949350505050565b6006546001600160a01b031633146123ad576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff161561240e576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f8b634d5168853c9437bf64448a838914d0d43872a8c4ea04e2b90c5e62b4ee209190a250565b6006546001600160a01b031633146124a7576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b0381166124f1576040805162461bcd60e51b815260206004820152600c60248201526b217a65726f6164647265737360a01b604482015290519081900360640190fd5b6000546001600160a01b0382811691161415612542576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b038316908117825560405190917fbf9a9534339a9d6b81696e05dcfb614b7dc518a31d48be3cfb757988381fb32391a250565b60008051602061346a83398151915281565b6001600160a01b038281166000908152600160205260409020541633146125f6576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16612654576040805162461bcd60e51b815260206004820152600e60248201526d10b0b8383937bb32b22a37b5b2b760911b604482015290519081900360640190fd5b60408051634274debf60e11b815260008051602061346a833981519152600482015290516001600160a01b038416916384e9bd7e91602480830192600092919082900301818387803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b50505050610b6b81613007565b6006546001600160a01b03163314806126f257503360009081526005602052604090205460ff165b61272d576040805162461bcd60e51b815260206004820152600760248201526610b637b1b5b2b960c91b604482015290519081900360640190fd5b604080516370a0823160e01b815260008051602061346a8339815191526004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d60208110156127ba57600080fd5b5051905080156110f55760008051602061346a8339815191526001600160a01b03166315456eba826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561281857600080fd5b505af11580156114a7573d6000803e3d6000fd5b6001600160a01b03828116600090815260016020526040902054163314612886576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156128d557600080fd5b505afa1580156128e9573d6000803e3d6000fd5b505050506040513d60208110156128ff57600080fd5b505190506129256001600160a01b03831660008051602061346a833981519152836130f5565b604080516370a0823160e01b815260008051602061346a833981519152600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b5051604080516001600160a01b0386166024820152600060448083018290528351808403909101815260649092019092526020810180516001600160e01b031663095ea7b360e01b179052919250612a0c9160008051602061346a833981519152918591612bbc565b604080516001600160a01b038516602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a719060008051602061346a833981519152908490600090612bbc565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b031663b6b55f2560e01b1790526110f29060008051602061346a833981519152908590600090612bbc565b6006546001600160a01b03163314612b14576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16612b73576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f411173ab59a2b8fc46cda8c47dddadfb8672dff412656b11e2fe9ffc0251be649190a250565b6000846001600160a01b031663b61d27f68585856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612c31578181015183820152602001612c19565b50505050905090810190601f168015612c5e5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015612c7f57600080fd5b505af1158015612c93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612cbc57600080fd5b815160208301805160405192949293830192919084600160201b821115612ce257600080fd5b908301906020820185811115612cf757600080fd5b8251600160201b811182820188101715612d1057600080fd5b82525081516020918201929091019080838360005b83811015612d3d578181015183820152602001612d25565b50505050905090810190601f168015612d6a5780820380516001836020036101000a031916815260200191505b50604052505050509050806114a757600080fd5b60006108f983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613147565b60006001600160a01b03821673d533a949740bb3306d119cc777fa900ba034cd521415612def57506000611848565b60408051633f9095b760e01b81526001600160a01b03841660048201529051732f50d538606fa9edd2b11e2446beb18c9d5846bb91633f9095b7916024808301926020929190829003018186803b158015612e4957600080fd5b505afa925050508015612e6e57506040513d6020811015612e6957600080fd5b505160015b612e7757612e81565b5060009050611848565b600073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc6001600160a01b031663bdf475c3846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ee457600080fd5b505afa158015612ef8573d6000803e3d6000fd5b505050506040513d6020811015612f0e57600080fd5b505190506001600160a01b03811615612f2b576000915050611848565b50600192915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316631ae26c6560e31b179052610b6b9060008051602061346a83398151915290732f50d538606fa9edd2b11e2446beb18c9d5846bb90600090612bbc565b6000828201838110156108f9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6110f581600033846001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561306957600080fd5b505afa15801561307d573d6000803e3d6000fd5b505050506040513d602081101561309357600080fd5b5051604080516001600160a01b0390931660248401526044808401929092528051808403909201825260649092019091526020810180516001600160e01b031663a9059cbb60e01b17905260008051602061346a833981519152929190612bbc565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110f29084906131de565b600081848411156131d65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561319b578181015183820152602001613183565b50505050905090810190601f1680156131c85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060613233826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661328f9092919063ffffffff16565b8051909150156110f25780806020019051602081101561325257600080fd5b50516110f25760405162461bcd60e51b815260040180806020018281038252602a815260200180613440602a913960400191505060405180910390fd5b6060612358848460008560606132a485613406565b6132f5576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106133345780518252601f199092019160209182019101613315565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613396576040519150601f19603f3d011682016040523d82523d6000602084013e61339b565b606091505b509150915081156133af5791506123589050565b8051156133bf5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561319b578181015183820152602001613183565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061235857505015159291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564000000000000000000000000f147b8125d2ef93fb6965db97d6746952a133934a26469706673582212205834d1d52d0f1c3ca706202d1fb62ab56c2738028e4689b9a9bc947d5efa8bd864736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80636c0b3e4611610151578063c45a0155116100c3578063e74b981b11610087578063e74b981b1461082c578063ec55688914610852578063f1e42ccd1461085a578063f83d08ba14610888578063f9609f0814610890578063fea422c9146108be57610274565b8063c45a015514610792578063c494448e1461079a578063d1e61dcb146107c8578063d9caed12146107d0578063e14b795f1461080657610274565b8063aa80304c11610115578063aa80304c14610639578063ab033ea914610667578063af38d7571461068d578063b9565c7414610695578063bb994d48146106bb578063bfad6f8c146106e157610274565b80636c0b3e46146105b757806370a08231146105bf578063779a6b21146105e557806399eecb3b1461060b578063a3ec138d1461061357610274565b806339ebf823116101ea578063510b78d0116101ae578063510b78d0146105455780635aa6e6751461054d5780635bb47808146105555780635f74bbde1461057b578063661ada78146105a75780636a4874a1146105af57610274565b806339ebf8231461042b57806344693a4b1461045157806346904840146104595780634b9526c9146104615780634f904d1a1461048757610274565b806322a2f07d1161023c57806322a2f07d146103535780632479b1771461037757806325ff742d1461037f5780632a1fac16146103a55780632c8e7a21146103cb5780632fa7dcf51461040557610274565b806309cae2c8146102795780630e5c011e146102b9578063119d4ddb146102e15780631b397f21146103075780631e83409a1461032d575b600080fd5b6102a76004803603604081101561028f57600080fd5b506001600160a01b03813581169160200135166108e4565b60408051918252519081900360200190f35b6102df600480360360208110156102cf57600080fd5b50356001600160a01b0316610900565b005b6102df600480360360208110156102f757600080fd5b50356001600160a01b0316610b6f565b6102df6004803603602081101561031d57600080fd5b50356001600160a01b0316610c69565b6102df6004803603602081101561034357600080fd5b50356001600160a01b0316610d6a565b61035b6110f8565b604080516001600160a01b039092168252519081900360200190f35b61035b611110565b6102df6004803603602081101561039557600080fd5b50356001600160a01b0316611128565b6102df600480360360208110156103bb57600080fd5b50356001600160a01b031661123f565b6103f1600480360360208110156103e157600080fd5b50356001600160a01b0316611334565b604080519115158252519081900360200190f35b6103f16004803603602081101561041b57600080fd5b50356001600160a01b0316611349565b61035b6004803603602081101561044157600080fd5b50356001600160a01b031661135e565b61035b611379565b61035b611391565b61035b6004803603602081101561047757600080fd5b50356001600160a01b03166113a0565b6102df6004803603604081101561049d57600080fd5b810190602081018135600160201b8111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460208302840111600160201b831117156104ea57600080fd5b919390929091602081019035600160201b81111561050757600080fd5b82018360208201111561051957600080fd5b803590602001918460208302840111600160201b8311171561053a57600080fd5b5090925090506113bb565b61035b6114ae565b61035b6114c6565b6102df6004803603602081101561056b57600080fd5b50356001600160a01b03166114d5565b6102df6004803603604081101561059157600080fd5b506001600160a01b0381351690602001356115bd565b6102a7611629565b61035b61162f565b6102df611647565b6102a7600480360360208110156105d557600080fd5b50356001600160a01b03166117bc565b6102df600480360360208110156105fb57600080fd5b50356001600160a01b031661184d565b61035b6119ba565b6103f16004803603602081101561062957600080fd5b50356001600160a01b03166119d2565b6102df6004803603604081101561064f57600080fd5b506001600160a01b03813581169160200135166119e7565b6102df6004803603602081101561067d57600080fd5b50356001600160a01b0316611b82565b6103f1611c6a565b6102df600480360360208110156106ab57600080fd5b50356001600160a01b0316611c98565b6102df600480360360208110156106d157600080fd5b50356001600160a01b0316611d5f565b6102df600480360360408110156106f757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561072157600080fd5b82018360208201111561073357600080fd5b803590602001918460208302840111600160201b8311171561075457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e60945050505050565b61035b611fd0565b6102df600480360360408110156107b057600080fd5b506001600160a01b0381358116916020013516611fdf565b61035b612144565b6102a7600480360360608110156107e657600080fd5b506001600160a01b0381358116916020810135909116906040013561215c565b6102df6004803603602081101561081c57600080fd5b50356001600160a01b0316612360565b6102df6004803603602081101561084257600080fd5b50356001600160a01b031661245a565b61035b61258a565b6102df6004803603604081101561087057600080fd5b506001600160a01b038135811691602001351661259c565b6102df6126ca565b6102df600480360360408110156108a657600080fd5b506001600160a01b038135811691602001351661282c565b6102df600480360360208110156108d457600080fd5b50356001600160a01b0316612ac7565b60006108f983836108f4866117bc565b61215c565b9392505050565b6001600160a01b0381811660009081526001602052604090205416331461095a576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b604080516370a0823160e01b815260008051602061346a8339815191526004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b5051604080516001600160a01b0385166024808301919091528251808303909101815260449091019091526020810180516001600160e01b03166335313c2160e11b179052909150610a619060008051602061346a8339815191529073d061d61a4d941c39e5453435b6345dc261c2fce090600090612bbc565b604080516370a0823160e01b815260008051602061346a83398151915260048201529051610af891839173d533a949740bb3306d119cc777fa900ba034cd52916370a08231916024808301926020929190829003018186803b158015610ac657600080fd5b505afa158015610ada573d6000803e3d6000fd5b505050506040513d6020811015610af057600080fd5b505190612d7e565b6040805133602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052909150610b6b9060008051602061346a8339815191529073d533a949740bb3306d119cc777fa900ba034cd5290600090612bbc565b5050565b6006546001600160a01b03163314610bbc576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1615610c1d576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f85e209912e11195144f49695f608785c8a31876f9d5d831813c396126a21b4849190a250565b6006546001600160a01b03163314610cb6576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038082166000908152600360205260409020541680610d15576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b0380831660008181526003602052604080822080546001600160a01b031916905551928416927f544362db0a3b53f67ced029f025c790316069e960821415a357f85b9c680b3169190a35050565b6000546001600160a01b03163314610db5576040805162461bcd60e51b815260206004820152600960248201526808585c1c1c9bdd995960ba1b604482015290519081900360640190fd5b610dbd611c6a565b610dc6576110f5565b60408051610280808201835260008051602061346a83398151915280835260208301819052828401819052606083018190526080830181905260a0830181905260c0830181905260e08301819052610100830181905261012083018190526101408301819052610160830181905261018083018190526101a083018190526101c083018190526101e0830181905261020083018190526102208301819052610240830181905261026083018190529251637b935a2360e01b815273a464e6dcda8ac41e03616f95f4bc98a13b8922dc92637b935a23929091600401908190839080838360005b83811015610ec4578181015183820152602001610eac565b50505050905001915050602060405180830381600087803b158015610ee857600080fd5b505af1158015610efc573d6000803e3d6000fd5b505050506040513d6020811015610f1257600080fd5b505060408051632a2a314b60e01b815260008051602061346a8339815191526004820152905173a464e6dcda8ac41e03616f95f4bc98a13b8922dc91632a2a314b916024808301926020929190829003018186803b158015610f7357600080fd5b505afa158015610f87573d6000803e3d6000fd5b505050506040513d6020811015610f9d57600080fd5b5051600855604080516370a0823160e01b815260008051602061346a83398151915260048201529051600091736c3f90f043a72fa612cbac8115ee7e52bde6e490916370a0823191602480820192602092909190829003018186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b5051905080156110f257604080516001600160a01b038516602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110b29060008051602061346a83398151915290736c3f90f043a72fa612cbac8115ee7e52bde6e49090600090612bbc565b6040805182815290516001600160a01b038516917f6dda1c050330bbf19404606d86eb8277c7a84ee0b310a5311f255750f72e71ea919081900360200190a25b50505b50565b735f3b5dfeb7b28cdbd7faba78963ee202a494e2a281565b73a464e6dcda8ac41e03616f95f4bc98a13b8922dc81565b6006546001600160a01b03163314611175576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b61117e81612dc0565b6111bc576040805162461bcd60e51b815260206004820152600a60248201526910b9b0b332aa37b5b2b760b11b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16156111e257600080fd5b6001600160a01b038116600081815260026020908152604091829020805460ff19166001908117909155825190815291517e6bcfa46dd5e628966b2935ff6a6e5785252152f1310d65131ec28ca46ef48d9281900390910190a250565b6006546001600160a01b0316331461128c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff166112eb576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260046020526040808220805460ff19169055517f8bd8971f91a5fea9c7ec31a7cd7a7cc467c75c932ea4bc73be16a0253d79eb879190a250565b60056020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b6001602052600090815260409020546001600160a01b031681565b73f98b45fa17de75fb1ad0e7afd971b0ca00e379fc81565b6000546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6006546001600160a01b03163314806113e357503360009081526004602052604090205460ff165b61141d576040805162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b604482015290519081900360640190fd5b82811461145d576040805162461bcd60e51b8152602060048201526009602482015268042dad2e6dac2e8c6d60bb1b604482015290519081900360640190fd5b60005b838110156114a75761149f85858381811061147757fe5b905060200201356001600160a01b031684848481811061149357fe5b90506020020135612f34565b600101611460565b5050505050565b736c3f90f043a72fa612cbac8115ee7e52bde6e49081565b6006546001600160a01b031681565b6006546001600160a01b03163314611522576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6007546001600160a01b0382811691161415611573576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b190600090a250565b6006546001600160a01b03163314806115e557503360009081526004602052604090205460ff165b61161f576040805162461bcd60e51b815260206004820152600660248201526510bb37ba32b960d11b604482015290519081900360640190fd5b610b6b8282612f34565b60085481565b73d533a949740bb3306d119cc777fa900ba034cd5281565b6006546001600160a01b031633148061166f57503360009081526005602052604090205460ff165b6116aa576040805162461bcd60e51b815260206004820152600760248201526610b637b1b5b2b960c91b604482015290519081900360640190fd5b6040805163adc6358960e01b815260008051602061346a83398151915260048201529051630784ce00420191600091735f3b5dfeb7b28cdbd7faba78963ee202a494e2a29163adc6358991602480830192602092919082900301818787803b15801561171557600080fd5b505af1158015611729573d6000803e3d6000fd5b505050506040513d602081101561173f57600080fd5b5051905062093a8080830402811015610b6b576040805160248082018590528251808303909101815260449091019091526020810180516001600160e01b03166377fbd30960e11b179052610b6b9060008051602061346a83398151915290735f3b5dfeb7b28cdbd7faba78963ee202a494e2a290600090612bbc565b6000816001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d602081101561184357600080fd5b505190505b919050565b6001600160a01b038082166000908152600360205260409020541633811461187457600080fd5b6000826001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118d157600080fd5b505afa1580156118e5573d6000803e3d6000fd5b505050506040513d60208110156118fb57600080fd5b5051905080156110f257604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261196a9060008051602061346a833981519152908590600090612bbc565b816001600160a01b0316836001600160a01b03167f4831bdd9dcf3048a28319ce81d3cab7a15366bcf449bc7803a539107440809cc836040518082815260200191505060405180910390a3505050565b732f50d538606fa9edd2b11e2446beb18c9d5846bb81565b60046020526000908152604090205460ff1681565b6006546001600160a01b03163314611a34576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038116611a7f576040805162461bcd60e51b815260206004820152600d60248201526c646973616c6c6f77207a65726f60981b604482015290519081900360640190fd5b6001600160a01b0382811660009081526003602052604090205481169082161415611ae4576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b611aed82612dc0565b611b2b576040805162461bcd60e51b815260206004820152600a60248201526910b9b0b332aa37b5b2b760b11b604482015290519081900360640190fd5b6001600160a01b0382811660008181526003602052604080822080546001600160a01b0319169486169485179055517fd0f1ad6998c43c422175023b8d72a819bc76d53debaa27846748bbb72e9a0eac9190a35050565b6006546001600160a01b03163314611bcf576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6006546001600160a01b0382811691161415611c20576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b690600090a250565b600854600090611c7d9062093a80612fad565b6201518001421015611c9157506000611c95565b5060015b90565b6006546001600160a01b03163314611ce5576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16611d0a57600080fd5b6001600160a01b0381166000818152600260209081526040808320805460ff191690558051928352517e6bcfa46dd5e628966b2935ff6a6e5785252152f1310d65131ec28ca46ef48d9281900390910190a250565b6006546001600160a01b03163314611dac576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b038082166000908152600160205260409020541680611e0b576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b0380831660008181526001602052604080822080546001600160a01b031916905551928416927f9e679fbbc4023ee1b3717af256f455ff2631ef94af1a29e2303085ac0e41127f9190a35050565b6001600160a01b03828116600090815260016020526040902054163314611eba576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b60408051634274debf60e11b815260008051602061346a833981519152600482015290516001600160a01b038416916384e9bd7e91602480830192600092919082900301818387803b158015611f0f57600080fd5b505af1158015611f23573d6000803e3d6000fd5b5050505060005b81518110156110f25760026000838381518110611f4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611fac576040805162461bcd60e51b815260206004820152600e60248201526d10b0b8383937bb32b22a37b5b2b760911b604482015290519081900360640190fd5b611fc8828281518110611fbb57fe5b6020026020010151613007565b600101611f2a565b6007546001600160a01b031681565b6006546001600160a01b031633148061200257506007546001600160a01b031633145b61203d576040805162461bcd60e51b81526020600482015260076024820152662161636365737360c81b604482015290519081900360640190fd5b6001600160a01b038116612088576040805162461bcd60e51b815260206004820152600d60248201526c646973616c6c6f77207a65726f60981b604482015290519081900360640190fd5b6001600160a01b03828116600090815260016020526040902054811690821614156120ed576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b0382811660008181526001602052604080822080546001600160a01b0319169486169485179055517f44fc9c54afeb78716cfdca7c7b65d327c824a43d9d7f3842489b1047e0858d859190a35050565b73d061d61a4d941c39e5453435b6345dc261c2fce081565b6001600160a01b0383811660009081526001602052604081205490911633146121b8576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6000836001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561221557600080fd5b505afa158015612229573d6000803e3d6000fd5b505050506040513d602081101561223f57600080fd5b50516040805160248082018790528251808303909101815260449091019091526020810180516001600160e01b0316632e1a7d4d60e01b17905290915061229a9060008051602061346a833981519152908790600090612bbc565b6122f981856001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ac657600080fd5b6040805133602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790529091506123589060008051602061346a833981519152908690600090612bbc565b949350505050565b6006546001600160a01b031633146123ad576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff161561240e576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f8b634d5168853c9437bf64448a838914d0d43872a8c4ea04e2b90c5e62b4ee209190a250565b6006546001600160a01b031633146124a7576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b0381166124f1576040805162461bcd60e51b815260206004820152600c60248201526b217a65726f6164647265737360a01b604482015290519081900360640190fd5b6000546001600160a01b0382811691161415612542576040805162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b038316908117825560405190917fbf9a9534339a9d6b81696e05dcfb614b7dc518a31d48be3cfb757988381fb32391a250565b60008051602061346a83398151915281565b6001600160a01b038281166000908152600160205260409020541633146125f6576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6001600160a01b03811660009081526002602052604090205460ff16612654576040805162461bcd60e51b815260206004820152600e60248201526d10b0b8383937bb32b22a37b5b2b760911b604482015290519081900360640190fd5b60408051634274debf60e11b815260008051602061346a833981519152600482015290516001600160a01b038416916384e9bd7e91602480830192600092919082900301818387803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b50505050610b6b81613007565b6006546001600160a01b03163314806126f257503360009081526005602052604090205460ff165b61272d576040805162461bcd60e51b815260206004820152600760248201526610b637b1b5b2b960c91b604482015290519081900360640190fd5b604080516370a0823160e01b815260008051602061346a8339815191526004820152905160009173d533a949740bb3306d119cc777fa900ba034cd52916370a0823191602480820192602092909190829003018186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d60208110156127ba57600080fd5b5051905080156110f55760008051602061346a8339815191526001600160a01b03166315456eba826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561281857600080fd5b505af11580156114a7573d6000803e3d6000fd5b6001600160a01b03828116600090815260016020526040902054163314612886576040805162461bcd60e51b815260206004820152600960248201526821737472617465677960b81b604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156128d557600080fd5b505afa1580156128e9573d6000803e3d6000fd5b505050506040513d60208110156128ff57600080fd5b505190506129256001600160a01b03831660008051602061346a833981519152836130f5565b604080516370a0823160e01b815260008051602061346a833981519152600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d60208110156129a357600080fd5b5051604080516001600160a01b0386166024820152600060448083018290528351808403909101815260649092019092526020810180516001600160e01b031663095ea7b360e01b179052919250612a0c9160008051602061346a833981519152918591612bbc565b604080516001600160a01b038516602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a719060008051602061346a833981519152908490600090612bbc565b6040805160248082018490528251808303909101815260449091019091526020810180516001600160e01b031663b6b55f2560e01b1790526110f29060008051602061346a833981519152908590600090612bbc565b6006546001600160a01b03163314612b14576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16612b73576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c995d9bdad959608a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517f411173ab59a2b8fc46cda8c47dddadfb8672dff412656b11e2fe9ffc0251be649190a250565b6000846001600160a01b031663b61d27f68585856040518463ffffffff1660e01b815260040180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612c31578181015183820152602001612c19565b50505050905090810190601f168015612c5e5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015612c7f57600080fd5b505af1158015612c93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612cbc57600080fd5b815160208301805160405192949293830192919084600160201b821115612ce257600080fd5b908301906020820185811115612cf757600080fd5b8251600160201b811182820188101715612d1057600080fd5b82525081516020918201929091019080838360005b83811015612d3d578181015183820152602001612d25565b50505050905090810190601f168015612d6a5780820380516001836020036101000a031916815260200191505b50604052505050509050806114a757600080fd5b60006108f983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613147565b60006001600160a01b03821673d533a949740bb3306d119cc777fa900ba034cd521415612def57506000611848565b60408051633f9095b760e01b81526001600160a01b03841660048201529051732f50d538606fa9edd2b11e2446beb18c9d5846bb91633f9095b7916024808301926020929190829003018186803b158015612e4957600080fd5b505afa925050508015612e6e57506040513d6020811015612e6957600080fd5b505160015b612e7757612e81565b5060009050611848565b600073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc6001600160a01b031663bdf475c3846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612ee457600080fd5b505afa158015612ef8573d6000803e3d6000fd5b505050506040513d6020811015612f0e57600080fd5b505190506001600160a01b03811615612f2b576000915050611848565b50600192915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0316631ae26c6560e31b179052610b6b9060008051602061346a83398151915290732f50d538606fa9edd2b11e2446beb18c9d5846bb90600090612bbc565b6000828201838110156108f9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6110f581600033846001600160a01b03166370a0823160008051602061346a8339815191526040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561306957600080fd5b505afa15801561307d573d6000803e3d6000fd5b505050506040513d602081101561309357600080fd5b5051604080516001600160a01b0390931660248401526044808401929092528051808403909201825260649092019091526020810180516001600160e01b031663a9059cbb60e01b17905260008051602061346a833981519152929190612bbc565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110f29084906131de565b600081848411156131d65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561319b578181015183820152602001613183565b50505050905090810190601f1680156131c85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6060613233826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661328f9092919063ffffffff16565b8051909150156110f25780806020019051602081101561325257600080fd5b50516110f25760405162461bcd60e51b815260040180806020018281038252602a815260200180613440602a913960400191505060405180910390fd5b6060612358848460008560606132a485613406565b6132f5576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106133345780518252601f199092019160209182019101613315565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613396576040519150601f19603f3d011682016040523d82523d6000602084013e61339b565b606091505b509150915081156133af5791506123589050565b8051156133bf5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561319b578181015183820152602001613183565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061235857505015159291505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564000000000000000000000000f147b8125d2ef93fb6965db97d6746952a133934a26469706673582212205834d1d52d0f1c3ca706202d1fb62ab56c2738028e4689b9a9bc947d5efa8bd864736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.