Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,788 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 16576620 | 534 days ago | IN | 0 ETH | 0.00262627 | ||||
Withdraw | 16065297 | 606 days ago | IN | 0 ETH | 0.0007795 | ||||
Deposit | 15608412 | 670 days ago | IN | 0 ETH | 0.00044664 | ||||
Withdraw | 15566337 | 676 days ago | IN | 0 ETH | 0.00043426 | ||||
Withdraw | 15161860 | 739 days ago | IN | 0 ETH | 0.0020741 | ||||
Withdraw | 15115454 | 746 days ago | IN | 0 ETH | 0.00143833 | ||||
Deposit | 14913959 | 781 days ago | IN | 0 ETH | 0.00229212 | ||||
Withdraw | 14823670 | 795 days ago | IN | 0 ETH | 0.00368499 | ||||
Withdraw | 14540014 | 840 days ago | IN | 0 ETH | 0.00531129 | ||||
Withdraw | 14434969 | 857 days ago | IN | 0 ETH | 0.00242072 | ||||
Deposit | 14122191 | 905 days ago | IN | 0 ETH | 0.02434168 | ||||
Withdraw | 13944848 | 932 days ago | IN | 0 ETH | 0.00701807 | ||||
Withdraw | 13917828 | 937 days ago | IN | 0 ETH | 0.00628846 | ||||
Withdraw | 13917811 | 937 days ago | IN | 0 ETH | 0.00813944 | ||||
Withdraw | 13829377 | 950 days ago | IN | 0 ETH | 0.0046701 | ||||
Withdraw | 13829360 | 950 days ago | IN | 0 ETH | 0.0052493 | ||||
Deposit | 13811840 | 953 days ago | IN | 0 ETH | 0.01526248 | ||||
Withdraw | 13788778 | 957 days ago | IN | 0 ETH | 0.00480529 | ||||
Deposit | 13695231 | 972 days ago | IN | 0 ETH | 0.00603451 | ||||
Deposit | 13678103 | 974 days ago | IN | 0 ETH | 0.01470346 | ||||
Deposit | 13678070 | 974 days ago | IN | 0 ETH | 0.01748447 | ||||
Withdraw | 13578431 | 990 days ago | IN | 0 ETH | 0.01010298 | ||||
Withdraw | 13574167 | 991 days ago | IN | 0 ETH | 0.00968857 | ||||
Deposit | 13558630 | 993 days ago | IN | 0 ETH | 0.01867793 | ||||
Deposit | 13555059 | 994 days ago | IN | 0 ETH | 0.01788914 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CoShiFarm
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-15 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // 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); } // File: @openzeppelin/contracts/math/SafeMath.sol 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; } } // File: @openzeppelin/contracts/utils/Address.sol 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) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @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"); } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address 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; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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; } } // File: contracts/Farm.sol pragma solidity 0.6.12; contract CoShiFarm is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of ERC20s // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accERC20PerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accERC20PerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ERC20s to distribute per block. uint256 lastRewardBlock; // Last block number that ERC20s distribution occurs. uint256 accERC20PerShare; // Accumulated ERC20s per share, times 1e36. } // Address of the ERC20 Token contract. IERC20 public erc20; // The total amount of ERC20 that's paid out as reward. uint256 public paidOut = 0; // ERC20 tokens rewarded per block. uint256 public rewardPerBlock; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when farming starts. uint256 public startBlock; // The block number when farming ends. uint256 public endBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor(IERC20 _erc20, uint256 _rewardPerBlock, uint256 _startBlock) public { erc20 = _erc20; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; endBlock = _startBlock; } // Number of LP pools function poolLength() external view returns (uint256) { return poolInfo.length; } function currentBlock() external view returns (uint256) { return block.number; } // Fund the farm, increase the end block function fund(uint256 _amount) public { require(block.number < endBlock, "fund: too late, the farm is closed"); erc20.safeTransferFrom(address(msg.sender), address(this), _amount); endBlock += _amount.div(rewardPerBlock); } // Add a new lp to the pool. Can only be called by the owner. // DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accERC20PerShare: 0 })); } // Update the given pool's ERC20 allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // View function to see deposited LP for a user. function deposited(uint256 _pid, address _user) external view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; return user.amount; } // View function to see pending ERC20s for a user. function pending(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accERC20PerShare = pool.accERC20PerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 lastBlock = block.number < endBlock ? block.number : endBlock; uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock); uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accERC20PerShare = accERC20PerShare.add(erc20Reward.mul(1e36).div(lpSupply)); } return user.amount.mul(accERC20PerShare).div(1e36).sub(user.rewardDebt); } // View function for total reward the farm has yet to pay out. function totalPending() external view returns (uint256) { if (block.number <= startBlock) { return 0; } uint256 lastBlock = block.number < endBlock ? block.number : endBlock; return rewardPerBlock.mul(lastBlock - startBlock).sub(paidOut); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; uint256 lastBlock = block.number < endBlock ? block.number : endBlock; if (lastBlock <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = lastBlock; return; } uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock); uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accERC20PerShare = pool.accERC20PerShare.add(erc20Reward.mul(1e36).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to Farm for ERC20 allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(msg.sender, pendingAmount); } pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from Farm. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: can't withdraw more than deposit"); updatePool(_pid); uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(msg.sender, pendingAmount); user.amount = user.amount.sub(_amount); user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36); pool.lpToken.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } // Transfer ERC20 and update the required ERC20 to payout all rewards function erc20Transfer(address _to, uint256 _amount) internal { erc20.transfer(_to, _amount); paidOut += _amount; } function updateBlockReward(uint256 _rewardPerBlock, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } rewardPerBlock = _rewardPerBlock; } function updateStartBlock(uint256 _startBlock, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } startBlock = _startBlock; } function updateEndBlock(uint256 _endBlock, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } endBlock = _endBlock; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_erc20","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accERC20PerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateBlockReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600255600060065534801561001a57600080fd5b5060405162002848380380620028488339818101604052606081101561003f57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050600061007461017060201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003819055508060078190555080600881905550505050610178565b600033905090565b6126c080620001886000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806364482f79116100f9578063a238310611610097578063e12ed13c11610071578063e12ed13c14610642578063e2bbb15814610660578063e4c75c2714610698578063f2fde38b146106fa576101a9565b8063a238310614610578578063ca1d209d146105da578063d524770c14610608576101a9565b80638ae39cac116100d35780638ae39cac146104835780638b2592cf146104a15780638da5cb5b146104db57806393f1a40b1461050f576101a9565b806364482f7914610401578063715018a614610445578063785e9e861461044f576101a9565b80633f90916a1161016657806351eb05a61161014057806351eb05a61461037d5780635312ea8e146103ab5780635c76ca2d146103d9578063630b5ba1146103f7576101a9565b80633f90916a14610309578063441a3e701461032757806348cd4cb11461035f576101a9565b8063081e3eda146101ae578063083c6323146101cc5780631526fe27146101ea57806317caf6f1146102575780631eaaa045146102755780632825da72146102cf575b600080fd5b6101b661073e565b6040518082815260200191505060405180910390f35b6101d461074b565b6040518082815260200191505060405180910390f35b6102166004803603602081101561020057600080fd5b8101908080359060200190929190505050610751565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b61025f6107ae565b6040518082815260200191505060405180910390f35b6102cd6004803603606081101561028b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506107b4565b005b610307600480360360408110156102e557600080fd5b810190808035906020019092919080351515906020019092919050505061098d565b005b610311610a6f565b6040518082815260200191505060405180910390f35b61035d6004803603604081101561033d57600080fd5b810190808035906020019092919080359060200190929190505050610ace565b005b610367610d0f565b6040518082815260200191505060405180910390f35b6103a96004803603602081101561039357600080fd5b8101908080359060200190929190505050610d15565b005b6103d7600480360360208110156103c157600080fd5b8101908080359060200190929190505050610f03565b005b6103e1611035565b6040518082815260200191505060405180910390f35b6103ff61103b565b005b6104436004803603606081101561041757600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611068565b005b61044d6111b2565b005b610457611338565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61048b61135e565b6040518082815260200191505060405180910390f35b6104d9600480360360408110156104b757600080fd5b8101908080359060200190929190803515159060200190929190505050611364565b005b6104e3611446565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055b6004803603604081101561052557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061146f565b604051808381526020018281526020019250505060405180910390f35b6105c46004803603604081101561058e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a0565b6040518082815260200191505060405180910390f35b610606600480360360208110156105f057600080fd5b8101908080359060200190929190505050611503565b005b6106406004803603604081101561061e57600080fd5b81019080803590602001909291908035151590602001909291905050506115d3565b005b61064a6116b5565b6040518082815260200191505060405180910390f35b6106966004803603604081101561067657600080fd5b8101908080359060200190929190803590602001909291905050506116bd565b005b6106e4600480360360408110156106ae57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b1565b6040518082815260200191505060405180910390f35b61073c6004803603602081101561071057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2c565b005b6000600480549050905090565b60085481565b6004818154811061075e57fe5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60065481565b6107bc611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561088b5761088a61103b565b5b6000600754431161089e576007546108a0565b435b90506108b784600654611d3f90919063ffffffff16565b600681905550600460405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018381526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155505050505050565b610995611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015610a6457610a6361103b565b5b816008819055505050565b60006007544311610a835760009050610acb565b60006008544310610a9657600854610a98565b435b9050610ac7600254610ab96007548403600354611dc790919063ffffffff16565b611e4d90919063ffffffff16565b9150505b90565b600060048381548110610add57fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612637602a913960400191505060405180910390fd5b610ba784610d15565b6000610bfb8260010154610bed6ec097ce7bc90715b34b9f1000000000610bdf87600301548760000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b9050610c073382611ee1565b610c1e848360000154611e4d90919063ffffffff16565b8260000181905550610c626ec097ce7bc90715b34b9f1000000000610c5485600301548560000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b8260010181905550610cb933858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fc49092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60075481565b600060048281548110610d2457fe5b9060005260206000209060040201905060006008544310610d4757600854610d49565b435b905081600201548111610d5d575050610f00565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6020811015610e1457600080fd5b810190808051906020019092919050505090506000811415610e4157818360020181905550505050610f00565b6000610e5a846002015484611e4d90919063ffffffff16565b90506000610e9d600654610e8f8760010154610e8160035487611dc790919063ffffffff16565b611dc790919063ffffffff16565b611e9790919063ffffffff16565b9050610ee9610ed684610ec86ec097ce7bc90715b34b9f100000000085611dc790919063ffffffff16565b611e9790919063ffffffff16565b8660030154611d3f90919063ffffffff16565b856003018190555043856002018190555050505050505b50565b600060048281548110610f1257fe5b9060005260206000209060040201905060006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610fc93382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fc49092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b60025481565b6000600480549050905060005b818110156110645761105981610d15565b806001019050611048565b5050565b611070611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561113f5761113e61103b565b5b611184826111766004868154811061115357fe5b906000526020600020906004020160010154600654611e4d90919063ffffffff16565b611d3f90919063ffffffff16565b600681905550816004848154811061119857fe5b906000526020600020906004020160010181905550505050565b6111ba611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b61136c611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561143b5761143a61103b565b5b816007819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b600854431061155d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126156022913960400191505060405180910390fd5b6115ac333083600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612066909392919063ffffffff16565b6115c160035482611e9790919063ffffffff16565b60086000828254019250508190555050565b6115db611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461169b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156116aa576116a961103b565b5b816003819055505050565b600043905090565b6000600483815481106116cc57fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061173984610d15565b6000816000015411156117a857600061179a826001015461178c6ec097ce7bc90715b34b9f100000000061177e87600301548760000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b90506117a63382611ee1565b505b6117f93330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612066909392919063ffffffff16565b611810838260000154611d3f90919063ffffffff16565b81600001819055506118546ec097ce7bc90715b34b9f100000000061184684600301548460000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b600080600484815481106118c157fe5b9060005260206000209060040201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d60208110156119e557600080fd5b81019080805190602001909291905050509050836002015443118015611a0c575060008114155b15611ad25760006008544310611a2457600854611a26565b435b90506000611a41866002015483611e4d90919063ffffffff16565b90506000611a84600654611a768960010154611a6860035487611dc790919063ffffffff16565b611dc790919063ffffffff16565b611e9790919063ffffffff16565b9050611acc611abd85611aaf6ec097ce7bc90715b34b9f100000000085611dc790919063ffffffff16565b611e9790919063ffffffff16565b86611d3f90919063ffffffff16565b94505050505b611b208360010154611b126ec097ce7bc90715b34b9f1000000000611b04868860000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b94505050505092915050565b611b34611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806125ce6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600080828401905083811015611dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415611dda5760009050611e47565b6000828402905082848281611deb57fe5b0414611e42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b809150505b92915050565b6000611e8f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612127565b905092915050565b6000611ed983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121e7565b905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611f7457600080fd5b505af1158015611f88573d6000803e3d6000fd5b505050506040513d6020811015611f9e57600080fd5b810190808051906020019092919050505050806002600082825401925050819055505050565b6120618363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122ad565b505050565b612121846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122ad565b50505050565b60008383111582906121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561219957808201518184015260208101905061217e565b50505050905090810190601f1680156121c65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612293576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561225857808201518184015260208101905061223d565b50505050905090810190601f1680156122855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161229f57fe5b049050809150509392505050565b606061230f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661239c9092919063ffffffff16565b90506000815111156123975780806020019051602081101561233057600080fd5b8101908080519060200190929190505050612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612661602a913960400191505060405180910390fd5b5b505050565b60606123ab84846000856123b4565b90509392505050565b60606123bf856125ba565b612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612481578051825260208201915060208101905060208303925061245e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146124e3576040519150601f19603f3d011682016040523d82523d6000602084013e6124e8565b606091505b509150915081156124fd5780925050506125b2565b6000815111156125105780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561257757808201518184015260208101905061255c565b50505050905090810190601f1680156125a45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7766756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73656477697468647261773a2063616e2774207769746864726177206d6f7265207468616e206465706f7369745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212208d807381f3e06b03e43a0dd35fb800a1f0a7ba9215dc8bdd55c095d03a6b781f64736f6c634300060c0033000000000000000000000000668c50b1c7f46effbe3f242687071d7908aab00a00000000000000000000000000000000000000000000000000766c7d60a512000000000000000000000000000000000000000000000000000000000000bdef0d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806364482f79116100f9578063a238310611610097578063e12ed13c11610071578063e12ed13c14610642578063e2bbb15814610660578063e4c75c2714610698578063f2fde38b146106fa576101a9565b8063a238310614610578578063ca1d209d146105da578063d524770c14610608576101a9565b80638ae39cac116100d35780638ae39cac146104835780638b2592cf146104a15780638da5cb5b146104db57806393f1a40b1461050f576101a9565b806364482f7914610401578063715018a614610445578063785e9e861461044f576101a9565b80633f90916a1161016657806351eb05a61161014057806351eb05a61461037d5780635312ea8e146103ab5780635c76ca2d146103d9578063630b5ba1146103f7576101a9565b80633f90916a14610309578063441a3e701461032757806348cd4cb11461035f576101a9565b8063081e3eda146101ae578063083c6323146101cc5780631526fe27146101ea57806317caf6f1146102575780631eaaa045146102755780632825da72146102cf575b600080fd5b6101b661073e565b6040518082815260200191505060405180910390f35b6101d461074b565b6040518082815260200191505060405180910390f35b6102166004803603602081101561020057600080fd5b8101908080359060200190929190505050610751565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b61025f6107ae565b6040518082815260200191505060405180910390f35b6102cd6004803603606081101561028b57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506107b4565b005b610307600480360360408110156102e557600080fd5b810190808035906020019092919080351515906020019092919050505061098d565b005b610311610a6f565b6040518082815260200191505060405180910390f35b61035d6004803603604081101561033d57600080fd5b810190808035906020019092919080359060200190929190505050610ace565b005b610367610d0f565b6040518082815260200191505060405180910390f35b6103a96004803603602081101561039357600080fd5b8101908080359060200190929190505050610d15565b005b6103d7600480360360208110156103c157600080fd5b8101908080359060200190929190505050610f03565b005b6103e1611035565b6040518082815260200191505060405180910390f35b6103ff61103b565b005b6104436004803603606081101561041757600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611068565b005b61044d6111b2565b005b610457611338565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61048b61135e565b6040518082815260200191505060405180910390f35b6104d9600480360360408110156104b757600080fd5b8101908080359060200190929190803515159060200190929190505050611364565b005b6104e3611446565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055b6004803603604081101561052557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061146f565b604051808381526020018281526020019250505060405180910390f35b6105c46004803603604081101561058e57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a0565b6040518082815260200191505060405180910390f35b610606600480360360208110156105f057600080fd5b8101908080359060200190929190505050611503565b005b6106406004803603604081101561061e57600080fd5b81019080803590602001909291908035151590602001909291905050506115d3565b005b61064a6116b5565b6040518082815260200191505060405180910390f35b6106966004803603604081101561067657600080fd5b8101908080359060200190929190803590602001909291905050506116bd565b005b6106e4600480360360408110156106ae57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118b1565b6040518082815260200191505060405180910390f35b61073c6004803603602081101561071057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2c565b005b6000600480549050905090565b60085481565b6004818154811061075e57fe5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60065481565b6107bc611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561088b5761088a61103b565b5b6000600754431161089e576007546108a0565b435b90506108b784600654611d3f90919063ffffffff16565b600681905550600460405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018381526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155505050505050565b610995611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015610a6457610a6361103b565b5b816008819055505050565b60006007544311610a835760009050610acb565b60006008544310610a9657600854610a98565b435b9050610ac7600254610ab96007548403600354611dc790919063ffffffff16565b611e4d90919063ffffffff16565b9150505b90565b600060048381548110610add57fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612637602a913960400191505060405180910390fd5b610ba784610d15565b6000610bfb8260010154610bed6ec097ce7bc90715b34b9f1000000000610bdf87600301548760000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b9050610c073382611ee1565b610c1e848360000154611e4d90919063ffffffff16565b8260000181905550610c626ec097ce7bc90715b34b9f1000000000610c5485600301548560000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b8260010181905550610cb933858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fc49092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60075481565b600060048281548110610d2457fe5b9060005260206000209060040201905060006008544310610d4757600854610d49565b435b905081600201548111610d5d575050610f00565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6020811015610e1457600080fd5b810190808051906020019092919050505090506000811415610e4157818360020181905550505050610f00565b6000610e5a846002015484611e4d90919063ffffffff16565b90506000610e9d600654610e8f8760010154610e8160035487611dc790919063ffffffff16565b611dc790919063ffffffff16565b611e9790919063ffffffff16565b9050610ee9610ed684610ec86ec097ce7bc90715b34b9f100000000085611dc790919063ffffffff16565b611e9790919063ffffffff16565b8660030154611d3f90919063ffffffff16565b856003018190555043856002018190555050505050505b50565b600060048281548110610f1257fe5b9060005260206000209060040201905060006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610fc93382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fc49092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b60025481565b6000600480549050905060005b818110156110645761105981610d15565b806001019050611048565b5050565b611070611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611130576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561113f5761113e61103b565b5b611184826111766004868154811061115357fe5b906000526020600020906004020160010154600654611e4d90919063ffffffff16565b611d3f90919063ffffffff16565b600681905550816004848154811061119857fe5b906000526020600020906004020160010181905550505050565b6111ba611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b61136c611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801561143b5761143a61103b565b5b816007819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b600854431061155d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806126156022913960400191505060405180910390fd5b6115ac333083600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612066909392919063ffffffff16565b6115c160035482611e9790919063ffffffff16565b60086000828254019250508190555050565b6115db611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461169b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156116aa576116a961103b565b5b816003819055505050565b600043905090565b6000600483815481106116cc57fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061173984610d15565b6000816000015411156117a857600061179a826001015461178c6ec097ce7bc90715b34b9f100000000061177e87600301548760000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b90506117a63382611ee1565b505b6117f93330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612066909392919063ffffffff16565b611810838260000154611d3f90919063ffffffff16565b81600001819055506118546ec097ce7bc90715b34b9f100000000061184684600301548460000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b600080600484815481106118c157fe5b9060005260206000209060040201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d60208110156119e557600080fd5b81019080805190602001909291905050509050836002015443118015611a0c575060008114155b15611ad25760006008544310611a2457600854611a26565b435b90506000611a41866002015483611e4d90919063ffffffff16565b90506000611a84600654611a768960010154611a6860035487611dc790919063ffffffff16565b611dc790919063ffffffff16565b611e9790919063ffffffff16565b9050611acc611abd85611aaf6ec097ce7bc90715b34b9f100000000085611dc790919063ffffffff16565b611e9790919063ffffffff16565b86611d3f90919063ffffffff16565b94505050505b611b208360010154611b126ec097ce7bc90715b34b9f1000000000611b04868860000154611dc790919063ffffffff16565b611e9790919063ffffffff16565b611e4d90919063ffffffff16565b94505050505092915050565b611b34611d37565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bf4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806125ce6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600080828401905083811015611dbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415611dda5760009050611e47565b6000828402905082848281611deb57fe5b0414611e42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b809150505b92915050565b6000611e8f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612127565b905092915050565b6000611ed983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121e7565b905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611f7457600080fd5b505af1158015611f88573d6000803e3d6000fd5b505050506040513d6020811015611f9e57600080fd5b810190808051906020019092919050505050806002600082825401925050819055505050565b6120618363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122ad565b505050565b612121846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122ad565b50505050565b60008383111582906121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561219957808201518184015260208101905061217e565b50505050905090810190601f1680156121c65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290612293576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561225857808201518184015260208101905061223d565b50505050905090810190601f1680156122855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161229f57fe5b049050809150509392505050565b606061230f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661239c9092919063ffffffff16565b90506000815111156123975780806020019051602081101561233057600080fd5b8101908080519060200190929190505050612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612661602a913960400191505060405180910390fd5b5b505050565b60606123ab84846000856123b4565b90509392505050565b60606123bf856125ba565b612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612481578051825260208201915060208101905060208303925061245e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146124e3576040519150601f19603f3d011682016040523d82523d6000602084013e6124e8565b606091505b509150915081156124fd5780925050506125b2565b6000815111156125105780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561257757808201518184015260208101905061255c565b50505050905090810190601f1680156125a45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7766756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73656477697468647261773a2063616e2774207769746864726177206d6f7265207468616e206465706f7369745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212208d807381f3e06b03e43a0dd35fb800a1f0a7ba9215dc8bdd55c095d03a6b781f64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000668c50b1c7f46effbe3f242687071d7908aab00a00000000000000000000000000000000000000000000000000766c7d60a512000000000000000000000000000000000000000000000000000000000000bdef0d
-----Decoded View---------------
Arg [0] : _erc20 (address): 0x668C50B1c7f46EFFBE3f242687071d7908AAB00A
Arg [1] : _rewardPerBlock (uint256): 33333333000000000
Arg [2] : _startBlock (uint256): 12447501
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000668c50b1c7f46effbe3f242687071d7908aab00a
Arg [1] : 00000000000000000000000000000000000000000000000000766c7d60a51200
Arg [2] : 0000000000000000000000000000000000000000000000000000000000bdef0d
Deployed Bytecode Sourcemap
29378:9507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31960:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31419:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31254:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32633:514;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38694:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34761:296;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36930:687;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31343:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35396:757;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37688:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30872:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35140:180;;;:::i;:::-;;33244:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28766:148;;;:::i;:::-;;30785:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30946:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38490:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28124:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31093:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33610:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32211:257;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38273:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32063:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36217:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33847:838;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29069:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31960:95;32005:7;32032:8;:15;;;;32025:22;;31960:95;:::o;31419:23::-;;;;:::o;31011:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31254:34::-;;;;:::o;32633:514::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32734:11:::1;32730:61;;;32762:17;:15;:17::i;:::-;32730:61;32801:23;32842:10;;32827:12;:25;:53;;32870:10;;32827:53;;;32855:12;32827:53;32801:79;;32909:32;32929:11;32909:15;;:19;;:32;;;;:::i;:::-;32891:15;:50;;;;32952:8;32966:172;;;;;;;;32999:8;32966:172;;;;;;33034:11;32966:172;;;;33077:15;32966:172;;;;33125:1;32966:172;;::::0;32952:187:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28406:1;32633:514:::0;;;:::o;38694:188::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38787:11:::1;38783:61;;;38815:17;:15;:17::i;:::-;38783:61;38865:9;38854:8;:20;;;;38694:188:::0;;:::o;34761:296::-;34808:7;34848:10;;34832:12;:26;34828:67;;34882:1;34875:8;;;;34828:67;34907:17;34942:8;;34927:12;:23;:49;;34968:8;;34927:49;;;34953:12;34927:49;34907:69;;34994:55;35041:7;;34994:42;35025:10;;35013:9;:22;34994:14;;:18;;:42;;;;:::i;:::-;:46;;:55;;;;:::i;:::-;34987:62;;;34761:296;;:::o;36930:687::-;36997:21;37021:8;37030:4;37021:14;;;;;;;;;;;;;;;;;;36997:38;;37046:21;37070:8;:14;37079:4;37070:14;;;;;;;;;;;:26;37085:10;37070:26;;;;;;;;;;;;;;;37046:50;;37130:7;37115:4;:11;;;:22;;37107:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37195:16;37206:4;37195:10;:16::i;:::-;37222:21;37246:69;37299:4;:15;;;37246:48;37289:4;37246:38;37262:4;:21;;;37246:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;37222:93;;37326:40;37340:10;37352:13;37326;:40::i;:::-;37391:24;37407:7;37391:4;:11;;;:15;;:24;;;;:::i;:::-;37377:4;:11;;:38;;;;37444:48;37487:4;37444:38;37460:4;:21;;;37444:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;37426:4;:15;;:66;;;;37503:55;37537:10;37550:7;37503:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;37595:4;37583:10;37574:35;;;37601:7;37574:35;;;;;;;;;;;;;;;;;;36930:687;;;;;:::o;31343:25::-;;;;:::o;35396:757::-;35448:21;35472:8;35481:4;35472:14;;;;;;;;;;;;;;;;;;35448:38;;35497:17;35532:8;;35517:12;:23;:49;;35558:8;;35517:49;;;35543:12;35517:49;35497:69;;35596:4;:20;;;35583:9;:33;35579:72;;35633:7;;;;35579:72;35661:16;35680:4;:12;;;;;;;;;;;;:22;;;35711:4;35680:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35661:56;;35744:1;35732:8;:13;35728:99;;;35785:9;35762:4;:20;;:32;;;;35809:7;;;;;35728:99;35839:18;35860:35;35874:4;:20;;;35860:9;:13;;:35;;;;:::i;:::-;35839:56;;35906:19;35928:72;35984:15;;35928:51;35963:4;:15;;;35928:30;35943:14;;35928:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;35906:94;;36037:62;36063:35;36089:8;36063:21;36079:4;36063:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;36037:4;:21;;;:25;;:62;;;;:::i;:::-;36013:4;:21;;:86;;;;36133:12;36110:4;:20;;:35;;;;35396:757;;;;;;;:::o;37688:356::-;37747:21;37771:8;37780:4;37771:14;;;;;;;;;;;;;;;;;;37747:38;;37796:21;37820:8;:14;37829:4;37820:14;;;;;;;;;;;:26;37835:10;37820:26;;;;;;;;;;;;;;;37796:50;;37857:59;37891:10;37904:4;:11;;;37857:4;:12;;;;;;;;;;;;:25;;;;:59;;;;;:::i;:::-;37962:4;37950:10;37932:48;;;37968:4;:11;;;37932:48;;;;;;;;;;;;;;;;;;38005:1;37991:4;:11;;:15;;;;38035:1;38017:4;:15;;:19;;;;37688:356;;;:::o;30872:26::-;;;;:::o;35140:180::-;35185:14;35202:8;:15;;;;35185:32;;35233:11;35228:85;35256:6;35250:3;:12;35228:85;;;35286:15;35297:3;35286:10;:15::i;:::-;35264:5;;;;;35228:85;;;;35140:180;:::o;33244:304::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33342:11:::1;33338:61;;;33370:17;:15;:17::i;:::-;33338:61;33427:63;33478:11;33427:46;33447:8;33456:4;33447:14;;;;;;;;;;;;;;;;;;:25;;;33427:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;33409:15;:81;;;;33529:11;33501:8;33510:4;33501:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;33244:304:::0;;;:::o;28766:148::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28873:1:::1;28836:40;;28857:6;::::0;::::1;;;;;;;;28836:40;;;;;;;;;;;;28904:1;28887:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;28766:148::o:0;30785:19::-;;;;;;;;;;;;;:::o;30946:29::-;;;;:::o;38490:196::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38587:11:::1;38583:61;;;38615:17;:15;:17::i;:::-;38583:61;38667:11;38654:10;:24;;;;38490:196:::0;;:::o;28124:79::-;28162:7;28189:6;;;;;;;;;;;28182:13;;28124:79;:::o;31093:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33610:173::-;33681:7;33701:21;33725:8;:14;33734:4;33725:14;;;;;;;;;;;:21;33740:5;33725:21;;;;;;;;;;;;;;;33701:45;;33764:4;:11;;;33757:18;;;33610:173;;;;:::o;32211:257::-;32283:8;;32268:12;:23;32260:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32343:67;32374:10;32395:4;32402:7;32343:5;;;;;;;;;;;:22;;;;:67;;;;;;:::i;:::-;32433:27;32445:14;;32433:7;:11;;:27;;;;:::i;:::-;32421:8;;:39;;;;;;;;;;;32211:257;:::o;38273:209::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38375:11:::1;38371:61;;;38403:17;:15;:17::i;:::-;38371:61;38459:15;38442:14;:32;;;;38273:209:::0;;:::o;32063:94::-;32110:7;32137:12;32130:19;;32063:94;:::o;36217:667::-;36283:21;36307:8;36316:4;36307:14;;;;;;;;;;;;;;;;;;36283:38;;36332:21;36356:8;:14;36365:4;36356:14;;;;;;;;;;;:26;36371:10;36356:26;;;;;;;;;;;;;;;36332:50;;36393:16;36404:4;36393:10;:16::i;:::-;36438:1;36424:4;:11;;;:15;36420:196;;;36456:21;36480:69;36533:4;:15;;;36480:48;36523:4;36480:38;36496:4;:21;;;36480:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;36456:93;;36564:40;36578:10;36590:13;36564;:40::i;:::-;36420:196;;36626:74;36664:10;36685:4;36692:7;36626:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;36725:24;36741:7;36725:4;:11;;;:15;;:24;;;;:::i;:::-;36711:4;:11;;:38;;;;36778:48;36821:4;36778:38;36794:4;:21;;;36778:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;36760:4;:15;;:66;;;;36862:4;36850:10;36842:34;;;36868:7;36842:34;;;;;;;;;;;;;;;;;;36217:667;;;;:::o;33847:838::-;33916:7;33936:21;33960:8;33969:4;33960:14;;;;;;;;;;;;;;;;;;33936:38;;33985:21;34009:8;:14;34018:4;34009:14;;;;;;;;;;;:21;34024:5;34009:21;;;;;;;;;;;;;;;33985:45;;34041:24;34068:4;:21;;;34041:48;;34100:16;34119:4;:12;;;;;;;;;;;;:22;;;34150:4;34119:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34100:56;;34188:4;:20;;;34173:12;:35;:52;;;;;34224:1;34212:8;:13;;34173:52;34169:425;;;34242:17;34277:8;;34262:12;:23;:49;;34303:8;;34262:49;;;34288:12;34262:49;34242:69;;34326:18;34347:35;34361:4;:20;;;34347:9;:13;;:35;;;;:::i;:::-;34326:56;;34397:19;34419:72;34475:15;;34419:51;34454:4;:15;;;34419:30;34434:14;;34419:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;34397:94;;34525:57;34546:35;34572:8;34546:21;34562:4;34546:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;34525:16;:20;;:57;;;;:::i;:::-;34506:76;;34169:425;;;;34613:64;34661:4;:15;;;34613:43;34651:4;34613:33;34629:16;34613:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;34606:71;;;;;;33847:838;;;;:::o;29069:244::-;28346:12;:10;:12::i;:::-;28336:22;;:6;;;;;;;;;;:22;;;28328:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29178:1:::1;29158:22;;:8;:22;;;;29150:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29268:8;29239:38;;29260:6;::::0;::::1;;;;;;;;29239:38;;;;;;;;;;;;29297:8;29288:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;29069:244:::0;:::o;26676:106::-;26729:15;26764:10;26757:17;;26676:106;:::o;3759:181::-;3817:7;3837:9;3853:1;3849;:5;3837:17;;3878:1;3873;:6;;3865:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3931:1;3924:8;;;3759:181;;;;:::o;5113:471::-;5171:7;5421:1;5416;:6;5412:47;;;5446:1;5439:8;;;;5412:47;5471:9;5487:1;5483;:5;5471:17;;5516:1;5511;5507;:5;;;;;;:10;5499:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5575:1;5568:8;;;5113:471;;;;;:::o;4223:136::-;4281:7;4308:43;4312:1;4315;4308:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4301:50;;4223:136;;;;:::o;6060:132::-;6118:7;6145:39;6149:1;6152;6145:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6138:46;;6060:132;;;;:::o;38127:138::-;38200:5;;;;;;;;;;;:14;;;38215:3;38220:7;38200:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38250:7;38239;;:18;;;;;;;;;;;38127:138;;:::o;14916:177::-;14999:86;15019:5;15049:23;;;15074:2;15078:5;15026:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14999:19;:86::i;:::-;14916:177;;;:::o;15101:205::-;15202:96;15222:5;15252:27;;;15281:4;15287:2;15291:5;15229:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15202:19;:96::i;:::-;15101:205;;;;:::o;4662:192::-;4748:7;4781:1;4776;:6;;4784:12;4768:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4808:9;4824:1;4820;:5;4808:17;;4845:1;4838:8;;;4662:192;;;;;:::o;6688:278::-;6774:7;6806:1;6802;:5;6809:12;6794:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6833:9;6849:1;6845;:5;;;;;;6833:17;;6957:1;6950:8;;;6688:278;;;;;:::o;17221:761::-;17645:23;17671:69;17699:4;17671:69;;;;;;;;;;;;;;;;;17679:5;17671:27;;;;:69;;;;;:::i;:::-;17645:95;;17775:1;17755:10;:17;:21;17751:224;;;17897:10;17886:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17878:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17751:224;17221:761;;;:::o;11903:196::-;12006:12;12038:53;12061:6;12069:4;12075:1;12078:12;12038:22;:53::i;:::-;12031:60;;11903:196;;;;;:::o;13280:979::-;13410:12;13443:18;13454:6;13443:10;:18::i;:::-;13435:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13569:12;13583:23;13610:6;:11;;13630:8;13641:4;13610:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13568:78;;;;13661:7;13657:595;;;13692:10;13685:17;;;;;;13657:595;13826:1;13806:10;:17;:21;13802:439;;;14069:10;14063:17;14130:15;14117:10;14113:2;14109:19;14102:44;14017:148;14212:12;14205:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13280:979;;;;;;;:::o;8985:422::-;9045:4;9253:12;9364:7;9352:20;9344:28;;9398:1;9391:4;:8;9384:15;;;8985:422;;;:::o
Swarm Source
ipfs://8d807381f3e06b03e43a0dd35fb800a1f0a7ba9215dc8bdd55c095d03a6b781f
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.