More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 940 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Harvest | 21351424 | 30 days ago | IN | 0 ETH | 0.0012188 | ||||
Harvest | 21213888 | 49 days ago | IN | 0 ETH | 0.00061722 | ||||
Registration | 21208657 | 50 days ago | IN | 0 ETH | 0.00123541 | ||||
Registration | 21136383 | 60 days ago | IN | 0 ETH | 0.00168083 | ||||
Harvest | 21013321 | 77 days ago | IN | 0 ETH | 0.00113442 | ||||
Registration | 20219523 | 188 days ago | IN | 0 ETH | 0.00078008 | ||||
Harvest | 20115560 | 203 days ago | IN | 0 ETH | 0.00252946 | ||||
Registration | 19771499 | 251 days ago | IN | 0 ETH | 0.00075775 | ||||
Harvest | 19762053 | 252 days ago | IN | 0 ETH | 0.00167583 | ||||
Harvest | 19362237 | 308 days ago | IN | 0 ETH | 0.0056115 | ||||
Harvest | 19047694 | 352 days ago | IN | 0 ETH | 0.00090247 | ||||
Registration | 18990347 | 360 days ago | IN | 0 ETH | 0.00171096 | ||||
Registration | 18740143 | 395 days ago | IN | 0 ETH | 0.00380276 | ||||
Registration | 18643056 | 409 days ago | IN | 0 ETH | 0.00311384 | ||||
Harvest | 18634897 | 410 days ago | IN | 0 ETH | 0.00271089 | ||||
Harvest | 18620382 | 412 days ago | IN | 0 ETH | 0.00208427 | ||||
Harvest | 18599021 | 415 days ago | IN | 0 ETH | 0.00533437 | ||||
Harvest | 18555273 | 421 days ago | IN | 0 ETH | 0.00127636 | ||||
Harvest | 18079817 | 488 days ago | IN | 0 ETH | 0.00326944 | ||||
Harvest | 17570174 | 559 days ago | IN | 0 ETH | 0.00106246 | ||||
Harvest | 17128608 | 621 days ago | IN | 0 ETH | 0.00226127 | ||||
Harvest | 16824512 | 664 days ago | IN | 0 ETH | 0.00106142 | ||||
Harvest | 16803118 | 667 days ago | IN | 0 ETH | 0.01423883 | ||||
Harvest | 16752598 | 675 days ago | IN | 0 ETH | 0.00119509 | ||||
Harvest | 16712082 | 680 days ago | IN | 0 ETH | 0.00153715 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ShadowStakingV4
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.6.12; library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } 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; } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } 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); } } } } 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); } 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"); } } } interface IMilk2Token { function transfer(address _to, uint256 _amount) external returns (bool); function balanceOf(address _to) external returns (uint256); } contract MultiplierMath { function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function getInterval(uint256 a, uint256 b) internal pure returns(uint256) { return a > b ? a - b : 0; } } interface LastShadowContract { function getRewards(address _user) external view returns(uint256); function getTotalRewards(address _user) external view returns(uint256); function getLastBlock(address _user) external view returns(uint256); function getUsersCount() external view returns(uint256); function getUser(uint256 _userId) external view returns(address); } contract ShadowStakingV4 is Ownable, MultiplierMath { using SafeMath for uint256; using SafeERC20 for IERC20; using ECDSA for bytes32; struct UserInfo { uint256 rewardDebt; uint256 lastBlock; } struct PoolInfo { IERC20 lpToken; uint256 allocPointAmount; uint256 blockCreation; } IMilk2Token public milk; LastShadowContract public lastShadowContract; mapping (address => UserInfo) private userInfo; mapping (address => bool) public trustedSigner; address[] internal users; uint256 internal previousUsersCount; mapping (address => uint256) public newUsersId; PoolInfo[] private poolInfo; uint256 private totalPoints; uint256[5] internal epochs; uint256[5] internal multipliers; event Harvest(address sender, uint256 amount, uint256 blockNumber); event AddNewPool(address token, uint256 pid); event PoolUpdate(uint256 poolPid, uint256 previusPoints, uint256 newPoints); event AddNewKey(bytes keyHash, uint256 id); event EmergencyRefund(address sender, uint256 amount); constructor(IMilk2Token _milk, uint256[5] memory _epochs, uint256[5] memory _multipliers, LastShadowContract _lastShadowContract) public { milk = _milk; epochs = _epochs; multipliers = _multipliers; lastShadowContract = _lastShadowContract; previousUsersCount = lastShadowContract.getUsersCount(); } function addNewPool(IERC20 _lpToken, uint256 _newPoints) public onlyOwner { totalPoints = totalPoints.add(_newPoints); poolInfo.push(PoolInfo({lpToken: _lpToken, allocPointAmount: _newPoints, blockCreation:block.number})); emit AddNewPool(address(_lpToken), _newPoints); } function setPoll(uint256 _poolPid, uint256 _newPoints) public onlyOwner { totalPoints = totalPoints.sub(poolInfo[_poolPid].allocPointAmount).add(_newPoints); poolInfo[_poolPid].allocPointAmount = _newPoints; } function setTrustedSigner(address _signer, bool _isValid) public onlyOwner { trustedSigner[_signer] = _isValid; } function getPool(uint256 _poolPid) public view returns(address _lpToken, uint256 _block, uint256 _weight) { _lpToken = address(poolInfo[_poolPid].lpToken); _block = poolInfo[_poolPid].blockCreation; _weight = poolInfo[_poolPid].allocPointAmount; } function getPoolsCount() public view returns(uint256) { return poolInfo.length; } function getRewards(address _user) public view returns(uint256) { if (newUsersId[_user] == 0) { return lastShadowContract.getRewards(_user); } else { return userInfo[_user].rewardDebt; } } function getLastBlock(address _user) public view returns(uint256) { if (newUsersId[_user] == 0) { return lastShadowContract.getLastBlock(_user); } else { return userInfo[_user].lastBlock; } } function getTotalPoints() public view returns(uint256) { return totalPoints; } function registration() public { require(getLastBlock(msg.sender) == 0, "User already exist"); _registration(msg.sender, 0, block.number); } function getData(uint256 _amount, uint256 _lastBlockNumber, uint256 _currentBlockNumber, address _sender) public pure returns(bytes32) { return sha256(abi.encode(_amount, _lastBlockNumber, _currentBlockNumber, _sender)); } /////////////////////////////////////////////////////////////////////////////////////// ///// Refactored items ///////////////////////////////////////////////////////////////////////////////////// /** *@dev Prepare abi encoded message */ function getMsgForSign(uint256 _amount, uint256 _lastBlockNumber, uint256 _currentBlockNumber, address _sender) public pure returns(bytes32) { return keccak256(abi.encode(_amount, _lastBlockNumber, _currentBlockNumber, _sender)); } /** * @dev prepare hash for sign with Ethereum comunity convention *see links below *https://ethereum.stackexchange.com/questions/24547/sign-without-x19ethereum-signed-message-prefix?rq=1 *https://github.com/ethereum/EIPs/pull/712 *https://programtheblockchain.com/posts/2018/02/17/signing-and-verifying-messages-in-ethereum/ */ function preSignMsg(bytes32 _msg) public pure returns(bytes32) { return _msg.toEthSignedMessageHash(); } /** * @dev Check signature and transfer tokens * @param _amount - subj * @param _lastBlockNumber - subj * @param _currentBlockNumber - subj * @param _msgForSign - hash for sign with Ethereum style prefix!!! * @param _signature - signature */ function harvest(uint256 _amount, uint256 _lastBlockNumber, uint256 _currentBlockNumber, bytes32 _msgForSign, bytes memory _signature) public { require(_currentBlockNumber <= block.number, "currentBlockNumber cannot be larger than the last block"); if (newUsersId[msg.sender] == 0) { _registration(msg.sender, getRewards(msg.sender), getLastBlock(msg.sender)); } //Double spend check require(getLastBlock(msg.sender) == _lastBlockNumber, "lastBlockNumber must be equal to the value in the storage"); //1. Lets check signer address signedBy = _msgForSign.recover(_signature); require(trustedSigner[signedBy] == true, "Signature check failed!"); //2. Check signed msg integrety bytes32 actualMsg = getMsgForSign( _amount, _lastBlockNumber, _currentBlockNumber, msg.sender ); require(actualMsg.toEthSignedMessageHash() == _msgForSign,"Integrety check failed!"); //Actions userInfo[msg.sender].rewardDebt = userInfo[msg.sender].rewardDebt.add(_amount); userInfo[msg.sender].lastBlock = _currentBlockNumber; if (_amount > 0) { milk.transfer(msg.sender, _amount); } emit Harvest(msg.sender, _amount, _currentBlockNumber); } function getUsersCount() public view returns(uint256) { return users.length.add(previousUsersCount); } function getUser(uint256 _userId) public view returns(address) { if (_userId < previousUsersCount) { return lastShadowContract.getUser(_userId); } else { return users[_userId.sub(previousUsersCount)]; } } function getTotalRewards(address _user) public view returns(uint256) { if (newUsersId[_user] == 0) { return lastShadowContract.getTotalRewards(_user); } else { return userInfo[_user].rewardDebt; } } function _registration(address _user, uint256 _rewardDebt, uint256 _lastBlock) internal { UserInfo storage _userInfo = userInfo[_user]; _userInfo.rewardDebt = _rewardDebt; _userInfo.lastBlock = _lastBlock; users.push(_user); newUsersId[_user] = users.length; } function getValueMultiplier(uint256 _id) public view returns(uint256) { return multipliers[_id]; } function getValueEpoch(uint256 _id) public view returns(uint256) { return epochs[_id]; } function getMultiplier(uint256 f, uint256 t) public view returns(uint256) { return getInterval(min(t, epochs[1]), max(f, epochs[0])) * multipliers[0] + getInterval(min(t, epochs[2]), max(f, epochs[1])) * multipliers[1] + getInterval(min(t, epochs[3]), max(f, epochs[2])) * multipliers[2] + getInterval(min(t, epochs[4]), max(f, epochs[3])) * multipliers[3] + getInterval(max(t, epochs[4]), max(f, epochs[4])) * multipliers[4]; } function getCurrentMultiplier() public view returns(uint256) { if (block.number < epochs[0]) { return 0; } if (block.number < epochs[1]) { return multipliers[0]; } if (block.number < epochs[2]) { return multipliers[1]; } if (block.number < epochs[3]) { return multipliers[2]; } if (block.number < epochs[4]) { return multipliers[3]; } if (block.number > epochs[4]) { return multipliers[4]; } } function setEpoch(uint256 _id, uint256 _amount) public onlyOwner { epochs[_id] = _amount; } function setMultiplier(uint256 _id, uint256 _amount) public onlyOwner { multipliers[_id] = _amount; } function emergencyRefund() public onlyOwner { emit EmergencyRefund(msg.sender, milk.balanceOf(address(this))); milk.transfer(owner(), milk.balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IMilk2Token","name":"_milk","type":"address"},{"internalType":"uint256[5]","name":"_epochs","type":"uint256[5]"},{"internalType":"uint256[5]","name":"_multipliers","type":"uint256[5]"},{"internalType":"contract LastShadowContract","name":"_lastShadowContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"keyHash","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"AddNewKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"AddNewPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolPid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previusPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPoints","type":"uint256"}],"name":"PoolUpdate","type":"event"},{"inputs":[{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_newPoints","type":"uint256"}],"name":"addNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_currentBlockNumber","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getLastBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_currentBlockNumber","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"}],"name":"getMsgForSign","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"f","type":"uint256"},{"internalType":"uint256","name":"t","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolPid","type":"uint256"}],"name":"getPool","outputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_block","type":"uint256"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_userId","type":"uint256"}],"name":"getUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getValueEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getValueMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_currentBlockNumber","type":"uint256"},{"internalType":"bytes32","name":"_msgForSign","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastShadowContract","outputs":[{"internalType":"contract LastShadowContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"milk","outputs":[{"internalType":"contract IMilk2Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"newUsersId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_msg","type":"bytes32"}],"name":"preSignMsg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"registration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolPid","type":"uint256"},{"internalType":"uint256","name":"_newPoints","type":"uint256"}],"name":"setPoll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bool","name":"_isValid","type":"bool"}],"name":"setTrustedSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001d7238038062001d7283398181016040526101808110156200003857600080fd5b5080516101608201519091602081019160c09091019060006200005a62000178565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b038616179055620000ce600a8460056200017c565b50620000de600f8360056200017c565b50600280546001600160a01b0319166001600160a01b0383811691909117918290556040805163a4a1e26360e01b81529051929091169163a4a1e26391600480820192602092909190829003018186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d60208110156200016857600080fd5b505160065550620001d692505050565b3390565b8260058101928215620001ad579160200282015b82811115620001ad57825182559160200191906001019062000190565b50620001bb929150620001bf565b5090565b5b80821115620001bb5760008155600101620001c0565b611b8c80620001e66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638905d7a011610104578063b4ac6860116100a2578063e9e211a111610071578063e9e211a114610584578063f2fde38b146105be578063f7f4bf5d146105e4578063fa61ed8114610601576101da565b8063b4ac686014610529578063bacf994614610531578063c46d927d1461055f578063dbf8b1681461057c576101da565b806391115fb7116100de57806391115fb71461040e5780639c4bcc2c14610446578063a4a1e26314610504578063b0467deb1461050c576101da565b80638905d7a0146103bf5780638da5cb5b146103e35780638dbb1e3a146103eb576101da565b8063333271d01161017c578063500a09641161014b578063500a09641461033c578063542cecdb14610359578063715018a61461039157806379ee54f714610399576101da565b8063333271d0146102c55780633cc1a8ec146102e8578063443bd1d01461030e5780634929dfa114610316576101da565b806329120b40116101b857806329120b40146102515780632b63c3001461027d5780632bcf161c14610297578063326bfcc1146102bd576101da565b8063068bcd8d146101df57806316bfe25c1461022457806317cbb4b91461022e575b600080fd5b6101fc600480360360208110156101f557600080fd5b5035610624565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b61022c61069f565b005b61022c6004803603604081101561024457600080fd5b50803590602001356108c5565b61022c6004803603604081101561026757600080fd5b506001600160a01b038135169060200135610987565b610285610aef565b60408051918252519081900360200190f35b610285600480360360208110156102ad57600080fd5b50356001600160a01b0316610b6b565b610285610c28565b61022c600480360360408110156102db57600080fd5b5080359060200135610c2e565b610285600480360360208110156102fe57600080fd5b50356001600160a01b0316610c9a565b61022c610cac565b6102856004803603602081101561032c57600080fd5b50356001600160a01b0316610d0a565b6102856004803603602081101561035257600080fd5b5035610d96565b6102856004803603608081101561036f57600080fd5b50803590602081013590604081013590606001356001600160a01b0316610dad565b61022c610df4565b610285600480360360208110156103af57600080fd5b50356001600160a01b0316610e96565b6103c7610f00565b604080516001600160a01b039092168252519081900360200190f35b6103c7610f0f565b6102856004803603604081101561040157600080fd5b5080359060200135610f1e565b6102856004803603608081101561042457600080fd5b50803590602081013590604081013590606001356001600160a01b0316610fe8565b61022c600480360360a081101561045c57600080fd5b81359160208101359160408201359160608101359181019060a08101608082013564010000000081111561048f57600080fd5b8201836020820111156104a157600080fd5b803590602001918460018302840111640100000000831117156104c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110bb945050505050565b61028561135e565b6103c76004803603602081101561052257600080fd5b5035611376565b61028561140b565b61022c6004803603604081101561054757600080fd5b506001600160a01b0381351690602001351515611411565b6102856004803603602081101561057557600080fd5b5035611494565b6103c76114a3565b6105aa6004803603602081101561059a57600080fd5b50356001600160a01b03166114b2565b604080519115158252519081900360200190f35b61022c600480360360208110156105d457600080fd5b50356001600160a01b03166114c7565b610285600480360360208110156105fa57600080fd5b50356115bf565b61022c6004803603604081101561061757600080fd5b50803590602001356115d0565b60008060006008848154811061063657fe5b6000918252602090912060039091020154600880546001600160a01b039092169450908590811061066357fe5b90600052602060002090600302016002015491506008848154811061068457fe5b90600052602060002090600302016001015490509193909250565b6106a7611636565b6000546001600160a01b039081169116146106f7576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290517fdf36e221948da014ebe0f9f6bb96696776424780da298e7f05e2f362dcd4289a9233926001600160a01b03909116916370a08231916024808201926020929091908290030181600087803b15801561076857600080fd5b505af115801561077c573d6000803e3d6000fd5b505050506040513d602081101561079257600080fd5b5051604080516001600160a01b03909316835260208301919091528051918290030190a16001546001600160a01b031663a9059cbb6107cf610f0f565b600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a08231916024808201926020929091908290030181600087803b15801561081c57600080fd5b505af1158015610830573d6000803e3d6000fd5b505050506040513d602081101561084657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050506040513d60208110156108c157600080fd5b5050565b6108cd611636565b6000546001600160a01b0390811691161461091d576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b61095a816109546008858154811061093157fe5b90600052602060002090600302016001015460095461163a90919063ffffffff16565b90611683565b600981905550806008838154811061096e57fe5b9060005260206000209060030201600101819055505050565b61098f611636565b6000546001600160a01b039081169116146109df576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6009546109ec9082611683565b600955604080516060810182526001600160a01b038481168083526020808401868152438587019081526008805460018101825560009190915295517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600390970296870180546001600160a01b0319169190961617909455517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee485015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909301929092558251918252810183905281517f1e31b72e27ef37901051a07176bc3898ce1f63f60acdd170828b98ce10a1b15c929181900390910190a15050565b600a54600090431015610b0457506000610b68565b600b54431015610b1c57600f60005b01549050610b68565b600c54431015610b2f57600f6001610b13565b600d54431015610b4257600f6002610b13565b600e54431015610b5557600f6003610b13565b600e54431115610b6857600f6004610b13565b90565b6001600160a01b038116600090815260076020526040812054610c085760025460408051630af3c58760e21b81526001600160a01b03858116600483015291519190921691632bcf161c916024808301926020929190829003018186803b158015610bd557600080fd5b505afa158015610be9573d6000803e3d6000fd5b505050506040513d6020811015610bff57600080fd5b50519050610c23565b506001600160a01b0381166000908152600360205260409020545b919050565b60095490565b610c36611636565b6000546001600160a01b03908116911614610c86576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b80600f8360058110610c9457fe5b01555050565b60076020526000908152604090205481565b610cb533610d0a565b15610cfc576040805162461bcd60e51b8152602060048201526012602482015271155cd95c88185b1c9958591e48195e1a5cdd60721b604482015290519081900360640190fd5b610d08336000436116dd565b565b6001600160a01b038116600090815260076020526040812054610d745760025460408051634929dfa160e01b81526001600160a01b03858116600483015291519190921691634929dfa1916024808301926020929190829003018186803b158015610bd557600080fd5b506001600160a01b038116600090815260036020526040902060010154610c23565b6000600f8260058110610da557fe5b015492915050565b604080516020808201969096528082019490945260608401929092526001600160a01b03166080808401919091528151808403909101815260a09092019052805191012090565b610dfc611636565b6000546001600160a01b03908116911614610e4c576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b038116600090815260076020526040812054610c0857600254604080516379ee54f760e01b81526001600160a01b038581166004830152915191909216916379ee54f7916024808301926020929190829003018186803b158015610bd557600080fd5b6002546001600160a01b031681565b6000546001600160a01b031690565b601354600090610f49610f3784600a60045b0154611752565b610f4486600a6004610f30565b611768565b02600f60030154610f70610f6385600a60045b015461177e565b610f4487600a6003610f30565b02600f60020154610f94610f8786600a6003610f5c565b610f4488600a6002610f30565b02600f60010154610fb8610fab87600a6002610f5c565b610f4489600a6001610f30565b02600f60000154610fdc610fcf88600a6001610f5c565b610f448a600a6000610f30565b02010101019392505050565b600060028585858560405160200180858152602001848152602001838152602001826001600160a01b031681526020019450505050506040516020818303038152906040526040518082805190602001908083835b6020831061105c5780518252601f19909201916020918201910161103d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561109b573d6000803e3d6000fd5b5050506040513d60208110156110b057600080fd5b505195945050505050565b438311156110fa5760405162461bcd60e51b8152600401808060200182810382526037815260200180611b206037913960400191505060405180910390fd5b33600090815260076020526040902054611129576111293361111b33610e96565b61112433610d0a565b6116dd565b8361113333610d0a565b1461116f5760405162461bcd60e51b8152600401808060200182810382526039815260200180611ae76039913960400191505060405180910390fd5b600061117b838361178d565b6001600160a01b03811660009081526004602052604090205490915060ff1615156001146111f0576040805162461bcd60e51b815260206004820152601760248201527f5369676e617475726520636865636b206661696c656421000000000000000000604482015290519081900360640190fd5b60006111fe87878733610dad565b90508361120a82611974565b1461125c576040805162461bcd60e51b815260206004820152601760248201527f496e7465677265747920636865636b206661696c656421000000000000000000604482015290519081900360640190fd5b336000908152600360205260409020546112769088611683565b3360009081526003602052604090209081556001018590558615611315576001546040805163a9059cbb60e01b8152336004820152602481018a905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50505b604080513381526020810189905280820187905290517f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549181900360600190a150505050505050565b6006546005546000916113719190611683565b905090565b60006006548210156113ce576002546040805163b0467deb60e01b81526004810185905290516001600160a01b039092169163b0467deb91602480820192602092909190829003018186803b158015610bd557600080fd5b60056113e56006548461163a90919063ffffffff16565b815481106113ef57fe5b6000918252602090912001546001600160a01b03169050610c23565b60085490565b611419611636565b6000546001600160a01b03908116911614611469576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000600a8260058110610da557fe5b6001546001600160a01b031681565b60046020526000908152604090205460ff1681565b6114cf611636565b6000546001600160a01b0390811691161461151f576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6001600160a01b0381166115645760405162461bcd60e51b8152600401808060200182810382526026815260200180611a5d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006115ca82611974565b92915050565b6115d8611636565b6000546001600160a01b03908116911614611628576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b80600a8360058110610c9457fe5b3390565b600061167c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119c5565b9392505050565b60008282018381101561167c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0390921660008181526003602090815260408083209485556001948501959095556005805494850181557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090940180546001600160a01b031916841790559254918152600790925291902055565b6000818311611761578161167c565b5090919050565b600081831161177857600061167c565b50900390565b6000818310611761578161167c565b600081516041146117e5576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156118565760405162461bcd60e51b8152600401808060200182810382526022815260200180611a836022913960400191505060405180910390fd5b8060ff16601b148061186b57508060ff16601c145b6118a65760405162461bcd60e51b8152600401808060200182810382526022815260200180611aa56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611902573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661196a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008184841115611a545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a19578181015183820152602001611a01565b50505050905090810190601f168015611a465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726c617374426c6f636b4e756d626572206d75737420626520657175616c20746f207468652076616c756520696e207468652073746f7261676563757272656e74426c6f636b4e756d6265722063616e6e6f74206265206c6172676572207468616e20746865206c61737420626c6f636ba26469706673582212208daaae91574629b2d90c58304c751d80c80f114560208156f987aec8252b427264736f6c634300060c003300000000000000000000000080c8c3dcfb854f9542567c8dac3f44d709ebc1de0000000000000000000000000000000000000000000000000000000000b398900000000000000000000000000000000000000000000000000000000000d21d100000000000000000000000000000000000000000000000000000000000f0a19000000000000000000000000000000000000000000000000000000000010f261000000000000000000000000000000000000000000000000000000000014c2f10000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000230000000000000000000000007f364003609004e83e96412a9d6f9794a91a5377
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638905d7a011610104578063b4ac6860116100a2578063e9e211a111610071578063e9e211a114610584578063f2fde38b146105be578063f7f4bf5d146105e4578063fa61ed8114610601576101da565b8063b4ac686014610529578063bacf994614610531578063c46d927d1461055f578063dbf8b1681461057c576101da565b806391115fb7116100de57806391115fb71461040e5780639c4bcc2c14610446578063a4a1e26314610504578063b0467deb1461050c576101da565b80638905d7a0146103bf5780638da5cb5b146103e35780638dbb1e3a146103eb576101da565b8063333271d01161017c578063500a09641161014b578063500a09641461033c578063542cecdb14610359578063715018a61461039157806379ee54f714610399576101da565b8063333271d0146102c55780633cc1a8ec146102e8578063443bd1d01461030e5780634929dfa114610316576101da565b806329120b40116101b857806329120b40146102515780632b63c3001461027d5780632bcf161c14610297578063326bfcc1146102bd576101da565b8063068bcd8d146101df57806316bfe25c1461022457806317cbb4b91461022e575b600080fd5b6101fc600480360360208110156101f557600080fd5b5035610624565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b61022c61069f565b005b61022c6004803603604081101561024457600080fd5b50803590602001356108c5565b61022c6004803603604081101561026757600080fd5b506001600160a01b038135169060200135610987565b610285610aef565b60408051918252519081900360200190f35b610285600480360360208110156102ad57600080fd5b50356001600160a01b0316610b6b565b610285610c28565b61022c600480360360408110156102db57600080fd5b5080359060200135610c2e565b610285600480360360208110156102fe57600080fd5b50356001600160a01b0316610c9a565b61022c610cac565b6102856004803603602081101561032c57600080fd5b50356001600160a01b0316610d0a565b6102856004803603602081101561035257600080fd5b5035610d96565b6102856004803603608081101561036f57600080fd5b50803590602081013590604081013590606001356001600160a01b0316610dad565b61022c610df4565b610285600480360360208110156103af57600080fd5b50356001600160a01b0316610e96565b6103c7610f00565b604080516001600160a01b039092168252519081900360200190f35b6103c7610f0f565b6102856004803603604081101561040157600080fd5b5080359060200135610f1e565b6102856004803603608081101561042457600080fd5b50803590602081013590604081013590606001356001600160a01b0316610fe8565b61022c600480360360a081101561045c57600080fd5b81359160208101359160408201359160608101359181019060a08101608082013564010000000081111561048f57600080fd5b8201836020820111156104a157600080fd5b803590602001918460018302840111640100000000831117156104c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110bb945050505050565b61028561135e565b6103c76004803603602081101561052257600080fd5b5035611376565b61028561140b565b61022c6004803603604081101561054757600080fd5b506001600160a01b0381351690602001351515611411565b6102856004803603602081101561057557600080fd5b5035611494565b6103c76114a3565b6105aa6004803603602081101561059a57600080fd5b50356001600160a01b03166114b2565b604080519115158252519081900360200190f35b61022c600480360360208110156105d457600080fd5b50356001600160a01b03166114c7565b610285600480360360208110156105fa57600080fd5b50356115bf565b61022c6004803603604081101561061757600080fd5b50803590602001356115d0565b60008060006008848154811061063657fe5b6000918252602090912060039091020154600880546001600160a01b039092169450908590811061066357fe5b90600052602060002090600302016002015491506008848154811061068457fe5b90600052602060002090600302016001015490509193909250565b6106a7611636565b6000546001600160a01b039081169116146106f7576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290517fdf36e221948da014ebe0f9f6bb96696776424780da298e7f05e2f362dcd4289a9233926001600160a01b03909116916370a08231916024808201926020929091908290030181600087803b15801561076857600080fd5b505af115801561077c573d6000803e3d6000fd5b505050506040513d602081101561079257600080fd5b5051604080516001600160a01b03909316835260208301919091528051918290030190a16001546001600160a01b031663a9059cbb6107cf610f0f565b600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a08231916024808201926020929091908290030181600087803b15801561081c57600080fd5b505af1158015610830573d6000803e3d6000fd5b505050506040513d602081101561084657600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b505050506040513d60208110156108c157600080fd5b5050565b6108cd611636565b6000546001600160a01b0390811691161461091d576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b61095a816109546008858154811061093157fe5b90600052602060002090600302016001015460095461163a90919063ffffffff16565b90611683565b600981905550806008838154811061096e57fe5b9060005260206000209060030201600101819055505050565b61098f611636565b6000546001600160a01b039081169116146109df576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6009546109ec9082611683565b600955604080516060810182526001600160a01b038481168083526020808401868152438587019081526008805460018101825560009190915295517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600390970296870180546001600160a01b0319169190961617909455517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee485015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909301929092558251918252810183905281517f1e31b72e27ef37901051a07176bc3898ce1f63f60acdd170828b98ce10a1b15c929181900390910190a15050565b600a54600090431015610b0457506000610b68565b600b54431015610b1c57600f60005b01549050610b68565b600c54431015610b2f57600f6001610b13565b600d54431015610b4257600f6002610b13565b600e54431015610b5557600f6003610b13565b600e54431115610b6857600f6004610b13565b90565b6001600160a01b038116600090815260076020526040812054610c085760025460408051630af3c58760e21b81526001600160a01b03858116600483015291519190921691632bcf161c916024808301926020929190829003018186803b158015610bd557600080fd5b505afa158015610be9573d6000803e3d6000fd5b505050506040513d6020811015610bff57600080fd5b50519050610c23565b506001600160a01b0381166000908152600360205260409020545b919050565b60095490565b610c36611636565b6000546001600160a01b03908116911614610c86576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b80600f8360058110610c9457fe5b01555050565b60076020526000908152604090205481565b610cb533610d0a565b15610cfc576040805162461bcd60e51b8152602060048201526012602482015271155cd95c88185b1c9958591e48195e1a5cdd60721b604482015290519081900360640190fd5b610d08336000436116dd565b565b6001600160a01b038116600090815260076020526040812054610d745760025460408051634929dfa160e01b81526001600160a01b03858116600483015291519190921691634929dfa1916024808301926020929190829003018186803b158015610bd557600080fd5b506001600160a01b038116600090815260036020526040902060010154610c23565b6000600f8260058110610da557fe5b015492915050565b604080516020808201969096528082019490945260608401929092526001600160a01b03166080808401919091528151808403909101815260a09092019052805191012090565b610dfc611636565b6000546001600160a01b03908116911614610e4c576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b038116600090815260076020526040812054610c0857600254604080516379ee54f760e01b81526001600160a01b038581166004830152915191909216916379ee54f7916024808301926020929190829003018186803b158015610bd557600080fd5b6002546001600160a01b031681565b6000546001600160a01b031690565b601354600090610f49610f3784600a60045b0154611752565b610f4486600a6004610f30565b611768565b02600f60030154610f70610f6385600a60045b015461177e565b610f4487600a6003610f30565b02600f60020154610f94610f8786600a6003610f5c565b610f4488600a6002610f30565b02600f60010154610fb8610fab87600a6002610f5c565b610f4489600a6001610f30565b02600f60000154610fdc610fcf88600a6001610f5c565b610f448a600a6000610f30565b02010101019392505050565b600060028585858560405160200180858152602001848152602001838152602001826001600160a01b031681526020019450505050506040516020818303038152906040526040518082805190602001908083835b6020831061105c5780518252601f19909201916020918201910161103d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561109b573d6000803e3d6000fd5b5050506040513d60208110156110b057600080fd5b505195945050505050565b438311156110fa5760405162461bcd60e51b8152600401808060200182810382526037815260200180611b206037913960400191505060405180910390fd5b33600090815260076020526040902054611129576111293361111b33610e96565b61112433610d0a565b6116dd565b8361113333610d0a565b1461116f5760405162461bcd60e51b8152600401808060200182810382526039815260200180611ae76039913960400191505060405180910390fd5b600061117b838361178d565b6001600160a01b03811660009081526004602052604090205490915060ff1615156001146111f0576040805162461bcd60e51b815260206004820152601760248201527f5369676e617475726520636865636b206661696c656421000000000000000000604482015290519081900360640190fd5b60006111fe87878733610dad565b90508361120a82611974565b1461125c576040805162461bcd60e51b815260206004820152601760248201527f496e7465677265747920636865636b206661696c656421000000000000000000604482015290519081900360640190fd5b336000908152600360205260409020546112769088611683565b3360009081526003602052604090209081556001018590558615611315576001546040805163a9059cbb60e01b8152336004820152602481018a905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50505b604080513381526020810189905280820187905290517f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549181900360600190a150505050505050565b6006546005546000916113719190611683565b905090565b60006006548210156113ce576002546040805163b0467deb60e01b81526004810185905290516001600160a01b039092169163b0467deb91602480820192602092909190829003018186803b158015610bd557600080fd5b60056113e56006548461163a90919063ffffffff16565b815481106113ef57fe5b6000918252602090912001546001600160a01b03169050610c23565b60085490565b611419611636565b6000546001600160a01b03908116911614611469576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6000600a8260058110610da557fe5b6001546001600160a01b031681565b60046020526000908152604090205460ff1681565b6114cf611636565b6000546001600160a01b0390811691161461151f576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b6001600160a01b0381166115645760405162461bcd60e51b8152600401808060200182810382526026815260200180611a5d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006115ca82611974565b92915050565b6115d8611636565b6000546001600160a01b03908116911614611628576040805162461bcd60e51b81526020600482018190526024820152600080516020611ac7833981519152604482015290519081900360640190fd5b80600a8360058110610c9457fe5b3390565b600061167c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119c5565b9392505050565b60008282018381101561167c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0390921660008181526003602090815260408083209485556001948501959095556005805494850181557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090940180546001600160a01b031916841790559254918152600790925291902055565b6000818311611761578161167c565b5090919050565b600081831161177857600061167c565b50900390565b6000818310611761578161167c565b600081516041146117e5576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156118565760405162461bcd60e51b8152600401808060200182810382526022815260200180611a836022913960400191505060405180910390fd5b8060ff16601b148061186b57508060ff16601c145b6118a65760405162461bcd60e51b8152600401808060200182810382526022815260200180611aa56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611902573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661196a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008184841115611a545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a19578181015183820152602001611a01565b50505050905090810190601f168015611a465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c75654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726c617374426c6f636b4e756d626572206d75737420626520657175616c20746f207468652076616c756520696e207468652073746f7261676563757272656e74426c6f636b4e756d6265722063616e6e6f74206265206c6172676572207468616e20746865206c61737420626c6f636ba26469706673582212208daaae91574629b2d90c58304c751d80c80f114560208156f987aec8252b427264736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000080c8c3dcfb854f9542567c8dac3f44d709ebc1de0000000000000000000000000000000000000000000000000000000000b398900000000000000000000000000000000000000000000000000000000000d21d100000000000000000000000000000000000000000000000000000000000f0a19000000000000000000000000000000000000000000000000000000000010f261000000000000000000000000000000000000000000000000000000000014c2f10000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000230000000000000000000000007f364003609004e83e96412a9d6f9794a91a5377
-----Decoded View---------------
Arg [0] : _milk (address): 0x80c8C3dCfB854f9542567c8Dac3f44D709eBc1de
Arg [1] : _epochs (uint256[5]): 11770000,13770000,15770000,17770000,21770000
Arg [2] : _multipliers (uint256[5]): 35,35,35,35,35
Arg [3] : _lastShadowContract (address): 0x7f364003609004e83E96412A9d6F9794a91A5377
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000080c8c3dcfb854f9542567c8dac3f44d709ebc1de
Arg [1] : 0000000000000000000000000000000000000000000000000000000000b39890
Arg [2] : 0000000000000000000000000000000000000000000000000000000000d21d10
Arg [3] : 0000000000000000000000000000000000000000000000000000000000f0a190
Arg [4] : 00000000000000000000000000000000000000000000000000000000010f2610
Arg [5] : 00000000000000000000000000000000000000000000000000000000014c2f10
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [11] : 0000000000000000000000007f364003609004e83e96412a9d6f9794a91a5377
Deployed Bytecode Sourcemap
23153:9086:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25367:279;;;;;;;;;;;;;;;;-1:-1:-1;25367:279:0;;:::i;:::-;;;;-1:-1:-1;;;;;25367:279:0;;;;;;;;;;;;;;;;;;;;;;;;;32044:190;;;:::i;:::-;;24988:232;;;;;;;;;;;;;;;;-1:-1:-1;24988:232:0;;;;;;;:::i;24674:304::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24674:304:0;;;;;;;;:::i;31210:584::-;;;:::i;:::-;;;;;;;;;;;;;;;;29893:265;;;;;;;;;;;;;;;;-1:-1:-1;29893:265:0;-1:-1:-1;;;;;29893:265:0;;:::i;26278:92::-;;;:::i;31919:115::-;;;;;;;;;;;;;;;;-1:-1:-1;31919:115:0;;;;;;;:::i;23796:46::-;;;;;;;;;;;;;;;;-1:-1:-1;23796:46:0;-1:-1:-1;;;;;23796:46:0;;:::i;26380:165::-;;;:::i;26019:249::-;;;;;;;;;;;;;;;;-1:-1:-1;26019:249:0;-1:-1:-1;;;;;26019:249:0;;:::i;30488:112::-;;;;;;;;;;;;;;;;-1:-1:-1;30488:112:0;;:::i;27067:245::-;;;;;;;;;;;;;;;;-1:-1:-1;27067:245:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27067:245:0;;:::i;9732:148::-;;;:::i;25761:248::-;;;;;;;;;;;;;;;;-1:-1:-1;25761:248:0;-1:-1:-1;;;;;25761:248:0;;:::i;23558:44::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23558:44:0;;;;;;;;;;;;;;9090:79;;;:::i;30722:478::-;;;;;;;;;;;;;;;;-1:-1:-1;30722:478:0;;;;;;;:::i;26555:236::-;;;;;;;;;;;;;;;;-1:-1:-1;26555:236:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26555:236:0;;:::i;28100:1374::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28100:1374:0;;-1:-1:-1;28100:1374:0;;-1:-1:-1;;;;;28100:1374:0:i;29486:116::-;;;:::i;29612:271::-;;;;;;;;;;;;;;;;-1:-1:-1;29612:271:0;;:::i;25656:95::-;;;:::i;25230:127::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25230:127:0;;;;;;;;;;:::i;30610:102::-;;;;;;;;;;;;;;;;-1:-1:-1;30610:102:0;;:::i;23526:23::-;;;:::i;23664:46::-;;;;;;;;;;;;;;;;-1:-1:-1;23664:46:0;-1:-1:-1;;;;;23664:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;10035:244;;;;;;;;;;;;;;;;-1:-1:-1;10035:244:0;-1:-1:-1;;;;;10035:244:0;;:::i;27684:118::-;;;;;;;;;;;;;;;;-1:-1:-1;27684:118:0;;:::i;31804:105::-;;;;;;;;;;;;;;;;-1:-1:-1;31804:105:0;;;;;;;:::i;25367:279::-;25422:16;25440:14;25456:15;25503:8;25512;25503:18;;;;;;;;;;;;;;;;;;;;;:26;25550:8;:18;;-1:-1:-1;;;;;25503:26:0;;;;-1:-1:-1;25550:8:0;25559;;25550:18;;;;;;;;;;;;;;;;:32;;;25541:41;;25603:8;25612;25603:18;;;;;;;;;;;;;;;;;;:35;;;25593:45;;25367:279;;;;;:::o;32044:190::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;32132:4:::1;::::0;:29:::1;::::0;;-1:-1:-1;;;32132:29:0;;32155:4:::1;32132:29;::::0;::::1;::::0;;;32104:58:::1;::::0;32120:10:::1;::::0;-1:-1:-1;;;;;32132:4:0;;::::1;::::0;:14:::1;::::0;:29;;;;;::::1;::::0;;;;;;;;;:4:::1;::::0;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32132:29:0;32104:58:::1;::::0;;-1:-1:-1;;;;;32104:58:0;;::::1;::::0;;32132:29:::1;32104:58:::0;::::1;::::0;;;;;;;;;;;;::::1;32173:4;::::0;-1:-1:-1;;;;;32173:4:0::1;:13;32187:7;:5;:7::i;:::-;32196:4;::::0;:29:::1;::::0;;-1:-1:-1;;;32196:29:0;;32219:4:::1;32196:29;::::0;::::1;::::0;;;-1:-1:-1;;;;;32196:4:0;;::::1;::::0;:14:::1;::::0;:29;;;;;::::1;::::0;;;;;;;;;:4:::1;::::0;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32196:29:0;32173:53:::1;::::0;;-1:-1:-1;;;;;;32173:53:0::1;::::0;;;;;;-1:-1:-1;;;;;32173:53:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;32196:29:::1;::::0;32173:53;;;;;;;-1:-1:-1;32173:53:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;32044:190:0:o;24988:232::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;25085:68:::1;25142:10;25085:52;25101:8;25110;25101:18;;;;;;;;;;;;;;;;;;:35;;;25085:11;;:15;;:52;;;;:::i;:::-;:56:::0;::::1;:68::i;:::-;25071:11;:82;;;;25202:10;25164:8;25173;25164:18;;;;;;;;;;;;;;;;;;:35;;:48;;;;24988:232:::0;;:::o;24674:304::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;24773:11:::1;::::0;:27:::1;::::0;24789:10;24773:15:::1;:27::i;:::-;24759:11;:41:::0;24825:87:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24825:87:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;24898:12:::1;24825:87:::0;;;;;;24811:8:::1;:102:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24811:102:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;24811:102:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;24929:41;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;24674:304:::0;;:::o;31210:584::-;31301:6;:9;31262:7;;31286:12;:24;31282:65;;;-1:-1:-1;31334:1:0;31327:8;;31282:65;31376:9;;31361:12;:24;31357:78;;;31409:11;31421:1;31409:14;;;31402:21;;;;31357:78;31464:9;;31449:12;:24;31445:78;;;31497:11;31509:1;31497:14;;31445:78;31552:9;;31537:12;:24;31533:78;;;31585:11;31597:1;31585:14;;31533:78;31640:9;;31625:12;:24;31621:78;;;31673:11;31685:1;31673:14;;31621:78;31728:9;;31713:12;:24;31709:78;;;31761:11;31773:1;31761:14;;31709:78;31210:584;:::o;29893:265::-;-1:-1:-1;;;;;29977:17:0;;29953:7;29977:17;;;:10;:17;;;;;;29973:178;;30023:18;;:41;;;-1:-1:-1;;;30023:41:0;;-1:-1:-1;;;;;30023:41:0;;;;;;;;;:18;;;;;:34;;:41;;;;;;;;;;;;;;:18;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30023:41:0;;-1:-1:-1;30016:48:0;;29973:178;-1:-1:-1;;;;;;30113:15:0;;;;;;:8;:15;;;;;:26;29973:178;29893:265;;;:::o;26278:92::-;26351:11;;26278:92;:::o;31919:115::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;32019:7:::1;32000:11;32012:3;32000:16;;;;;;;;:26:::0;-1:-1:-1;;31919:115:0:o;23796:46::-;;;;;;;;;;;;;:::o;26380:165::-;26430:24;26443:10;26430:12;:24::i;:::-;:29;26422:60;;;;;-1:-1:-1;;;26422:60:0;;;;;;;;;;;;-1:-1:-1;;;26422:60:0;;;;;;;;;;;;;;;26495:42;26509:10;26521:1;26524:12;26495:13;:42::i;:::-;26380:165::o;26019:249::-;-1:-1:-1;;;;;26100:17:0;;26076:7;26100:17;;;:10;:17;;;;;;26096:165;;26146:18;;:38;;;-1:-1:-1;;;26146:38:0;;-1:-1:-1;;;;;26146:38:0;;;;;;;;;:18;;;;;:31;;:38;;;;;;;;;;;;;;:18;:38;;;;;;;;;;26096:165;-1:-1:-1;;;;;;26224:15:0;;;;;;:8;:15;;;;;:25;;;26217:32;;30488:112;30549:7;30576:11;30588:3;30576:16;;;;;;;;;;30488:112;-1:-1:-1;;30488:112:0:o;27067:245::-;27236:67;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27236:67:0;;;;;;;;;;;;;;;;;;;;;;;;;27226:78;;;;;;27067:245::o;9732:148::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;9839:1:::1;9823:6:::0;;9802:40:::1;::::0;-1:-1:-1;;;;;9823:6:0;;::::1;::::0;9802:40:::1;::::0;9839:1;;9802:40:::1;9870:1;9853:19:::0;;-1:-1:-1;;;;;;9853:19:0::1;::::0;;9732:148::o;25761:248::-;-1:-1:-1;;;;;25840:17:0;;25816:7;25840:17;;;:10;:17;;;;;;25836:166;;25887:18;;:36;;;-1:-1:-1;;;25887:36:0;;-1:-1:-1;;;;;25887:36:0;;;;;;;;;:18;;;;;:29;;:36;;;;;;;;;;;;;;:18;:36;;;;;;;;;;23558:44;;;-1:-1:-1;;;;;23558:44:0;;:::o;9090:79::-;9128:7;9155:6;-1:-1:-1;;;;;9155:6:0;9090:79;:::o;30722:478::-;31178:14;;30787:7;;31126:49;31138:17;31142:1;31145:6;31190:1;31145:9;;;31138:3;:17::i;:::-;31157;31161:1;31164:6;31171:1;31164:9;;31157:17;31126:11;:49::i;:::-;:66;31100:11;31112:1;31100:14;;31048:49;31060:17;31064:1;31067:6;31074:1;31067:9;;;31060:3;:17::i;:::-;31079;31083:1;31086:6;31093:1;31086:9;;31048:49;:66;31022:11;31034:1;31022:14;;30970:49;30982:17;30986:1;30989:6;30996:1;30989:9;;30982:17;31001;31005:1;31008:6;31015:1;31008:9;;30970:49;:66;30944:11;30956:1;30944:14;;30892:49;30904:17;30908:1;30911:6;30918:1;30911:9;;30904:17;30923;30927:1;30930:6;30937:1;30930:9;;30892:49;:66;30866:11;30878:1;30866:14;;30814:49;30826:17;30830:1;30833:6;30840:1;30833:9;;30826:17;30845;30849:1;30852:6;30859:1;30852:9;;30814:49;:66;:144;:222;:300;:378;;30722:478;-1:-1:-1;;;30722:478:0:o;26555:236::-;26681:7;26708:75;26726:7;26735:16;26753:19;26774:7;26715:67;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26715:67:0;;;;;;;;;;;;;;;;;;;;;;;26708:75;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26708:75:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26708:75:0;;;;;;;;;;;;;;;;;;-1:-1:-1;26708:75:0;;-1:-1:-1;;26708:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26708:75:0;;26555:236;-1:-1:-1;;;;;26555:236:0:o;28100:1374::-;28284:12;28261:19;:35;;28253:103;;;;-1:-1:-1;;;28253:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28384:10;28373:22;;;;:10;:22;;;;;;28369:135;;28417:75;28431:10;28443:22;28454:10;28443;:22::i;:::-;28467:24;28480:10;28467:12;:24::i;:::-;28417:13;:75::i;:::-;28582:16;28554:24;28567:10;28554:12;:24::i;:::-;:44;28546:114;;;;-1:-1:-1;;;28546:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28705:16;28724:31;:11;28744:10;28724:19;:31::i;:::-;-1:-1:-1;;;;;28774:23:0;;;;;;:13;:23;;;;;;28705:50;;-1:-1:-1;28774:23:0;;:31;;:23;:31;28766:67;;;;;-1:-1:-1;;;28766:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28887:17;28907:136;28935:7;28957:16;28988:19;29022:10;28907:13;:136::i;:::-;28887:156;;29100:11;29062:34;:9;:32;:34::i;:::-;:49;29054:84;;;;;-1:-1:-1;;;29054:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29215:10;29206:20;;;;:8;:20;;;;;:31;:44;;29242:7;29206:35;:44::i;:::-;29181:10;29172:20;;;;:8;:20;;;;;:78;;;29261:30;;:52;;;29328:11;;29324:78;;29356:4;;:34;;;-1:-1:-1;;;29356:34:0;;29370:10;29356:34;;;;;;;;;;;;-1:-1:-1;;;;;29356:4:0;;;;:13;;:34;;;;;;;;;;;;;;;:4;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29324:78:0;29417:49;;;29425:10;29417:49;;;;;;;;;;;;;;;;;;;;;;;;;28100:1374;;;;;;;:::o;29486:116::-;29575:18;;29558:5;:12;29531:7;;29558:36;;:12;:16;:36::i;:::-;29551:43;;29486:116;:::o;29612:271::-;29666:7;29700:18;;29690:7;:28;29686:190;;;29742:18;;:35;;;-1:-1:-1;;;29742:35:0;;;;;;;;;;-1:-1:-1;;;;;29742:18:0;;;;:26;;:35;;;;;;;;;;;;;;;:18;:35;;;;;;;;;;29686:190;29826:5;29832:31;29844:18;;29832:7;:11;;:31;;;;:::i;:::-;29826:38;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29826:38:0;;-1:-1:-1;29819:45:0;;25656:95;25728:8;:15;25656:95;:::o;25230:127::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25316:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:33;;-1:-1:-1;;25316:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25230:127::o;30610:102::-;30666:7;30693:6;30700:3;30693:11;;;;;;23526:23;;;-1:-1:-1;;;;;23526:23:0;;:::o;23664:46::-;;;;;;;;;;;;;;;:::o;10035:244::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;10124:22:0;::::1;10116:73;;;;-1:-1:-1::0;;;10116:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10226:6;::::0;;10205:38:::1;::::0;-1:-1:-1;;;;;10205:38:0;;::::1;::::0;10226:6;::::1;::::0;10205:38:::1;::::0;::::1;10254:6;:17:::0;;-1:-1:-1;;;;;;10254:17:0::1;-1:-1:-1::0;;;;;10254:17:0;;;::::1;::::0;;;::::1;::::0;;10035:244::o;27684:118::-;27738:7;27765:29;:4;:27;:29::i;:::-;27758:36;27684:118;-1:-1:-1;;27684:118:0:o;31804:105::-;9312:12;:10;:12::i;:::-;9302:6;;-1:-1:-1;;;;;9302:6:0;;;:22;;;9294:67;;;;;-1:-1:-1;;;9294:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;9294:67:0;;;;;;;;;;;;;;;31894:7:::1;31880:6;31887:3;31880:11;;;;;;8235:106:::0;8323:10;8235:106;:::o;4206:136::-;4264:7;4291:43;4295:1;4298;4291:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4284:50;4206:136;-1:-1:-1;;;4206:136:0:o;3742:181::-;3800:7;3832:5;;;3856:6;;;;3848:46;;;;;-1:-1:-1;;;3848:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30168:310;-1:-1:-1;;;;;30296:15:0;;;30267:26;30296:15;;;:8;:15;;;;;;;;30322:34;;;30367:19;;;;:32;;;;30410:5;:17;;;;;;;;;;;;;-1:-1:-1;;;;;;30410:17:0;;;;;30458:12;;30438:17;;;:10;:17;;;;;;:32;30168:310::o;22392:106::-;22450:7;22481:1;22477;:5;:13;;22489:1;22477:13;;;-1:-1:-1;22485:1:0;;22392:106;-1:-1:-1;22392:106:0:o;22624:117::-;22689:7;22720:1;22716;:5;:17;;22732:1;22716:17;;;-1:-1:-1;22724:5:0;;;22624:117::o;22508:106::-;22566:7;22597:1;22593;:5;:13;;22605:1;22593:13;;878:2051;956:7;1019:9;:16;1039:2;1019:22;1015:96;;1058:41;;;-1:-1:-1;;;1058:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1015:96;1472:4;1457:20;;1451:27;1518:4;1503:20;;1497:27;1572:4;1557:20;;1551:27;1180:9;1543:36;2507:66;2493:80;;;2485:127;;;;-1:-1:-1;;;2485:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:1;:7;;2636:2;2631:7;:18;;;;2642:1;:7;;2647:2;2642:7;2631:18;2623:65;;;;-1:-1:-1;;;2623:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2786:14;2803:24;2813:4;2819:1;2822;2825;2803:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2803:24:0;;-1:-1:-1;;2803:24:0;;;-1:-1:-1;;;;;;;2846:20:0;;2838:57;;;;;-1:-1:-1;;;2838:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2915:6;878:2051;-1:-1:-1;;;;;;878:2051:0:o;3203:269::-;3405:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3395:69;;;;;;3203:269::o;4645:192::-;4731:7;4767:12;4759:6;;;;4751:29;;;;-1:-1:-1;;;4751:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4803:5:0;;;4645:192::o
Swarm Source
ipfs://8daaae91574629b2d90c58304c751d80c80f114560208156f987aec8252b4272
Loading...
Loading
Loading...
Loading
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.