Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,327 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 20251075 | 2 days ago | IN | 0 ETH | 0.00002627 | ||||
No Rewards Withd... | 19266656 | 140 days ago | IN | 0 ETH | 0.00768267 | ||||
No Rewards Withd... | 18817745 | 203 days ago | IN | 0 ETH | 0.01668939 | ||||
No Rewards Withd... | 17561130 | 379 days ago | IN | 0 ETH | 0.00084877 | ||||
No Rewards Withd... | 12805953 | 1094 days ago | IN | 0 ETH | 0.00414638 | ||||
No Rewards Withd... | 12580455 | 1129 days ago | IN | 0 ETH | 0.0006803 | ||||
No Rewards Withd... | 12580430 | 1129 days ago | IN | 0 ETH | 0.00371177 | ||||
No Rewards Withd... | 12521318 | 1138 days ago | IN | 0 ETH | 0.01373399 | ||||
No Rewards Withd... | 12514808 | 1139 days ago | IN | 0 ETH | 0.0084247 | ||||
No Rewards Withd... | 12354582 | 1164 days ago | IN | 0 ETH | 0.00829276 | ||||
No Rewards Withd... | 12340186 | 1166 days ago | IN | 0 ETH | 0.01339192 | ||||
No Rewards Withd... | 12315592 | 1170 days ago | IN | 0 ETH | 0.01499566 | ||||
No Rewards Withd... | 12313635 | 1170 days ago | IN | 0 ETH | 0.00929592 | ||||
No Rewards Withd... | 12311517 | 1171 days ago | IN | 0 ETH | 0.01745326 | ||||
No Rewards Withd... | 12310713 | 1171 days ago | IN | 0 ETH | 0.0208237 | ||||
No Rewards Withd... | 12309689 | 1171 days ago | IN | 0 ETH | 0.00319585 | ||||
No Rewards Withd... | 12309689 | 1171 days ago | IN | 0 ETH | 0.00291177 | ||||
No Rewards Withd... | 12309668 | 1171 days ago | IN | 0 ETH | 0.00291177 | ||||
No Rewards Withd... | 12304704 | 1172 days ago | IN | 0 ETH | 0.01930182 | ||||
No Rewards Withd... | 12302118 | 1172 days ago | IN | 0 ETH | 0.01951318 | ||||
No Rewards Withd... | 12302109 | 1172 days ago | IN | 0 ETH | 0.01982898 | ||||
No Rewards Withd... | 12302101 | 1172 days ago | IN | 0 ETH | 0.02110886 | ||||
No Rewards Withd... | 12224600 | 1184 days ago | IN | 0 ETH | 0.03143196 | ||||
No Rewards Withd... | 12197333 | 1188 days ago | IN | 0 ETH | 0.00559949 | ||||
No Rewards Withd... | 12184803 | 1190 days ago | IN | 0 ETH | 0.03632137 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-05 */ pragma solidity ^0.6.12; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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; } } interface Payroll { event CreateSalary(uint256 indexed salaryId, uint256 indexed streamId, address indexed company); function getSalary(uint256 salaryId) external view returns ( address company, address employee, uint256 salary, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 rate ); function createSalary(address employee, uint256 salary, address tokenAddress, uint256 startTime, uint256 stopTime) external returns (uint256 salaryId); } contract SablierStreamable is Ownable { uint256 public duration = 7500000; //~90 days; Payroll public sablier = Payroll(0xbd6a40Bb904aEa5a49c59050B5395f7484A4203d); mapping(address => uint256[]) public streams; function startStream(address _destination, IERC20 _token, uint256 _amount) internal returns (uint256) { uint256 c = _amount / duration; uint256 roundedAmount = c * duration; require(_token.balanceOf(address(this)) >= roundedAmount, "not enough tokens"); _token.approve(address(sablier), roundedAmount); uint256 streamId = sablier.createSalary(_destination, roundedAmount, address(_token), now, now + duration); streams[msg.sender].push(streamId); return roundedAmount; } function getStreams(address _who) public view returns (uint256[] memory) { return streams[_who]; } function getStreamDetails(uint256 _streamId) external view returns ( address source, address destination, uint256 amount, address tokenAddress, uint256 startTime, uint256 stopTime, uint256 remainingBalance, uint256 rate ) { return sablier.getSalary(_streamId); } function updateDuration(uint256 _duration) public onlyOwner { require(_duration <= 90 days, "cannot set longer duration"); duration = _duration; } } // File: contracts/MasterChef.sol pragma solidity 0.6.12; contract MasterChef is SablierStreamable { 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 gsawps // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accRewardPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accRewardPerShare` (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. GSWAPs to distribute per block. uint256 lastRewardBlock; // Last block number that GSWAPs distribution occurs. uint256 accRewardPerShare; // Accumulated GSWAPs per share, times 1e12. See below. } IERC20 public gswap = IERC20(0xaac41EC512808d64625576EDdd580e7Ea40ef8B2); uint256 public rewardPerBlock = 30 ether; uint256 public claimingOpen; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; uint256 public totalAllocPoint = 0; uint256 public startBlock; 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() public { startBlock = 11194950; claimingOpen = 1606780800; add(3,IERC20(0x1E9ed2a6aE58F49B3f847eB9F301849c4a20B7e3)); add(6,IERC20(0xE79590c1D8cBf6f3217b734dAE7abd1b06b68D48)); add(3,IERC20(0x7D611e4CF1C7B94561C4cAA5602F329d108336e3)); add(1,IERC20(0x065a489B2da5d239407c04F5BC8CF67e0F1DF40F)); add(1,IERC20(0xe77F9DAf52e2eEC41a1AC70FCaE81a99Fe056F0b)); } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IERC20 _lpToken) public onlyOwner { uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accRewardPerShare: 0 })); } // Update the given pool's allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } function pendingReward(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accPerShare = pool.accRewardPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = block.number.sub(pool.lastRewardBlock); uint256 reward = multiplier.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); accPerShare = accPerShare.add(reward.mul(1e12).div(lpSupply)); } return user.amount.mul(accPerShare).div(1e12).sub(user.rewardDebt); } // 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]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = block.number.sub(pool.lastRewardBlock); uint256 reward = multiplier.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(lpSupply)); pool.lastRewardBlock = block.number; } function deposit(uint256 _pid, uint256 _amount) public { require(now < claimingOpen, "deposits closed"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); emit Deposit(msg.sender, _pid, _amount); } } function claimAndWithdraw(uint256 _pid) public { require(now >= claimingOpen, "claiming not yet open"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = user.amount.mul(pool.accRewardPerShare).div(1e12).sub(user.rewardDebt); uint256 totalAvailable = gswap.balanceOf(address(this)); if(pending > totalAvailable){ pending = totalAvailable; } uint256 streamedGswapAmount = startStream(msg.sender, gswap, pending); user.rewardDebt = user.rewardDebt.add(streamedGswapAmount); uint256 streamedLPAmount = startStream(msg.sender, pool.lpToken, user.amount); user.amount = user.amount.sub(streamedLPAmount); emit Withdraw(msg.sender, _pid, streamedLPAmount); } // Withdraw without the rewards at any time, still streamed function noRewardsWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 streamedAmount = startStream(msg.sender, pool.lpToken, user.amount); user.amount = user.amount.sub(streamedAmount); user.rewardDebt = 0; emit Withdraw(msg.sender, _pid, streamedAmount); } function updateIssuingRate(uint256 _newRate) public onlyOwner { rewardPerBlock = _newRate; } function updateClaimingOpen(uint256 _newTime) public onlyOwner { claimingOpen = _newTime; } function updateStartBlock(uint256 _startBlock) public onlyOwner { startBlock = _startBlock; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claimAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingOpen","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":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_streamId","type":"uint256"}],"name":"getStreamDetails","outputs":[{"internalType":"address","name":"source","type":"address"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"stopTime","type":"uint256"},{"internalType":"uint256","name":"remainingBalance","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"getStreams","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gswap","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"noRewardsWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","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":"accRewardPerShare","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":[],"name":"sablier","outputs":[{"internalType":"contract Payroll","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"streams","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":"_newTime","type":"uint256"}],"name":"updateClaimingOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"updateDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"updateIssuingRate","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"}],"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"}]
Contract Creation Code
6080604052627270e0600155600280546001600160a01b031990811673bd6a40bb904aea5a49c59050b5395f7484a4203d179091556004805490911673aac41ec512808d64625576eddd580e7ea40ef8b21790556801a055690d9db8000060055560006009553480156200007257600080fd5b5060006200007f62000183565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062aad246600a55635fc58780600655620000f96003731e9ed2a6ae58f49b3f847eb9f301849c4a20b7e362000187565b6200011a600673e79590c1d8cbf6f3217b734dae7abd1b06b68d4862000187565b6200013b6003737d611e4cf1c7b94561c4caa5602f329d108336e362000187565b6200015c600173065a489b2da5d239407c04f5bc8cf67e0f1df40f62000187565b6200017d600173e77f9daf52e2eec41a1ac70fcae81a99fe056f0b62000187565b6200037a565b3390565b6200019162000183565b6000546001600160a01b03908116911614620001f4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000600a5443116200020957600a546200020b565b435b905062000229836009546200031860201b620013a51790919060201c565b600955604080516080810182526001600160a01b0393841681526020810194855290810191825260006060820181815260078054600181018255925291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600490920291820180546001600160a01b031916919095161790935592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b90910155565b60008282018381101562000373576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b611b9e806200038a6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636c7dda8e116100f957806398969e8211610097578063e2bbb15811610071578063e2bbb15814610510578063f2fde38b14610533578063f62b46c914610559578063fac2b9ba14610576576101c4565b806398969e821461049b5780639b9d6cc1146104c7578063a480aa8a146104f3576101c4565b80638ae39cac116100d35780638ae39cac146104295780638da5cb5b1461043157806393f1a40b1461043957806394a8e8031461047e576101c4565b80636c7dda8e146103a3578063715018a6146103ab57806385b9dd0a146103b3576101c4565b80631b50ad091161016657806348cd4cb11161014057806348cd4cb11461036e57806351eb05a614610376578063630b5ba11461039357806363a9845c1461039b576101c4565b80631b50ad09146103015780632b8bbbe81461031e578063482879aa1461034a576101c4565b80631526fe27116101a25780631526fe271461020a5780631764e8951461025757806317caf6f1146102d65780631ab06ee5146102de576101c4565b806305eb6652146101c9578063081e3eda146101e85780630fb5a6b414610202575b600080fd5b6101e6600480360360208110156101df57600080fd5b5035610593565b005b6101f06105f0565b60408051918252519081900360200190f35b6101f06105f6565b6102276004803603602081101561022057600080fd5b50356105fc565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b6102746004803603602081101561026d57600080fd5b503561063d565b60405180896001600160a01b03168152602001886001600160a01b03168152602001878152602001866001600160a01b031681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6101f0610714565b6101e6600480360360408110156102f457600080fd5b508035906020013561071a565b6101e66004803603602081101561031757600080fd5b50356107dc565b6101e66004803603604081101561033457600080fd5b50803590602001356001600160a01b0316610891565b6103526109fd565b604080516001600160a01b039092168252519081900360200190f35b6101f0610a0c565b6101e66004803603602081101561038c57600080fd5b5035610a12565b6101e6610b51565b610352610b74565b6101f0610b83565b6101e6610b89565b6103d9600480360360208110156103c957600080fd5b50356001600160a01b0316610c2b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104155781810151838201526020016103fd565b505050509050019250505060405180910390f35b6101f0610c97565b610352610c9d565b6104656004803603604081101561044f57600080fd5b50803590602001356001600160a01b0316610cac565b6040805192835260208301919091528051918290030190f35b6101e66004803603602081101561049457600080fd5b5035610cd0565b6101f0600480360360408110156104b157600080fd5b50803590602001356001600160a01b0316610d79565b6101f0600480360360408110156104dd57600080fd5b506001600160a01b038135169060200135610eec565b6101e66004803603602081101561050957600080fd5b5035610f1a565b6101e66004803603604081101561052657600080fd5b5080359060200135610f77565b6101e66004803603602081101561054957600080fd5b50356001600160a01b0316611068565b6101e66004803603602081101561056f57600080fd5b5035611160565b6101e66004803603602081101561058c57600080fd5b5035611348565b61059b611406565b6000546001600160a01b039081169116146105eb576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600655565b60075490565b60015481565b6007818154811061060957fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600080600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b03166380bfacc28a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b1580156106a357600080fd5b505afa1580156106b7573d6000803e3d6000fd5b505050506040513d6101008110156106ce57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b60095481565b610722611406565b6000546001600160a01b03908116911614610772576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6107af816107a96007858154811061078657fe5b90600052602060002090600402016001015460095461140a90919063ffffffff16565b906113a5565b60098190555080600783815481106107c357fe5b9060005260206000209060040201600101819055505050565b6107e4611406565b6000546001600160a01b03908116911614610834576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6276a70081111561088c576040805162461bcd60e51b815260206004820152601a60248201527f63616e6e6f7420736574206c6f6e676572206475726174696f6e000000000000604482015290519081900360640190fd5b600155565b610899611406565b6000546001600160a01b039081169116146108e9576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6000600a5443116108fc57600a546108fe565b435b60095490915061090e90846113a5565b600955604080516080810182526001600160a01b0393841681526020810194855290810191825260006060820181815260078054600181018255925291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600490920291820180546001600160a01b031916919095161790935592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b90910155565b6002546001600160a01b031681565b600a5481565b600060078281548110610a2157fe5b9060005260206000209060040201905080600201544311610a425750610b4e565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d6020811015610ab657600080fd5b5051905080610acc575043600290910155610b4e565b6000610ae583600201544361140a90919063ffffffff16565b90506000610b18600954610b128660010154610b0c6005548761144c90919063ffffffff16565b9061144c565b906114a5565b9050610b3b610b3084610b128464e8d4a5100061144c565b6003860154906113a5565b6003850155505043600290920191909155505b50565b60075460005b81811015610b7057610b6881610a12565b600101610b57565b5050565b6004546001600160a01b031681565b60065481565b610b91611406565b6000546001600160a01b03908116911614610be1576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b038116600090815260036020908152604091829020805483518184028101840190945280845260609392830182828015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b50505050509050919050565b60055481565b6000546001600160a01b031690565b60086020908152600092835260408084209091529082529020805460019091015482565b600060078281548110610cdf57fe5b60009182526020808320858452600882526040808520338087529352842060049093020180548354919550929392610d2492916001600160a01b0391909116906114e7565b8254909150610d33908261140a565b825560006001830155604080518281529051859133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050565b60008060078481548110610d8957fe5b600091825260208083208784526008825260408085206001600160a01b03898116875290845281862060049586029093016003810154815484516370a0823160e01b81523098810198909852935191985093969395939492909116926370a08231926024808301939192829003018186803b158015610e0757600080fd5b505afa158015610e1b573d6000803e3d6000fd5b505050506040513d6020811015610e3157600080fd5b5051600285015490915043118015610e4857508015155b15610eb1576000610e6685600201544361140a90919063ffffffff16565b90506000610e8d600954610b128860010154610b0c6005548761144c90919063ffffffff16565b9050610eac610ea584610b128464e8d4a5100061144c565b85906113a5565b935050505b610edf8360010154610ed964e8d4a51000610b1286886000015461144c90919063ffffffff16565b9061140a565b9450505050505b92915050565b60036020528160005260406000208181548110610f0557fe5b90600052602060002001600091509150505481565b610f22611406565b6000546001600160a01b03908116911614610f72576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600555565b6006544210610fbf576040805162461bcd60e51b815260206004820152600f60248201526e19195c1bdcda5d1cc818db1bdcd959608a1b604482015290519081900360640190fd5b600060078381548110610fce57fe5b60009182526020808320868452600882526040808520338652909252922060049091029091019150610fff84610a12565b821561106257815461101c906001600160a01b031633308661170e565b805461102890846113a5565b8155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35b50505050565b611070611406565b6000546001600160a01b039081169116146110c0576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6001600160a01b0381166111055760405162461bcd60e51b8152600401808060200182810382526026815260200180611ad86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6006544210156111af576040805162461bcd60e51b815260206004820152601560248201527431b630b4b6b4b733903737ba103cb2ba1037b832b760591b604482015290519081900360640190fd5b6000600782815481106111be57fe5b600091825260208083208584526008825260408085203386529092529220600490910290910191506111ef83610a12565b600061121d8260010154610ed964e8d4a51000610b128760030154876000015461144c90919063ffffffff16565b60048054604080516370a0823160e01b81523093810193909352519293506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561126f57600080fd5b505afa158015611283573d6000803e3d6000fd5b505050506040513d602081101561129957600080fd5b50519050808211156112a9578091505b6004546000906112c49033906001600160a01b0316856114e7565b60018501549091506112d690826113a5565b6001850155845484546000916112f79133916001600160a01b0316906114e7565b8554909150611306908261140a565b8555604080518281529051889133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050505050565b611350611406565b6000546001600160a01b039081169116146113a0576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600a55565b6000828201838110156113ff576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b60006113ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611768565b60008261145b57506000610ee6565b8282028284828161146857fe5b04146113ff5760405162461bcd60e51b8152600401808060200182810382526021815260200180611afe6021913960400191505060405180910390fd5b60006113ff83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117ff565b60008060015483816114f557fe5b04905060006001548202905080856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561154f57600080fd5b505afa158015611563573d6000803e3d6000fd5b505050506040513d602081101561157957600080fd5b505110156115c2576040805162461bcd60e51b81526020600482015260116024820152706e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519187169163095ea7b3916044808201926020929091908290030181600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050506040513d602081101561164257600080fd5b50506002546001546040805163dc7d936960e01b81526001600160a01b038a81166004830152602482018690528981166044830152426064830181905290930160848201529051600093929092169163dc7d93699160a48082019260209290919082900301818787803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505133600090815260036020908152604082208054600181018255908352912001555095945050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611062908590611864565b600081848411156117f75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117bc5781810151838201526020016117a4565b50505050905090810190601f1680156117e95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361184e5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117bc5781810151838201526020016117a4565b50600083858161185a57fe5b0495945050505050565b60606118b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661191a9092919063ffffffff16565b805190915015611915578080602001905160208110156118d857600080fd5b50516119155760405162461bcd60e51b815260040180806020018281038252602a815260200180611b3f602a913960400191505060405180910390fd5b505050565b60606119298484600085611931565b949350505050565b606061193c85611a9e565b61198d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119cc5780518252601f1990920191602091820191016119ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a2e576040519150601f19603f3d011682016040523d82523d6000602084013e611a33565b606091505b50915091508115611a475791506119299050565b805115611a575780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156117bc5781810151838201526020016117a4565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061192957505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122054199102a596b1f785b5f5628e38a32a49e2df90774529f428c5c8fe13168aff64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636c7dda8e116100f957806398969e8211610097578063e2bbb15811610071578063e2bbb15814610510578063f2fde38b14610533578063f62b46c914610559578063fac2b9ba14610576576101c4565b806398969e821461049b5780639b9d6cc1146104c7578063a480aa8a146104f3576101c4565b80638ae39cac116100d35780638ae39cac146104295780638da5cb5b1461043157806393f1a40b1461043957806394a8e8031461047e576101c4565b80636c7dda8e146103a3578063715018a6146103ab57806385b9dd0a146103b3576101c4565b80631b50ad091161016657806348cd4cb11161014057806348cd4cb11461036e57806351eb05a614610376578063630b5ba11461039357806363a9845c1461039b576101c4565b80631b50ad09146103015780632b8bbbe81461031e578063482879aa1461034a576101c4565b80631526fe27116101a25780631526fe271461020a5780631764e8951461025757806317caf6f1146102d65780631ab06ee5146102de576101c4565b806305eb6652146101c9578063081e3eda146101e85780630fb5a6b414610202575b600080fd5b6101e6600480360360208110156101df57600080fd5b5035610593565b005b6101f06105f0565b60408051918252519081900360200190f35b6101f06105f6565b6102276004803603602081101561022057600080fd5b50356105fc565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b6102746004803603602081101561026d57600080fd5b503561063d565b60405180896001600160a01b03168152602001886001600160a01b03168152602001878152602001866001600160a01b031681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b6101f0610714565b6101e6600480360360408110156102f457600080fd5b508035906020013561071a565b6101e66004803603602081101561031757600080fd5b50356107dc565b6101e66004803603604081101561033457600080fd5b50803590602001356001600160a01b0316610891565b6103526109fd565b604080516001600160a01b039092168252519081900360200190f35b6101f0610a0c565b6101e66004803603602081101561038c57600080fd5b5035610a12565b6101e6610b51565b610352610b74565b6101f0610b83565b6101e6610b89565b6103d9600480360360208110156103c957600080fd5b50356001600160a01b0316610c2b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104155781810151838201526020016103fd565b505050509050019250505060405180910390f35b6101f0610c97565b610352610c9d565b6104656004803603604081101561044f57600080fd5b50803590602001356001600160a01b0316610cac565b6040805192835260208301919091528051918290030190f35b6101e66004803603602081101561049457600080fd5b5035610cd0565b6101f0600480360360408110156104b157600080fd5b50803590602001356001600160a01b0316610d79565b6101f0600480360360408110156104dd57600080fd5b506001600160a01b038135169060200135610eec565b6101e66004803603602081101561050957600080fd5b5035610f1a565b6101e66004803603604081101561052657600080fd5b5080359060200135610f77565b6101e66004803603602081101561054957600080fd5b50356001600160a01b0316611068565b6101e66004803603602081101561056f57600080fd5b5035611160565b6101e66004803603602081101561058c57600080fd5b5035611348565b61059b611406565b6000546001600160a01b039081169116146105eb576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600655565b60075490565b60015481565b6007818154811061060957fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600080600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b03166380bfacc28a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b1580156106a357600080fd5b505afa1580156106b7573d6000803e3d6000fd5b505050506040513d6101008110156106ce57600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b60095481565b610722611406565b6000546001600160a01b03908116911614610772576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6107af816107a96007858154811061078657fe5b90600052602060002090600402016001015460095461140a90919063ffffffff16565b906113a5565b60098190555080600783815481106107c357fe5b9060005260206000209060040201600101819055505050565b6107e4611406565b6000546001600160a01b03908116911614610834576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6276a70081111561088c576040805162461bcd60e51b815260206004820152601a60248201527f63616e6e6f7420736574206c6f6e676572206475726174696f6e000000000000604482015290519081900360640190fd5b600155565b610899611406565b6000546001600160a01b039081169116146108e9576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6000600a5443116108fc57600a546108fe565b435b60095490915061090e90846113a5565b600955604080516080810182526001600160a01b0393841681526020810194855290810191825260006060820181815260078054600181018255925291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600490920291820180546001600160a01b031916919095161790935592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a82015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b90910155565b6002546001600160a01b031681565b600a5481565b600060078281548110610a2157fe5b9060005260206000209060040201905080600201544311610a425750610b4e565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d6020811015610ab657600080fd5b5051905080610acc575043600290910155610b4e565b6000610ae583600201544361140a90919063ffffffff16565b90506000610b18600954610b128660010154610b0c6005548761144c90919063ffffffff16565b9061144c565b906114a5565b9050610b3b610b3084610b128464e8d4a5100061144c565b6003860154906113a5565b6003850155505043600290920191909155505b50565b60075460005b81811015610b7057610b6881610a12565b600101610b57565b5050565b6004546001600160a01b031681565b60065481565b610b91611406565b6000546001600160a01b03908116911614610be1576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b038116600090815260036020908152604091829020805483518184028101840190945280845260609392830182828015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b50505050509050919050565b60055481565b6000546001600160a01b031690565b60086020908152600092835260408084209091529082529020805460019091015482565b600060078281548110610cdf57fe5b60009182526020808320858452600882526040808520338087529352842060049093020180548354919550929392610d2492916001600160a01b0391909116906114e7565b8254909150610d33908261140a565b825560006001830155604080518281529051859133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050565b60008060078481548110610d8957fe5b600091825260208083208784526008825260408085206001600160a01b03898116875290845281862060049586029093016003810154815484516370a0823160e01b81523098810198909852935191985093969395939492909116926370a08231926024808301939192829003018186803b158015610e0757600080fd5b505afa158015610e1b573d6000803e3d6000fd5b505050506040513d6020811015610e3157600080fd5b5051600285015490915043118015610e4857508015155b15610eb1576000610e6685600201544361140a90919063ffffffff16565b90506000610e8d600954610b128860010154610b0c6005548761144c90919063ffffffff16565b9050610eac610ea584610b128464e8d4a5100061144c565b85906113a5565b935050505b610edf8360010154610ed964e8d4a51000610b1286886000015461144c90919063ffffffff16565b9061140a565b9450505050505b92915050565b60036020528160005260406000208181548110610f0557fe5b90600052602060002001600091509150505481565b610f22611406565b6000546001600160a01b03908116911614610f72576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600555565b6006544210610fbf576040805162461bcd60e51b815260206004820152600f60248201526e19195c1bdcda5d1cc818db1bdcd959608a1b604482015290519081900360640190fd5b600060078381548110610fce57fe5b60009182526020808320868452600882526040808520338652909252922060049091029091019150610fff84610a12565b821561106257815461101c906001600160a01b031633308661170e565b805461102890846113a5565b8155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35b50505050565b611070611406565b6000546001600160a01b039081169116146110c0576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b6001600160a01b0381166111055760405162461bcd60e51b8152600401808060200182810382526026815260200180611ad86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6006544210156111af576040805162461bcd60e51b815260206004820152601560248201527431b630b4b6b4b733903737ba103cb2ba1037b832b760591b604482015290519081900360640190fd5b6000600782815481106111be57fe5b600091825260208083208584526008825260408085203386529092529220600490910290910191506111ef83610a12565b600061121d8260010154610ed964e8d4a51000610b128760030154876000015461144c90919063ffffffff16565b60048054604080516370a0823160e01b81523093810193909352519293506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561126f57600080fd5b505afa158015611283573d6000803e3d6000fd5b505050506040513d602081101561129957600080fd5b50519050808211156112a9578091505b6004546000906112c49033906001600160a01b0316856114e7565b60018501549091506112d690826113a5565b6001850155845484546000916112f79133916001600160a01b0316906114e7565b8554909150611306908261140a565b8555604080518281529051889133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050505050565b611350611406565b6000546001600160a01b039081169116146113a0576040805162461bcd60e51b81526020600482018190526024820152600080516020611b1f833981519152604482015290519081900360640190fd5b600a55565b6000828201838110156113ff576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b60006113ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611768565b60008261145b57506000610ee6565b8282028284828161146857fe5b04146113ff5760405162461bcd60e51b8152600401808060200182810382526021815260200180611afe6021913960400191505060405180910390fd5b60006113ff83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117ff565b60008060015483816114f557fe5b04905060006001548202905080856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561154f57600080fd5b505afa158015611563573d6000803e3d6000fd5b505050506040513d602081101561157957600080fd5b505110156115c2576040805162461bcd60e51b81526020600482015260116024820152706e6f7420656e6f75676820746f6b656e7360781b604482015290519081900360640190fd5b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519187169163095ea7b3916044808201926020929091908290030181600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050506040513d602081101561164257600080fd5b50506002546001546040805163dc7d936960e01b81526001600160a01b038a81166004830152602482018690528981166044830152426064830181905290930160848201529051600093929092169163dc7d93699160a48082019260209290919082900301818787803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505133600090815260036020908152604082208054600181018255908352912001555095945050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611062908590611864565b600081848411156117f75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117bc5781810151838201526020016117a4565b50505050905090810190601f1680156117e95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361184e5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156117bc5781810151838201526020016117a4565b50600083858161185a57fe5b0495945050505050565b60606118b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661191a9092919063ffffffff16565b805190915015611915578080602001905160208110156118d857600080fd5b50516119155760405162461bcd60e51b815260040180806020018281038252602a815260200180611b3f602a913960400191505060405180910390fd5b505050565b60606119298484600085611931565b949350505050565b606061193c85611a9e565b61198d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119cc5780518252601f1990920191602091820191016119ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a2e576040519150601f19603f3d011682016040523d82523d6000602084013e611a33565b606091505b50915091508115611a475791506119299050565b805115611a575780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156117bc5781810151838201526020016117a4565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061192957505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122054199102a596b1f785b5f5628e38a32a49e2df90774529f428c5c8fe13168aff64736f6c634300060c0033
Deployed Bytecode Sourcemap
31604:7439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38816:105;;;;;;;;;;;;;;;;-1:-1:-1;38816:105:0;;:::i;:::-;;34107:95;;;:::i;:::-;;;;;;;;;;;;;;;;30126:33;;;:::i;33172:26::-;;;;;;;;;;;;;;;;-1:-1:-1;33172:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;33172:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30988:368;;;;;;;;;;;;;;;;-1:-1:-1;30988:368:0;;:::i;:::-;;;;;-1:-1:-1;;;;;30988:368:0;;;;;;-1:-1:-1;;;;;30988:368:0;;;;;;;;;;;-1:-1:-1;;;;;30988:368:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33327:34;;;:::i;34872:215::-;;;;;;;;;;;;;;;;-1:-1:-1;34872:215:0;;;;;;;:::i;31364:169::-;;;;;;;;;;;;;;;;-1:-1:-1;31364:169:0;;:::i;34371:410::-;;;;;;;;;;;;;;;;-1:-1:-1;34371:410:0;;;;;;-1:-1:-1;;;;;34371:410:0;;:::i;30178:76::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30178:76:0;;;;;;;;;;;;;;33368:25;;;:::i;36164:674::-;;;;;;;;;;;;;;;;-1:-1:-1;36164:674:0;;:::i;35908:180::-;;;:::i;32983:72::-;;;:::i;33109:27::-;;;:::i;28912:148::-;;;:::i;30868:112::-;;;;;;;;;;;;;;;;-1:-1:-1;30868:112:0;-1:-1:-1;;;;;30868:112:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33062:40;;;:::i;28270:79::-;;;:::i;33254:66::-;;;;;;;;;;;;;;;;-1:-1:-1;33254:66:0;;;;;;-1:-1:-1;;;;;33254:66:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38292:402;;;;;;;;;;;;;;;;-1:-1:-1;38292:402:0;;:::i;35095:730::-;;;;;;;;;;;;;;;;-1:-1:-1;35095:730:0;;;;;;-1:-1:-1;;;;;35095:730:0;;:::i;30261:44::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30261:44:0;;;;;;;;:::i;38702:106::-;;;;;;;;;;;;;;;;-1:-1:-1;38702:106:0;;:::i;36846:494::-;;;;;;;;;;;;;;;;-1:-1:-1;36846:494:0;;;;;;;:::i;29215:244::-;;;;;;;;;;;;;;;;-1:-1:-1;29215:244:0;-1:-1:-1;;;;;29215:244:0;;:::i;37348:871::-;;;;;;;;;;;;;;;;-1:-1:-1;37348:871:0;;:::i;38929:107::-;;;;;;;;;;;;;;;;-1:-1:-1;38929:107:0;;:::i;38816:105::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;38890:12:::1;:23:::0;38816:105::o;34107:95::-;34179:8;:15;34107:95;:::o;30126:33::-;;;;:::o;33172:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33172:26:0;;;;-1:-1:-1;33172:26:0;;;:::o;30988:368::-;31081:14;31106:19;31136:14;31161:20;31192:17;31220:16;31247:24;31282:12;31320:7;;;;;;;;;-1:-1:-1;;;;;31320:7:0;-1:-1:-1;;;;;31320:17:0;;31338:9;31320:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31320:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31320:28:0;;-1:-1:-1;31320:28:0;;-1:-1:-1;31320:28:0;-1:-1:-1;31320:28:0;-1:-1:-1;31320:28:0;-1:-1:-1;31320:28:0;;-1:-1:-1;31320:28:0;-1:-1:-1;30988:368:0;;;;;;;;;:::o;33327:34::-;;;;:::o;34872:215::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;34966:63:::1;35017:11;34966:46;34986:8;34995:4;34986:14;;;;;;;;;;;;;;;;;;:25;;;34966:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;34948:15;:81;;;;35068:11;35040:8;35049:4;35040:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;34872:215:::0;;:::o;31364:169::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;31456:7:::1;31443:9;:20;;31435:59;;;::::0;;-1:-1:-1;;;31435:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31505:8;:20:::0;31364:169::o;34371:410::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;34450:23:::1;34491:10;;34476:12;:25;:53;;34519:10;;34476:53;;;34504:12;34476:53;34558:15;::::0;34450:79;;-1:-1:-1;34558:32:0::1;::::0;34578:11;34558:19:::1;:32::i;:::-;34540:15;:50:::0;34615:157:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34615:157:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;34615:157:0;;;;;;34601:8:::1;:172:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;34601:172:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;34371:410::o;30178:76::-;;;-1:-1:-1;;;;;30178:76:0;;:::o;33368:25::-;;;;:::o;36164:674::-;36216:21;36240:8;36249:4;36240:14;;;;;;;;;;;;;;;;;;36216:38;;36285:4;:20;;;36269:12;:36;36265:75;;36322:7;;;36265:75;36369:12;;:37;;;-1:-1:-1;;;36369:37:0;;36400:4;36369:37;;;;;;36350:16;;-1:-1:-1;;;;;36369:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36369:37:0;;-1:-1:-1;36421:13:0;36417:102;;-1:-1:-1;36474:12:0;36451:20;;;;:35;36501:7;;36417:102;36529:18;36550:38;36567:4;:20;;;36550:12;:16;;:38;;;;:::i;:::-;36529:59;;36599:14;36616:72;36672:15;;36616:51;36651:4;:15;;;36616:30;36631:14;;36616:10;:14;;:30;;;;:::i;:::-;:34;;:51::i;:::-;:55;;:72::i;:::-;36599:89;-1:-1:-1;36726:58:0;36753:30;36774:8;36753:16;36599:89;36764:4;36753:10;:16::i;:30::-;36726:22;;;;;:26;:58::i;:::-;36701:22;;;:83;-1:-1:-1;;36818:12:0;36795:20;;;;:35;;;;-1:-1:-1;36164:674:0;;:::o;35908:180::-;35970:8;:15;35953:14;35996:85;36024:6;36018:3;:12;35996:85;;;36054:15;36065:3;36054:10;:15::i;:::-;36032:5;;35996:85;;;;35908:180;:::o;32983:72::-;;;-1:-1:-1;;;;;32983:72:0;;:::o;33109:27::-;;;;:::o;28912:148::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;29019:1:::1;29003:6:::0;;28982:40:::1;::::0;-1:-1:-1;;;;;29003:6:0;;::::1;::::0;28982:40:::1;::::0;29019:1;;28982:40:::1;29050:1;29033:19:::0;;-1:-1:-1;;;;;;29033:19:0::1;::::0;;28912:148::o;30868:112::-;-1:-1:-1;;;;;30959:13:0;;;;;;:7;:13;;;;;;;;;30952:20;;;;;;;;;;;;;;;;;30923:16;;30952:20;;;30959:13;30952:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30868:112;;;:::o;33062:40::-;;;;:::o;28270:79::-;28308:7;28335:6;-1:-1:-1;;;;;28335:6:0;28270:79;:::o;33254:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38292:402::-;38351:21;38375:8;38384:4;38375:14;;;;;;;;;;;;;;;;38424;;;:8;:14;;;;;;38439:10;38424:26;;;;;;;38375:14;;;;;38512:12;;38526:11;;38375:14;;-1:-1:-1;38424:26:0;;38375:14;38488:50;;38439:10;-1:-1:-1;;;;;38512:12:0;;;;;38488:11;:50::i;:::-;38565:11;;38463:75;;-1:-1:-1;38565:31:0;;38463:75;38565:15;:31::i;:::-;38551:45;;:11;38607:15;;;:19;38644:42;;;;;;;;38665:4;;38653:10;;38644:42;;;;;;;;;38292:402;;;;:::o;35095:730::-;35170:7;35190:21;35214:8;35223:4;35214:14;;;;;;;;;;;;;;;;35263;;;:8;:14;;;;;;-1:-1:-1;;;;;35263:21:0;;;;;;;;;;;35214:14;;;;;;;35317:22;;;;35369:12;;:37;;-1:-1:-1;;;35369:37:0;;35400:4;35369:37;;;;;;;;;35214:14;;-1:-1:-1;35263:21:0;;35317:22;;35214:14;;35369:12;;;;;:22;;:37;;;;;35214:14;;35369:37;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35369:37:0;35436:20;;;;35369:37;;-1:-1:-1;35421:12:0;:35;:52;;;;-1:-1:-1;35460:13:0;;;35421:52;35417:324;;;35490:18;35511:38;35528:4;:20;;;35511:12;:16;;:38;;;;:::i;:::-;35490:59;;35564:14;35581:72;35637:15;;35581:51;35616:4;:15;;;35581:30;35596:14;;35581:10;:14;;:30;;;;:::i;:72::-;35564:89;-1:-1:-1;35682:47:0;35698:30;35719:8;35698:16;35564:89;35709:4;35698:10;:16::i;:30::-;35682:11;;:15;:47::i;:::-;35668:61;;35417:324;;;35758:59;35801:4;:15;;;35758:38;35791:4;35758:28;35774:11;35758:4;:11;;;:15;;:28;;;;:::i;:38::-;:42;;:59::i;:::-;35751:66;;;;;;35095:730;;;;;:::o;30261:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38702:106::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;38775:14:::1;:25:::0;38702:106::o;36846:494::-;36926:12;;36920:3;:18;36912:46;;;;;-1:-1:-1;;;36912:46:0;;;;;;;;;;;;-1:-1:-1;;;36912:46:0;;;;;;;;;;;;;;;36969:21;36993:8;37002:4;36993:14;;;;;;;;;;;;;;;;37042;;;:8;:14;;;;;;37057:10;37042:26;;;;;;;36993:14;;;;;;;;-1:-1:-1;37079:16:0;37051:4;37079:10;:16::i;:::-;37112:11;;37108:225;;37140:12;;:74;;-1:-1:-1;;;;;37140:12:0;37178:10;37199:4;37206:7;37140:29;:74::i;:::-;37243:11;;:24;;37259:7;37243:15;:24::i;:::-;37229:38;;37287:34;;;;;;;;37307:4;;37295:10;;37287:34;;;;;;;;;37108:225;36846:494;;;;:::o;29215:244::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29304:22:0;::::1;29296:73;;;;-1:-1:-1::0;;;29296:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29406:6;::::0;;29385:38:::1;::::0;-1:-1:-1;;;;;29385:38:0;;::::1;::::0;29406:6;::::1;::::0;29385:38:::1;::::0;::::1;29434:6;:17:::0;;-1:-1:-1;;;;;;29434:17:0::1;-1:-1:-1::0;;;;;29434:17:0;;;::::1;::::0;;;::::1;::::0;;29215:244::o;37348:871::-;37421:12;;37414:3;:19;;37406:53;;;;;-1:-1:-1;;;37406:53:0;;;;;;;;;;;;-1:-1:-1;;;37406:53:0;;;;;;;;;;;;;;;37472:21;37496:8;37505:4;37496:14;;;;;;;;;;;;;;;;37545;;;:8;:14;;;;;;37560:10;37545:26;;;;;;;37496:14;;;;;;;;-1:-1:-1;37584:16:0;37554:4;37584:10;:16::i;:::-;37611:15;37629:70;37683:4;:15;;;37629:49;37673:4;37629:39;37645:4;:22;;;37629:4;:11;;;:15;;:39;;;;:::i;:70::-;37735:5;;;:30;;;-1:-1:-1;;;37735:30:0;;37759:4;37735:30;;;;;;;;37611:88;;-1:-1:-1;37710:22:0;;-1:-1:-1;;;;;37735:5:0;;;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37735:30:0;;-1:-1:-1;37779:24:0;;;37776:79;;;37829:14;37819:24;;37776:79;37919:5;;37865:27;;37895:39;;37907:10;;-1:-1:-1;;;;;37919:5:0;37926:7;37895:11;:39::i;:::-;37963:15;;;;37865:69;;-1:-1:-1;37963:40:0;;37865:69;37963:19;:40::i;:::-;37945:15;;;:58;38067:12;;38081:11;;38016:24;;38043:50;;38055:10;;-1:-1:-1;;;;;38067:12:0;;38043:11;:50::i;:::-;38118:11;;38016:77;;-1:-1:-1;38118:33:0;;38016:77;38118:15;:33::i;:::-;38104:47;;38167:44;;;;;;;;38188:4;;38176:10;;38167:44;;;;;;;;;37348:871;;;;;;;:::o;38929:107::-;28492:12;:10;:12::i;:::-;28482:6;;-1:-1:-1;;;;;28482:6:0;;;:22;;;28474:67;;;;;-1:-1:-1;;;28474:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28474:67:0;;;;;;;;;;;;;;;39004:10:::1;:24:::0;38929:107::o;3668:181::-;3726:7;3758:5;;;3782:6;;;;3774:46;;;;;-1:-1:-1;;;3774:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3840:1;3668:181;-1:-1:-1;;;3668:181:0:o;26822:106::-;26910:10;26822:106;:::o;4132:136::-;4190:7;4217:43;4221:1;4224;4217:43;;;;;;;;;;;;;;;;;:3;:43::i;5022:471::-;5080:7;5325:6;5321:47;;-1:-1:-1;5355:1:0;5348:8;;5321:47;5392:5;;;5396:1;5392;:5;:1;5416:5;;;;;:10;5408:56;;;;-1:-1:-1;;;5408:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5969:132;6027:7;6054:39;6058:1;6061;6054:39;;;;;;;;;;;;;;;;;:3;:39::i;30314:546::-;30407:7;30429:9;30451:8;;30441:7;:18;;;;;;30429:30;;30470:21;30498:8;;30494:1;:12;30470:36;;30560:13;30525:6;-1:-1:-1;;;;;30525:16:0;;30550:4;30525:31;;;;;;;;;;;;;-1:-1:-1;;;;;30525:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30525:31:0;:48;;30517:78;;;;;-1:-1:-1;;;30517:78:0;;;;;;;;;;;;-1:-1:-1;;;30517:78:0;;;;;;;;;;;;;;;30631:7;;30608:47;;;-1:-1:-1;;;30608:47:0;;-1:-1:-1;;;;;30631:7:0;;;30608:47;;;;;;;;;;;;:14;;;;;;:47;;;;;;;;;;;;;;;30631:7;30608:14;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30687:7:0;;;30765:8;30687:87;;;-1:-1:-1;;;30687:87:0;;-1:-1:-1;;;;;30687:87:0;;;;;;;;;;;;;;;;;;;;30754:3;30687:87;;;;;;30759:14;;;30687:87;;;;;;-1:-1:-1;;30687:7:0;;;;;:20;;:87;;;;;30608:47;;30687:87;;;;;;;;-1:-1:-1;30687:7:0;:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30687:87:0;30793:10;30785:19;;;;:7;30687:87;30785:19;;;;;;:34;;;;;;;;;;;;;;-1:-1:-1;30839:13:0;30314:546;-1:-1:-1;;;;;30314:546:0:o;15217:205::-;15345:68;;;-1:-1:-1;;;;;15345:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15345:68:0;-1:-1:-1;;;15345:68:0;;;15318:96;;15338:5;;15318:19;:96::i;4571:192::-;4657:7;4693:12;4685:6;;;;4677:29;;;;-1:-1:-1;;;4677:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4729:5:0;;;4571:192::o;6597:278::-;6683:7;6718:12;6711:5;6703:28;;;;-1:-1:-1;;;6703:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6742:9;6758:1;6754;:5;;;;;;;6597:278;-1:-1:-1;;;;;6597:278:0:o;17337:761::-;17761:23;17787:69;17815:4;17787:69;;;;;;;;;;;;;;;;;17795:5;-1:-1:-1;;;;;17787:27:0;;;:69;;;;;:::i;:::-;17871:17;;17761:95;;-1:-1:-1;17871:21:0;17867:224;;18013:10;18002:30;;;;;;;;;;;;;;;-1:-1:-1;18002:30:0;17994:85;;;;-1:-1:-1;;;17994:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17337:761;;;:::o;12011:196::-;12114:12;12146:53;12169:6;12177:4;12183:1;12186:12;12146:22;:53::i;:::-;12139:60;12011:196;-1:-1:-1;;;;12011:196:0:o;13388:979::-;13518:12;13551:18;13562:6;13551:10;:18::i;:::-;13543:60;;;;;-1:-1:-1;;;13543:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13677:12;13691:23;13718:6;-1:-1:-1;;;;;13718:11:0;13738:8;13749:4;13718:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13718:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13676:78;;;;13769:7;13765:595;;;13800:10;-1:-1:-1;13793:17:0;;-1:-1:-1;13793:17:0;13765:595;13914:17;;:21;13910:439;;14177:10;14171:17;14238:15;14225:10;14221:2;14217:19;14210:44;14125:148;14313:20;;-1:-1:-1;;;14313:20:0;;;;;;;;;;;;;;;;;14320:12;;14313:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8894:619;8954:4;9422:20;;9265:66;9462:23;;;;;;:42;;-1:-1:-1;;9489:15:0;;;9454:51;-1:-1:-1;;8894:619:0:o
Swarm Source
ipfs://54199102a596b1f785b5f5628e38a32a49e2df90774529f428c5c8fe13168aff
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.54 | 424.998 | $652.83 |
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.