Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 13194404 | 1220 days ago | IN | 0 ETH | 0.00792975 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FannyVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-28 */ // Sources flattened with hardhat v2.0.1 https://hardhat.org // File contracts/v612/FANNY/FANNYVault.sol pragma solidity 0.6.12; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%%@@@@@&%%%%%%@%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@&%%*****#%%%%&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&%%*******#%%%# /%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&%%%********#*,,,*. %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&/******,. %@@@@@@%%%%%@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@%%%&@@@@@%***%*** %%&@@&%%,**%@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@%,,(%@@@%%*(#***, (%%@&% (%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@% %%%%*,,** %%, (%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@% %%%**,, % %%%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@%* %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&%* %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@&#%% %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@%#****%* %@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@%%%/**%* %%@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@%%* %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@% %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@% %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@&% %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@% %%%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@% (%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@&* %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@%%/, %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@%***** %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&%%***** %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&/****** %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&/****** %@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&/,****, (%%@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@%,*****, (&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@%*,***. (&@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@% %%%@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@% %@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&#( ((((%////%%&@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@&%%,. . ./%&&&&&%*.............%%&&&&&&&&&&&&&@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ /// MUH FANNY // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] 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-ethereum-package/contracts/math/[email protected] 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) { // Solidity only automatically asserts when dividing by 0 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-ethereum-package/contracts/utils/[email protected] 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"); } } // File @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/[email protected] 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 ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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-ethereum-package/contracts/utils/[email protected] 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-ethereum-package/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] 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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } 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; } uint256[50] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/access/[email protected] 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 OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { 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; } uint256[49] private __gap; } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface INBUNIERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } interface ICOREGlobals { function TransferHandler() external returns (address); function CoreBuyer() external returns (address); } interface ICOREBuyer { function ensureFee(uint256, uint256, uint256) external; } interface ICORETransferHandler{ function getVolumeOfTokenInCoreBottomUnits(address) external returns(uint256); } // Core Vault distributes fees equally amongst staked pools // Have fun reading it. Hopefully it's bug-free. God bless. contract FannyVault is OwnableUpgradeSafe { using SafeMath for uint256; using SafeERC20 for IERC20; event Deposit(address indexed by, address indexed forWho, uint256 indexed depositID, uint256 amount, uint256 multiplier); event Withdraw(address indexed user, uint256 indexed creditPenalty, uint256 amount); event COREBurned(address indexed from, uint256 value); // Eachu user has many deposits struct UserDeposit { uint256 amountCORE; uint256 startedLockedTime; uint256 amountTimeLocked; uint256 multiplier; bool withdrawed; } // Info of each user. struct UserInfo { uint256 amountCredit; // This is with locking multiplier uint256 rewardDebt; UserDeposit[] deposits; } struct PoolInfo { uint256 accFannyPerShare; bool withdrawable; bool depositable; } IERC20 public CORE; IERC20 public FANNY; address public COREBurnPileNFT; // Info of each pool. PoolInfo public fannyPoolInfo; // Info of each user that stakes tokens. mapping(address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. //// pending rewards awaiting anyone to massUpdate uint256 public totalFarmableFannies; uint256 public blocksFarmingActive; uint256 public blockFarmingStarted; uint256 public blockFarmingEnds; uint256 public fannyPerBlock; uint256 public totalShares; uint256 public totalBlocksToCreditRemaining; uint256 private lastBlockUpdate; uint256 private coreBalance; bool private locked; // Reentrancy lock modifier lock() { require(locked == false, 'FANNY Vault: LOCKED'); locked = true; _; locked = false; } function initialize(address _fanny, uint256 farmableFanniesInWholeUnits, uint256 _blocksFarmingActive) public initializer { OwnableUpgradeSafe.__Ownable_init(); CORE = IERC20(0x62359Ed7505Efc61FF1D56fEF82158CcaffA23D7); FANNY = IERC20(_fanny); totalFarmableFannies = farmableFanniesInWholeUnits*1e18; blocksFarmingActive = _blocksFarmingActive; } function startFarming() public onlyOwner { require(FANNY.balanceOf(address(this)) == totalFarmableFannies, "Not enough fannies in the contract - shameful"); /// We start farming blockFarmingStarted = block.number + 300; // 300 is for deposits to roll in before rewards start // This is how rewards are calculated lastBlockUpdate = block.number + 300; // 300 is for deposits to roll in before rewards start // We get the last farming block blockFarmingEnds = blockFarmingStarted.add(blocksFarmingActive); // This is static so can be set here totalBlocksToCreditRemaining = blockFarmingEnds.sub(blockFarmingStarted); fannyPerBlock = totalFarmableFannies.div(totalBlocksToCreditRemaining); fannyPoolInfo.depositable = true; // We open deposits fannyPoolInfo.withdrawable = true; } function fanniesLeft() public view returns (uint256) { return totalBlocksToCreditRemaining * fannyPerBlock; } function _burn(uint256 _amount) internal { require(COREBurnPileNFT != address(0), "Burning NFT is not set"); // We send the CORE to burn pile safeWithdrawCORE(COREBurnPileNFT, _amount) ; emit COREBurned(msg.sender, _amount); } // Sets the burn NFT once function setBurningNFT(address _burningNFTAddress) public onlyOwner { require(COREBurnPileNFT == address(0), "Already set"); COREBurnPileNFT = _burningNFTAddress; } // Update the given pool's ability to withdraw tokens // Note contract owner is meant to be a governance contract allowing CORE governance consensus function toggleWithdrawals(bool _withdrawable) public onlyOwner { fannyPoolInfo.withdrawable = _withdrawable; } function toggleDepositable(bool _depositable) public onlyOwner { fannyPoolInfo.depositable = _depositable; } // View function to see pending COREs on frontend. function fannyReadyToClaim(address _user) public view returns (uint256) { PoolInfo memory pool = fannyPoolInfo; UserInfo memory user = userInfo[_user]; uint256 accFannyPerShare = pool.accFannyPerShare; return user.amountCredit.mul(accFannyPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool() public { // This is safe to be called publically caues its deterministic if(lastBlockUpdate == block.number) { return; } // save gas on consecutive same block calls if(totalShares == 0) { return; } // div0 error if(blockFarmingStarted > block.number ) { return; } PoolInfo storage pool = fannyPoolInfo; // We take number of blocks since last update uint256 deltaBlocks = block.number.sub(lastBlockUpdate); if(deltaBlocks > totalBlocksToCreditRemaining) { deltaBlocks = totalBlocksToCreditRemaining; } uint256 numFannyToCreditpool = deltaBlocks.mul(fannyPerBlock); totalBlocksToCreditRemaining = totalBlocksToCreditRemaining.sub(deltaBlocks); // Its stored as 1e12 for change // We divide it by total issued shares to get it per share uint256 fannyPerShare = numFannyToCreditpool.mul(1e12).div(totalShares); // This means we finished farming so noone gets anythign no more // We assign a value that its per each share pool.accFannyPerShare = pool.accFannyPerShare.add(fannyPerShare); lastBlockUpdate = block.number; } function changeTotalBlocksRemaining(uint256 amount, bool isSubstraction) public onlyOwner { if(isSubstraction) { totalBlocksToCreditRemaining = totalBlocksToCreditRemaining.sub(amount); } else { totalBlocksToCreditRemaining = totalBlocksToCreditRemaining.add(amount); } } function totalWithdrawableCORE(address user) public view returns (uint256 withdrawableCORE) { UserInfo memory user = userInfo[user]; uint256 lengthUserDeposits = user.deposits.length; // Loop over all deposits for (uint256 i = 0; i < lengthUserDeposits; i++) { UserDeposit memory currentDeposit = user.deposits[i]; // MEMORY BE CAREFUL if(currentDeposit.withdrawed == false // If it has not yet been withdrawed && // And // the timestamp is higher than the lock time block.timestamp > currentDeposit.startedLockedTime.add(currentDeposit.amountTimeLocked)) { // It was not withdrawed. // And its withdrawable, so we withdraw it uint256 amountCOREInThisDeposit = currentDeposit.amountCORE; //gas savings we use it twice withdrawableCORE = withdrawableCORE.add(amountCOREInThisDeposit); } } } function totalDepositedCOREAndNotWithdrawed(address user) public view returns (uint256 totalDeposited) { UserInfo memory user = userInfo[user]; uint256 lengthUserDeposits = user.deposits.length; // Loop over all deposits for (uint256 i = 0; i < lengthUserDeposits; i++) { UserDeposit memory currentDeposit = user.deposits[i]; if(currentDeposit.withdrawed == false) { uint256 amountCOREInThisDeposit = currentDeposit.amountCORE; totalDeposited = totalDeposited.add(amountCOREInThisDeposit); } } } function numberDepositsOfuser(address user) public view returns (uint256) { UserInfo memory user = userInfo[user]; return user.deposits.length; } // Amount and multiplier already needs to be validated function _deposit(uint256 _amount, uint256 multiplier, address forWho) internal { // We multiply the amount by the.. multiplier require(block.number < blockFarmingEnds, "Farming has ended or not started"); PoolInfo storage pool = fannyPoolInfo; // Just memory is fine we don't write to it. require(pool.depositable, "Pool Deposits are closed"); UserInfo storage user = userInfo[forWho]; require(multiplier <= 25, "Sanity check failure for multiplier"); require(multiplier > 0, "Sanity check failure for multiplier"); uint256 depositID = user.deposits.length; if(multiplier != 25) { // multiplier of 25 is a burn user.deposits.push( UserDeposit({ amountCORE : _amount, startedLockedTime : block.timestamp, amountTimeLocked : multiplier > 1 ? multiplier * 4 weeks : 0, withdrawed : false, multiplier : multiplier }) ); } _amount = _amount.mul(multiplier); // Safe math just in case // Because i hate the ethereum network // And want everyone to pay 200 gas // Update before giving credit // Stops attacks updatePool(); // Transfer pending fanny tokens to the user updateAndPayOutPending(forWho); //Transfer in the amounts from user if(_amount > 0) { user.amountCredit = user.amountCredit.add(_amount); } // We paid out so have to remember to update the user debt user.rewardDebt = user.amountCredit.mul(pool.accFannyPerShare).div(1e12); totalShares = totalShares.add(_amount); emit Deposit(msg.sender, forWho, depositID, _amount, multiplier); } // Function that burns from a person fro 25 multiplier function burnFor25XCredit(uint256 _amount) lock public { safeTransferCOREFromPersonToThisContract(_amount, msg.sender); _burn(_amount); _deposit(_amount, 25, msg.sender); } function deposit(uint256 _amount, uint256 lockTimeWeeks) lock public { // Safely transfer CORE out, make sure it got there in all pieces safeTransferCOREFromPersonToThisContract(_amount, msg.sender); _deposit(_amount, getMultiplier(lockTimeWeeks), msg.sender); } function depositFor(uint256 _amount, uint256 lockTimeWeeks, address forWho) lock public { safeTransferCOREFromPersonToThisContract(_amount, msg.sender); _deposit(_amount, getMultiplier(lockTimeWeeks), forWho); } function getMultiplier(uint256 lockTimeWeeks) internal pure returns (uint256 multiplier) { // We check for input errors require(lockTimeWeeks <= 48, "Lock time is too large."); // We establish the deposit multiplier if(lockTimeWeeks >= 8) { // Multiplier starts now multiplier = lockTimeWeeks/4; // max 12 min 2 in this branch } else { multiplier = 1; // else multiplier is 1 and is non-locked } } // Helper function that validates the deposit // And checks if FoT is on the deposit, which it should not be. function safeTransferCOREFromPersonToThisContract(uint256 _amount, address person) internal { uint256 beforeBalance = CORE.balanceOf(address(this)); safeTransferFrom(address(CORE), person, address(this), _amount); uint256 afterBalance = CORE.balanceOf(address(this)); require(afterBalance.sub(beforeBalance) == _amount, "Didn't get enough CORE, most likely FOT is ON"); } function withdrawAllWithdrawableCORE() lock public { UserInfo memory user = userInfo[msg.sender];// MEMORY BE CAREFUL uint256 lenghtUserDeposits = user.deposits.length; require(user.amountCredit > 0, "Nothing to withdraw 1"); require(lenghtUserDeposits > 0, "No deposits"); // struct Deposit { // uint256 amountCORE; // uint256 startedLockedTime; // uint256 amountTimeLocked; // bool withdrawed; // } uint256 withdrawableCORE; uint256 creditPenalty; // Loop over all deposits for (uint256 i = 0; i < lenghtUserDeposits; i++) { UserDeposit memory currentDeposit = user.deposits[i]; // MEMORY BE CAREFUL if(currentDeposit.withdrawed == false // If it has not yet been withdrawed && // And // the timestamp is higher than the lock time block.timestamp > currentDeposit.startedLockedTime.add(currentDeposit.amountTimeLocked)) { // It was not withdrawed. // And its withdrawable, so we withdraw it userInfo[msg.sender].deposits[i].withdrawed = true; // this writes to storage uint256 amountCOREInThisDeposit = currentDeposit.amountCORE; //gas savings we use it twice creditPenalty = creditPenalty.add(amountCOREInThisDeposit.mul(currentDeposit.multiplier)); withdrawableCORE = withdrawableCORE.add(amountCOREInThisDeposit); } } // We check if there is anything to witdraw require(withdrawableCORE > 0, "Nothing to withdraw 2"); //Sanity checks require(creditPenalty >= withdrawableCORE, "Sanity check failure. Penalty should be bigger or equal to withdrawable"); // We conduct the withdrawal _withdraw(msg.sender, msg.sender, withdrawableCORE, creditPenalty); } function _withdraw(address from, address to, uint256 amountToWithdraw, uint256 creditPenalty) internal { PoolInfo storage pool = fannyPoolInfo; require(pool.withdrawable, "Withdrawals are closed."); UserInfo storage user = userInfo[from]; // We update the pool updatePool(); // And pay out rewards to this person updateAndPayOutPending(from); // Adjust their reward debt and balances user.amountCredit = user.amountCredit.sub(creditPenalty, "Coudn't validate user credit amounts"); user.rewardDebt = user.amountCredit.mul(pool.accFannyPerShare).div(1e12); // divide out the change buffer totalShares = totalShares.sub(creditPenalty, "Coudn't validate total shares"); safeWithdrawCORE(to, amountToWithdraw); emit Withdraw(from, creditPenalty, amountToWithdraw); } function claimFanny(address forWho) public lock { UserInfo storage user = userInfo[forWho]; PoolInfo storage pool = fannyPoolInfo; // Just memory is fine we don't write to it. updatePool(); // And pay out rewards to this person updateAndPayOutPending(forWho); user.rewardDebt = user.amountCredit.mul(pool.accFannyPerShare).div(1e12); } function claimFanny() public { claimFanny(msg.sender); } // Public locked function, validates via msg.sender function withdrawDeposit(uint256 depositID) public lock { _withdrawDeposit(depositID, msg.sender, msg.sender); } // We withdraw a specific deposit id // Important to validate from // Internal function function _withdrawDeposit(uint256 depositID, address from, address to) internal { UserDeposit memory currentDeposit = userInfo[from].deposits[depositID]; // MEMORY BE CAREFUL uint256 creditPenalty; uint256 withdrawableCORE; if( currentDeposit.withdrawed == false && block.timestamp > currentDeposit.startedLockedTime.add(currentDeposit.amountTimeLocked)) { // It was not withdrawed. // And its withdrawable, so we withdraw it userInfo[from].deposits[depositID].withdrawed = true; // this writes to storage uint256 amountCOREInThisDeposit = currentDeposit.amountCORE; //gas savings we use it twice creditPenalty = creditPenalty.add(amountCOREInThisDeposit.mul(currentDeposit.multiplier)); withdrawableCORE = withdrawableCORE.add(amountCOREInThisDeposit); } require(withdrawableCORE > 0, "Nothing to withdraw"); require(creditPenalty >= withdrawableCORE, "Sanity check failure. Penalty should be bigger or equal to withdrawable"); require(creditPenalty > 0, "Sanity fail, withdrawing CORE and inccuring no credit penalty"); // _withdraw(address from, address to, uint256 amountToWithdraw, uint256 creditPenalty) _withdraw(from, to, withdrawableCORE, creditPenalty); } function updateAndPayOutPending(address from) internal { uint256 pending = fannyReadyToClaim(from); if(pending > 0) { safeFannyTransfer(from, pending); } } // Safe core transfer function, just in case if rounding error causes pool to not have enough COREs. function safeFannyTransfer(address _to, uint256 _amount) internal { uint256 _fannyBalance = FANNY.balanceOf(address(this)); if (_amount > _fannyBalance) { safeTransfer(address(FANNY), _to, _fannyBalance); } else { safeTransfer(address(FANNY), _to, _amount); } } function safeWithdrawCORE(address _to, uint256 _amount) internal { uint256 balanceBefore = CORE.balanceOf(_to); safeTransfer(address(CORE), _to, _amount); uint256 balanceAfter = CORE.balanceOf(_to); require(balanceAfter.sub(balanceBefore) == _amount, "Failed to withdraw CORE tokens successfully, make sure FOT is off"); } function safeTransfer(address token, address to, uint256 value) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'MUH FANNY: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'MUH FANNY: TRANSFER_FROM_FAILED'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"COREBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"forWho","type":"address"},{"indexed":true,"internalType":"uint256","name":"depositID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"Deposit","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":"creditPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"CORE","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COREBurnPileNFT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FANNY","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockFarmingEnds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockFarmingStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksFarmingActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFor25XCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isSubstraction","type":"bool"}],"name":"changeTotalBlocksRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forWho","type":"address"}],"name":"claimFanny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFanny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"lockTimeWeeks","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"lockTimeWeeks","type":"uint256"},{"internalType":"address","name":"forWho","type":"address"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fanniesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fannyPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fannyPoolInfo","outputs":[{"internalType":"uint256","name":"accFannyPerShare","type":"uint256"},{"internalType":"bool","name":"withdrawable","type":"bool"},{"internalType":"bool","name":"depositable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"fannyReadyToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fanny","type":"address"},{"internalType":"uint256","name":"farmableFanniesInWholeUnits","type":"uint256"},{"internalType":"uint256","name":"_blocksFarmingActive","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"numberDepositsOfuser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burningNFTAddress","type":"address"}],"name":"setBurningNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_depositable","type":"bool"}],"name":"toggleDepositable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"toggleWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBlocksToCreditRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalDepositedCOREAndNotWithdrawed","outputs":[{"internalType":"uint256","name":"totalDeposited","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFarmableFannies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalWithdrawableCORE","outputs":[{"internalType":"uint256","name":"withdrawableCORE","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amountCredit","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAllWithdrawableCORE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositID","type":"uint256"}],"name":"withdrawDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612c37806100206000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80639712c6751161011a578063d3ccc298116100ad578063e87a01801161007c578063e87a0180146104d5578063ea0aa540146104dd578063ed1d227e146104e5578063efcd73281461050a578063f2fde38b1461053257610206565b8063d3ccc2981461047c578063e2bbb158146104a2578063e3161ddd146104c5578063e4c2fe15146104cd57610206565b8063bafdbbf7116100e9578063bafdbbf714610429578063bd213b281461044f578063bf21630c14610457578063ce5201a01461047457610206565b80639712c675146103d45780639777d821146103fa5780639f610d7414610419578063afbcfea11461042157610206565b80636b5470341161019d5780637b02665d1161016c5780637b02665d146103645780637ee1d7231461038a57806384679c65146103925780638da5cb5b1461039a57806390210d7e146103a257610206565b80636b547034146102fc5780636b6c077414610322578063715018a61461032a5780637a1ac61e1461033257610206565b806333289a46116101d957806333289a46146102ab5780633a98ef39146102c85780633aa30335146102d05780634529077a146102d857610206565b8063163c8ffb1461020b5780631959a0021461022557806320794113146102645780632638b6d914610285575b600080fd5b610213610558565b60408051918252519081900360200190f35b61024b6004803603602081101561023b57600080fd5b50356001600160a01b031661055e565b6040805192835260208301919091528051918290030190f35b6102836004803603602081101561027a57600080fd5b50351515610577565b005b6102836004803603602081101561029b57600080fd5b50356001600160a01b03166105e9565b610283600480360360208110156102c157600080fd5b50356106af565b610213610722565b610213610728565b6102e0610732565b604080516001600160a01b039092168252519081900360200190f35b6102136004803603602081101561031257600080fd5b50356001600160a01b0316610741565b6102e0610886565b610283610895565b6102836004803603606081101561034857600080fd5b506001600160a01b038135169060208101359060400135610937565b6102136004803603602081101561037a57600080fd5b50356001600160a01b0316610a34565b610213610b8e565b6102e0610b94565b6102e0610ba3565b610283600480360360608110156103b857600080fd5b50803590602081013590604001356001600160a01b0316610bb2565b610213600480360360208110156103ea57600080fd5b50356001600160a01b0316610c39565b6102836004803603602081101561041057600080fd5b50351515610d24565b610283610d8f565b6102836110c2565b6102836004803603602081101561043f57600080fd5b50356001600160a01b031661122c565b6102836112e7565b6102836004803603602081101561046d57600080fd5b50356112f2565b61021361136c565b6102136004803603602081101561049257600080fd5b50356001600160a01b0316611372565b610283600480360360408110156104b857600080fd5b50803590602001356114bd565b610283611543565b6102136115f0565b6102136115f6565b6102136115fc565b610283600480360360408110156104fb57600080fd5b50803590602001351515611602565b61051261168a565b604080519384529115156020840152151582820152519081900360600190f35b6102836004803603602081101561054857600080fd5b50356001600160a01b031661169f565b60a35481565b609c602052600090815260409020805460019091015482565b61057f611798565b6065546001600160a01b039081169116146105cf576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609b80549115156101000261ff0019909216919091179055565b6105f1611798565b6065546001600160a01b03908116911614610641576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6099546001600160a01b03161561068d576040805162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0392909216919091179055565b60a65460ff16156106fd576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff1916600117905561071581338061179c565b5060a6805460ff19169055565b60a25481565b60a15460a3540290565b6099546001600160a01b031681565b600061074b612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156108175760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff161515608083015290835290920191016107b4565b5050509152505060408101515190915060005b8181101561087e5761083a6129b5565b8360400151828151811061084a57fe5b60200260200101519050806080015115156000151514156108755780516108718682611997565b9550505b5060010161082a565b505050919050565b6097546001600160a01b031681565b61089d611798565b6065546001600160a01b039081169116146108ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff168061095057506109506119fa565b8061095e575060005460ff16155b6109995760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff161580156109c4576000805460ff1961ff0019909116610100171660011790555b6109cc611a00565b609780547362359ed7505efc61ff1d56fef82158ccaffa23d76001600160a01b031991821617909155609880549091166001600160a01b038616179055670de0b6b3a76400008302609d55609e8290558015610a2e576000805461ff00191690555b50505050565b6000610a3e612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610b0a5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610aa7565b5050509152505060408101515190915060005b8181101561087e57610b2d6129b5565b83604001518281518110610b3d57fe5b602002602001015190508060800151151560001515148015610b70575060408101516020820151610b6d91611997565b42115b15610b85578051610b818682611997565b9550505b50600101610b1d565b609e5481565b6098546001600160a01b031681565b6065546001600160a01b031690565b60a65460ff1615610c00576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff19166001179055610c178333611ab2565b610c2a83610c2484611c04565b83611c76565b505060a6805460ff1916905550565b6000610c43612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610d0f5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610cac565b5050509152505060400151519150505b919050565b610d2c611798565b6065546001600160a01b03908116911614610d7c576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609b805460ff1916911515919091179055565b60a65460ff1615610ddd576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff19166001179055610df2612994565b336000908152609c60209081526040808320815160608101835281548152600182015481850152600282018054845181870281018701865281815292969395948701949293919290919084015b82821015610ea25760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610e3f565b50505091525050604081015151815191925090610efe576040805162461bcd60e51b81526020600482015260156024820152744e6f7468696e6720746f207769746864726177203160581b604482015290519081900360640190fd5b60008111610f41576040805162461bcd60e51b815260206004820152600b60248201526a4e6f206465706f7369747360a81b604482015290519081900360640190fd5b60008060005b8381101561101957610f576129b5565b85604001518281518110610f6757fe5b602002602001015190508060800151151560001515148015610f9a575060408101516020820151610f9791611997565b42115b1561101057336000908152609c6020526040902060020180546001919084908110610fc157fe5b60009182526020909120600590910201600401805460ff19169115159190911790558051606082015161100090610ff9908390611f16565b8590611997565b935061100c8582611997565b9450505b50600101610f47565b5060008211611067576040805162461bcd60e51b81526020600482015260156024820152742737ba3434b733903a37903bb4ba34323930bb901960591b604482015290519081900360640190fd5b818110156110a65760405162461bcd60e51b8152600401808060200182810382526047815260200180612a516047913960600191505060405180910390fd5b6110b233338484611f6f565b505060a6805460ff191690555050565b6110ca611798565b6065546001600160a01b0390811691161461111a576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609d54609854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561116857600080fd5b505afa15801561117c573d6000803e3d6000fd5b505050506040513d602081101561119257600080fd5b5051146111d05760405162461bcd60e51b815260040180806020018281038252602d815260200180612af6602d913960400191505060405180910390fd5b61012c4301609f81905560a4819055609e546111ec9190611997565b60a0819055609f546111fe91906120ce565b60a3819055609d5461120f91612110565b60a155609b805460ff1961ff001990911661010017166001179055565b60a65460ff161561127a576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556001600160a01b0381166000908152609c60205260409020609a6112a9611543565b6112b283612152565b805482546112d09164e8d4a51000916112ca91611f16565b90612110565b600190920191909155505060a6805460ff19169055565b6112f03361122c565b565b60a65460ff1615611340576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556113578133611ab2565b6113608161216f565b61071581601933611c76565b609f5481565b600061137c6129e6565b5060408051606081018252609a548152609b5460ff80821615156020840152610100909104161515918101919091526113b3612994565b609c6000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561147f5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff1615156080830152908352909201910161141c565b5050509152505082516020820151825192935090916114b491906114ae9064e8d4a51000906112ca9086611f16565b906120ce565b95945050505050565b60a65460ff161561150b576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556115228233611ab2565b6115358261152f83611c04565b33611c76565b505060a6805460ff19169055565b4360a4541415611552576112f0565b60a25461155e576112f0565b43609f54111561156d576112f0565b60a454609a906000906115819043906120ce565b905060a354811115611592575060a3545b60006115a960a15483611f1690919063ffffffff16565b60a3549091506115b990836120ce565b60a35560a2546000906115d5906112ca8464e8d4a51000611f16565b84549091506115e49082611997565b90935550504360a45550565b60a15481565b609d5481565b60a05481565b61160a611798565b6065546001600160a01b0390811691161461165a576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b80156116755760a35461166d90836120ce565b60a355611686565b60a3546116829083611997565b60a3555b5050565b609a54609b5460ff8082169161010090041683565b6116a7611798565b6065546001600160a01b039081169116146116f7576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6001600160a01b03811661173c5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a2b6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6117a46129b5565b6001600160a01b0383166000908152609c602052604090206002018054859081106117cb57fe5b600091825260208083206040805160a081018252600590940290910180548452600181015492840192909252600282015490830152600381015460608301526004015460ff1615801560808301819052919350829161183b57506040830151602084015161183891611997565b42115b156118ba576001600160a01b0385166000908152609c602052604090206002018054600191908890811061186b57fe5b60009182526020909120600590910201600401805460ff1916911515919091179055825160608401516118aa906118a3908390611f16565b8490611997565b92506118b68282611997565b9150505b60008111611905576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b808210156119445760405162461bcd60e51b8152600401808060200182810382526047815260200180612a516047913960600191505060405180910390fd5b600082116119835760405162461bcd60e51b815260040180806020018281038252603d815260200180612a98603d913960400191505060405180910390fd5b61198f85858385611f6f565b505050505050565b6000828201838110156119f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b303b1590565b600054610100900460ff1680611a195750611a196119fa565b80611a27575060005460ff16155b611a625760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015611a8d576000805460ff1961ff0019909116610100171660011790555b611a95612214565b611a9d6122b4565b8015611aaf576000805461ff00191690555b50565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611afd57600080fd5b505afa158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051609754909150611b44906001600160a01b03168330866123ad565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b8f57600080fd5b505afa158015611ba3573d6000803e3d6000fd5b505050506040513d6020811015611bb957600080fd5b5051905083611bc882846120ce565b14610a2e5760405162461bcd60e51b815260040180806020018281038252602d815260200180612b94602d913960400191505060405180910390fd5b60006030821115611c5c576040805162461bcd60e51b815260206004820152601760248201527f4c6f636b2074696d6520697320746f6f206c617267652e000000000000000000604482015290519081900360640190fd5b60088210611c6e575060048104610d1f565b506001919050565b60a0544310611ccc576040805162461bcd60e51b815260206004820181905260248201527f4661726d696e672068617320656e646564206f72206e6f742073746172746564604482015290519081900360640190fd5b609b54609a90610100900460ff16611d2b576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c204465706f736974732061726520636c6f7365640000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152609c602052604090206019841115611d835760405162461bcd60e51b8152600401808060200182810382526023815260200180612b716023913960400191505060405180910390fd5b60008411611dc25760405162461bcd60e51b8152600401808060200182810382526023815260200180612b716023913960400191505060405180910390fd5b600281015460198514611e6557816002016040518060a0016040528088815260200142815260200160018811611df9576000611e00565b876224ea00025b81526020808201899052600060409283018190528454600180820187559582529082902084516005909202019081559083015193810193909355810151600283015560608101516003830155608001516004909101805460ff19169115159190911790555b611e6f8686611f16565b9550611e79611543565b611e8284612152565b8515611e97578154611e949087611997565b82555b82548254611eaf9164e8d4a51000916112ca91611f16565b600183015560a254611ec19087611997565b60a2556040805187815260208101879052815183926001600160a01b0388169233927f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6929181900390910190a4505050505050565b600082611f25575060006119f4565b82820282848281611f3257fe5b04146119f15760405162461bcd60e51b8152600401808060200182810382526021815260200180612ad56021913960400191505060405180910390fd5b609b54609a9060ff16611fc9576040805162461bcd60e51b815260206004820152601760248201527f5769746864726177616c732061726520636c6f7365642e000000000000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152609c60205260409020611fe9611543565b611ff286612152565b61201883604051806060016040528060248152602001612a076024913983549190612518565b80825582546120329164e8d4a51000916112ca9190611f16565b600182015560408051808201909152601d81527f436f75646e27742076616c696461746520746f74616c20736861726573000000602082015260a254612079918590612518565b60a25561208685856125af565b60408051858152905184916001600160a01b038916917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60006119f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612518565b60006119f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061270c565b600061215d82611372565b90508015611686576116868282612771565b6099546001600160a01b03166121c5576040805162461bcd60e51b8152602060048201526016602482015275109d5c9b9a5b99c8139195081a5cc81b9bdd081cd95d60521b604482015290519081900360640190fd5b6099546121db906001600160a01b0316826125af565b60408051828152905133917f7729b31dd8e769462d6bc74522ce0b385e538be92b6d0b191a96b71dd345fc0b919081900360200190a250565b600054610100900460ff168061222d575061222d6119fa565b8061223b575060005460ff16155b6122765760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015611a9d576000805460ff1961ff0019909116610100171660011790558015611aaf576000805461ff001916905550565b600054610100900460ff16806122cd57506122cd6119fa565b806122db575060005460ff16155b6123165760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015612341576000805460ff1961ff0019909116610100171660011790555b600061234b611798565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611aaf576000805461ff001916905550565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106124325780518252601f199092019160209182019101612413565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612494576040519150601f19603f3d011682016040523d82523d6000602084013e612499565b606091505b50915091508180156124c75750805115806124c757508080602001905160208110156124c457600080fd5b50515b61198f576040805162461bcd60e51b815260206004820152601f60248201527f4d55482046414e4e593a205452414e534645525f46524f4d5f4641494c454400604482015290519081900360640190fd5b600081848411156125a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561256c578181015183820152602001612554565b50505050905090810190601f1680156125995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b609754604080516370a0823160e01b81526001600160a01b038581166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561260057600080fd5b505afa158015612614573d6000803e3d6000fd5b505050506040513d602081101561262a57600080fd5b5051609754909150612646906001600160a01b0316848461282a565b609754604080516370a0823160e01b81526001600160a01b038681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561269757600080fd5b505afa1580156126ab573d6000803e3d6000fd5b505050506040513d60208110156126c157600080fd5b50519050826126d082846120ce565b14610a2e5760405162461bcd60e51b8152600401808060200182810382526041815260200180612bc16041913960600191505060405180910390fd5b6000818361275b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561256c578181015183820152602001612554565b50600083858161276757fe5b0495945050505050565b609854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b505190508082111561280e57609854612809906001600160a01b0316848361282a565b612825565b609854612825906001600160a01b0316848461282a565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106128a75780518252601f199092019160209182019101612888565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612909576040519150601f19603f3d011682016040523d82523d6000602084013e61290e565b606091505b509150915081801561293c57508051158061293c575080806020019051602081101561293957600080fd5b50515b61298d576040805162461bcd60e51b815260206004820152601a60248201527f4d55482046414e4e593a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60405180606001604052806000815260200160008152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b60408051606081018252600080825260208201819052918101919091529056fe436f75646e27742076616c696461746520757365722063726564697420616d6f756e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616e69747920636865636b206661696c7572652e2050656e616c74792073686f756c6420626520626967676572206f7220657175616c20746f20776974686472617761626c6553616e697479206661696c2c207769746864726177696e6720434f524520616e6420696e63637572696e67206e6f206372656469742070656e616c7479536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f7420656e6f7567682066616e6e69657320696e2074686520636f6e7472616374202d207368616d6566756c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656453616e69747920636865636b206661696c75726520666f72206d756c7469706c6965724469646e27742067657420656e6f75676820434f52452c206d6f7374206c696b656c7920464f54206973204f4e4661696c656420746f20776974686472617720434f524520746f6b656e73207375636365737366756c6c792c206d616b65207375726520464f54206973206f6666a264697066735822122074dc224db8cc140820a19e91ae416265e67b10482b10ee17503b8b2ecac1915c64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c80639712c6751161011a578063d3ccc298116100ad578063e87a01801161007c578063e87a0180146104d5578063ea0aa540146104dd578063ed1d227e146104e5578063efcd73281461050a578063f2fde38b1461053257610206565b8063d3ccc2981461047c578063e2bbb158146104a2578063e3161ddd146104c5578063e4c2fe15146104cd57610206565b8063bafdbbf7116100e9578063bafdbbf714610429578063bd213b281461044f578063bf21630c14610457578063ce5201a01461047457610206565b80639712c675146103d45780639777d821146103fa5780639f610d7414610419578063afbcfea11461042157610206565b80636b5470341161019d5780637b02665d1161016c5780637b02665d146103645780637ee1d7231461038a57806384679c65146103925780638da5cb5b1461039a57806390210d7e146103a257610206565b80636b547034146102fc5780636b6c077414610322578063715018a61461032a5780637a1ac61e1461033257610206565b806333289a46116101d957806333289a46146102ab5780633a98ef39146102c85780633aa30335146102d05780634529077a146102d857610206565b8063163c8ffb1461020b5780631959a0021461022557806320794113146102645780632638b6d914610285575b600080fd5b610213610558565b60408051918252519081900360200190f35b61024b6004803603602081101561023b57600080fd5b50356001600160a01b031661055e565b6040805192835260208301919091528051918290030190f35b6102836004803603602081101561027a57600080fd5b50351515610577565b005b6102836004803603602081101561029b57600080fd5b50356001600160a01b03166105e9565b610283600480360360208110156102c157600080fd5b50356106af565b610213610722565b610213610728565b6102e0610732565b604080516001600160a01b039092168252519081900360200190f35b6102136004803603602081101561031257600080fd5b50356001600160a01b0316610741565b6102e0610886565b610283610895565b6102836004803603606081101561034857600080fd5b506001600160a01b038135169060208101359060400135610937565b6102136004803603602081101561037a57600080fd5b50356001600160a01b0316610a34565b610213610b8e565b6102e0610b94565b6102e0610ba3565b610283600480360360608110156103b857600080fd5b50803590602081013590604001356001600160a01b0316610bb2565b610213600480360360208110156103ea57600080fd5b50356001600160a01b0316610c39565b6102836004803603602081101561041057600080fd5b50351515610d24565b610283610d8f565b6102836110c2565b6102836004803603602081101561043f57600080fd5b50356001600160a01b031661122c565b6102836112e7565b6102836004803603602081101561046d57600080fd5b50356112f2565b61021361136c565b6102136004803603602081101561049257600080fd5b50356001600160a01b0316611372565b610283600480360360408110156104b857600080fd5b50803590602001356114bd565b610283611543565b6102136115f0565b6102136115f6565b6102136115fc565b610283600480360360408110156104fb57600080fd5b50803590602001351515611602565b61051261168a565b604080519384529115156020840152151582820152519081900360600190f35b6102836004803603602081101561054857600080fd5b50356001600160a01b031661169f565b60a35481565b609c602052600090815260409020805460019091015482565b61057f611798565b6065546001600160a01b039081169116146105cf576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609b80549115156101000261ff0019909216919091179055565b6105f1611798565b6065546001600160a01b03908116911614610641576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6099546001600160a01b03161561068d576040805162461bcd60e51b815260206004820152600b60248201526a105b1c9958591e481cd95d60aa1b604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0392909216919091179055565b60a65460ff16156106fd576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff1916600117905561071581338061179c565b5060a6805460ff19169055565b60a25481565b60a15460a3540290565b6099546001600160a01b031681565b600061074b612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156108175760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff161515608083015290835290920191016107b4565b5050509152505060408101515190915060005b8181101561087e5761083a6129b5565b8360400151828151811061084a57fe5b60200260200101519050806080015115156000151514156108755780516108718682611997565b9550505b5060010161082a565b505050919050565b6097546001600160a01b031681565b61089d611798565b6065546001600160a01b039081169116146108ed576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff168061095057506109506119fa565b8061095e575060005460ff16155b6109995760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff161580156109c4576000805460ff1961ff0019909116610100171660011790555b6109cc611a00565b609780547362359ed7505efc61ff1d56fef82158ccaffa23d76001600160a01b031991821617909155609880549091166001600160a01b038616179055670de0b6b3a76400008302609d55609e8290558015610a2e576000805461ff00191690555b50505050565b6000610a3e612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610b0a5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610aa7565b5050509152505060408101515190915060005b8181101561087e57610b2d6129b5565b83604001518281518110610b3d57fe5b602002602001015190508060800151151560001515148015610b70575060408101516020820151610b6d91611997565b42115b15610b85578051610b818682611997565b9550505b50600101610b1d565b609e5481565b6098546001600160a01b031681565b6065546001600160a01b031690565b60a65460ff1615610c00576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff19166001179055610c178333611ab2565b610c2a83610c2484611c04565b83611c76565b505060a6805460ff1916905550565b6000610c43612994565b609c6000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015610d0f5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610cac565b5050509152505060400151519150505b919050565b610d2c611798565b6065546001600160a01b03908116911614610d7c576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609b805460ff1916911515919091179055565b60a65460ff1615610ddd576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff19166001179055610df2612994565b336000908152609c60209081526040808320815160608101835281548152600182015481850152600282018054845181870281018701865281815292969395948701949293919290919084015b82821015610ea25760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101610e3f565b50505091525050604081015151815191925090610efe576040805162461bcd60e51b81526020600482015260156024820152744e6f7468696e6720746f207769746864726177203160581b604482015290519081900360640190fd5b60008111610f41576040805162461bcd60e51b815260206004820152600b60248201526a4e6f206465706f7369747360a81b604482015290519081900360640190fd5b60008060005b8381101561101957610f576129b5565b85604001518281518110610f6757fe5b602002602001015190508060800151151560001515148015610f9a575060408101516020820151610f9791611997565b42115b1561101057336000908152609c6020526040902060020180546001919084908110610fc157fe5b60009182526020909120600590910201600401805460ff19169115159190911790558051606082015161100090610ff9908390611f16565b8590611997565b935061100c8582611997565b9450505b50600101610f47565b5060008211611067576040805162461bcd60e51b81526020600482015260156024820152742737ba3434b733903a37903bb4ba34323930bb901960591b604482015290519081900360640190fd5b818110156110a65760405162461bcd60e51b8152600401808060200182810382526047815260200180612a516047913960600191505060405180910390fd5b6110b233338484611f6f565b505060a6805460ff191690555050565b6110ca611798565b6065546001600160a01b0390811691161461111a576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b609d54609854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561116857600080fd5b505afa15801561117c573d6000803e3d6000fd5b505050506040513d602081101561119257600080fd5b5051146111d05760405162461bcd60e51b815260040180806020018281038252602d815260200180612af6602d913960400191505060405180910390fd5b61012c4301609f81905560a4819055609e546111ec9190611997565b60a0819055609f546111fe91906120ce565b60a3819055609d5461120f91612110565b60a155609b805460ff1961ff001990911661010017166001179055565b60a65460ff161561127a576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556001600160a01b0381166000908152609c60205260409020609a6112a9611543565b6112b283612152565b805482546112d09164e8d4a51000916112ca91611f16565b90612110565b600190920191909155505060a6805460ff19169055565b6112f03361122c565b565b60a65460ff1615611340576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556113578133611ab2565b6113608161216f565b61071581601933611c76565b609f5481565b600061137c6129e6565b5060408051606081018252609a548152609b5460ff80821615156020840152610100909104161515918101919091526113b3612994565b609c6000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561147f5760008481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff1615156080830152908352909201910161141c565b5050509152505082516020820151825192935090916114b491906114ae9064e8d4a51000906112ca9086611f16565b906120ce565b95945050505050565b60a65460ff161561150b576040805162461bcd60e51b815260206004820152601360248201527211905393964815985d5b1d0e881313d0d2d151606a1b604482015290519081900360640190fd5b60a6805460ff191660011790556115228233611ab2565b6115358261152f83611c04565b33611c76565b505060a6805460ff19169055565b4360a4541415611552576112f0565b60a25461155e576112f0565b43609f54111561156d576112f0565b60a454609a906000906115819043906120ce565b905060a354811115611592575060a3545b60006115a960a15483611f1690919063ffffffff16565b60a3549091506115b990836120ce565b60a35560a2546000906115d5906112ca8464e8d4a51000611f16565b84549091506115e49082611997565b90935550504360a45550565b60a15481565b609d5481565b60a05481565b61160a611798565b6065546001600160a01b0390811691161461165a576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b80156116755760a35461166d90836120ce565b60a355611686565b60a3546116829083611997565b60a3555b5050565b609a54609b5460ff8082169161010090041683565b6116a7611798565b6065546001600160a01b039081169116146116f7576040805162461bcd60e51b81526020600482018190526024820152600080516020612b23833981519152604482015290519081900360640190fd5b6001600160a01b03811661173c5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a2b6026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6117a46129b5565b6001600160a01b0383166000908152609c602052604090206002018054859081106117cb57fe5b600091825260208083206040805160a081018252600590940290910180548452600181015492840192909252600282015490830152600381015460608301526004015460ff1615801560808301819052919350829161183b57506040830151602084015161183891611997565b42115b156118ba576001600160a01b0385166000908152609c602052604090206002018054600191908890811061186b57fe5b60009182526020909120600590910201600401805460ff1916911515919091179055825160608401516118aa906118a3908390611f16565b8490611997565b92506118b68282611997565b9150505b60008111611905576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b808210156119445760405162461bcd60e51b8152600401808060200182810382526047815260200180612a516047913960600191505060405180910390fd5b600082116119835760405162461bcd60e51b815260040180806020018281038252603d815260200180612a98603d913960400191505060405180910390fd5b61198f85858385611f6f565b505050505050565b6000828201838110156119f1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b303b1590565b600054610100900460ff1680611a195750611a196119fa565b80611a27575060005460ff16155b611a625760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015611a8d576000805460ff1961ff0019909116610100171660011790555b611a95612214565b611a9d6122b4565b8015611aaf576000805461ff00191690555b50565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611afd57600080fd5b505afa158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051609754909150611b44906001600160a01b03168330866123ad565b609754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611b8f57600080fd5b505afa158015611ba3573d6000803e3d6000fd5b505050506040513d6020811015611bb957600080fd5b5051905083611bc882846120ce565b14610a2e5760405162461bcd60e51b815260040180806020018281038252602d815260200180612b94602d913960400191505060405180910390fd5b60006030821115611c5c576040805162461bcd60e51b815260206004820152601760248201527f4c6f636b2074696d6520697320746f6f206c617267652e000000000000000000604482015290519081900360640190fd5b60088210611c6e575060048104610d1f565b506001919050565b60a0544310611ccc576040805162461bcd60e51b815260206004820181905260248201527f4661726d696e672068617320656e646564206f72206e6f742073746172746564604482015290519081900360640190fd5b609b54609a90610100900460ff16611d2b576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c204465706f736974732061726520636c6f7365640000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152609c602052604090206019841115611d835760405162461bcd60e51b8152600401808060200182810382526023815260200180612b716023913960400191505060405180910390fd5b60008411611dc25760405162461bcd60e51b8152600401808060200182810382526023815260200180612b716023913960400191505060405180910390fd5b600281015460198514611e6557816002016040518060a0016040528088815260200142815260200160018811611df9576000611e00565b876224ea00025b81526020808201899052600060409283018190528454600180820187559582529082902084516005909202019081559083015193810193909355810151600283015560608101516003830155608001516004909101805460ff19169115159190911790555b611e6f8686611f16565b9550611e79611543565b611e8284612152565b8515611e97578154611e949087611997565b82555b82548254611eaf9164e8d4a51000916112ca91611f16565b600183015560a254611ec19087611997565b60a2556040805187815260208101879052815183926001600160a01b0388169233927f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6929181900390910190a4505050505050565b600082611f25575060006119f4565b82820282848281611f3257fe5b04146119f15760405162461bcd60e51b8152600401808060200182810382526021815260200180612ad56021913960400191505060405180910390fd5b609b54609a9060ff16611fc9576040805162461bcd60e51b815260206004820152601760248201527f5769746864726177616c732061726520636c6f7365642e000000000000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152609c60205260409020611fe9611543565b611ff286612152565b61201883604051806060016040528060248152602001612a076024913983549190612518565b80825582546120329164e8d4a51000916112ca9190611f16565b600182015560408051808201909152601d81527f436f75646e27742076616c696461746520746f74616c20736861726573000000602082015260a254612079918590612518565b60a25561208685856125af565b60408051858152905184916001600160a01b038916917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60006119f183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612518565b60006119f183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061270c565b600061215d82611372565b90508015611686576116868282612771565b6099546001600160a01b03166121c5576040805162461bcd60e51b8152602060048201526016602482015275109d5c9b9a5b99c8139195081a5cc81b9bdd081cd95d60521b604482015290519081900360640190fd5b6099546121db906001600160a01b0316826125af565b60408051828152905133917f7729b31dd8e769462d6bc74522ce0b385e538be92b6d0b191a96b71dd345fc0b919081900360200190a250565b600054610100900460ff168061222d575061222d6119fa565b8061223b575060005460ff16155b6122765760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015611a9d576000805460ff1961ff0019909116610100171660011790558015611aaf576000805461ff001916905550565b600054610100900460ff16806122cd57506122cd6119fa565b806122db575060005460ff16155b6123165760405162461bcd60e51b815260040180806020018281038252602e815260200180612b43602e913960400191505060405180910390fd5b600054610100900460ff16158015612341576000805460ff1961ff0019909116610100171660011790555b600061234b611798565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611aaf576000805461ff001916905550565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106124325780518252601f199092019160209182019101612413565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612494576040519150601f19603f3d011682016040523d82523d6000602084013e612499565b606091505b50915091508180156124c75750805115806124c757508080602001905160208110156124c457600080fd5b50515b61198f576040805162461bcd60e51b815260206004820152601f60248201527f4d55482046414e4e593a205452414e534645525f46524f4d5f4641494c454400604482015290519081900360640190fd5b600081848411156125a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561256c578181015183820152602001612554565b50505050905090810190601f1680156125995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b609754604080516370a0823160e01b81526001600160a01b038581166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561260057600080fd5b505afa158015612614573d6000803e3d6000fd5b505050506040513d602081101561262a57600080fd5b5051609754909150612646906001600160a01b0316848461282a565b609754604080516370a0823160e01b81526001600160a01b038681166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561269757600080fd5b505afa1580156126ab573d6000803e3d6000fd5b505050506040513d60208110156126c157600080fd5b50519050826126d082846120ce565b14610a2e5760405162461bcd60e51b8152600401808060200182810382526041815260200180612bc16041913960600191505060405180910390fd5b6000818361275b5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561256c578181015183820152602001612554565b50600083858161276757fe5b0495945050505050565b609854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b505190508082111561280e57609854612809906001600160a01b0316848361282a565b612825565b609854612825906001600160a01b0316848461282a565b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106128a75780518252601f199092019160209182019101612888565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612909576040519150601f19603f3d011682016040523d82523d6000602084013e61290e565b606091505b509150915081801561293c57508051158061293c575080806020019051602081101561293957600080fd5b50515b61298d576040805162461bcd60e51b815260206004820152601a60248201527f4d55482046414e4e593a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60405180606001604052806000815260200160008152602001606081525090565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b60408051606081018252600080825260208201819052918101919091529056fe436f75646e27742076616c696461746520757365722063726564697420616d6f756e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616e69747920636865636b206661696c7572652e2050656e616c74792073686f756c6420626520626967676572206f7220657175616c20746f20776974686472617761626c6553616e697479206661696c2c207769746864726177696e6720434f524520616e6420696e63637572696e67206e6f206372656469742070656e616c7479536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774e6f7420656e6f7567682066616e6e69657320696e2074686520636f6e7472616374202d207368616d6566756c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656453616e69747920636865636b206661696c75726520666f72206d756c7469706c6965724469646e27742067657420656e6f75676820434f52452c206d6f7374206c696b656c7920464f54206973204f4e4661696c656420746f20776974686472617720434f524520746f6b656e73207375636365737366756c6c792c206d616b65207375726520464f54206973206f6666a264697066735822122074dc224db8cc140820a19e91ae416265e67b10482b10ee17503b8b2ecac1915c64736f6c634300060c0033
Deployed Bytecode Sourcemap
36038:18896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37606:43;;;:::i;:::-;;;;;;;;;;;;;;;;37177:44;;;;;;;;;;;;;;;;-1:-1:-1;37177:44:0;-1:-1:-1;;;;;37177:44:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40174:122;;;;;;;;;;;;;;;;-1:-1:-1;40174:122:0;;;;:::i;:::-;;39687:187;;;;;;;;;;;;;;;;-1:-1:-1;39687:187:0;-1:-1:-1;;;;;39687:187:0;;:::i;51551:126::-;;;;;;;;;;;;;;;;-1:-1:-1;51551:126:0;;:::i;37573:26::-;;;:::i;39249:123::-;;;:::i;37028:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;37028:30:0;;;;;;;;;;;;;;43389:622;;;;;;;;;;;;;;;;-1:-1:-1;43389:622:0;-1:-1:-1;;;;;43389:622:0;;:::i;36975:18::-;;;:::i;31892:148::-;;;:::i;37932:398::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37932:398:0;;;;;;;;;;;;;:::i;42322:1057::-;;;;;;;;;;;;;;;;-1:-1:-1;42322:1057:0;-1:-1:-1;;;;;42322:1057:0;;:::i;37418:34::-;;;:::i;37000:19::-;;;:::i;31250:79::-;;;:::i;46794:235::-;;;;;;;;;;;;;;;;-1:-1:-1;46794:235:0;;;;;;;;;;;-1:-1:-1;;;;;46794:235:0;;:::i;44023:168::-;;;;;;;;;;;;;;;;-1:-1:-1;44023:168:0;-1:-1:-1;;;;;44023:168:0;;:::i;40043:125::-;;;;;;;;;;;;;;;;-1:-1:-1;40043:125:0;;;;:::i;48069:2034::-;;;:::i;38338:903::-;;;:::i;51008:395::-;;;;;;;;;;;;;;;;-1:-1:-1;51008:395:0;-1:-1:-1;;;;;51008:395:0;;:::i;51412:70::-;;;:::i;46279:204::-;;;;;;;;;;;;;;;;-1:-1:-1;46279:204:0;;:::i;37459:34::-;;;:::i;40360:325::-;;;;;;;;;;;;;;;;-1:-1:-1;40360:325:0;-1:-1:-1;;;;;40360:325:0;;:::i;46493:293::-;;;;;;;;;;;;;;;;-1:-1:-1;46493:293:0;;;;;;;:::i;40763:1212::-;;;:::i;37538:28::-;;;:::i;37374:35::-;;;:::i;37500:31::-;;;:::i;41985:329::-;;;;;;;;;;;;;;;;-1:-1:-1;41985:329:0;;;;;;;;;:::i;37094:29::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32195:244;;;;;;;;;;;;;;;;-1:-1:-1;32195:244:0;-1:-1:-1;;;;;32195:244:0;;:::i;37606:43::-;;;;:::o;37177:44::-;;;;;;;;;;;;;;;;;;;:::o;40174:122::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;40248:25;:40;;;::::1;;;;-1:-1:-1::0;;40248:40:0;;::::1;::::0;;;::::1;::::0;;40174:122::o;39687:187::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;39774:15:::1;::::0;-1:-1:-1;;;;;39774:15:0::1;:29:::0;39766:53:::1;;;::::0;;-1:-1:-1;;;39766:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39766:53:0;;;;;;;;;;;;;::::1;;39830:15;:36:::0;;-1:-1:-1;;;;;;39830:36:0::1;-1:-1:-1::0;;;;;39830:36:0;;;::::1;::::0;;;::::1;::::0;;39687:187::o;51551:126::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;51618:51:::1;51635:9:::0;51646:10:::1;::::0;51618:16:::1;:51::i;:::-;-1:-1:-1::0;37902:6:0;:14;;-1:-1:-1;;37902:14:0;;;51551:126::o;37573:26::-;;;;:::o;39249:123::-;39351:13;;39320:28;;:44;39249:123;:::o;37028:30::-;;;-1:-1:-1;;;;;37028:30:0;;:::o;43389:622::-;43468:22;43503:20;;:::i;:::-;43526:8;:14;43535:4;-1:-1:-1;;;;;43526:14:0;-1:-1:-1;;;;;43526:14:0;;;;;;;;;;;;43503:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43503:37:0;;-1:-1:-1;;43580:13:0;;;;:20;43503:37;;-1:-1:-1;43551:26:0;43648:356;43672:18;43668:1;:22;43648:356;;;43712:33;;:::i;:::-;43748:4;:13;;;43762:1;43748:16;;;;;;;;;;;;;;43712:52;;43783:14;:25;;;:34;;43812:5;43783:34;;;43780:213;;;43872:25;;43934:43;:14;43872:25;43934:18;:43::i;:::-;43917:60;;43780:213;;-1:-1:-1;43692:3:0;;43648:356;;;;43389:622;;;;;:::o;36975:18::-;;;-1:-1:-1;;;;;36975:18:0;;:::o;31892:148::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;31983:6:::1;::::0;31962:40:::1;::::0;31999:1:::1;::::0;-1:-1:-1;;;;;31983:6:0::1;::::0;31962:40:::1;::::0;31999:1;;31962:40:::1;32013:6;:19:::0;;-1:-1:-1;;;;;;32013:19:0::1;::::0;;31892:148::o;37932:398::-;27481:12;;;;;;;;:31;;;27497:15;:13;:15::i;:::-;27481:47;;;-1:-1:-1;27517:11:0;;;;27516:12;27481:47;27473:106;;;;-1:-1:-1;;;27473:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27588:19;27611:12;;;;;;27610:13;27630:83;;;;27659:12;:19;;-1:-1:-1;;;;27659:19:0;;;;;27687:18;27674:4;27687:18;;;27630:83;38065:35:::1;:33;:35::i;:::-;38111:4;:57:::0;;38125:42:::1;-1:-1:-1::0;;;;;;38111:57:0;;::::1;;::::0;;;38179:5:::1;:22:::0;;;;::::1;-1:-1:-1::0;;;;;38179:22:0;::::1;;::::0;;38265:4:::1;38237:32:::0;::::1;38214:20;:55:::0;38280:19:::1;:42:::0;;;27731:57;;;;27775:5;27760:20;;-1:-1:-1;;27760:20:0;;;27731:57;37932:398;;;;:::o;42322:1057::-;42388:24;42425:20;;:::i;:::-;42448:8;:14;42457:4;-1:-1:-1;;;;;42448:14:0;-1:-1:-1;;;;;42448:14:0;;;;;;;;;;;;42425:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42425:37:0;;-1:-1:-1;;42502:13:0;;;;:20;42425:37;;-1:-1:-1;42473:26:0;42570:802;42594:18;42590:1;:22;42570:802;;;42634:33;;:::i;:::-;42670:4;:13;;;42684:1;42670:16;;;;;;;;;;;;;;42634:52;;42727:14;:25;;;:34;;42756:5;42727:34;;;:284;;;;-1:-1:-1;42979:31:0;;;;42942:32;;;;:69;;:36;:69::i;:::-;42924:15;:87;42727:284;42724:637;;;43199:25;;43296:45;:16;43199:25;43296:20;:45::i;:::-;43277:64;;42724:637;;-1:-1:-1;42614:3:0;;42570:802;;37418:34;;;;:::o;37000:19::-;;;-1:-1:-1;;;;;37000:19:0;;:::o;31250:79::-;31315:6;;-1:-1:-1;;;;;31315:6:0;31250:79;:::o;46794:235::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;46893:61:::1;46934:7:::0;46943:10:::1;46893:40;:61::i;:::-;46964:55;46973:7;46982:28;46996:13;46982;:28::i;:::-;47012:6;46964:8;:55::i;:::-;-1:-1:-1::0;;37902:6:0;:14;;-1:-1:-1;;37902:14:0;;;-1:-1:-1;46794:235:0:o;44023:168::-;44088:7;44108:20;;:::i;:::-;44131:8;:14;44140:4;-1:-1:-1;;;;;44131:14:0;-1:-1:-1;;;;;44131:14:0;;;;;;;;;;;;44108:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44108:37:0;;-1:-1:-1;;44163:13:0;;;:20;;-1:-1:-1;;44023:168:0;;;;:::o;40043:125::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;40118:26;:42;;-1:-1:-1;;40118:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40043:125::o;48069:2034::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;48131:20:::1;;:::i;:::-;48163:10;48154:20;::::0;;;:8:::1;:20;::::0;;;;;;;48131:43;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;48154:20;;48131:43;;;;;;;;;;48154:20;48131:43;::::1;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;::::1;;;;::::0;;;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;48131:43:0;;-1:-1:-1;;48234:13:0::1;::::0;::::1;::::0;:20;48273:17;;48131:43;;-1:-1:-1;48234:20:0;48265:55:::1;;;::::0;;-1:-1:-1;;;48265:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48265:55:0;;;;;;;;;;;;;::::1;;48360:1;48339:18;:22;48331:46;;;::::0;;-1:-1:-1;;;48331:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48331:46:0;;;;;;;;;;;;;::::1;;48585:24;48620:21:::0;48694:9:::1;48689:1015;48713:18;48709:1;:22;48689:1015;;;48753:33;;:::i;:::-;48789:4;:13;;;48803:1;48789:16;;;;;;;;;;;;;;48753:52;;48844:14;:25;;;:34;;48873:5;48844:34;;;:284;;;;-1:-1:-1::0;49096:31:0::1;::::0;::::1;::::0;49059:32:::1;::::0;::::1;::::0;:69:::1;::::0;:36:::1;:69::i;:::-;49041:15;:87;48844:284;48841:852;;;49293:10;49284:20;::::0;;;:8:::1;:20;::::0;;;;:29:::1;;:32:::0;;49330:4:::1;::::0;49284:29;49314:1;;49284:32;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:43;;:50:::0;;-1:-1:-1;;49284:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49417:25;;49559::::1;::::0;::::1;::::0;49513:73:::1;::::0;49531:54:::1;::::0;49417:25;;49531:27:::1;:54::i;:::-;49513:13:::0;;:17:::1;:73::i;:::-;49497:89:::0;-1:-1:-1;49628:45:0::1;:16:::0;49649:23;49628:20:::1;:45::i;:::-;49609:64;;48841:852;;-1:-1:-1::0;48733:3:0::1;;48689:1015;;;;49796:1;49777:16;:20;49769:54;;;::::0;;-1:-1:-1;;;49769:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49769:54:0;;;;;;;;;;;;;::::1;;49884:16;49867:13;:33;;49859:117;;;;-1:-1:-1::0;;;49859:117:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50027:66;50037:10;50049;50061:16;50079:13;50027:9;:66::i;:::-;-1:-1:-1::0;;37902:6:0;:14;;-1:-1:-1;;37902:14:0;;;-1:-1:-1;;48069:2034:0:o;38338:903::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;38432:20:::1;::::0;38398:5:::1;::::0;:30:::1;::::0;;-1:-1:-1;;;38398:30:0;;38422:4:::1;38398:30;::::0;::::1;::::0;;;-1:-1:-1;;;;;38398:5:0;;::::1;::::0;:15:::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:5;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38398:30:0;:54:::1;38390:112;;;;-1:-1:-1::0;;;38390:112:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38580:3;38565:12;:18;38543:19;:40:::0;;;38696:15:::1;:36:::0;;;38883:19:::1;::::0;38859:44:::1;::::0;38565:18;38859:23:::1;:44::i;:::-;38840:16;:63:::0;;;39012:19:::1;::::0;38991:41:::1;::::0;38840:63;38991:20:::1;:41::i;:::-;38960:28;:72:::0;;;39059:20:::1;::::0;:54:::1;::::0;:24:::1;:54::i;:::-;39043:13;:70:::0;39124:25;:32;;-1:-1:-1;;;;39124:32:0;;::::1;;;39198:33;39152:4;39198:33;::::0;;38338:903::o;51008:395::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;-1:-1:-1;;;;;51091:16:0;::::1;37866:6:::0;51091:16;;;:8:::1;:16;::::0;;;;51142:13:::1;51211:12;:10;:12::i;:::-;51281:30;51304:6;51281:22;:30::i;:::-;51362:21:::0;;51340:17;;:54:::1;::::0;51389:4:::1;::::0;51340:44:::1;::::0;:21:::1;:44::i;:::-;:48:::0;::::1;:54::i;:::-;51322:15;::::0;;::::1;:72:::0;;;;-1:-1:-1;;37902:6:0;:14;;-1:-1:-1;;37902:14:0;;;51008:395::o;51412:70::-;51452:22;51463:10;51452;:22::i;:::-;51412:70::o;46279:204::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;46345:61:::1;46386:7:::0;46395:10:::1;46345:40;:61::i;:::-;46417:14;46423:7;46417:5;:14::i;:::-;46442:33;46451:7;46460:2;46464:10;46442:8;:33::i;37459:34::-:0;;;;:::o;40360:325::-;40423:7;40443:20;;:::i;:::-;-1:-1:-1;40443:36:0;;;;;;;;40466:13;40443:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40490:20;;:::i;:::-;40513:8;:15;40522:5;-1:-1:-1;;;;;40513:15:0;-1:-1:-1;;;;;40513:15:0;;;;;;;;;;;;40490:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40490:38:0;;-1:-1:-1;;40566:21:0;;40661:15;;;;40607:17;;40490:38;;-1:-1:-1;40566:21:0;;40607:70;;40661:15;40607:49;;40651:4;;40607:39;;40566:21;40607;:39::i;:49::-;:53;;:70::i;:::-;40600:77;40360:325;-1:-1:-1;;;;;40360:325:0:o;46493:293::-;37816:6;;;;:15;37808:47;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;-1:-1:-1;;;37808:47:0;;;;;;;;;;;;;;;37866:6;:13;;-1:-1:-1;;37866:13:0;37875:4;37866:13;;;46648:61:::1;46689:7:::0;46698:10:::1;46648:40;:61::i;:::-;46719:59;46728:7;46737:28;46751:13;46737;:28::i;:::-;46767:10;46719:8;:59::i;:::-;-1:-1:-1::0;;37902:6:0;:14;;-1:-1:-1;;37902:14:0;;;46493:293::o;40763:1212::-;40890:12;40871:15;;:31;40868:48;;;40907:7;;40868:48;40973:11;;40970:33;;40994:7;;40970:33;41052:12;41030:19;;:34;41027:51;;;41069:7;;41027:51;41230:15;;41112:13;;41088:21;;41213:33;;:12;;:16;:33::i;:::-;41191:55;;41274:28;;41260:11;:42;41257:116;;;-1:-1:-1;41333:28:0;;41257:116;41383:28;41414:30;41430:13;;41414:11;:15;;:30;;;;:::i;:::-;41486:28;;41383:61;;-1:-1:-1;41486:45:0;;41519:11;41486:32;:45::i;:::-;41455:28;:76;41711:11;;41652:21;;41676:47;;:30;:20;41701:4;41676:24;:30::i;:47::-;41886:21;;41652:71;;-1:-1:-1;41886:40:0;;41652:71;41886:25;:40::i;:::-;41862:64;;;-1:-1:-1;;41955:12:0;41937:15;:30;-1:-1:-1;40763:1212:0:o;37538:28::-;;;;:::o;37374:35::-;;;;:::o;37500:31::-;;;;:::o;41985:329::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;42089:14:::1;42086:221;;;42151:28;::::0;:40:::1;::::0;42184:6;42151:32:::1;:40::i;:::-;42120:28;:71:::0;42086:221:::1;;;42255:28;::::0;:40:::1;::::0;42288:6;42255:32:::1;:40::i;:::-;42224:28;:71:::0;42086:221:::1;41985:329:::0;;:::o;37094:29::-;;;;;;;;;;;;;;;:::o;32195:244::-;31472:12;:10;:12::i;:::-;31462:6;;-1:-1:-1;;;;;31462:6:0;;;:22;;;31454:67;;;;;-1:-1:-1;;;31454:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31454:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32284:22:0;::::1;32276:73;;;;-1:-1:-1::0;;;32276:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32386:6;::::0;32365:38:::1;::::0;-1:-1:-1;;;;;32365:38:0;;::::1;::::0;32386:6:::1;::::0;32365:38:::1;::::0;32386:6:::1;::::0;32365:38:::1;32414:6;:17:::0;;-1:-1:-1;;;;;;32414:17:0::1;-1:-1:-1::0;;;;;32414:17:0;;;::::1;::::0;;;::::1;::::0;;32195:244::o;29518:106::-;29606:10;29518:106;:::o;51794:1388::-;51888:33;;:::i;:::-;-1:-1:-1;;;;;51924:14:0;;;;;;:8;:14;;;;;:23;;:34;;51948:9;;51924:34;;;;;;;;;;;;;;51888:70;;;;;;;;51924:34;;;;;;;51888:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51924:34:0;;52078:139;;-1:-1:-1;52185:31:0;;;;52148:32;;;;:69;;:36;:69::i;:::-;52130:15;:87;52078:139;52061:657;;;-1:-1:-1;;;;;52339:14:0;;;;;;:8;:14;;;;;:23;;:34;;52387:4;;52339:23;52363:9;;52339:34;;;;;;;;;;;;;;;;;;;:45;;:52;;-1:-1:-1;;52339:52:0;;;;;;;;;;52466:25;;52600;;;;52554:73;;52572:54;;52466:25;;52572:27;:54::i;:::-;52554:13;;:17;:73::i;:::-;52538:89;-1:-1:-1;52661:45:0;:16;52682:23;52661:20;:45::i;:::-;52642:64;;52061:657;;52757:1;52738:16;:20;52730:52;;;;;-1:-1:-1;;;52730:52:0;;;;;;;;;;;;-1:-1:-1;;;52730:52:0;;;;;;;;;;;;;;;52818:16;52801:13;:33;;52793:117;;;;-1:-1:-1;;;52793:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52945:1;52929:13;:17;52921:91;;;;-1:-1:-1;;;52921:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53120:52;53130:4;53136:2;53140:16;53158:13;53120:9;:52::i;:::-;51794:1388;;;;;;:::o;7167:181::-;7225:7;7257:5;;;7281:6;;;;7273:46;;;;;-1:-1:-1;;;7273:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7339:1;-1:-1:-1;7167:181:0;;;;;:::o;27882:508::-;28299:4;28345:17;28377:7;27882:508;:::o;30828:129::-;27481:12;;;;;;;;:31;;;27497:15;:13;:15::i;:::-;27481:47;;;-1:-1:-1;27517:11:0;;;;27516:12;27481:47;27473:106;;;;-1:-1:-1;;;27473:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27588:19;27611:12;;;;;;27610:13;27630:83;;;;27659:12;:19;;-1:-1:-1;;;;27659:19:0;;;;;27687:18;27674:4;27687:18;;;27630:83;30886:26:::1;:24;:26::i;:::-;30923;:24;:26::i;:::-;27735:14:::0;27731:57;;;27775:5;27760:20;;-1:-1:-1;;27760:20:0;;;27731:57;30828:129;:::o;47647:412::-;47774:4;;:29;;;-1:-1:-1;;;47774:29:0;;47797:4;47774:29;;;;;;47750:21;;-1:-1:-1;;;;;47774:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47774:29:0;47839:4;;47774:29;;-1:-1:-1;47814:63:0;;-1:-1:-1;;;;;47839:4:0;47846:6;47862:4;47869:7;47814:16;:63::i;:::-;47911:4;;:29;;;-1:-1:-1;;;47911:29:0;;47934:4;47911:29;;;;;;47888:20;;-1:-1:-1;;;;;47911:4:0;;:14;;:29;;;;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47911:29:0;;-1:-1:-1;47994:7:0;47959:31;47911:29;47976:13;47959:16;:31::i;:::-;:42;47951:100;;;;-1:-1:-1;;;47951:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47037:482;47106:18;47200:2;47183:13;:19;;47175:55;;;;;-1:-1:-1;;;47175:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47309:1;47292:13;:18;47289:223;;-1:-1:-1;47379:1:0;47365:15;;47289:223;;;-1:-1:-1;47457:1:0;47037:482;;;:::o;44263:1946::-;44432:16;;44417:12;:31;44409:76;;;;;-1:-1:-1;;;44409:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44597:16;;44520:13;;44597:16;;;;;44589:53;;;;;-1:-1:-1;;;44589:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44677:16:0;;44653:21;44677:16;;;:8;:16;;;;;44728:2;44714:16;;;44706:64;;;;-1:-1:-1;;;44706:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44802:1;44789:10;:14;44781:62;;;;-1:-1:-1;;;44781:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44876:13;;;:20;44924:2;44910:16;;44907:433;;44973:4;:13;;45010:303;;;;;;;;45058:7;45010:303;;;;45108:15;45010:303;;;;45178:1;45165:10;:14;:41;;45205:1;45165:41;;;45182:10;45195:7;45182:20;45165:41;45010:303;;;;;;;;;-1:-1:-1;45010:303:0;;;;;;;44973:355;;45010:303;44973:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44973:355:0;;;;;;;;;;44907:433;45362:23;:7;45374:10;45362:11;:23::i;:::-;45352:33;;45651:12;:10;:12::i;:::-;45738:30;45761:6;45738:22;:30::i;:::-;45829:11;;45826:93;;45877:17;;:30;;45899:7;45877:21;:30::i;:::-;45857:50;;45826:93;46039:21;;46017:17;;:54;;46066:4;;46017:44;;:21;:44::i;:54::-;45999:15;;;:72;46096:11;;:24;;46112:7;46096:15;:24::i;:::-;46082:11;:38;46142:59;;;;;;;;;;;;;;46170:9;;-1:-1:-1;;;;;46142:59:0;;;46150:10;;46142:59;;;;;;;;;;;44263:1946;;;;;;:::o;8497:471::-;8555:7;8800:6;8796:47;;-1:-1:-1;8830:1:0;8823:8;;8796:47;8867:5;;;8871:1;8867;:5;:1;8891:5;;;;;:10;8883:56;;;;-1:-1:-1;;;8883:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50113:887;50284:17;;50251:13;;50284:17;;50276:53;;;;;-1:-1:-1;;;50276:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50364:14:0;;50340:21;50364:14;;;:8;:14;;;;;50422:12;:10;:12::i;:::-;50492:28;50515:4;50492:22;:28::i;:::-;50601:76;50623:13;50601:76;;;;;;;;;;;;;;;;;:17;;;:76;:21;:76::i;:::-;50581:96;;;50728:21;;50706:54;;50755:4;;50706:44;;50581:96;50706:21;:44::i;:54::-;50688:15;;;:72;50817:63;;;;;;;;;;;;;;;;;:11;;:63;;50833:13;;50817:15;:63::i;:::-;50803:11;:77;50891:38;50908:2;50912:16;50891;:38::i;:::-;50945:47;;;;;;;;50960:13;;-1:-1:-1;;;;;50945:47:0;;;;;;;;;;;;50113:887;;;;;;:::o;7623:136::-;7681:7;7708:43;7712:1;7715;7708:43;;;;;;;;;;;;;;;;;:3;:43::i;9436:132::-;9494:7;9521:39;9525:1;9528;9521:39;;;;;;;;;;;;;;;;;:3;:39::i;53192:200::-;53258:15;53276:23;53294:4;53276:17;:23::i;:::-;53258:41;-1:-1:-1;53313:11:0;;53310:75;;53341:32;53359:4;53365:7;53341:17;:32::i;39380:268::-;39440:15;;-1:-1:-1;;;;;39440:15:0;39432:65;;;;;-1:-1:-1;;;39432:65:0;;;;;;;;;;;;-1:-1:-1;;;39432:65:0;;;;;;;;;;;;;;;39567:15;;39550:42;;-1:-1:-1;;;;;39567:15:0;39584:7;39550:16;:42::i;:::-;39609:31;;;;;;;;39620:10;;39609:31;;;;;;;;;;39380:268;:::o;29439:69::-;27481:12;;;;;;;;:31;;;27497:15;:13;:15::i;:::-;27481:47;;;-1:-1:-1;27517:11:0;;;;27516:12;27481:47;27473:106;;;;-1:-1:-1;;;27473:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27588:19;27611:12;;;;;;27610:13;27630:83;;;;27659:12;:19;;-1:-1:-1;;;;27659:19:0;;;;;27687:18;27674:4;27687:18;;;27735:14;27731:57;;;27775:5;27760:20;;-1:-1:-1;;27760:20:0;;;29439:69;:::o;30965:202::-;27481:12;;;;;;;;:31;;;27497:15;:13;:15::i;:::-;27481:47;;;-1:-1:-1;27517:11:0;;;;27516:12;27481:47;27473:106;;;;-1:-1:-1;;;27473:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27588:19;27611:12;;;;;;27610:13;27630:83;;;;27659:12;:19;;-1:-1:-1;;;;27659:19:0;;;;;27687:18;27674:4;27687:18;;;27630:83;31037:17:::1;31057:12;:10;:12::i;:::-;31080:6;:18:::0;;-1:-1:-1;;;;;;31080:18:0::1;-1:-1:-1::0;;;;;31080:18:0;::::1;::::0;;::::1;::::0;;;31114:43:::1;::::0;31080:18;;-1:-1:-1;31080:18:0;-1:-1:-1;;31114:43:0::1;::::0;-1:-1:-1;;31114:43:0::1;27721:1;27735:14:::0;27731:57;;;27775:5;27760:20;;-1:-1:-1;;27760:20:0;;;30965:202;:::o;54529:400::-;54757:51;;;-1:-1:-1;;;;;54757:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54757:51:0;-1:-1:-1;;;54757:51:0;;;54746:63;;;;54711:12;;54725:17;;54746:10;;;;54757:51;54746:63;;;54757:51;54746:63;;54757:51;54746:63;;;;;;;;;;-1:-1:-1;;54746:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54710:99;;;;54828:7;:57;;;;-1:-1:-1;54840:11:0;;:16;;:44;;;54871:4;54860:24;;;;;;;;;;;;;;;-1:-1:-1;54860:24:0;54840:44;54820:101;;;;;-1:-1:-1;;;54820:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8054:192;8140:7;8176:12;8168:6;;;;8160:29;;;;-1:-1:-1;;;8160:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8212:5:0;;;8054:192::o;53856:363::-;53956:4;;:19;;;-1:-1:-1;;;53956:19:0;;-1:-1:-1;;;;;53956:19:0;;;;;;;;;53932:21;;53956:4;;;;;:14;;:19;;;;;;;;;;;;;;;:4;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53956:19:0;54007:4;;53956:19;;-1:-1:-1;53986:41:0;;-1:-1:-1;;;;;54007:4:0;54014:3;54019:7;53986:12;:41::i;:::-;54061:4;;:19;;;-1:-1:-1;;;54061:19:0;;-1:-1:-1;;;;;54061:19:0;;;;;;;;;54038:20;;54061:4;;;;;:14;;:19;;;;;;;;;;;;;;;:4;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54061:19:0;;-1:-1:-1;54134:7:0;54099:31;54061:19;54116:13;54099:16;:31::i;:::-;:42;54091:120;;;;-1:-1:-1;;;54091:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10056:345;10142:7;10244:12;10237:5;10229:28;;;;-1:-1:-1;;;10229:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10268:9;10284:1;10280;:5;;;;;;;10056:345;-1:-1:-1;;;;;10056:345:0:o;53508:340::-;53619:5;;:30;;;-1:-1:-1;;;53619:30:0;;53643:4;53619:30;;;;;;53595:21;;-1:-1:-1;;;;;53619:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53619:30:0;;-1:-1:-1;53666:23:0;;;53662:179;;;53727:5;;53706:48;;-1:-1:-1;;;;;53727:5:0;53735:3;53740:13;53706:12;:48::i;:::-;53662:179;;;53808:5;;53787:42;;-1:-1:-1;;;;;53808:5:0;53816:3;53821:7;53787:12;:42::i;:::-;53508:340;;;:::o;54229:292::-;54360:45;;;-1:-1:-1;;;;;54360:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54360:45:0;-1:-1:-1;;;54360:45:0;;;54349:57;;;;54314:12;;54328:17;;54349:10;;;;54360:45;54349:57;;;54360:45;54349:57;;54360:45;54349:57;;;;;;;;;;-1:-1:-1;;54349:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54313:93;;;;54425:7;:57;;;;-1:-1:-1;54437:11:0;;:16;;:44;;;54468:4;54457:24;;;;;;;;;;;;;;;-1:-1:-1;54457:24:0;54437:44;54417:96;;;;;-1:-1:-1;;;54417:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54229:292;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://74dc224db8cc140820a19e91ae416265e67b10482b10ee17503b8b2ecac1915c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.