Source Code
Latest 25 from a total of 6,064 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit | 15562233 | 1273 days ago | IN | 0 ETH | 0.00800037 | ||||
| Deposit | 14987591 | 1365 days ago | IN | 0 ETH | 0.00800037 | ||||
| Withdraw | 12224258 | 1798 days ago | IN | 0 ETH | 0.01446931 | ||||
| Withdraw | 11995986 | 1833 days ago | IN | 0 ETH | 0.01421906 | ||||
| Withdraw | 11872813 | 1852 days ago | IN | 0 ETH | 0.01522987 | ||||
| Deposit | 11868520 | 1852 days ago | IN | 0 ETH | 0.02144114 | ||||
| Withdraw | 11868426 | 1852 days ago | IN | 0 ETH | 0.03579995 | ||||
| Withdraw | 11831266 | 1858 days ago | IN | 0 ETH | 0.0189214 | ||||
| Withdraw | 11789494 | 1865 days ago | IN | 0 ETH | 0.02262709 | ||||
| Withdraw | 11757301 | 1869 days ago | IN | 0 ETH | 0.01564718 | ||||
| Withdraw | 11742496 | 1872 days ago | IN | 0 ETH | 0.01378723 | ||||
| Withdraw | 11740601 | 1872 days ago | IN | 0 ETH | 0.0130403 | ||||
| Deposit | 11683909 | 1881 days ago | IN | 0 ETH | 0.00658843 | ||||
| Withdraw | 11683904 | 1881 days ago | IN | 0 ETH | 0.01154985 | ||||
| Deposit | 11679861 | 1881 days ago | IN | 0 ETH | 0.0105228 | ||||
| Withdraw | 11679856 | 1881 days ago | IN | 0 ETH | 0.02657344 | ||||
| Withdraw | 11646675 | 1886 days ago | IN | 0 ETH | 0.00685208 | ||||
| Deposit | 11639010 | 1888 days ago | IN | 0 ETH | 0.01207414 | ||||
| Deposit | 11625573 | 1890 days ago | IN | 0 ETH | 0.00566579 | ||||
| Withdraw | 11625561 | 1890 days ago | IN | 0 ETH | 0.01075853 | ||||
| Withdraw | 11624676 | 1890 days ago | IN | 0 ETH | 0.00922318 | ||||
| Withdraw | 11603085 | 1893 days ago | IN | 0 ETH | 0.01966342 | ||||
| Withdraw | 11573118 | 1898 days ago | IN | 0 ETH | 0.00763731 | ||||
| Withdraw | 11572484 | 1898 days ago | IN | 0 ETH | 0.00681912 | ||||
| Withdraw | 11549600 | 1901 days ago | IN | 0 ETH | 0.0217432 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ValueMinorPool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-09-22
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/utils/EnumerableSet.sol
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
* (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(value)));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(value)));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint256(_at(set._inner, index)));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/GSN/Context.sol
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name, string memory symbol) public {
_name = name;
_symbol = symbol;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: contracts/vaults/ValueLiquidityToken.sol
// Value Liquidity (VALUE) with Governance Alpha
contract ValueLiquidityToken is ERC20 {
using SafeERC20 for IERC20;
using SafeMath for uint256;
IERC20 public yfv;
address public governance;
uint256 public cap;
uint256 public yfvLockedBalance;
mapping(address => bool) public minters;
event Deposit(address indexed dst, uint amount);
event Withdrawal(address indexed src, uint amount);
constructor (IERC20 _yfv, uint256 _cap) public ERC20("Value Liquidity", "VALUE") {
governance = msg.sender;
yfv = _yfv;
cap = _cap;
}
function mint(address _to, uint256 _amount) public {
require(msg.sender == governance || minters[msg.sender], "!governance && !minter");
_mint(_to, _amount);
_moveDelegates(address(0), _delegates[_to], _amount);
}
function burn(uint256 _amount) public {
_burn(msg.sender, _amount);
_moveDelegates(_delegates[msg.sender], address(0), _amount);
}
function burnFrom(address _account, uint256 _amount) public {
uint256 decreasedAllowance = allowance(_account, msg.sender).sub(_amount, "ERC20: burn amount exceeds allowance");
_approve(_account, msg.sender, decreasedAllowance);
_burn(_account, _amount);
_moveDelegates(_delegates[_account], address(0), _amount);
}
function setGovernance(address _governance) public {
require(msg.sender == governance, "!governance");
governance = _governance;
}
function addMinter(address _minter) public {
require(msg.sender == governance, "!governance");
minters[_minter] = true;
}
function removeMinter(address _minter) public {
require(msg.sender == governance, "!governance");
minters[_minter] = false;
}
function setCap(uint256 _cap) public {
require(msg.sender == governance, "!governance");
require(_cap.add(yfvLockedBalance) >= totalSupply(), "_cap (plus yfvLockedBalance) is below current supply");
cap = _cap;
}
function deposit(uint256 _amount) public {
yfv.safeTransferFrom(msg.sender, address(this), _amount);
yfvLockedBalance = yfvLockedBalance.add(_amount);
_mint(msg.sender, _amount);
_moveDelegates(address(0), _delegates[msg.sender], _amount);
Deposit(msg.sender, _amount);
}
function withdraw(uint256 _amount) public {
yfvLockedBalance = yfvLockedBalance.sub(_amount, "There is not enough locked YFV to withdraw");
yfv.safeTransfer(msg.sender, _amount);
_burn(msg.sender, _amount);
_moveDelegates(_delegates[msg.sender], address(0), _amount);
Withdrawal(msg.sender, _amount);
}
// This function allows governance to take unsupported tokens out of the contract.
// This is in an effort to make someone whole, should they seriously mess up.
// There is no guarantee governance will vote to return these.
// It also allows for removal of airdropped tokens.
function governanceRecoverUnsupported(IERC20 _token, address _to, uint256 _amount) external {
require(msg.sender == governance, "!governance");
if (_token == yfv) {
uint256 yfvBalance = yfv.balanceOf(address(this));
require(_amount <= yfvBalance.sub(yfvLockedBalance), "cant withdraw more then stuck amount");
}
_token.safeTransfer(_to, _amount);
}
/**
* @dev See {ERC20-_beforeTokenTransfer}.
*
* Requirements:
*
* - minted tokens must not cause the total supply to go over the cap.
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) {// When minting tokens
require(totalSupply().add(amount) <= cap.add(yfvLockedBalance), "ERC20Capped: cap exceeded");
}
}
// Copied and modified from YAM code:
// https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
// https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
// Which is copied and modified from COMPOUND:
// https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
/// @dev A record of each accounts delegate
mapping(address => address) internal _delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint256 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping(address => uint32) public numCheckpoints;
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
/// @notice A record of states for signing / validating signatures
mapping(address => uint) public nonces;
/// @notice An event thats emitted when an account changes its delegate
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
/// @notice An event thats emitted when a delegate account's vote balance changes
event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegator The address to get delegatee for
*/
function delegates(address delegator)
external
view
returns (address)
{
return _delegates[delegator];
}
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external {
return _delegate(msg.sender, delegatee);
}
/**
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint nonce,
uint expiry,
uint8 v,
bytes32 r,
bytes32 s
)
external
{
bytes32 domainSeparator = keccak256(
abi.encode(
DOMAIN_TYPEHASH,
keccak256(bytes(name())),
getChainId(),
address(this)
)
);
bytes32 structHash = keccak256(
abi.encode(
DELEGATION_TYPEHASH,
delegatee,
nonce,
expiry
)
);
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
structHash
)
);
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), "VALUE::delegateBySig: invalid signature");
require(nonce == nonces[signatory]++, "VALUE::delegateBySig: invalid nonce");
require(now <= expiry, "VALUE::delegateBySig: signature expired");
return _delegate(signatory, delegatee);
}
/**
* @notice Gets the current votes balance for `account`
* @param account The address to get votes balance
* @return The number of current votes for `account`
*/
function getCurrentVotes(address account)
external
view
returns (uint256)
{
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* @notice Determine the prior number of votes for an account as of a block number
* @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
* @param account The address of the account to check
* @param blockNumber The block number to get the vote balance at
* @return The number of votes the account had as of the given block
*/
function getPriorVotes(address account, uint blockNumber)
external
view
returns (uint256)
{
require(blockNumber < block.number, "VALUE::getPriorVotes: not yet determined");
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee)
internal
{
address currentDelegate = _delegates[delegator];
uint256 delegatorBalance = balanceOf(delegator); // balance of underlying VALUEs (not scaled);
_delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
// decrease old representative
uint32 srcRepNum = numCheckpoints[srcRep];
uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint256 srcRepNew = srcRepOld.sub(amount);
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
// increase new representative
uint32 dstRepNum = numCheckpoints[dstRep];
uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint256 dstRepNew = dstRepOld.add(amount);
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint256 oldVotes,
uint256 newVotes
)
internal
{
uint32 blockNumber = safe32(block.number, "VALUE::_writeCheckpoint: block number exceeds 32 bits");
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2 ** 32, errorMessage);
return uint32(n);
}
function getChainId() internal pure returns (uint) {
uint256 chainId;
assembly {chainId := chainid()}
return chainId;
}
}
// File: contracts/vaults/ValueVaultMaster.sol
/*
* Here we have a list of constants. In order to get access to an address
* managed by ValueVaultMaster, the calling contract should copy and define
* some of these constants and use them as keys.
* Keys themselves are immutable. Addresses can be immutable or mutable.
*
* Vault addresses are immutable once set, and the list may grow:
* K_VAULT_WETH = 0;
* K_VAULT_ETH_USDC_UNI_V2_LP = 1;
* K_VAULT_ETH_WBTC_UNI_V2_LP = 2;
*/
/*
* ValueVaultMaster manages all the vaults and strategies of our Value Vaults system.
*/
contract ValueVaultMaster {
address public governance;
address public bank;
address public minorPool;
address public profitSharer;
address public govToken; // VALUE
address public yfv; // When harvesting, convert some parts to YFV for govVault
address public usdc; // we only used USDC to estimate APY
address public govVault; // YFV -> VALUE, vUSD, vETH and 6.7% profit from Value Vaults
address public insuranceFund = 0xb7b2Ea8A1198368f950834875047aA7294A2bDAa; // set to Governance Multisig at start
address public performanceReward = 0x7Be4D5A99c903C437EC77A20CB6d0688cBB73c7f; // set to deploy wallet at start
uint256 public constant FEE_DENOMINATOR = 10000;
uint256 public govVaultProfitShareFee = 670; // 6.7% | VIP-1 (https://yfv.finance/vip-vote/vip_1)
uint256 public gasFee = 50; // 0.5% at start and can be set by governance decision
uint256 public minStakeTimeToClaimVaultReward = 24 hours;
mapping(address => bool) public isVault;
mapping(uint256 => address) public vaultByKey;
mapping(address => bool) public isStrategy;
mapping(uint256 => address) public strategyByKey;
mapping(address => uint256) public strategyQuota;
constructor(address _govToken, address _yfv, address _usdc) public {
govToken = _govToken;
yfv = _yfv;
usdc = _usdc;
governance = tx.origin;
}
function setGovernance(address _governance) external {
require(msg.sender == governance, "!governance");
governance = _governance;
}
// Immutable once set.
function setBank(address _bank) external {
require(msg.sender == governance, "!governance");
require(bank == address(0));
bank = _bank;
}
// Mutable in case we want to upgrade the pool.
function setMinorPool(address _minorPool) external {
require(msg.sender == governance, "!governance");
minorPool = _minorPool;
}
// Mutable in case we want to upgrade this module.
function setProfitSharer(address _profitSharer) external {
require(msg.sender == governance, "!governance");
profitSharer = _profitSharer;
}
// Mutable, in case governance want to upgrade VALUE to new version
function setGovToken(address _govToken) external {
require(msg.sender == governance, "!governance");
govToken = _govToken;
}
// Immutable once added, and you can always add more.
function addVault(uint256 _key, address _vault) external {
require(msg.sender == governance, "!governance");
require(vaultByKey[_key] == address(0), "vault: key is taken");
isVault[_vault] = true;
vaultByKey[_key] = _vault;
}
// Mutable and removable.
function addStrategy(uint256 _key, address _strategy) external {
require(msg.sender == governance, "!governance");
isStrategy[_strategy] = true;
strategyByKey[_key] = _strategy;
}
// Set 0 to disable quota (no limit)
function setStrategyQuota(address _strategy, uint256 _quota) external {
require(msg.sender == governance, "!governance");
strategyQuota[_strategy] = _quota;
}
function removeStrategy(uint256 _key) external {
require(msg.sender == governance, "!governance");
isStrategy[strategyByKey[_key]] = false;
delete strategyByKey[_key];
}
function setGovVault(address _govVault) public {
require(msg.sender == governance, "!governance");
govVault = _govVault;
}
function setInsuranceFund(address _insuranceFund) public {
require(msg.sender == governance, "!governance");
insuranceFund = _insuranceFund;
}
function setPerformanceReward(address _performanceReward) public{
require(msg.sender == governance, "!governance");
performanceReward = _performanceReward;
}
function setGovVaultProfitShareFee(uint256 _govVaultProfitShareFee) public {
require(msg.sender == governance, "!governance");
govVaultProfitShareFee = _govVaultProfitShareFee;
}
function setGasFee(uint256 _gasFee) public {
require(msg.sender == governance, "!governance");
gasFee = _gasFee;
}
function setMinStakeTimeToClaimVaultReward(uint256 _minStakeTimeToClaimVaultReward) public {
require(msg.sender == governance, "!governance");
minStakeTimeToClaimVaultReward = _minStakeTimeToClaimVaultReward;
}
/**
* This function allows governance to take unsupported tokens out of the contract.
* This is in an effort to make someone whole, should they seriously mess up.
* There is no guarantee governance will vote to return these.
* It also allows for removal of airdropped tokens.
*/
function governanceRecoverUnsupported(IERC20x _token, uint256 amount, address to) external {
require(msg.sender == governance, "!governance");
_token.transfer(to, amount);
}
}
interface IERC20x {
function transfer(address recipient, uint256 amount) external returns (bool);
}
// File: contracts/vaults/ValueMinorPool.sol
interface IYFVReferral {
function setReferrer(address farmer, address referrer) external;
function getReferrer(address farmer) external view returns (address);
}
interface IFreeFromUpTo {
function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
}
// Similar to ValueMasterPool but will generate only a small amount of VALUE for 2 weeks at most. And we remove Migration process from this pool. Happy farming dude!
contract ValueMinorPool is Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);
modifier discountCHI {
uint256 gasStart = gasleft();
_;
uint256 gasSpent = 21000 + gasStart - gasleft() + 16 * msg.data.length;
chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41130);
}
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt. See explanation below.
uint256 accumulatedStakingPower; // will accumulate every time user harvest
}
// Info of each pool.
struct PoolInfo {
IERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. VALUEs to distribute per block.
uint256 lastRewardBlock; // Last block number that VALUEs distribution occurs.
uint256 accValuePerShare; // Accumulated VALUEs per share, times 1e12. See below.
bool isStarted; // if lastRewardBlock has passed
}
uint256 public constant REFERRAL_COMMISSION_PERCENT = 1;
address public rewardReferral;
// The VALUE TOKEN!
ValueLiquidityToken public value;
// InsuranceFund address.
address public insuranceFundAddr;
// VALUE tokens created per block.
uint256 public valuePerBlock;
// Info of each pool.
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
// Total allocation poitns. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The block number when VALUE mining starts.
uint256 public startBlock;
ValueVaultMaster public vaultMaster;
// Block number when each epoch ends.
uint256[3] public epochEndBlocks = [11000000, 1000000000, 2000000000];
// Reward multipler
uint256[4] public epochRewardMultiplers = [500, 0, 0, 0];
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
constructor(
ValueLiquidityToken _value,
address _insuranceFundAddr,
uint256 _valuePerBlock,
uint256 _startBlock,
ValueVaultMaster _vaultMaster
) public {
value = _value;
insuranceFundAddr = _insuranceFundAddr;
valuePerBlock = _valuePerBlock; // supposed to be 0.001 (1e16 wei)
startBlock = _startBlock; // supposed to be 10,916,000 (Wed Sep 23 2020 02:00:00 GMT+0)
vaultMaster = _vaultMaster;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Add a new lp to the pool. Can only be called by the owner.
// XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate, uint256 _lastRewardBlock) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
if (block.number < startBlock) {
// chef is sleeping
if (_lastRewardBlock == 0) {
_lastRewardBlock = startBlock;
} else {
if (_lastRewardBlock < startBlock) {
_lastRewardBlock = startBlock;
}
}
} else {
// chef is cooking
if (_lastRewardBlock == 0 || _lastRewardBlock < block.number) {
_lastRewardBlock = block.number;
}
}
bool _isStarted = (block.number >= _lastRewardBlock) && (_lastRewardBlock >= startBlock);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: _lastRewardBlock,
accValuePerShare: 0,
isStarted: _isStarted
}));
if (_isStarted) {
totalAllocPoint = totalAllocPoint.add(_allocPoint);
}
}
// Update the given pool's VALUE allocation point. Can only be called by the owner.
function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
if (_withUpdate) {
massUpdatePools();
}
PoolInfo storage pool = poolInfo[_pid];
if (pool.isStarted) {
totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(_allocPoint);
}
pool.allocPoint = _allocPoint;
}
function setValuePerBlock(uint256 _valuePerBlock) public onlyOwner {
massUpdatePools();
valuePerBlock = _valuePerBlock;
}
function setEpochEndBlock(uint8 _index, uint256 _epochEndBlock) public onlyOwner {
require(_index < 3, "_index out of range");
require(_epochEndBlock > block.number, "Too late to update");
require(epochEndBlocks[_index] > block.number, "Too late to update");
epochEndBlocks[_index] = _epochEndBlock;
}
function setEpochRewardMultipler(uint8 _index, uint256 _epochRewardMultipler) public onlyOwner {
require(_index > 0 && _index < 4, "Index out of range");
require(epochEndBlocks[_index - 1] > block.number, "Too late to update");
epochRewardMultiplers[_index] = _epochRewardMultipler;
}
function setRewardReferral(address _rewardReferral) external onlyOwner {
rewardReferral = _rewardReferral;
}
// Return reward multiplier over the given _from to _to block.
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
for (uint8 epochId = 3; epochId >= 1; --epochId) {
if (_to >= epochEndBlocks[epochId - 1]) {
if (_from >= epochEndBlocks[epochId - 1]) return _to.sub(_from).mul(epochRewardMultiplers[epochId]);
uint256 multiplier = _to.sub(epochEndBlocks[epochId - 1]).mul(epochRewardMultiplers[epochId]);
if (epochId == 1) return multiplier.add(epochEndBlocks[0].sub(_from).mul(epochRewardMultiplers[0]));
for (epochId = epochId - 1; epochId >= 1; --epochId) {
if (_from >= epochEndBlocks[epochId - 1]) return multiplier.add(epochEndBlocks[epochId].sub(_from).mul(epochRewardMultiplers[epochId]));
multiplier = multiplier.add(epochEndBlocks[epochId].sub(epochEndBlocks[epochId - 1]).mul(epochRewardMultiplers[epochId]));
}
return multiplier.add(epochEndBlocks[0].sub(_from).mul(epochRewardMultiplers[0]));
}
}
return _to.sub(_from).mul(epochRewardMultiplers[0]);
}
// View function to see pending VALUEs on frontend.
function pendingValue(uint256 _pid, address _user) public view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accValuePerShare = pool.accValuePerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
if (totalAllocPoint > 0) {
uint256 valueReward = multiplier.mul(valuePerBlock).mul(pool.allocPoint).div(totalAllocPoint);
accValuePerShare = accValuePerShare.add(valueReward.mul(1e12).div(lpSupply));
}
}
return user.amount.mul(accValuePerShare).div(1e12).sub(user.rewardDebt);
}
function stakingPower(uint256 _pid, address _user) public view returns (uint256) {
UserInfo storage user = userInfo[_pid][_user];
return user.accumulatedStakingPower.add(pendingValue(_pid, _user));
}
// Update reward variables for all pools. Be careful of gas spending!
function massUpdatePools() public discountCHI {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public discountCHI {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0) {
pool.lastRewardBlock = block.number;
return;
}
if (!pool.isStarted) {
pool.isStarted = true;
totalAllocPoint = totalAllocPoint.add(pool.allocPoint);
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
if (totalAllocPoint > 0) {
uint256 valueReward = multiplier.mul(valuePerBlock).mul(pool.allocPoint).div(totalAllocPoint);
safeValueMint(address(this), valueReward);
pool.accValuePerShare = pool.accValuePerShare.add(valueReward.mul(1e12).div(lpSupply));
}
pool.lastRewardBlock = block.number;
}
// Deposit LP tokens to the pool for VALUE allocation.
function deposit(uint256 _pid, uint256 _amount, address _referrer) public discountCHI {
depositOnBehalf(msg.sender, _pid, _amount, _referrer);
}
function depositOnBehalf(address farmer, uint256 _pid, uint256 _amount, address _referrer) public {
require(msg.sender == farmer || msg.sender == vaultMaster.bank(), "!bank && !yourself");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][farmer];
updatePool(_pid);
if (rewardReferral != address(0) && _referrer != address(0)) {
require(_referrer != farmer, "You cannot refer yourself.");
IYFVReferral(rewardReferral).setReferrer(farmer, _referrer);
}
if (user.amount > 0) {
uint256 pending = user.amount.mul(pool.accValuePerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
user.accumulatedStakingPower = user.accumulatedStakingPower.add(pending);
uint256 actualPaid = pending.mul(100 - REFERRAL_COMMISSION_PERCENT).div(100); // 99%
uint256 commission = pending - actualPaid; // 1%
safeValueTransfer(farmer, actualPaid);
if (rewardReferral != address(0)) {
_referrer = IYFVReferral(rewardReferral).getReferrer(farmer);
}
if (_referrer != address(0)) { // send commission to referrer
safeValueTransfer(_referrer, commission);
} else { // send commission to insuranceFundAddr
safeValueTransfer(insuranceFundAddr, commission);
}
}
}
if(_amount > 0) {
pool.lpToken.safeTransferFrom(farmer, address(this), _amount);
user.amount = user.amount.add(_amount);
}
user.rewardDebt = user.amount.mul(pool.accValuePerShare).div(1e12);
emit Deposit(farmer, _pid, _amount);
}
// Withdraw LP tokens from the pool.
function withdraw(uint256 _pid, uint256 _amount) public discountCHI {
withdrawOnBehalf(msg.sender, _pid, _amount);
}
function withdrawOnBehalf(address farmer, uint256 _pid, uint256 _amount) public {
require(msg.sender == farmer || msg.sender == vaultMaster.bank(), "!bank && !yourself");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][farmer];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending = user.amount.mul(pool.accValuePerShare).div(1e12).sub(user.rewardDebt);
if(pending > 0) {
user.accumulatedStakingPower = user.accumulatedStakingPower.add(pending);
uint256 actualPaid = pending.mul(100 - REFERRAL_COMMISSION_PERCENT).div(100); // 99%
uint256 commission = pending - actualPaid; // 1%
safeValueTransfer(farmer, actualPaid);
address _referrer = address(0);
if (rewardReferral != address(0)) {
_referrer = IYFVReferral(rewardReferral).getReferrer(farmer);
}
if (_referrer != address(0)) { // send commission to referrer
safeValueTransfer(_referrer, commission);
} else { // send commission to insuranceFundAddr
safeValueTransfer(insuranceFundAddr, commission);
}
}
if(_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.lpToken.safeTransfer(farmer, _amount);
}
user.rewardDebt = user.amount.mul(pool.accValuePerShare).div(1e12);
emit Withdraw(farmer, _pid, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
pool.lpToken.safeTransfer(address(msg.sender), user.amount);
emit EmergencyWithdraw(msg.sender, _pid, user.amount);
user.amount = 0;
user.rewardDebt = 0;
}
// Safe value mint, ensure it is never over cap and we are the current owner.
function safeValueMint(address _to, uint256 _amount) internal {
if (value.minters(address(this)) && _to != address(0)) {
uint256 totalSupply = value.totalSupply();
uint256 realCap = value.cap().add(value.yfvLockedBalance());
if (totalSupply.add(_amount) > realCap) {
value.mint(_to, realCap.sub(totalSupply));
} else {
value.mint(_to, _amount);
}
}
}
// Safe value transfer function, just in case if rounding error causes pool to not have enough VALUEs.
function safeValueTransfer(address _to, uint256 _amount) internal {
uint256 valueBal = value.balanceOf(address(this));
if (_amount > valueBal) {
value.transfer(_to, valueBal);
} else {
value.transfer(_to, _amount);
}
}
// Update insuranceFund by the previous insuranceFund contract.
function setInsuranceFundAddr(address _insuranceFundAddr) public {
require(msg.sender == insuranceFundAddr, "insuranceFund: wut?");
insuranceFundAddr = _insuranceFundAddr;
}
// This function allows governance to take unsupported tokens out of the contract, since this pool exists longer than the other pools.
// This is in an effort to make someone whole, should they seriously mess up.
// There is no guarantee governance will vote to return these.
// It also allows for removal of airdropped tokens.
function governanceRecoverUnsupported(IERC20 _token, uint256 amount, address to) external onlyOwner {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
PoolInfo storage pool = poolInfo[pid];
// cant take staked asset
require(_token != pool.lpToken, "!pool.lpToken");
}
// transfer to
_token.safeTransfer(to, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract ValueLiquidityToken","name":"_value","type":"address"},{"internalType":"address","name":"_insuranceFundAddr","type":"address"},{"internalType":"uint256","name":"_valuePerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"contract ValueVaultMaster","name":"_vaultMaster","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"REFERRAL_COMMISSION_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_lastRewardBlock","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farmer","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"depositOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochEndBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochRewardMultiplers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"insuranceFundAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accValuePerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReferral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_epochEndBlock","type":"uint256"}],"name":"setEpochEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_epochRewardMultipler","type":"uint256"}],"name":"setEpochRewardMultipler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_insuranceFundAddr","type":"address"}],"name":"setInsuranceFundAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardReferral","type":"address"}],"name":"setRewardReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_valuePerBlock","type":"uint256"}],"name":"setValuePerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"stakingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"accumulatedStakingPower","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"value","outputs":[{"internalType":"contract ValueLiquidityToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultMaster","outputs":[{"internalType":"contract ValueVaultMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farmer","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
600060075560e060405262a7d8c06080908152633b9aca0060a052637735940060c0526200003290600a90600362000162565b50604080516080810182526101f4815260006020820181905291810182905260608101919091526200006990600d906004620001ad565b503480156200007757600080fd5b5060405162002cc938038062002cc9833981810160405260a08110156200009d57600080fd5b508051602082015160408301516060840151608090940151929391929091906000620000c86200015e565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b039687166001600160a01b031991821617909155600380549587169582169590951790945560049290925560085560098054919093169116179055620001fb565b3390565b82600381019282156200019b579160200282015b828111156200019b578251829063ffffffff1690559160200191906001019062000176565b50620001a9929150620001e4565b5090565b82600481019282156200019b579160200282015b828111156200019b578251829061ffff16905591602001919060010190620001c1565b5b80821115620001a95760008155600101620001e5565b612abe806200020b6000396000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c806364482f791161012557806396805e54116100ad578063aa9713f41161007c578063aa9713f4146105dd578063c92aecc414610609578063dfc1e7d614610611578063f2fde38b1461062e578063fb4999211461065457610210565b806396805e5414610561578063974c52261461059b578063a0214ea3146105a3578063a9210737146105ab57610210565b80637c52b2d4116100f45780637c52b2d41461048e5780638da5cb5b146104ba5780638dbb1e3a146104c25780638dbdbe6d146104e557806393f1a40b1461051757610210565b806364482f79146103fb57806370cf7f6f14610426578063715018a61461044c57806371b629b61461045457610210565b80633fd50001116101a857806351eb05a61161017757806351eb05a61461037b5780635312ea8e1461039857806353220a42146103b557806354575af4146103bd578063630b5ba1146103f357610210565b80633fd500011461030d578063441a3e701461032a57806348cd4cb11461034d5780634a75ca671461035557610210565b80631494f1d7116101e45780631494f1d7146102835780631526fe27146102a957806317caf6f1146102fd5780633fa4f2451461030557610210565b80622dcfb91461021557806304405cfb1461023d578063081e3eda146102615780630cdb43c41461027b575b600080fd5b61023b6004803603602081101561022b57600080fd5b50356001600160a01b0316610671565b005b6102456106eb565b604080516001600160a01b039092168252519081900360200190f35b6102696106fa565b60408051918252519081900360200190f35b610245610700565b61023b6004803603604081101561029957600080fd5b5060ff813516906020013561070f565b6102c6600480360360208110156102bf57600080fd5b503561086f565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b6102696108ba565b6102456108c0565b6102696004803603602081101561032357600080fd5b50356108cf565b61023b6004803603604081101561034057600080fd5b50803590602001356108e3565b6102696109a9565b61023b6004803603602081101561036b57600080fd5b50356001600160a01b03166109af565b61023b6004803603602081101561039157600080fd5b5035610a26565b61023b600480360360208110156103ae57600080fd5b5035610c55565b610269610cf0565b61023b600480360360608110156103d357600080fd5b506001600160a01b03813581169160208101359160409091013516610cf5565b61023b610df3565b61023b6004803603606081101561041157600080fd5b50803590602081013590604001351515610ec9565b61023b6004803603604081101561043c57600080fd5b5060ff8135169060200135610f90565b61023b6110b2565b61023b6004803603608081101561046a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611154565b610269600480360360408110156104a457600080fd5b50803590602001356001600160a01b031661154a565b61024561158e565b610269600480360360408110156104d857600080fd5b508035906020013561159d565b61023b600480360360608110156104fb57600080fd5b50803590602081013590604001356001600160a01b0316611754565b6105436004803603604081101561052d57600080fd5b50803590602001356001600160a01b031661181c565b60408051938452602084019290925282820152519081900360600190f35b61023b6004803603608081101561057757600080fd5b508035906001600160a01b0360208201351690604081013515159060600135611848565b610245611a4f565b610269611a5e565b61023b600480360360608110156105c157600080fd5b506001600160a01b038135169060208101359060400135611a64565b610269600480360360408110156105f357600080fd5b50803590602001356001600160a01b0316611d9b565b610245611f03565b6102696004803603602081101561062757600080fd5b5035611f15565b61023b6004803603602081101561064457600080fd5b50356001600160a01b0316611f22565b61023b6004803603602081101561066a57600080fd5b503561201a565b61067961207f565b6000546001600160a01b039081169116146106c9576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b60055490565b6001546001600160a01b031681565b61071761207f565b6000546001600160a01b03908116911614610767576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60038260ff16106107b5576040805162461bcd60e51b81526020600482015260136024820152725f696e646578206f7574206f662072616e676560681b604482015290519081900360640190fd5b4381116107fe576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b43600a8360ff166003811061080f57fe5b015411610858576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b80600a8360ff166003811061086957fe5b01555050565b6005818154811061087c57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60075481565b6002546001600160a01b031681565b600a81600381106108dc57fe5b0154905081565b60005a90506108f3338484611a64565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161093057fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b505050505050565b60085481565b6003546001600160a01b03163314610a04576040805162461bcd60e51b8152602060048201526013602482015272696e737572616e636546756e643a207775743f60681b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60005a9050600060058381548110610a3a57fe5b9060005260206000209060050201905080600201544311610a5b5750610ba0565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610aa557600080fd5b505afa158015610ab9573d6000803e3d6000fd5b505050506040513d6020811015610acf57600080fd5b5051905080610ae5575043600290910155610ba0565b600482015460ff16610b165760048201805460ff19166001908117909155820154600754610b1291612083565b6007555b6000610b2683600201544361159d565b60075490915015610b96576000610b62600754610b5c8660010154610b56600454876120dd90919063ffffffff16565b906120dd565b90612136565b9050610b6e3082612178565b610b8f610b8484610b5c8464e8d4a510006120dd565b600386015490612083565b6003850155505b5050436002909101555b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610bdd57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610c2457600080fd5b505af1158015610c38573d6000803e3d6000fd5b505050506040513d6020811015610c4e57600080fd5b5050505050565b600060058281548110610c6457fe5b60009182526020808320858452600682526040808520338087529352909320805460059093029093018054909450610ca9926001600160a01b0391909116919061246e565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a360008082556001909101555050565b600181565b610cfd61207f565b6000546001600160a01b03908116911614610d4d576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60055460005b81811015610dd857600060058281548110610d6a57fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610dcf576040805162461bcd60e51b815260206004820152600d60248201526c10b837b7b61736382a37b5b2b760991b604482015290519081900360640190fd5b50600101610d53565b50610ded6001600160a01b038516838561246e565b50505050565b60005a60055490915060005b81811015610e1857610e1081610a26565b600101610dff565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e5857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ded57600080fd5b610ed161207f565b6000546001600160a01b03908116911614610f21576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b8015610f2f57610f2f610df3565b600060058481548110610f3e57fe5b60009182526020909120600590910201600481015490915060ff1615610f8557610f8183610f7b83600101546007546124c590919063ffffffff16565b90612083565b6007555b600101919091555050565b610f9861207f565b6000546001600160a01b03908116911614610fe8576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60008260ff16118015610ffe575060048260ff16105b611044576040805162461bcd60e51b8152602060048201526012602482015271496e646578206f7574206f662072616e676560701b604482015290519081900360640190fd5b43600a6001840360ff166003811061105857fe5b0154116110a1576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b80600d8360ff166004811061086957fe5b6110ba61207f565b6000546001600160a01b0390811691161461110a576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336001600160a01b03851614806111ec5750600960009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b457600080fd5b505afa1580156111c8573d6000803e3d6000fd5b505050506040513d60208110156111de57600080fd5b50516001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152601260248201527110b130b7359013131010bcb7bab939b2b63360711b604482015290519081900360640190fd5b60006005848154811061124157fe5b600091825260208083208784526006825260408085206001600160a01b038b16865290925292206005909102909101915061127b85610a26565b6001546001600160a01b03161580159061129d57506001600160a01b03831615155b1561137857856001600160a01b0316836001600160a01b03161415611309576040805162461bcd60e51b815260206004820152601a60248201527f596f752063616e6e6f7420726566657220796f757273656c662e000000000000604482015290519081900360640190fd5b6001546040805163bbddaca360e01b81526001600160a01b03898116600483015286811660248301529151919092169163bbddaca391604480830192600092919082900301818387803b15801561135f57600080fd5b505af1158015611373573d6000803e3d6000fd5b505050505b8054156114b65760006113b382600101546113ad64e8d4a51000610b5c876003015487600001546120dd90919063ffffffff16565b906124c5565b905080156114b45760028201546113ca9082612083565b600283015560006113e16064610b5c8460636120dd565b90508082036113f08983612507565b6001546001600160a01b03161561147d5760015460408051634a9fefc760e01b81526001600160a01b038c8116600483015291519190921691634a9fefc7916024808301926020929190829003018186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d602081101561147857600080fd5b505195505b6001600160a01b0386161561149b576114968682612507565b6114b1565b6003546114b1906001600160a01b031682612507565b50505b505b83156114e25781546114d3906001600160a01b0316873087612666565b80546114df9085612083565b81555b600382015481546114fd9164e8d4a5100091610b5c916120dd565b600182015560408051858152905186916001600160a01b038916917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505050505050565b60008281526006602090815260408083206001600160a01b038516845290915281206115846115798585611d9b565b600283015490612083565b9150505b92915050565b6000546001600160a01b031690565b600060035b60018160ff161061173b57600a6001820360ff16600381106115c057fe5b0154831061173257600a6001820360ff16600381106115db57fe5b0154841061160a57611602600d8260ff16600481106115f657fe5b0154610b5685876124c5565b915050611588565b6000611640600d8360ff166004811061161f57fe5b0154610b56600a6001860360ff166003811061163757fe5b015487906124c5565b90508160ff166001141561167c5761167361166c600d60005b0154610b5688600a60005b0154906124c5565b8290612083565b92505050611588565b6001820391505b60018260ff161061172357600a6001830360ff16600381106116a157fe5b015485106116d55761167361166c600d8460ff16600481106116bf57fe5b0154610b5688600a8760ff166003811061166457fe5b61171561166c600d8460ff16600481106116eb57fe5b0154610b56600a6001870360ff166003811061170357fe5b0154600a8760ff166003811061166457fe5b600019909201919050611683565b61167361166c600d6000611659565b600019016115a2565b50600d5461174d90610b5684866124c5565b9392505050565b60005a905061176533858585611154565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816117a257fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156117e957600080fd5b505af11580156117fd573d6000803e3d6000fd5b505050506040513d602081101561181357600080fd5b50505050505050565b600660209081526000928352604080842090915290825290208054600182015460029092015490919083565b61185061207f565b6000546001600160a01b039081169116146118a0576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b81156118ae576118ae610df3565b6008544310156118da57806118c657506008546118d5565b6008548110156118d557506008545b6118ee565b8015806118e657504381105b156118ee5750435b600081431015801561190257506008548210155b6040805160a0810182526001600160a01b038781168252602082018981529282018681526000606084018181528615801560808701908152600580546001810182559481905296517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09490970293840180546001600160a01b031916979096169690961790945594517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db182015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db384015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db4909201805460ff191692151592909217909155909150610c4e57600754611a459086612083565b6007555050505050565b6009546001600160a01b031681565b60045481565b336001600160a01b0384161480611afc5750600960009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b50516001600160a01b031633145b611b42576040805162461bcd60e51b815260206004820152601260248201527110b130b7359013131010bcb7bab939b2b63360711b604482015290519081900360640190fd5b600060058381548110611b5157fe5b600091825260208083208684526006825260408085206001600160a01b038a1686529092529220805460059092029092019250831115611bcd576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b611bd684610a26565b6000611c0482600101546113ad64e8d4a51000610b5c876003015487600001546120dd90919063ffffffff16565b90508015611d09576002820154611c1b9082612083565b60028301556000611c326064610b5c8460636120dd565b9050808203611c418883612507565b6001546000906001600160a01b031615611cd15760015460408051634a9fefc760e01b81526001600160a01b038c8116600483015291519190921691634a9fefc7916024808301926020929190829003018186803b158015611ca257600080fd5b505afa158015611cb6573d6000803e3d6000fd5b505050506040513d6020811015611ccc57600080fd5b505190505b6001600160a01b03811615611cef57611cea8183612507565b611d05565b600354611d05906001600160a01b031683612507565b5050505b8315611d33578154611d1b90856124c5565b82558254611d33906001600160a01b0316878661246e565b60038301548254611d4e9164e8d4a5100091610b5c916120dd565b600183015560408051858152905186916001600160a01b038916917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60008060058481548110611dab57fe5b600091825260208083208784526006825260408085206001600160a01b0389811687529084528186206005959095029092016003810154815483516370a0823160e01b815230600482015293519298509596909590949316926370a082319260248082019391829003018186803b158015611e2557600080fd5b505afa158015611e39573d6000803e3d6000fd5b505050506040513d6020811015611e4f57600080fd5b5051600285015490915043118015611e6657508015155b15611ed0576000611e7b85600201544361159d565b60075490915015611ece576000611eab600754610b5c8860010154610b56600454876120dd90919063ffffffff16565b9050611eca611ec384610b5c8464e8d4a510006120dd565b8590612083565b9350505b505b611ef883600101546113ad64e8d4a51000610b5c8688600001546120dd90919063ffffffff16565b979650505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b600d81600481106108dc57fe5b611f2a61207f565b6000546001600160a01b03908116911614611f7a576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b6001600160a01b038116611fbf5760405162461bcd60e51b81526004018080602001828103825260268152602001806129f86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61202261207f565b6000546001600160a01b03908116911614612072576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b61207a610df3565b600455565b3390565b60008282018381101561174d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826120ec57506000611588565b828202828482816120f957fe5b041461174d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612a1e6021913960400191505060405180910390fd5b600061174d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126c0565b60025460408051633d1bb33160e21b815230600482015290516001600160a01b039092169163f46eccc491602480820192602092909190829003018186803b1580156121c357600080fd5b505afa1580156121d7573d6000803e3d6000fd5b505050506040513d60208110156121ed57600080fd5b5051801561220357506001600160a01b03821615155b1561246a57600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b50516002546040805163227af2a760e11b81529051929350600092612368926001600160a01b0316916344f5e54e916004808301926020929190829003018186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d60208110156122ef57600080fd5b505160025460408051631aa93a7560e11b815290516001600160a01b039092169163355274ea91600480820192602092909190829003018186803b15801561233657600080fd5b505afa15801561234a573d6000803e3d6000fd5b505050506040513d602081101561236057600080fd5b505190612083565b9050806123758385612083565b11156123fa576002546001600160a01b03166340c10f198561239784866124c5565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b50505050610ded565b600254604080516340c10f1960e01b81526001600160a01b03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050505050505b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124c0908490612762565b505050565b600061174d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612813565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561255257600080fd5b505afa158015612566573d6000803e3d6000fd5b505050506040513d602081101561257c57600080fd5b5051905080821115612610576002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156125de57600080fd5b505af11580156125f2573d6000803e3d6000fd5b505050506040513d602081101561260857600080fd5b506124c09050565b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610c2457600080fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ded908590612762565b6000818361274c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127115781810151838201526020016126f9565b50505050905090810190601f16801561273e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161275857fe5b0495945050505050565b60606127b7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661286d9092919063ffffffff16565b8051909150156124c0578080602001905160208110156127d657600080fd5b50516124c05760405162461bcd60e51b815260040180806020018281038252602a815260200180612a5f602a913960400191505060405180910390fd5b600081848411156128655760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156127115781810151838201526020016126f9565b505050900390565b606061287c8484600085612884565b949350505050565b606061288f856129f1565b6128e0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061291f5780518252601f199092019160209182019101612900565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612981576040519150601f19603f3d011682016040523d82523d6000602084013e612986565b606091505b5091509150811561299a57915061287c9050565b8051156129aa5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156127115781810151838201526020016126f9565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c475f336b89de620d07e8565fca2d090d6e436d80eb56b3d228cd1282f5a489b64736f6c634300060c003300000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000b7b2ea8a1198368f950834875047aa7294a2bdaa00000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000a690a0000000000000000000000000aa8ecca0082c34ab8c30b4d896eb8eecc5004b28
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102105760003560e01c806364482f791161012557806396805e54116100ad578063aa9713f41161007c578063aa9713f4146105dd578063c92aecc414610609578063dfc1e7d614610611578063f2fde38b1461062e578063fb4999211461065457610210565b806396805e5414610561578063974c52261461059b578063a0214ea3146105a3578063a9210737146105ab57610210565b80637c52b2d4116100f45780637c52b2d41461048e5780638da5cb5b146104ba5780638dbb1e3a146104c25780638dbdbe6d146104e557806393f1a40b1461051757610210565b806364482f79146103fb57806370cf7f6f14610426578063715018a61461044c57806371b629b61461045457610210565b80633fd50001116101a857806351eb05a61161017757806351eb05a61461037b5780635312ea8e1461039857806353220a42146103b557806354575af4146103bd578063630b5ba1146103f357610210565b80633fd500011461030d578063441a3e701461032a57806348cd4cb11461034d5780634a75ca671461035557610210565b80631494f1d7116101e45780631494f1d7146102835780631526fe27146102a957806317caf6f1146102fd5780633fa4f2451461030557610210565b80622dcfb91461021557806304405cfb1461023d578063081e3eda146102615780630cdb43c41461027b575b600080fd5b61023b6004803603602081101561022b57600080fd5b50356001600160a01b0316610671565b005b6102456106eb565b604080516001600160a01b039092168252519081900360200190f35b6102696106fa565b60408051918252519081900360200190f35b610245610700565b61023b6004803603604081101561029957600080fd5b5060ff813516906020013561070f565b6102c6600480360360208110156102bf57600080fd5b503561086f565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b6102696108ba565b6102456108c0565b6102696004803603602081101561032357600080fd5b50356108cf565b61023b6004803603604081101561034057600080fd5b50803590602001356108e3565b6102696109a9565b61023b6004803603602081101561036b57600080fd5b50356001600160a01b03166109af565b61023b6004803603602081101561039157600080fd5b5035610a26565b61023b600480360360208110156103ae57600080fd5b5035610c55565b610269610cf0565b61023b600480360360608110156103d357600080fd5b506001600160a01b03813581169160208101359160409091013516610cf5565b61023b610df3565b61023b6004803603606081101561041157600080fd5b50803590602081013590604001351515610ec9565b61023b6004803603604081101561043c57600080fd5b5060ff8135169060200135610f90565b61023b6110b2565b61023b6004803603608081101561046a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611154565b610269600480360360408110156104a457600080fd5b50803590602001356001600160a01b031661154a565b61024561158e565b610269600480360360408110156104d857600080fd5b508035906020013561159d565b61023b600480360360608110156104fb57600080fd5b50803590602081013590604001356001600160a01b0316611754565b6105436004803603604081101561052d57600080fd5b50803590602001356001600160a01b031661181c565b60408051938452602084019290925282820152519081900360600190f35b61023b6004803603608081101561057757600080fd5b508035906001600160a01b0360208201351690604081013515159060600135611848565b610245611a4f565b610269611a5e565b61023b600480360360608110156105c157600080fd5b506001600160a01b038135169060208101359060400135611a64565b610269600480360360408110156105f357600080fd5b50803590602001356001600160a01b0316611d9b565b610245611f03565b6102696004803603602081101561062757600080fd5b5035611f15565b61023b6004803603602081101561064457600080fd5b50356001600160a01b0316611f22565b61023b6004803603602081101561066a57600080fd5b503561201a565b61067961207f565b6000546001600160a01b039081169116146106c9576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b60055490565b6001546001600160a01b031681565b61071761207f565b6000546001600160a01b03908116911614610767576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60038260ff16106107b5576040805162461bcd60e51b81526020600482015260136024820152725f696e646578206f7574206f662072616e676560681b604482015290519081900360640190fd5b4381116107fe576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b43600a8360ff166003811061080f57fe5b015411610858576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b80600a8360ff166003811061086957fe5b01555050565b6005818154811061087c57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60075481565b6002546001600160a01b031681565b600a81600381106108dc57fe5b0154905081565b60005a90506108f3338484611a64565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a018161093057fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d60208110156109a157600080fd5b505050505050565b60085481565b6003546001600160a01b03163314610a04576040805162461bcd60e51b8152602060048201526013602482015272696e737572616e636546756e643a207775743f60681b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60005a9050600060058381548110610a3a57fe5b9060005260206000209060050201905080600201544311610a5b5750610ba0565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610aa557600080fd5b505afa158015610ab9573d6000803e3d6000fd5b505050506040513d6020811015610acf57600080fd5b5051905080610ae5575043600290910155610ba0565b600482015460ff16610b165760048201805460ff19166001908117909155820154600754610b1291612083565b6007555b6000610b2683600201544361159d565b60075490915015610b96576000610b62600754610b5c8660010154610b56600454876120dd90919063ffffffff16565b906120dd565b90612136565b9050610b6e3082612178565b610b8f610b8484610b5c8464e8d4a510006120dd565b600386015490612083565b6003850155505b5050436002909101555b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610bdd57fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610c2457600080fd5b505af1158015610c38573d6000803e3d6000fd5b505050506040513d6020811015610c4e57600080fd5b5050505050565b600060058281548110610c6457fe5b60009182526020808320858452600682526040808520338087529352909320805460059093029093018054909450610ca9926001600160a01b0391909116919061246e565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a360008082556001909101555050565b600181565b610cfd61207f565b6000546001600160a01b03908116911614610d4d576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60055460005b81811015610dd857600060058281548110610d6a57fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610dcf576040805162461bcd60e51b815260206004820152600d60248201526c10b837b7b61736382a37b5b2b760991b604482015290519081900360640190fd5b50600101610d53565b50610ded6001600160a01b038516838561246e565b50505050565b60005a60055490915060005b81811015610e1857610e1081610a26565b600101610dff565b5060009050601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a0181610e5857fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ded57600080fd5b610ed161207f565b6000546001600160a01b03908116911614610f21576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b8015610f2f57610f2f610df3565b600060058481548110610f3e57fe5b60009182526020909120600590910201600481015490915060ff1615610f8557610f8183610f7b83600101546007546124c590919063ffffffff16565b90612083565b6007555b600101919091555050565b610f9861207f565b6000546001600160a01b03908116911614610fe8576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b60008260ff16118015610ffe575060048260ff16105b611044576040805162461bcd60e51b8152602060048201526012602482015271496e646578206f7574206f662072616e676560701b604482015290519081900360640190fd5b43600a6001840360ff166003811061105857fe5b0154116110a1576040805162461bcd60e51b8152602060048201526012602482015271546f6f206c61746520746f2075706461746560701b604482015290519081900360640190fd5b80600d8360ff166004811061086957fe5b6110ba61207f565b6000546001600160a01b0390811691161461110a576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336001600160a01b03851614806111ec5750600960009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b457600080fd5b505afa1580156111c8573d6000803e3d6000fd5b505050506040513d60208110156111de57600080fd5b50516001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152601260248201527110b130b7359013131010bcb7bab939b2b63360711b604482015290519081900360640190fd5b60006005848154811061124157fe5b600091825260208083208784526006825260408085206001600160a01b038b16865290925292206005909102909101915061127b85610a26565b6001546001600160a01b03161580159061129d57506001600160a01b03831615155b1561137857856001600160a01b0316836001600160a01b03161415611309576040805162461bcd60e51b815260206004820152601a60248201527f596f752063616e6e6f7420726566657220796f757273656c662e000000000000604482015290519081900360640190fd5b6001546040805163bbddaca360e01b81526001600160a01b03898116600483015286811660248301529151919092169163bbddaca391604480830192600092919082900301818387803b15801561135f57600080fd5b505af1158015611373573d6000803e3d6000fd5b505050505b8054156114b65760006113b382600101546113ad64e8d4a51000610b5c876003015487600001546120dd90919063ffffffff16565b906124c5565b905080156114b45760028201546113ca9082612083565b600283015560006113e16064610b5c8460636120dd565b90508082036113f08983612507565b6001546001600160a01b03161561147d5760015460408051634a9fefc760e01b81526001600160a01b038c8116600483015291519190921691634a9fefc7916024808301926020929190829003018186803b15801561144e57600080fd5b505afa158015611462573d6000803e3d6000fd5b505050506040513d602081101561147857600080fd5b505195505b6001600160a01b0386161561149b576114968682612507565b6114b1565b6003546114b1906001600160a01b031682612507565b50505b505b83156114e25781546114d3906001600160a01b0316873087612666565b80546114df9085612083565b81555b600382015481546114fd9164e8d4a5100091610b5c916120dd565b600182015560408051858152905186916001600160a01b038916917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505050505050565b60008281526006602090815260408083206001600160a01b038516845290915281206115846115798585611d9b565b600283015490612083565b9150505b92915050565b6000546001600160a01b031690565b600060035b60018160ff161061173b57600a6001820360ff16600381106115c057fe5b0154831061173257600a6001820360ff16600381106115db57fe5b0154841061160a57611602600d8260ff16600481106115f657fe5b0154610b5685876124c5565b915050611588565b6000611640600d8360ff166004811061161f57fe5b0154610b56600a6001860360ff166003811061163757fe5b015487906124c5565b90508160ff166001141561167c5761167361166c600d60005b0154610b5688600a60005b0154906124c5565b8290612083565b92505050611588565b6001820391505b60018260ff161061172357600a6001830360ff16600381106116a157fe5b015485106116d55761167361166c600d8460ff16600481106116bf57fe5b0154610b5688600a8760ff166003811061166457fe5b61171561166c600d8460ff16600481106116eb57fe5b0154610b56600a6001870360ff166003811061170357fe5b0154600a8760ff166003811061166457fe5b600019909201919050611683565b61167361166c600d6000611659565b600019016115a2565b50600d5461174d90610b5684866124c5565b9392505050565b60005a905061176533858585611154565b6000601036025a8361520801030190506d4946c0e9f43f4dee607b0ef1fa1c6001600160a01b031663079d229f3361a0aa8461374a01816117a257fe5b046040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156117e957600080fd5b505af11580156117fd573d6000803e3d6000fd5b505050506040513d602081101561181357600080fd5b50505050505050565b600660209081526000928352604080842090915290825290208054600182015460029092015490919083565b61185061207f565b6000546001600160a01b039081169116146118a0576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b81156118ae576118ae610df3565b6008544310156118da57806118c657506008546118d5565b6008548110156118d557506008545b6118ee565b8015806118e657504381105b156118ee5750435b600081431015801561190257506008548210155b6040805160a0810182526001600160a01b038781168252602082018981529282018681526000606084018181528615801560808701908152600580546001810182559481905296517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09490970293840180546001600160a01b031916979096169690961790945594517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db182015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db282015592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db384015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db4909201805460ff191692151592909217909155909150610c4e57600754611a459086612083565b6007555050505050565b6009546001600160a01b031681565b60045481565b336001600160a01b0384161480611afc5750600960009054906101000a90046001600160a01b03166001600160a01b03166376cdb03b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac457600080fd5b505afa158015611ad8573d6000803e3d6000fd5b505050506040513d6020811015611aee57600080fd5b50516001600160a01b031633145b611b42576040805162461bcd60e51b815260206004820152601260248201527110b130b7359013131010bcb7bab939b2b63360711b604482015290519081900360640190fd5b600060058381548110611b5157fe5b600091825260208083208684526006825260408085206001600160a01b038a1686529092529220805460059092029092019250831115611bcd576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b611bd684610a26565b6000611c0482600101546113ad64e8d4a51000610b5c876003015487600001546120dd90919063ffffffff16565b90508015611d09576002820154611c1b9082612083565b60028301556000611c326064610b5c8460636120dd565b9050808203611c418883612507565b6001546000906001600160a01b031615611cd15760015460408051634a9fefc760e01b81526001600160a01b038c8116600483015291519190921691634a9fefc7916024808301926020929190829003018186803b158015611ca257600080fd5b505afa158015611cb6573d6000803e3d6000fd5b505050506040513d6020811015611ccc57600080fd5b505190505b6001600160a01b03811615611cef57611cea8183612507565b611d05565b600354611d05906001600160a01b031683612507565b5050505b8315611d33578154611d1b90856124c5565b82558254611d33906001600160a01b0316878661246e565b60038301548254611d4e9164e8d4a5100091610b5c916120dd565b600183015560408051858152905186916001600160a01b038916917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60008060058481548110611dab57fe5b600091825260208083208784526006825260408085206001600160a01b0389811687529084528186206005959095029092016003810154815483516370a0823160e01b815230600482015293519298509596909590949316926370a082319260248082019391829003018186803b158015611e2557600080fd5b505afa158015611e39573d6000803e3d6000fd5b505050506040513d6020811015611e4f57600080fd5b5051600285015490915043118015611e6657508015155b15611ed0576000611e7b85600201544361159d565b60075490915015611ece576000611eab600754610b5c8860010154610b56600454876120dd90919063ffffffff16565b9050611eca611ec384610b5c8464e8d4a510006120dd565b8590612083565b9350505b505b611ef883600101546113ad64e8d4a51000610b5c8688600001546120dd90919063ffffffff16565b979650505050505050565b6d4946c0e9f43f4dee607b0ef1fa1c81565b600d81600481106108dc57fe5b611f2a61207f565b6000546001600160a01b03908116911614611f7a576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b6001600160a01b038116611fbf5760405162461bcd60e51b81526004018080602001828103825260268152602001806129f86026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61202261207f565b6000546001600160a01b03908116911614612072576040805162461bcd60e51b81526020600482018190526024820152600080516020612a3f833981519152604482015290519081900360640190fd5b61207a610df3565b600455565b3390565b60008282018381101561174d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826120ec57506000611588565b828202828482816120f957fe5b041461174d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612a1e6021913960400191505060405180910390fd5b600061174d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126c0565b60025460408051633d1bb33160e21b815230600482015290516001600160a01b039092169163f46eccc491602480820192602092909190829003018186803b1580156121c357600080fd5b505afa1580156121d7573d6000803e3d6000fd5b505050506040513d60208110156121ed57600080fd5b5051801561220357506001600160a01b03821615155b1561246a57600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b50516002546040805163227af2a760e11b81529051929350600092612368926001600160a01b0316916344f5e54e916004808301926020929190829003018186803b1580156122c557600080fd5b505afa1580156122d9573d6000803e3d6000fd5b505050506040513d60208110156122ef57600080fd5b505160025460408051631aa93a7560e11b815290516001600160a01b039092169163355274ea91600480820192602092909190829003018186803b15801561233657600080fd5b505afa15801561234a573d6000803e3d6000fd5b505050506040513d602081101561236057600080fd5b505190612083565b9050806123758385612083565b11156123fa576002546001600160a01b03166340c10f198561239784866124c5565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b50505050610ded565b600254604080516340c10f1960e01b81526001600160a01b03878116600483015260248201879052915191909216916340c10f1991604480830192600092919082900301818387803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050505050505b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124c0908490612762565b505050565b600061174d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612813565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561255257600080fd5b505afa158015612566573d6000803e3d6000fd5b505050506040513d602081101561257c57600080fd5b5051905080821115612610576002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156125de57600080fd5b505af11580156125f2573d6000803e3d6000fd5b505050506040513d602081101561260857600080fd5b506124c09050565b6002546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610c2457600080fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ded908590612762565b6000818361274c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156127115781810151838201526020016126f9565b50505050905090810190601f16801561273e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161275857fe5b0495945050505050565b60606127b7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661286d9092919063ffffffff16565b8051909150156124c0578080602001905160208110156127d657600080fd5b50516124c05760405162461bcd60e51b815260040180806020018281038252602a815260200180612a5f602a913960400191505060405180910390fd5b600081848411156128655760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156127115781810151838201526020016126f9565b505050900390565b606061287c8484600085612884565b949350505050565b606061288f856129f1565b6128e0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061291f5780518252601f199092019160209182019101612900565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612981576040519150601f19603f3d011682016040523d82523d6000602084013e612986565b606091505b5091509150811561299a57915061287c9050565b8051156129aa5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156127115781810151838201526020016126f9565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c475f336b89de620d07e8565fca2d090d6e436d80eb56b3d228cd1282f5a489b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c000000000000000000000000b7b2ea8a1198368f950834875047aa7294a2bdaa00000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000a690a0000000000000000000000000aa8ecca0082c34ab8c30b4d896eb8eecc5004b28
-----Decoded View---------------
Arg [0] : _value (address): 0x49E833337ECe7aFE375e44F4E3e8481029218E5c
Arg [1] : _insuranceFundAddr (address): 0xb7b2Ea8A1198368f950834875047aA7294A2bDAa
Arg [2] : _valuePerBlock (uint256): 1000000000000000
Arg [3] : _startBlock (uint256): 10916000
Arg [4] : _vaultMaster (address): 0xAa8ECCa0082c34Ab8c30B4D896eB8eEcC5004b28
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000049e833337ece7afe375e44f4e3e8481029218e5c
Arg [1] : 000000000000000000000000b7b2ea8a1198368f950834875047aa7294a2bdaa
Arg [2] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000a690a0
Arg [4] : 000000000000000000000000aa8ecca0082c34ab8c30b4d896eb8eecc5004b28
Deployed Bytecode Sourcemap
59131:15690:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64801:122;;;;;;;;;;;;;;;;-1:-1:-1;64801:122:0;-1:-1:-1;;;;;64801:122:0;;:::i;:::-;;60545:32;;;:::i;:::-;;;;-1:-1:-1;;;;;60545:32:0;;;;;;;;;;;;;;62065:95;;;:::i;:::-;;;;;;;;;;;;;;;;60412:29;;;:::i;64127:342::-;;;;;;;;;;;;;;;;-1:-1:-1;64127:342:0;;;;;;;;;:::i;60688:26::-;;;;;;;;;;;;;;;;-1:-1:-1;60688:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;60688:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60931:34;;;:::i;60475:32::-;;;:::i;61144:69::-;;;;;;;;;;;;;;;;-1:-1:-1;61144:69:0;;:::i;70668:130::-;;;;;;;;;;;;;;;;-1:-1:-1;70668:130:0;;;;;;;:::i;61023:25::-;;;:::i;73830:196::-;;;;;;;;;;;;;;;;-1:-1:-1;73830:196:0;-1:-1:-1;;;;;73830:196:0;;:::i;67607:961::-;;;;;;;;;;;;;;;;-1:-1:-1;67607:961:0;;:::i;72433:356::-;;;;;;;;;;;;;;;;-1:-1:-1;72433:356:0;;:::i;60350:55::-;;;:::i;74382:436::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;74382:436:0;;;;;;;;;;;;;;;;;:::i;67339:192::-;;;:::i;63588:379::-;;;;;;;;;;;;;;;;-1:-1:-1;63588:379:0;;;;;;;;;;;;;;:::i;64477:316::-;;;;;;;;;;;;;;;;-1:-1:-1;64477:316:0;;;;;;;;;:::i;28582:148::-;;;:::i;68802:1816::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;68802:1816:0;;;;;;;;;;;;;;;;;;;;:::i;67034:222::-;;;;;;;;;;;;;;;;-1:-1:-1;67034:222:0;;;;;;-1:-1:-1;;;;;67034:222:0;;:::i;27940:79::-;;;:::i;64999:1133::-;;;;;;;;;;;;;;;;-1:-1:-1;64999:1133:0;;;;;;;:::i;68636:158::-;;;;;;;;;;;;;;;;-1:-1:-1;68636:158:0;;;;;;;;;;;-1:-1:-1;;;;;68636:158:0;;:::i;60770:66::-;;;;;;;;;;;;;;;;-1:-1:-1;60770:66:0;;;;;;-1:-1:-1;;;;;60770:66:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62329:1162;;;;;;;;;;;;;;;;-1:-1:-1;62329:1162:0;;;-1:-1:-1;;;;;62329:1162:0;;;;;;;;;;;;;;;;;:::i;61057:35::-;;;:::i;60624:28::-;;;:::i;70806:1556::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;70806:1556:0;;;;;;;;;;;;;:::i;66197:829::-;;;;;;;;;;;;;;;;-1:-1:-1;66197:829:0;;;;;;-1:-1:-1;;;;;66197:829:0;;:::i;59241:93::-;;;:::i;61247:56::-;;;;;;;;;;;;;;;;-1:-1:-1;61247:56:0;;:::i;28885:244::-;;;;;;;;;;;;;;;;-1:-1:-1;28885:244:0;-1:-1:-1;;;;;28885:244:0;;:::i;63975:144::-;;;;;;;;;;;;;;;;-1:-1:-1;63975:144:0;;:::i;64801:122::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;64883:14:::1;:32:::0;;-1:-1:-1;;;;;;64883:32:0::1;-1:-1:-1::0;;;;;64883:32:0;;;::::1;::::0;;;::::1;::::0;;64801:122::o;60545:32::-;;;-1:-1:-1;;;;;60545:32:0;;:::o;62065:95::-;62137:8;:15;62065:95;:::o;60412:29::-;;;-1:-1:-1;;;;;60412:29:0;;:::o;64127:342::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;64236:1:::1;64227:6;:10;;;64219:42;;;::::0;;-1:-1:-1;;;64219:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64219:42:0;;;;;;;;;;;;;::::1;;64297:12;64280:14;:29;64272:60;;;::::0;;-1:-1:-1;;;64272:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64272:60:0;;;;;;;;;;;;;::::1;;64376:12;64351:14;64366:6;64351:22;;;;;;;;;;;:37;64343:68;;;::::0;;-1:-1:-1;;;64343:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64343:68:0;;;;;;;;;;;;;::::1;;64447:14;64422;64437:6;64422:22;;;;;;;;;;:39:::0;-1:-1:-1;;64127:342:0:o;60688:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60688:26:0;;;;-1:-1:-1;60688:26:0;;;;;;;:::o;60931:34::-;;;;:::o;60475:32::-;;;-1:-1:-1;;;;;60475:32:0;;:::o;61144:69::-;;;;;;;;;;;;;-1:-1:-1;61144:69:0;:::o;70668:130::-;59375:16;59394:9;59375:28;;70747:43:::1;70764:10;70776:4;70782:7;70747:16;:43::i;:::-;59426:16:::0;59476:2;59481:8;59476:20;59464:9;59453:8;59445:5;:16;:28;:51;59426:70;;59291:42;-1:-1:-1;;;;;59507:16:0;;59524:10;59557:5;59537:8;59548:5;59537:16;59536:26;;;;;;59507:56;;;;;;;;;;;;;-1:-1:-1;;;;;59507:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;70668:130:0:o;61023:25::-;;;;:::o;73830:196::-;73928:17;;-1:-1:-1;;;;;73928:17:0;73914:10;:31;73906:63;;;;;-1:-1:-1;;;73906:63:0;;;;;;;;;;;;-1:-1:-1;;;73906:63:0;;;;;;;;;;;;;;;73980:17;:38;;-1:-1:-1;;;;;;73980:38:0;-1:-1:-1;;;;;73980:38:0;;;;;;;;;;73830:196::o;67607:961::-;59375:16;59394:9;59375:28;;67671:21:::1;67695:8;67704:4;67695:14;;;;;;;;;;;;;;;;;;67671:38;;67740:4;:20;;;67724:12;:36;67720:75;;67777:7;;;67720:75;67824:12:::0;;:37:::1;::::0;;-1:-1:-1;;;67824:37:0;;67855:4:::1;67824:37;::::0;::::1;::::0;;;67805:16:::1;::::0;-1:-1:-1;;;;;67824:12:0::1;::::0;:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:12;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;67824:37:0;;-1:-1:-1;67876:13:0;67872:102:::1;;-1:-1:-1::0;67929:12:0::1;67906:20;::::0;;::::1;:35:::0;67956:7:::1;;67872:102;67989:14;::::0;::::1;::::0;::::1;;67984:138;;68020:14;::::0;::::1;:21:::0;;-1:-1:-1;;68020:21:0::1;68037:4;68020:21:::0;;::::1;::::0;;;68094:15;::::1;::::0;68074::::1;::::0;:36:::1;::::0;:19:::1;:36::i;:::-;68056:15;:54:::0;67984:138:::1;68132:18;68153:49;68167:4;:20;;;68189:12;68153:13;:49::i;:::-;68217:15;::::0;68132:70;;-1:-1:-1;68217:19:0;68213:302:::1;;68253:19;68275:71;68330:15;;68275:50;68309:4;:15;;;68275:29;68290:13;;68275:10;:14;;:29;;;;:::i;:::-;:33:::0;::::1;:50::i;:::-;:54:::0;::::1;:71::i;:::-;68253:93;;68361:41;68383:4;68390:11;68361:13;:41::i;:::-;68441:62;68467:35;68493:8:::0;68467:21:::1;:11:::0;68483:4:::1;68467:15;:21::i;:35::-;68441:21;::::0;::::1;::::0;;:25:::1;:62::i;:::-;68417:21;::::0;::::1;:86:::0;-1:-1:-1;68213:302:0::1;-1:-1:-1::0;;68548:12:0::1;68525:20;::::0;;::::1;:35:::0;59414:1:::1;59426:16:::0;59476:2;59481:8;59476:20;59464:9;59453:8;59445:5;:16;:28;:51;59426:70;;59291:42;-1:-1:-1;;;;;59507:16:0;;59524:10;59557:5;59537:8;59548:5;59537:16;59536:26;;;;;;59507:56;;;;;;;;;;;;;-1:-1:-1;;;;;59507:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67607:961:0:o;72433:356::-;72492:21;72516:8;72525:4;72516:14;;;;;;;;;;;;;;;;72565;;;:8;:14;;;;;;72580:10;72565:26;;;;;;;;72649:11;;72516:14;;;;;;;72602:12;;72516:14;;-1:-1:-1;72602:59:0;;-1:-1:-1;;;;;72602:12:0;;;;;72580:10;72602:25;:59::i;:::-;72713:11;;72677:48;;;;;;;72707:4;;72695:10;;72677:48;;;;;;;;;72750:1;72736:15;;;72762;;;;:19;-1:-1:-1;;72433:356:0:o;60350:55::-;60404:1;60350:55;:::o;74382:436::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;74510:8:::1;:15:::0;74493:14:::1;74536:209;74564:6;74558:3;:12;74536:209;;;74594:21;74618:8;74627:3;74618:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;74703:12:::0;;74618:13;;-1:-1:-1;;;;;;74693:22:0;;::::1;74703:12:::0;::::1;74693:22;;74685:48;;;::::0;;-1:-1:-1;;;74685:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;74685:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;74572:5:0::1;;74536:209;;;-1:-1:-1::0;74779:31:0::1;-1:-1:-1::0;;;;;74779:19:0;::::1;74799:2:::0;74803:6;74779:19:::1;:31::i;:::-;28222:1;74382:436:::0;;;:::o;67339:192::-;59375:16;59394:9;67413:8:::1;:15:::0;59375:28;;-1:-1:-1;67396:14:0::1;67439:85;67467:6;67461:3;:12;67439:85;;;67497:15;67508:3;67497:10;:15::i;:::-;67475:5;;67439:85;;;-1:-1:-1::0;59426:16:0;;-1:-1:-1;59476:2:0;59481:8;59476:20;59464:9;59453:8;59445:5;:16;:28;:51;59426:70;;59291:42;-1:-1:-1;;;;;59507:16:0;;59524:10;59557:5;59537:8;59548:5;59537:16;59536:26;;;;;;59507:56;;;;;;;;;;;;;-1:-1:-1;;;;;59507:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63588:379;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;63686:11:::1;63682:61;;;63714:17;:15;:17::i;:::-;63753:21;63777:8;63786:4;63777:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;63806;::::0;::::1;::::0;63777;;-1:-1:-1;63806:14:0::1;;63802:118;;;63855:53;63896:11;63855:36;63875:4;:15;;;63855;;:19;;:36;;;;:::i;:::-;:40:::0;::::1;:53::i;:::-;63837:15;:71:::0;63802:118:::1;63930:15;;:29:::0;;;;-1:-1:-1;;63588:379:0:o;64477:316::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;64600:1:::1;64591:6;:10;;;:24;;;;;64614:1;64605:6;:10;;;64591:24;64583:55;;;::::0;;-1:-1:-1;;;64583:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64583:55:0;;;;;;;;;;;;;::::1;;64686:12;64657:14;64681:1;64672:6;:10;64657:26;;;;;;;;;;;:41;64649:72;;;::::0;;-1:-1:-1;;;64649:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;64649:72:0;;;;;;;;;;;;;::::1;;64764:21;64732;64754:6;64732:29;;;;;;;;28582:148:::0;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;28689:1:::1;28673:6:::0;;28652:40:::1;::::0;-1:-1:-1;;;;;28673:6:0;;::::1;::::0;28652:40:::1;::::0;28689:1;;28652:40:::1;28720:1;28703:19:::0;;-1:-1:-1;;;;;;28703:19:0::1;::::0;;28582:148::o;68802:1816::-;68919:10;-1:-1:-1;;;;;68919:20:0;;;;:56;;;68957:11;;;;;;;;;-1:-1:-1;;;;;68957:11:0;-1:-1:-1;;;;;68957:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68957:18:0;-1:-1:-1;;;;;68943:32:0;:10;:32;68919:56;68911:87;;;;;-1:-1:-1;;;68911:87:0;;;;;;;;;;;;-1:-1:-1;;;68911:87:0;;;;;;;;;;;;;;;69009:21;69033:8;69042:4;69033:14;;;;;;;;;;;;;;;;69082;;;:8;:14;;;;;;-1:-1:-1;;;;;69082:22:0;;;;;;;;;69033:14;;;;;;;;-1:-1:-1;69115:16:0;69091:4;69115:10;:16::i;:::-;69146:14;;-1:-1:-1;;;;;69146:14:0;:28;;;;:55;;-1:-1:-1;;;;;;69178:23:0;;;;69146:55;69142:220;;;69239:6;-1:-1:-1;;;;;69226:19:0;:9;-1:-1:-1;;;;;69226:19:0;;;69218:58;;;;;-1:-1:-1;;;69218:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;69304:14;;69291:59;;;-1:-1:-1;;;69291:59:0;;-1:-1:-1;;;;;69291:59:0;;;;;;;;;;;;;;;;69304:14;;;;;69291:40;;:59;;;;;69304:14;;69291:59;;;;;;;69304:14;;69291:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69142:220;69376:11;;:15;69372:949;;69408:15;69426:69;69479:4;:15;;;69426:48;69469:4;69426:38;69442:4;:21;;;69426:4;:11;;;:15;;:38;;;;:::i;:48::-;:52;;:69::i;:::-;69408:87;-1:-1:-1;69513:11:0;;69510:800;;69576:28;;;;:41;;69609:7;69576:32;:41::i;:::-;69545:28;;;:72;69636:18;69657:55;69708:3;69657:46;:7;69669:33;69657:11;:46::i;:55::-;69636:76;-1:-1:-1;69759:20:0;;;69804:37;69822:6;69636:76;69804:17;:37::i;:::-;69864:14;;-1:-1:-1;;;;;69864:14:0;:28;69860:137;;69942:14;;69929:48;;;-1:-1:-1;;;69929:48:0;;-1:-1:-1;;;;;69929:48:0;;;;;;;;;69942:14;;;;;69929:40;;:48;;;;;;;;;;;;;;69942:14;69929:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69929:48:0;;-1:-1:-1;69860:137:0;-1:-1:-1;;;;;70019:23:0;;;70015:280;;70098:40;70116:9;70127:10;70098:17;:40::i;:::-;70015:280;;;70245:17;;70227:48;;-1:-1:-1;;;;;70245:17:0;70264:10;70227:17;:48::i;:::-;69510:800;;;69372:949;;70334:11;;70331:157;;70362:12;;:61;;-1:-1:-1;;;;;70362:12:0;70392:6;70408:4;70415:7;70362:29;:61::i;:::-;70452:11;;:24;;70468:7;70452:15;:24::i;:::-;70438:38;;70331:157;70532:21;;;;70516:11;;:48;;70559:4;;70516:38;;:15;:38::i;:48::-;70498:15;;;:66;70580:30;;;;;;;;70596:4;;-1:-1:-1;;;;;70580:30:0;;;;;;;;;;;;68802:1816;;;;;;:::o;67034:222::-;67106:7;67150:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;67150:21:0;;;;;;;;;67189:59;67222:25;67159:4;67165:5;67222:12;:25::i;:::-;67189:28;;;;;:32;:59::i;:::-;67182:66;;;67034:222;;;;;:::o;27940:79::-;27978:7;28005:6;-1:-1:-1;;;;;28005:6:0;27940:79;:::o;64999:1133::-;65071:7;65112:1;65091:972;65126:1;65115:7;:12;;;65091:972;;65166:14;65191:1;65181:7;:11;65166:27;;;;;;;;;;;65159:3;:34;65155:897;;65227:14;65252:1;65242:7;:11;65227:27;;;;;;;;;;;65218:5;:36;65214:99;;65263:50;65282:21;65304:7;65282:30;;;;;;;;;;;65263:14;:3;65271:5;65263:7;:14::i;:50::-;65256:57;;;;;65214:99;65332:18;65353:72;65394:21;65416:7;65394:30;;;;;;;;;;;65353:36;65361:14;65386:1;65376:7;:11;65361:27;;;;;;;;;;;65353:3;;:7;:36::i;:72::-;65332:93;;65448:7;:12;;65459:1;65448:12;65444:99;;;65469:74;65484:58;65517:21;65539:1;65517:24;;;65484:28;65506:5;65484:14;65499:1;65484:17;;;;:21;:28::i;:58::-;65469:10;;:14;:74::i;:::-;65462:81;;;;;;65444:99;65587:1;65577:7;:11;65567:21;;65562:375;65601:1;65590:7;:12;;;65562:375;;65651:14;65676:1;65666:7;:11;65651:27;;;;;;;;;;;65642:5;:36;65638:135;;65687:86;65702:70;65741:21;65763:7;65741:30;;;;;;;;;;;65702:34;65730:5;65702:14;65717:7;65702:23;;;;;;;;65638:135;65809:108;65824:92;65885:21;65907:7;65885:30;;;;;;;;;;;65824:56;65852:14;65877:1;65867:7;:11;65852:27;;;;;;;;;;;65824:14;65839:7;65824:23;;;;;;;;65809:108;-1:-1:-1;;65604:9:0;;;;65796:121;-1:-1:-1;65562:375:0;;;65962:74;65977:58;66010:21;66032:1;66010:24;;65155:897;-1:-1:-1;;65129:9:0;65091:972;;;-1:-1:-1;66099:21:0;:24;66080:44;;:14;:3;66088:5;66080:7;:14::i;:44::-;66073:51;64999:1133;-1:-1:-1;;;64999:1133:0:o;68636:158::-;59375:16;59394:9;59375:28;;68733:53:::1;68749:10;68761:4;68767:7;68776:9;68733:15;:53::i;:::-;59426:16:::0;59476:2;59481:8;59476:20;59464:9;59453:8;59445:5;:16;:28;:51;59426:70;;59291:42;-1:-1:-1;;;;;59507:16:0;;59524:10;59557:5;59537:8;59548:5;59537:16;59536:26;;;;;;59507:56;;;;;;;;;;;;;-1:-1:-1;;;;;59507:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;68636:158:0:o;60770:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62329:1162::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;62456:11:::1;62452:61;;;62484:17;:15;:17::i;:::-;62542:10;;62527:12;:25;62523:520;;;62606:21:::0;62602:238:::1;;-1:-1:-1::0;62667:10:0::1;::::0;62602:238:::1;;;62741:10;;62722:16;:29;62718:107;;;-1:-1:-1::0;62795:10:0::1;::::0;62718:107:::1;62523:520;;;62908:21:::0;;;:56:::1;;;62952:12;62933:16;:31;62908:56;62904:128;;;-1:-1:-1::0;63004:12:0::1;62904:128;63053:15;63088:16;63072:12;:32;;63071:70;;;;;63130:10;;63110:16;:30;;63071:70;63166:213;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;63166:213:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;63166:213:0;;;;;;;::::1;::::0;::::1;::::0;;;;;;63152:8:::1;:228:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;63152:228:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63152:228:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;63166:213;;-1:-1:-1;63391:93:0::1;;63440:15;::::0;:32:::1;::::0;63460:11;63440:19:::1;:32::i;:::-;63422:15;:50:::0;28222:1:::1;62329:1162:::0;;;;:::o;61057:35::-;;;-1:-1:-1;;;;;61057:35:0;;:::o;60624:28::-;;;;:::o;70806:1556::-;70905:10;-1:-1:-1;;;;;70905:20:0;;;;:56;;;70943:11;;;;;;;;;-1:-1:-1;;;;;70943:11:0;-1:-1:-1;;;;;70943:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70943:18:0;-1:-1:-1;;;;;70929:32:0;:10;:32;70905:56;70897:87;;;;;-1:-1:-1;;;70897:87:0;;;;;;;;;;;;-1:-1:-1;;;70897:87:0;;;;;;;;;;;;;;;70995:21;71019:8;71028:4;71019:14;;;;;;;;;;;;;;;;71068;;;:8;:14;;;;;;-1:-1:-1;;;;;71068:22:0;;;;;;;;;71109:11;;71019:14;;;;;;;;-1:-1:-1;71109:22:0;-1:-1:-1;71109:22:0;71101:53;;;;;-1:-1:-1;;;71101:53:0;;;;;;;;;;;;-1:-1:-1;;;71101:53:0;;;;;;;;;;;;;;;71165:16;71176:4;71165:10;:16::i;:::-;71192:15;71210:69;71263:4;:15;;;71210:48;71253:4;71210:38;71226:4;:21;;;71210:4;:11;;;:15;;:38;;;;:::i;:69::-;71192:87;-1:-1:-1;71293:11:0;;71290:793;;71352:28;;;;:41;;71385:7;71352:32;:41::i;:::-;71321:28;;;:72;71408:18;71429:55;71480:3;71429:46;:7;71441:33;71429:11;:46::i;:55::-;71408:76;-1:-1:-1;71527:20:0;;;71568:37;71586:6;71408:76;71568:17;:37::i;:::-;71669:14;;71620:17;;-1:-1:-1;;;;;71669:14:0;:28;71665:129;;71743:14;;71730:48;;;-1:-1:-1;;;71730:48:0;;-1:-1:-1;;;;;71730:48:0;;;;;;;;;71743:14;;;;;71730:40;;:48;;;;;;;;;;;;;;71743:14;71730:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71730:48:0;;-1:-1:-1;71665:129:0;-1:-1:-1;;;;;71812:23:0;;;71808:264;;71887:40;71905:9;71916:10;71887:17;:40::i;:::-;71808:264;;;72026:17;;72008:48;;-1:-1:-1;;;;;72026:17:0;72045:10;72008:17;:48::i;:::-;71290:793;;;;72096:11;;72093:138;;72138:11;;:24;;72154:7;72138:15;:24::i;:::-;72124:38;;72177:12;;:42;;-1:-1:-1;;;;;72177:12:0;72203:6;72211:7;72177:25;:42::i;:::-;72275:21;;;;72259:11;;:48;;72302:4;;72259:38;;:15;:38::i;:48::-;72241:15;;;:66;72323:31;;;;;;;;72340:4;;-1:-1:-1;;;;;72323:31:0;;;;;;;;;;;;70806:1556;;;;;;:::o;66197:829::-;66269:7;66289:21;66313:8;66322:4;66313:14;;;;;;;;;;;;;;;;66362;;;:8;:14;;;;;;-1:-1:-1;;;;;66362:21:0;;;;;;;;;;;66313:14;;;;;;;;66421:21;;;;66472:12;;:37;;-1:-1:-1;;;66472:37:0;;66503:4;66472:37;;;;;;66313:14;;-1:-1:-1;66362:21:0;;66421;;66313:14;;66472:12;;;:22;;:37;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66472:37:0;66539:20;;;;66472:37;;-1:-1:-1;66524:12:0;:35;:52;;;;-1:-1:-1;66563:13:0;;;66524:52;66520:417;;;66593:18;66614:49;66628:4;:20;;;66650:12;66614:13;:49::i;:::-;66682:15;;66593:70;;-1:-1:-1;66682:19:0;66678:248;;66722:19;66744:71;66799:15;;66744:50;66778:4;:15;;;66744:29;66759:13;;66744:10;:14;;:29;;;;:::i;:71::-;66722:93;-1:-1:-1;66853:57:0;66874:35;66900:8;66874:21;66722:93;66890:4;66874:15;:21::i;:35::-;66853:16;;:20;:57::i;:::-;66834:76;;66678:248;;66520:417;;66954:64;67002:4;:15;;;66954:43;66992:4;66954:33;66970:16;66954:4;:11;;;:15;;:33;;;;:::i;:64::-;66947:71;66197:829;-1:-1:-1;;;;;;;66197:829:0:o;59241:93::-;59291:42;59241:93;:::o;61247:56::-;;;;;;;;;28885:244;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28974:22:0;::::1;28966:73;;;;-1:-1:-1::0;;;28966:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29076:6;::::0;;29055:38:::1;::::0;-1:-1:-1;;;;;29055:38:0;;::::1;::::0;29076:6;::::1;::::0;29055:38:::1;::::0;::::1;29104:6;:17:::0;;-1:-1:-1;;;;;;29104:17:0::1;-1:-1:-1::0;;;;;29104:17:0;;;::::1;::::0;;;::::1;::::0;;28885:244::o;63975:144::-;28162:12;:10;:12::i;:::-;28152:6;;-1:-1:-1;;;;;28152:6:0;;;:22;;;28144:67;;;;;-1:-1:-1;;;28144:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28144:67:0;;;;;;;;;;;;;;;64053:17:::1;:15;:17::i;:::-;64081:13;:30:::0;63975:144::o;26523:106::-;26611:10;26523:106;:::o;3728:181::-;3786:7;3818:5;;;3842:6;;;;3834:46;;;;;-1:-1:-1;;;3834:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5082:471;5140:7;5385:6;5381:47;;-1:-1:-1;5415:1:0;5408:8;;5381:47;5452:5;;;5456:1;5452;:5;:1;5476:5;;;;;:10;5468:56;;;;-1:-1:-1;;;5468:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6029:132;6087:7;6114:39;6118:1;6121;6114:39;;;;;;;;;;;;;;;;;:3;:39::i;72880:472::-;72957:5;;:28;;;-1:-1:-1;;;72957:28:0;;72979:4;72957:28;;;;;;-1:-1:-1;;;;;72957:5:0;;;;:13;;:28;;;;;;;;;;;;;;;:5;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72957:28:0;:49;;;;-1:-1:-1;;;;;;72989:17:0;;;;72957:49;72953:392;;;73045:5;;:19;;;-1:-1:-1;;;73045:19:0;;;;73023;;-1:-1:-1;;;;;73045:5:0;;:17;;:19;;;;;;;;;;;;;;:5;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73045:19:0;73113:5;;:24;;;-1:-1:-1;;;73113:24:0;;;;73045:19;;-1:-1:-1;73079:15:0;;73097:41;;-1:-1:-1;;;;;73113:5:0;;:22;;:24;;;;;73045:19;;73113:24;;;;;;;:5;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73113:24:0;73097:5;;:11;;;-1:-1:-1;;;73097:11:0;;;;-1:-1:-1;;;;;73097:5:0;;;;:9;;:11;;;;;73113:24;;73097:11;;;;;;;;:5;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73097:11:0;;:15;:41::i;:::-;73079:59;-1:-1:-1;73079:59:0;73157:24;:11;73173:7;73157:15;:24::i;:::-;:34;73153:181;;;73212:5;;-1:-1:-1;;;;;73212:5:0;:10;73223:3;73228:24;:7;73240:11;73228;:24::i;:::-;73212:41;;;;;;;;;;;;;-1:-1:-1;;;;;73212:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73153:181;;;73294:5;;:24;;;-1:-1:-1;;;73294:24:0;;-1:-1:-1;;;;;73294:24:0;;;;;;;;;;;;;;;:5;;;;;:10;;:24;;;;;:5;;:24;;;;;;;:5;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72953:392;;;72880:472;;:::o;14825:177::-;14935:58;;;-1:-1:-1;;;;;14935:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14935:58:0;-1:-1:-1;;;14935:58:0;;;14908:86;;14928:5;;14908:19;:86::i;:::-;14825:177;;;:::o;4192:136::-;4250:7;4277:43;4281:1;4284;4277:43;;;;;;;;;;;;;;;;;:3;:43::i;73468:285::-;73564:5;;:30;;;-1:-1:-1;;;73564:30:0;;73588:4;73564:30;;;;;;73545:16;;-1:-1:-1;;;;;73564:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73564:30:0;;-1:-1:-1;73609:18:0;;;73605:141;;;73644:5;;:29;;;-1:-1:-1;;;73644:29:0;;-1:-1:-1;;;;;73644:29:0;;;;;;;;;;;;;;;:5;;;;;:14;;:29;;;;;;;;;;;;;;:5;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73605:141:0;;-1:-1:-1;73605:141:0;;73706:5;;:28;;;-1:-1:-1;;;73706:28:0;;-1:-1:-1;;;;;73706:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;;;;;;;;15010:205;15138:68;;;-1:-1:-1;;;;;15138:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15138:68:0;-1:-1:-1;;;15138:68:0;;;15111:96;;15131:5;;15111:19;:96::i;6657:278::-;6743:7;6778:12;6771:5;6763:28;;;;-1:-1:-1;;;6763:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6802:9;6818:1;6814;:5;;;;;;;6657:278;-1:-1:-1;;;;;6657:278:0:o;17130:761::-;17554:23;17580:69;17608:4;17580:69;;;;;;;;;;;;;;;;;17588:5;-1:-1:-1;;;;;17580:27:0;;;:69;;;;;:::i;:::-;17664:17;;17554:95;;-1:-1:-1;17664:21:0;17660:224;;17806:10;17795:30;;;;;;;;;;;;;;;-1:-1:-1;17795:30:0;17787:85;;;;-1:-1:-1;;;17787:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4631:192;4717:7;4753:12;4745:6;;;;4737:29;;;;-1:-1:-1;;;4737:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4789:5:0;;;4631:192::o;11841:196::-;11944:12;11976:53;11999:6;12007:4;12013:1;12016:12;11976:22;:53::i;:::-;11969:60;11841:196;-1:-1:-1;;;;11841:196:0:o;13218:979::-;13348:12;13381:18;13392:6;13381:10;:18::i;:::-;13373:60;;;;;-1:-1:-1;;;13373:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13507:12;13521:23;13548:6;-1:-1:-1;;;;;13548:11:0;13568:8;13579:4;13548:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13548:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13506:78;;;;13599:7;13595:595;;;13630:10;-1:-1:-1;13623:17:0;;-1:-1:-1;13623:17:0;13595:595;13744:17;;:21;13740:439;;14007:10;14001:17;14068:15;14055:10;14051:2;14047:19;14040:44;13955:148;14143:20;;-1:-1:-1;;;14143:20:0;;;;;;;;;;;;;;;;;14150:12;;14143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8923:422;9290:20;9329:8;;;8923:422::o
Swarm Source
ipfs://c475f336b89de620d07e8565fca2d090d6e436d80eb56b3d228cd1282f5a489b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$3.93
Net Worth in ETH
0.001856
Token Allocations
VALUE
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.015065 | 260.7071 | $3.93 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.