More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,529 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 10037416 | 88 days ago | IN | 0 MOVR | 0.00019019 | ||||
Deposit | 8219354 | 218 days ago | IN | 0 MOVR | 0.00138349 | ||||
Withdraw | 6976165 | 312 days ago | IN | 0 MOVR | 0.00021283 | ||||
Deposit | 6976152 | 312 days ago | IN | 0 MOVR | 0.00021053 | ||||
Deposit | 6640285 | 360 days ago | IN | 0 MOVR | 0.00018795 | ||||
Withdraw | 6234745 | 420 days ago | IN | 0 MOVR | 0.00048364 | ||||
Deposit | 6227781 | 421 days ago | IN | 0 MOVR | 0.00048738 | ||||
Deposit | 6198512 | 425 days ago | IN | 0 MOVR | 0.00041386 | ||||
Emergency Withdr... | 6145942 | 433 days ago | IN | 0 MOVR | 0.00013796 | ||||
Emergency Withdr... | 6145941 | 433 days ago | IN | 0 MOVR | 0.00013796 | ||||
Deposit | 6145930 | 433 days ago | IN | 0 MOVR | 0.00021069 | ||||
Deposit | 6145930 | 433 days ago | IN | 0 MOVR | 0.00021069 | ||||
Deposit | 6043722 | 449 days ago | IN | 0 MOVR | 0.00048738 | ||||
Deposit | 6010642 | 455 days ago | IN | 0 MOVR | 0.00041386 | ||||
Withdraw | 5903537 | 470 days ago | IN | 0 MOVR | 0.00041839 | ||||
Deposit | 5806905 | 485 days ago | IN | 0 MOVR | 0.00068249 | ||||
Withdraw | 5696125 | 501 days ago | IN | 0 MOVR | 0.00019227 | ||||
Withdraw | 5696069 | 501 days ago | IN | 0 MOVR | 0.00019018 | ||||
Withdraw | 5691496 | 502 days ago | IN | 0 MOVR | 0.00044844 | ||||
Deposit | 5691467 | 502 days ago | IN | 0 MOVR | 0.00044358 | ||||
Deposit | 5659007 | 507 days ago | IN | 0 MOVR | 0.00041386 | ||||
Withdraw | 5602628 | 515 days ago | IN | 0 MOVR | 0.00044844 | ||||
Deposit | 5602614 | 515 days ago | IN | 0 MOVR | 0.00041386 | ||||
Deposit | 5596240 | 516 days ago | IN | 0 MOVR | 0.00041386 | ||||
Deposit | 5520970 | 527 days ago | IN | 0 MOVR | 0.00041418 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-04-14 */ // Sources flattened with hardhat v2.8.4 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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" ); (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" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using 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' 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) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _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 require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(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" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/structs/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `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; if (lastIndex != toDeleteIndex) { 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] = valueIndex; // Replace lastvalue's index to valueIndex } // 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) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // 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(uint160(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(uint160(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(uint160(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(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // 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)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require( account == _msgSender(), "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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 Contracts guidelines: functions revert * instead 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, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); 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) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + 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) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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: * * - `account` 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 += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(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 Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @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 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File contracts/Roar/roar.sol pragma solidity ^0.8.0; contract Roar is ERC20Burnable, Pausable, AccessControl { using SafeMath for uint256; bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); constructor() ERC20("Roar", "roar") { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _mint(msg.sender, 20000000e18); } function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) { _mint(to, amount); } function pause() public onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } function unpause() public onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override whenNotPaused { super._beforeTokenTransfer(from, to, amount); } } // File contracts/MasterChef/Masterchef.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; interface IMigratorChef { // Perform LP token migration from legacy UniswapV2 to Alphadex. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to UniswapV2 LP tokens. // Alphadex must mint EXACTLY the same amount of Alphadex LP tokens or // else something bad will happen. Traditional UniswapV2 does not // do that so be careful! function migrate(IERC20 token) external returns (IERC20); } // MasterChef is the master of Roar. He can make Roar and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once ROAR is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChef is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of ROARs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accKwikPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accKwikPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ROARs to distribute per block. uint256 lastRewardBlock; // Last block number that ROARs distribution occurs. uint256 accKwikPerShare; // Accumulated ROARs per share, times 1e12. See below. } // The ROAR TOKEN! Roar public roar; // ROAR tokens created per block. uint256 public roarPerBlock; // The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; mapping(uint256 => EnumerableSet.AddressSet) private poolUsers; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when ROAR mining starts. uint256 public startBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); constructor( Roar _roar, uint256 _roarPerBlock, uint256 _startBlock ) { roar = _roar; roarPerBlock = _roarPerBlock; startBlock = _startBlock; } function poolLength() external view returns (uint256) { return poolInfo.length; } function updateRoar(Roar _roar) external onlyOwner { roar = _roar; } // 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 ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accKwikPerShare: 0 }) ); } // Update the given pool's ROAR allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Set the migrator contract. Can only be called by the owner. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "migrate: no migrator"); PoolInfo storage pool = poolInfo[_pid]; IERC20 lpToken = pool.lpToken; uint256 bal = lpToken.balanceOf(address(this)); lpToken.safeApprove(address(migrator), bal); IERC20 newLpToken = migrator.migrate(lpToken); require(bal == newLpToken.balanceOf(address(this)), "migrate: bad"); pool.lpToken = newLpToken; } // function to update the first block function updateRewardFirstBlock(uint256 _blockNumber) public onlyOwner { startBlock = _blockNumber; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } // View function to see pending ROARs on frontend. function pendingKwik(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accKwikPerShare = pool.accKwikPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number ); uint256 roarReward = multiplier .mul(roarPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); accKwikPerShare = accKwikPerShare.add( roarReward.mul(1e12).div(lpSupply) ); } return user.amount.mul(accKwikPerShare).div(1e12).sub(user.rewardDebt); } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 kwikReward = multiplier .mul(roarPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); pool.accKwikPerShare = pool.accKwikPerShare.add( kwikReward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = block.number; if (address(roar) != address(0)) { bool hasRole = roar.hasRole(roar.MINTER_ROLE(), address(this)); if (hasRole) { roar.mint(address(this), kwikReward); } } } // Deposit LP tokens to MasterChef for ROAR allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accKwikPerShare) .div(1e12) .sub(user.rewardDebt); safeKwikTransfer(msg.sender, pending); } pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accKwikPerShare).div(1e12); if (user.amount > 0) { poolUsers[_pid].add(msg.sender); } emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accKwikPerShare).div(1e12).sub( user.rewardDebt ); safeKwikTransfer(msg.sender, pending); user.amount = user.amount.sub(_amount); user.rewardDebt = user.amount.mul(pool.accKwikPerShare).div(1e12); pool.lpToken.safeTransfer(address(msg.sender), _amount); if (user.amount <= 0) { poolUsers[_pid].remove(msg.sender); } emit Withdraw(msg.sender, _pid, _amount); } function getAllPoolUsers(uint256 _pid) public view returns (address[] memory) { return poolUsers[_pid].values(); } function getAllPoolUserInfos(uint256 _pid) public view returns (address[] memory, uint256[] memory) { address[] memory userAddresses = new address[]( poolUsers[_pid].length() ); uint256[] memory amounts = new uint256[](poolUsers[_pid].length()); for (uint256 i = 0; i < poolUsers[_pid].length(); i++) { userAddresses[i] = poolUsers[_pid].at(i); amounts[i] = userInfo[_pid][poolUsers[_pid].at(i)].amount; } return (userAddresses, amounts); } // 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 roar transfer function, just in case if rounding error causes pool to not have enough ROARs. function safeKwikTransfer(address _to, uint256 _amount) internal { uint256 roarBal = roar.balanceOf(address(this)); if (_amount > roarBal) { roar.transfer(_to, roarBal); } else { roar.transfer(_to, _amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract Roar","name":"_roar","type":"address"},{"internalType":"uint256","name":"_roarPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getAllPoolUserInfos","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getAllPoolUsers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","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":"pendingKwik","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":"accKwikPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roar","outputs":[{"internalType":"contract Roar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roarPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_blockNumber","type":"uint256"}],"name":"updateRewardFirstBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Roar","name":"_roar","type":"address"}],"name":"updateRoar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006007553480156200001657600080fd5b5060405162002073380380620020738339810160408190526200003991620000c1565b620000443362000071565b600180546001600160a01b0319166001600160a01b03949094169390931790925560025560085562000106565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600060608486031215620000d757600080fd5b83516001600160a01b0381168114620000ef57600080fd5b602085015160409095015190969495509392505050565b611f5d80620001166000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806364482f79116100de578063ddb5419211610097578063e598dd9d11610071578063e598dd9d146103a0578063f1b37093146103a9578063f2fde38b146103bc578063fbd01c3d146103cf57600080fd5b8063ddb5419214610359578063e1cc38f71461036c578063e2bbb1581461038d57600080fd5b806364482f79146102a8578063715018a6146102bb5780637cd07e47146102c35780638da5cb5b146102ee5780638dbb1e3a146102ff57806393f1a40b1461031257600080fd5b8063441a3e701161014b57806348cd4cb11161012557806348cd4cb11461027157806351eb05a61461027a5780635312ea8e1461028d578063630b5ba1146102a057600080fd5b8063441a3e701461022b578063454b06081461023e578063485c57881461025157600080fd5b8063081e3eda146101935780631526fe27146101aa57806317caf6f1146101e75780631eaaa045146101f057806323cf3118146102055780633cbbd6f214610218575b600080fd5b6004545b6040519081526020015b60405180910390f35b6101bd6101b8366004611be8565b6103e2565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a1565b61019760075481565b6102036101fe366004611c31565b610426565b005b610203610213366004611b78565b610580565b610197610226366004611c01565b6105cc565b610203610239366004611c73565b61074c565b61020361024c366004611be8565b6108b4565b61026461025f366004611be8565b610b1c565b6040516101a19190611d23565b61019760085481565b610203610288366004611be8565b610b36565b61020361029b366004611be8565b610ddd565b610203610e7f565b6102036102b6366004611c95565b610eaa565b610203610f59565b6003546102d6906001600160a01b031681565b6040516001600160a01b0390911681526020016101a1565b6000546001600160a01b03166102d6565b61019761030d366004611c73565b610f8f565b610344610320366004611c01565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101a1565b610203610367366004611be8565b610fa2565b61037f61037a366004611be8565b610fd1565b6040516101a1929190611d36565b61020361039b366004611c73565b61116d565b61019760025481565b6001546102d6906001600160a01b031681565b6102036103ca366004611b78565b611299565b6102036103dd366004611b78565b611334565b600481815481106103f257600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146104595760405162461bcd60e51b815260040161045090611dc0565b60405180910390fd5b801561046757610467610e7f565b6000600854431161047a5760085461047c565b435b60075490915061048c9085611380565b600755604080516080810182526001600160a01b03948516815260208101958652908101918252600060608201818152600480546001810182559281905292517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9290930291820180546001600160a01b031916939096169290921790945593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301555090517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90910155565b6000546001600160a01b031633146105aa5760405162461bcd60e51b815260040161045090611dc0565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080600484815481106105e2576105e2611ed8565b600091825260208083208784526005825260408085206001600160a01b038981168752935280852060049485029092016003810154815492516370a0823160e01b8152309681019690965290965091949193919216906370a082319060240160206040518083038186803b15801561065957600080fd5b505afa15801561066d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106919190611bb2565b90508360020154431180156106a557508015155b156107115760006106ba856002015443610f8f565b905060006106ed6007546106e788600101546106e16002548761138c90919063ffffffff16565b9061138c565b90611398565b905061070c610705846106e78464e8d4a5100061138c565b8590611380565b935050505b61073f836001015461073964e8d4a510006106e786886000015461138c90919063ffffffff16565b906113a4565b9450505050505b92915050565b60006004838154811061076157610761611ed8565b6000918252602080832086845260058252604080852033865290925292208054600490920290920192508311156107cf5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610450565b6107d884610b36565b6000610806826001015461073964e8d4a510006106e78760030154876000015461138c90919063ffffffff16565b905061081233826113b0565b815461081e90856113a4565b808355600384015461083b9164e8d4a51000916106e7919061138c565b60018301558254610856906001600160a01b03163386611501565b81546108765760008581526006602052604090206108749033611564565b505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050505050565b6003546001600160a01b03166109035760405162461bcd60e51b815260206004820152601460248201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b6044820152606401610450565b60006004828154811061091857610918611ed8565b60009182526020822060049182020180546040516370a0823160e01b815230938101939093529093506001600160a01b0316919082906370a082319060240160206040518083038186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190611bb2565b6003549091506109c4906001600160a01b03848116911683611579565b60035460405163ce5494bb60e01b81526001600160a01b038481166004830152600092169063ce5494bb90602401602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a449190611bcb565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b158015610a8657600080fd5b505afa158015610a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abe9190611bb2565b8214610afb5760405162461bcd60e51b815260206004820152600c60248201526b1b5a59dc985d194e8818985960a21b6044820152606401610450565b83546001600160a01b0319166001600160a01b039190911617909255505050565b60008181526006602052604090206060906107469061169d565b600060048281548110610b4b57610b4b611ed8565b9060005260206000209060040201905080600201544311610b6a575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610bad57600080fd5b505afa158015610bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be59190611bb2565b905080610bf757504360029091015550565b6000610c07836002015443610f8f565b90506000610c2e6007546106e786600101546106e16002548761138c90919063ffffffff16565b9050610c51610c46846106e78464e8d4a5100061138c565b600386015490611380565b60038501554360028501556001546001600160a01b031615610dd6576001546040805163d539139360e01b815290516000926001600160a01b0316916391d1485491839163d5391393916004808301926020929190829003018186803b158015610cba57600080fd5b505afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190611bb2565b6040516001600160e01b031960e084901b168152600481019190915230602482015260440160206040518083038186803b158015610d2f57600080fd5b505afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190611b95565b90508015610dd4576001546040516340c10f1960e01b8152306004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b505050505b505b5050505050565b600060048281548110610df257610df2611ed8565b60009182526020808320858452600582526040808520338087529352909320805460049093029093018054909450610e37926001600160a01b03919091169190611501565b8054604051908152839033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a360008082556001909101555050565b60045460005b81811015610ea657610e9681610b36565b610e9f81611e91565b9050610e85565b5050565b6000546001600160a01b03163314610ed45760405162461bcd60e51b815260040161045090611dc0565b8015610ee257610ee2610e7f565b610f2582610f1f60048681548110610efc57610efc611ed8565b9060005260206000209060040201600101546007546113a490919063ffffffff16565b90611380565b6007819055508160048481548110610f3f57610f3f611ed8565b906000526020600020906004020160010181905550505050565b6000546001600160a01b03163314610f835760405162461bcd60e51b815260040161045090611dc0565b610f8d60006116aa565b565b6000610f9b82846113a4565b9392505050565b6000546001600160a01b03163314610fcc5760405162461bcd60e51b815260040161045090611dc0565b600855565b60008181526006602052604081206060918291610fed906116fa565b67ffffffffffffffff81111561100557611005611eee565b60405190808252806020026020018201604052801561102e578160200160208202803683370190505b5060008581526006602052604081209192509061104a906116fa565b67ffffffffffffffff81111561106257611062611eee565b60405190808252806020026020018201604052801561108b578160200160208202803683370190505b50905060005b60008681526006602052604090206110a8906116fa565b8110156111625760008681526006602052604090206110c79082611704565b8382815181106110d9576110d9611ed8565b6001600160a01b0390921660209283029190910182015260008781526005825260408082206006909352812061110f9084611704565b6001600160a01b03166001600160a01b031681526020019081526020016000206000015482828151811061114557611145611ed8565b60209081029190910101528061115a81611e91565b915050611091565b509094909350915050565b60006004838154811061118257611182611ed8565b600091825260208083208684526005825260408085203386529092529220600490910290910191506111b384610b36565b8054156111f65760006111e8826001015461073964e8d4a510006106e78760030154876000015461138c90919063ffffffff16565b90506111f433826113b0565b505b815461120d906001600160a01b0316333086611710565b80546112199084611380565b80825560038301546112369164e8d4a51000916106e7919061138c565b600182015580541561125c57600084815260066020526040902061125a9033611748565b505b604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a350505050565b6000546001600160a01b031633146112c35760405162461bcd60e51b815260040161045090611dc0565b6001600160a01b0381166113285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610450565b611331816116aa565b50565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260040161045090611dc0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f9b8284611df5565b6000610f9b8284611e2f565b6000610f9b8284611e0d565b6000610f9b8284611e4e565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156113f457600080fd5b505afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190611bb2565b9050808211156114c35760015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb906044015b602060405180830381600087803b15801561148557600080fd5b505af1158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd9190611b95565b50505050565b60015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb9060440161146b565b505050565b6040516001600160a01b0383166024820152604481018290526114fc90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261175d565b6000610f9b836001600160a01b03841661182f565b8015806116025750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156115c857600080fd5b505afa1580156115dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116009190611bb2565b155b61166d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610450565b6040516001600160a01b0383166024820152604481018290526114fc90849063095ea7b360e01b9060640161152d565b60606000610f9b83611922565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610746825490565b6000610f9b838361197e565b6040516001600160a01b03808516602483015283166044820152606481018290526114bd9085906323b872dd60e01b9060840161152d565b6000610f9b836001600160a01b0384166119a8565b60006117b2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119f79092919063ffffffff16565b8051909150156114fc57808060200190518101906117d09190611b95565b6114fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610450565b60008181526001830160205260408120548015611918576000611853600183611e4e565b855490915060009061186790600190611e4e565b90508181146118cc57600086600001828154811061188757611887611ed8565b90600052602060002001549050808760000184815481106118aa576118aa611ed8565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118dd576118dd611ec2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610746565b6000915050610746565b60608160000180548060200260200160405190810160405280929190818152602001828054801561197257602002820191906000526020600020905b81548152602001906001019080831161195e575b50505050509050919050565b600082600001828154811061199557611995611ed8565b9060005260206000200154905092915050565b60008181526001830160205260408120546119ef57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610746565b506000610746565b6060611a068484600085611a0e565b949350505050565b606082471015611a6f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610450565b6001600160a01b0385163b611ac65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610450565b600080866001600160a01b03168587604051611ae29190611d07565b60006040518083038185875af1925050503d8060008114611b1f576040519150601f19603f3d011682016040523d82523d6000602084013e611b24565b606091505b5091509150611b34828286611b3f565b979650505050505050565b60608315611b4e575081610f9b565b825115611b5e5782518084602001fd5b8160405162461bcd60e51b81526004016104509190611d8d565b600060208284031215611b8a57600080fd5b8135610f9b81611f04565b600060208284031215611ba757600080fd5b8151610f9b81611f19565b600060208284031215611bc457600080fd5b5051919050565b600060208284031215611bdd57600080fd5b8151610f9b81611f04565b600060208284031215611bfa57600080fd5b5035919050565b60008060408385031215611c1457600080fd5b823591506020830135611c2681611f04565b809150509250929050565b600080600060608486031215611c4657600080fd5b833592506020840135611c5881611f04565b91506040840135611c6881611f19565b809150509250925092565b60008060408385031215611c8657600080fd5b50508035926020909101359150565b600080600060608486031215611caa57600080fd5b83359250602084013591506040840135611c6881611f19565b600081518084526020808501945080840160005b83811015611cfc5781516001600160a01b031687529582019590820190600101611cd7565b509495945050505050565b60008251611d19818460208701611e65565b9190910192915050565b602081526000610f9b6020830184611cc3565b604081526000611d496040830185611cc3565b82810360208481019190915284518083528582019282019060005b81811015611d8057845183529383019391830191600101611d64565b5090979650505050505050565b6020815260008251806020840152611dac816040850160208701611e65565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611e0857611e08611eac565b500190565b600082611e2a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611e4957611e49611eac565b500290565b600082821015611e6057611e60611eac565b500390565b60005b83811015611e80578181015183820152602001611e68565b838111156114bd5750506000910152565b6000600019821415611ea557611ea5611eac565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133157600080fd5b801515811461133157600080fdfea2646970667358221220ad873376756f5e3bec4c24d8921ae001f2b4e638bb8da1ca2f5af86d6040afd764736f6c634300080700330000000000000000000000004829b57f0160427f768a5c0aa23cd3d33c7ab8330000000000000000000000000000000000000000000000004c53ecdc18a6000000000000000000000000000000000000000000000000000000000000001a06cf
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806364482f79116100de578063ddb5419211610097578063e598dd9d11610071578063e598dd9d146103a0578063f1b37093146103a9578063f2fde38b146103bc578063fbd01c3d146103cf57600080fd5b8063ddb5419214610359578063e1cc38f71461036c578063e2bbb1581461038d57600080fd5b806364482f79146102a8578063715018a6146102bb5780637cd07e47146102c35780638da5cb5b146102ee5780638dbb1e3a146102ff57806393f1a40b1461031257600080fd5b8063441a3e701161014b57806348cd4cb11161012557806348cd4cb11461027157806351eb05a61461027a5780635312ea8e1461028d578063630b5ba1146102a057600080fd5b8063441a3e701461022b578063454b06081461023e578063485c57881461025157600080fd5b8063081e3eda146101935780631526fe27146101aa57806317caf6f1146101e75780631eaaa045146101f057806323cf3118146102055780633cbbd6f214610218575b600080fd5b6004545b6040519081526020015b60405180910390f35b6101bd6101b8366004611be8565b6103e2565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a1565b61019760075481565b6102036101fe366004611c31565b610426565b005b610203610213366004611b78565b610580565b610197610226366004611c01565b6105cc565b610203610239366004611c73565b61074c565b61020361024c366004611be8565b6108b4565b61026461025f366004611be8565b610b1c565b6040516101a19190611d23565b61019760085481565b610203610288366004611be8565b610b36565b61020361029b366004611be8565b610ddd565b610203610e7f565b6102036102b6366004611c95565b610eaa565b610203610f59565b6003546102d6906001600160a01b031681565b6040516001600160a01b0390911681526020016101a1565b6000546001600160a01b03166102d6565b61019761030d366004611c73565b610f8f565b610344610320366004611c01565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101a1565b610203610367366004611be8565b610fa2565b61037f61037a366004611be8565b610fd1565b6040516101a1929190611d36565b61020361039b366004611c73565b61116d565b61019760025481565b6001546102d6906001600160a01b031681565b6102036103ca366004611b78565b611299565b6102036103dd366004611b78565b611334565b600481815481106103f257600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146104595760405162461bcd60e51b815260040161045090611dc0565b60405180910390fd5b801561046757610467610e7f565b6000600854431161047a5760085461047c565b435b60075490915061048c9085611380565b600755604080516080810182526001600160a01b03948516815260208101958652908101918252600060608201818152600480546001810182559281905292517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9290930291820180546001600160a01b031916939096169290921790945593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d8301555090517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e90910155565b6000546001600160a01b031633146105aa5760405162461bcd60e51b815260040161045090611dc0565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080600484815481106105e2576105e2611ed8565b600091825260208083208784526005825260408085206001600160a01b038981168752935280852060049485029092016003810154815492516370a0823160e01b8152309681019690965290965091949193919216906370a082319060240160206040518083038186803b15801561065957600080fd5b505afa15801561066d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106919190611bb2565b90508360020154431180156106a557508015155b156107115760006106ba856002015443610f8f565b905060006106ed6007546106e788600101546106e16002548761138c90919063ffffffff16565b9061138c565b90611398565b905061070c610705846106e78464e8d4a5100061138c565b8590611380565b935050505b61073f836001015461073964e8d4a510006106e786886000015461138c90919063ffffffff16565b906113a4565b9450505050505b92915050565b60006004838154811061076157610761611ed8565b6000918252602080832086845260058252604080852033865290925292208054600490920290920192508311156107cf5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610450565b6107d884610b36565b6000610806826001015461073964e8d4a510006106e78760030154876000015461138c90919063ffffffff16565b905061081233826113b0565b815461081e90856113a4565b808355600384015461083b9164e8d4a51000916106e7919061138c565b60018301558254610856906001600160a01b03163386611501565b81546108765760008581526006602052604090206108749033611564565b505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050505050565b6003546001600160a01b03166109035760405162461bcd60e51b815260206004820152601460248201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b6044820152606401610450565b60006004828154811061091857610918611ed8565b60009182526020822060049182020180546040516370a0823160e01b815230938101939093529093506001600160a01b0316919082906370a082319060240160206040518083038186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190611bb2565b6003549091506109c4906001600160a01b03848116911683611579565b60035460405163ce5494bb60e01b81526001600160a01b038481166004830152600092169063ce5494bb90602401602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a449190611bcb565b6040516370a0823160e01b81523060048201529091506001600160a01b038216906370a082319060240160206040518083038186803b158015610a8657600080fd5b505afa158015610a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abe9190611bb2565b8214610afb5760405162461bcd60e51b815260206004820152600c60248201526b1b5a59dc985d194e8818985960a21b6044820152606401610450565b83546001600160a01b0319166001600160a01b039190911617909255505050565b60008181526006602052604090206060906107469061169d565b600060048281548110610b4b57610b4b611ed8565b9060005260206000209060040201905080600201544311610b6a575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610bad57600080fd5b505afa158015610bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be59190611bb2565b905080610bf757504360029091015550565b6000610c07836002015443610f8f565b90506000610c2e6007546106e786600101546106e16002548761138c90919063ffffffff16565b9050610c51610c46846106e78464e8d4a5100061138c565b600386015490611380565b60038501554360028501556001546001600160a01b031615610dd6576001546040805163d539139360e01b815290516000926001600160a01b0316916391d1485491839163d5391393916004808301926020929190829003018186803b158015610cba57600080fd5b505afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190611bb2565b6040516001600160e01b031960e084901b168152600481019190915230602482015260440160206040518083038186803b158015610d2f57600080fd5b505afa158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190611b95565b90508015610dd4576001546040516340c10f1960e01b8152306004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b505050505b505b5050505050565b600060048281548110610df257610df2611ed8565b60009182526020808320858452600582526040808520338087529352909320805460049093029093018054909450610e37926001600160a01b03919091169190611501565b8054604051908152839033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a360008082556001909101555050565b60045460005b81811015610ea657610e9681610b36565b610e9f81611e91565b9050610e85565b5050565b6000546001600160a01b03163314610ed45760405162461bcd60e51b815260040161045090611dc0565b8015610ee257610ee2610e7f565b610f2582610f1f60048681548110610efc57610efc611ed8565b9060005260206000209060040201600101546007546113a490919063ffffffff16565b90611380565b6007819055508160048481548110610f3f57610f3f611ed8565b906000526020600020906004020160010181905550505050565b6000546001600160a01b03163314610f835760405162461bcd60e51b815260040161045090611dc0565b610f8d60006116aa565b565b6000610f9b82846113a4565b9392505050565b6000546001600160a01b03163314610fcc5760405162461bcd60e51b815260040161045090611dc0565b600855565b60008181526006602052604081206060918291610fed906116fa565b67ffffffffffffffff81111561100557611005611eee565b60405190808252806020026020018201604052801561102e578160200160208202803683370190505b5060008581526006602052604081209192509061104a906116fa565b67ffffffffffffffff81111561106257611062611eee565b60405190808252806020026020018201604052801561108b578160200160208202803683370190505b50905060005b60008681526006602052604090206110a8906116fa565b8110156111625760008681526006602052604090206110c79082611704565b8382815181106110d9576110d9611ed8565b6001600160a01b0390921660209283029190910182015260008781526005825260408082206006909352812061110f9084611704565b6001600160a01b03166001600160a01b031681526020019081526020016000206000015482828151811061114557611145611ed8565b60209081029190910101528061115a81611e91565b915050611091565b509094909350915050565b60006004838154811061118257611182611ed8565b600091825260208083208684526005825260408085203386529092529220600490910290910191506111b384610b36565b8054156111f65760006111e8826001015461073964e8d4a510006106e78760030154876000015461138c90919063ffffffff16565b90506111f433826113b0565b505b815461120d906001600160a01b0316333086611710565b80546112199084611380565b80825560038301546112369164e8d4a51000916106e7919061138c565b600182015580541561125c57600084815260066020526040902061125a9033611748565b505b604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a350505050565b6000546001600160a01b031633146112c35760405162461bcd60e51b815260040161045090611dc0565b6001600160a01b0381166113285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610450565b611331816116aa565b50565b6000546001600160a01b0316331461135e5760405162461bcd60e51b815260040161045090611dc0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f9b8284611df5565b6000610f9b8284611e2f565b6000610f9b8284611e0d565b6000610f9b8284611e4e565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b1580156113f457600080fd5b505afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c9190611bb2565b9050808211156114c35760015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb906044015b602060405180830381600087803b15801561148557600080fd5b505af1158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd9190611b95565b50505050565b60015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb9060440161146b565b505050565b6040516001600160a01b0383166024820152604481018290526114fc90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261175d565b6000610f9b836001600160a01b03841661182f565b8015806116025750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156115c857600080fd5b505afa1580156115dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116009190611bb2565b155b61166d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610450565b6040516001600160a01b0383166024820152604481018290526114fc90849063095ea7b360e01b9060640161152d565b60606000610f9b83611922565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610746825490565b6000610f9b838361197e565b6040516001600160a01b03808516602483015283166044820152606481018290526114bd9085906323b872dd60e01b9060840161152d565b6000610f9b836001600160a01b0384166119a8565b60006117b2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119f79092919063ffffffff16565b8051909150156114fc57808060200190518101906117d09190611b95565b6114fc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610450565b60008181526001830160205260408120548015611918576000611853600183611e4e565b855490915060009061186790600190611e4e565b90508181146118cc57600086600001828154811061188757611887611ed8565b90600052602060002001549050808760000184815481106118aa576118aa611ed8565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118dd576118dd611ec2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610746565b6000915050610746565b60608160000180548060200260200160405190810160405280929190818152602001828054801561197257602002820191906000526020600020905b81548152602001906001019080831161195e575b50505050509050919050565b600082600001828154811061199557611995611ed8565b9060005260206000200154905092915050565b60008181526001830160205260408120546119ef57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610746565b506000610746565b6060611a068484600085611a0e565b949350505050565b606082471015611a6f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610450565b6001600160a01b0385163b611ac65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610450565b600080866001600160a01b03168587604051611ae29190611d07565b60006040518083038185875af1925050503d8060008114611b1f576040519150601f19603f3d011682016040523d82523d6000602084013e611b24565b606091505b5091509150611b34828286611b3f565b979650505050505050565b60608315611b4e575081610f9b565b825115611b5e5782518084602001fd5b8160405162461bcd60e51b81526004016104509190611d8d565b600060208284031215611b8a57600080fd5b8135610f9b81611f04565b600060208284031215611ba757600080fd5b8151610f9b81611f19565b600060208284031215611bc457600080fd5b5051919050565b600060208284031215611bdd57600080fd5b8151610f9b81611f04565b600060208284031215611bfa57600080fd5b5035919050565b60008060408385031215611c1457600080fd5b823591506020830135611c2681611f04565b809150509250929050565b600080600060608486031215611c4657600080fd5b833592506020840135611c5881611f04565b91506040840135611c6881611f19565b809150509250925092565b60008060408385031215611c8657600080fd5b50508035926020909101359150565b600080600060608486031215611caa57600080fd5b83359250602084013591506040840135611c6881611f19565b600081518084526020808501945080840160005b83811015611cfc5781516001600160a01b031687529582019590820190600101611cd7565b509495945050505050565b60008251611d19818460208701611e65565b9190910192915050565b602081526000610f9b6020830184611cc3565b604081526000611d496040830185611cc3565b82810360208481019190915284518083528582019282019060005b81811015611d8057845183529383019391830191600101611d64565b5090979650505050505050565b6020815260008251806020840152611dac816040850160208701611e65565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611e0857611e08611eac565b500190565b600082611e2a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611e4957611e49611eac565b500290565b600082821015611e6057611e60611eac565b500390565b60005b83811015611e80578181015183820152602001611e68565b838111156114bd5750506000910152565b6000600019821415611ea557611ea5611eac565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133157600080fd5b801515811461133157600080fdfea2646970667358221220ad873376756f5e3bec4c24d8921ae001f2b4e638bb8da1ca2f5af86d6040afd764736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004829b57f0160427f768a5c0aa23cd3d33c7ab8330000000000000000000000000000000000000000000000004c53ecdc18a6000000000000000000000000000000000000000000000000000000000000001a06cf
-----Decoded View---------------
Arg [0] : _roar (address): 0x4829b57F0160427F768a5C0Aa23cD3D33c7Ab833
Arg [1] : _roarPerBlock (uint256): 5500000000000000000
Arg [2] : _startBlock (uint256): 1705679
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004829b57f0160427f768a5c0aa23cd3d33c7ab833
Arg [1] : 0000000000000000000000000000000000000000000000004c53ecdc18a60000
Arg [2] : 00000000000000000000000000000000000000000000000000000000001a06cf
Deployed Bytecode Sourcemap
74948:10861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77558:95;77630:8;:15;77558:95;;;11630:25:1;;;11618:2;11603:18;77558:95:0;;;;;;;;76624:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7068:32:1;;;7050:51;;7132:2;7117:18;;7110:34;;;;7160:18;;;7153:34;7218:2;7203:18;;7196:34;7037:3;7022:19;76624:26:0;6806:430:1;76934:34:0;;;;;;77912:617;;;;;;:::i;:::-;;:::i;:::-;;79063:102;;;;;;:::i;:::-;;:::i;80238:926::-;;;;;;:::i;:::-;;:::i;83472:769::-;;;;;;:::i;:::-;;:::i;79288:491::-;;;;;;:::i;:::-;;:::i;84249:160::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77025:25::-;;;;;;81503:981;;;;;;:::i;:::-;;:::i;85058:356::-;;;;;;:::i;:::-;;:::i;81247:180::-;;;:::i;78625:362::-;;;;;;:::i;:::-;;:::i;26283:103::-;;;:::i;76559:29::-;;;;;-1:-1:-1;;;;;76559:29:0;;;;;;-1:-1:-1;;;;;4219:32:1;;;4201:51;;4189:2;4174:18;76559:29:0;4055:203:1;25632:87:0;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;25632:87;;80021:153;;;;;;:::i;:::-;;:::i;76706:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11840:25:1;;;11896:2;11881:18;;11874:34;;;;11813:18;76706:64:0;11666:248:1;79830:115:0;;;;;;:::i;:::-;;:::i;84417:570::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;82553:867::-;;;;;;:::i;:::-;;:::i;76425:27::-;;;;;;76363:16;;;;;-1:-1:-1;;;;;76363:16:0;;;26541:238;;;;;;:::i;:::-;;:::i;77661:82::-;;;;;;:::i;:::-;;:::i;76624:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76624:26:0;;;;-1:-1:-1;76624:26:0;;;:::o;77912:617::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;;;;;;;;;78047:11:::1;78043:61;;;78075:17;:15;:17::i;:::-;78114:23;78155:10;;78140:12;:25;:79;;78209:10;;78140:79;;;78181:12;78140:79;78248:15;::::0;78114:105;;-1:-1:-1;78248:32:0::1;::::0;78268:11;78248:19:::1;:32::i;:::-;78230:15;:50:::0;78319:191:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;78319:191:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;78319:191:0;;;;;;78291:8:::1;:230:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;78291:230:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;78291:230:0;;;;;;;77912:617::o;79063:102::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;79137:8:::1;:20:::0;;-1:-1:-1;;;;;;79137:20:0::1;-1:-1:-1::0;;;;;79137:20:0;;;::::1;::::0;;;::::1;::::0;;79063:102::o;80238:926::-;80338:7;80363:21;80387:8;80396:4;80387:14;;;;;;;;:::i;:::-;;;;;;;;;80436;;;:8;:14;;;;;;-1:-1:-1;;;;;80436:21:0;;;;;;;;;;80387:14;;;;;;;80494:20;;;;80544:12;;:37;;-1:-1:-1;;;80544:37:0;;80575:4;80544:37;;;4201:51:1;;;;80387:14:0;;-1:-1:-1;80436:21:0;;80494:20;;80387:14;;80544:12;;:22;;4174:18:1;;80544:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80525:56;;80611:4;:20;;;80596:12;:35;:52;;;;-1:-1:-1;80635:13:0;;;80596:52;80592:484;;;80665:18;80686:98;80718:4;:20;;;80757:12;80686:13;:98::i;:::-;80665:119;;80799:18;80820:124;80928:15;;80820:85;80889:4;:15;;;80820:46;80853:12;;80820:10;:32;;:46;;;;:::i;:::-;:68;;:85::i;:::-;:107;;:124::i;:::-;80799:145;-1:-1:-1;80977:87:0;81015:34;81040:8;81015:20;80799:145;81030:4;81015:14;:20::i;:34::-;80977:15;;:19;:87::i;:::-;80959:105;;80650:426;;80592:484;81093:63;81140:4;:15;;;81093:42;81130:4;81093:32;81109:15;81093:4;:11;;;:15;;:32;;;;:::i;:42::-;:46;;:63::i;:::-;81086:70;;;;;;80238:926;;;;;:::o;83472:769::-;83539:21;83563:8;83572:4;83563:14;;;;;;;;:::i;:::-;;;;;;;;;83612;;;:8;:14;;;;;;83627:10;83612:26;;;;;;;83657:11;;83563:14;;;;;;;;-1:-1:-1;83657:22:0;-1:-1:-1;83657:22:0;83649:53;;;;-1:-1:-1;;;83649:53:0;;9815:2:1;83649:53:0;;;9797:21:1;9854:2;9834:18;;;9827:30;-1:-1:-1;;;9873:18:1;;;9866:48;9931:18;;83649:53:0;9613:342:1;83649:53:0;83713:16;83724:4;83713:10;:16::i;:::-;83740:15;83758:92;83824:4;:15;;;83758:47;83800:4;83758:37;83774:4;:20;;;83758:4;:11;;;:15;;:37;;;;:::i;:92::-;83740:110;;83861:37;83878:10;83890:7;83861:16;:37::i;:::-;83923:11;;:24;;83939:7;83923:15;:24::i;:::-;83909:38;;;83992:20;;;;83976:47;;84018:4;;83976:37;;83909:38;83976:15;:37::i;:47::-;83958:15;;;:65;84034:12;;:55;;-1:-1:-1;;;;;84034:12:0;84068:10;84081:7;84034:25;:55::i;:::-;84104:11;;84100:83;;84137:15;;;;:9;:15;;;;;:34;;84160:10;84137:22;:34::i;:::-;;84100:83;84198:35;;11630:25:1;;;84219:4:0;;84207:10;;84198:35;;11618:2:1;11603:18;84198:35:0;;;;;;;83528:713;;;83472:769;;:::o;79288:491::-;79353:8;;-1:-1:-1;;;;;79353:8:0;79337:64;;;;-1:-1:-1;;;79337:64:0;;11337:2:1;79337:64:0;;;11319:21:1;11376:2;11356:18;;;11349:30;-1:-1:-1;;;11395:18:1;;;11388:50;11455:18;;79337:64:0;11135:344:1;79337:64:0;79412:21;79436:8;79445:4;79436:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;79478:12;;79515:32;;-1:-1:-1;;;79515:32:0;;79541:4;79515:32;;;4201:51:1;;;;79436:14:0;;-1:-1:-1;;;;;;79478:12:0;;79436:14;79478:12;;79515:17;;4174:18:1;;79515:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79586:8;;79501:46;;-1:-1:-1;79558:43:0;;-1:-1:-1;;;;;79558:19:0;;;;79586:8;79501:46;79558:19;:43::i;:::-;79632:8;;:25;;-1:-1:-1;;;79632:25:0;;-1:-1:-1;;;;;4219:32:1;;;79632:25:0;;;4201:51:1;79612:17:0;;79632:8;;:16;;4174:18:1;;79632:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79683:35;;-1:-1:-1;;;79683:35:0;;79712:4;79683:35;;;4201:51:1;79612:45:0;;-1:-1:-1;;;;;;79683:20:0;;;;;4174:18:1;;79683:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79676:3;:42;79668:67;;;;-1:-1:-1;;;79668:67:0;;10573:2:1;79668:67:0;;;10555:21:1;10612:2;10592:18;;;10585:30;-1:-1:-1;;;10631:18:1;;;10624:42;10683:18;;79668:67:0;10371:336:1;79668:67:0;79746:25;;-1:-1:-1;;;;;;79746:25:0;-1:-1:-1;;;;;79746:25:0;;;;;;;;-1:-1:-1;;;79288:491:0:o;84249:160::-;84377:15;;;;:9;:15;;;;;84336:16;;84377:24;;:22;:24::i;81503:981::-;81555:21;81579:8;81588:4;81579:14;;;;;;;;:::i;:::-;;;;;;;;;;;81555:38;;81624:4;:20;;;81608:12;:36;81604:75;;81661:7;81503:981;:::o;81604:75::-;81708:12;;:37;;-1:-1:-1;;;81708:37:0;;81739:4;81708:37;;;4201:51:1;81689:16:0;;-1:-1:-1;;;;;81708:12:0;;:22;;4174:18:1;;81708:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81689:56;-1:-1:-1;81760:13:0;81756:102;;-1:-1:-1;81813:12:0;81790:20;;;;:35;-1:-1:-1;81503:981:0:o;81756:102::-;81868:18;81889:49;81903:4;:20;;;81925:12;81889:13;:49::i;:::-;81868:70;;81949:18;81970:112;82066:15;;81970:77;82031:4;:15;;;81970:42;81999:12;;81970:10;:28;;:42;;;;:::i;:112::-;81949:133;-1:-1:-1;82116:84:0;82155:34;82180:8;82155:20;81949:133;82170:4;82155:14;:20::i;:34::-;82116:20;;;;;:24;:84::i;:::-;82093:20;;;:107;82234:12;82211:20;;;:35;-1:-1:-1;82269:4:0;-1:-1:-1;;;;;82269:4:0;82261:27;82257:220;;82320:4;;82333:18;;;-1:-1:-1;;;82333:18:0;;;;82305:12;;-1:-1:-1;;;;;82320:4:0;;:12;;:4;;82333:16;;:18;;;;;;;;;;;;;;82320:4;82333:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82320:47;;-1:-1:-1;;;;;;82320:47:0;;;;;;;;;;6480:25:1;;;;82361:4:0;6521:18:1;;;6514:60;6453:18;;82320:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82305:62;;82386:7;82382:84;;;82414:4;;:36;;-1:-1:-1;;;82414:36:0;;82432:4;82414:36;;;5126:51:1;5193:18;;;5186:34;;;-1:-1:-1;;;;;82414:4:0;;;;:9;;5099:18:1;;82414:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82382:84;82290:187;82257:220;81544:940;;;;81503:981;:::o;85058:356::-;85117:21;85141:8;85150:4;85141:14;;;;;;;;:::i;:::-;;;;;;;;;85190;;;:8;:14;;;;;;85205:10;85190:26;;;;;;;;85274:11;;85141:14;;;;;;;85227:12;;85141:14;;-1:-1:-1;85227:59:0;;-1:-1:-1;;;;;85227:12:0;;;;;85205:10;85227:25;:59::i;:::-;85338:11;;85302:48;;11630:25:1;;;85332:4:0;;85320:10;;85302:48;;11618:2:1;11603:18;85302:48:0;;;;;;;85375:1;85361:15;;;85387;;;;:19;-1:-1:-1;;85058:356:0:o;81247:180::-;81309:8;:15;81292:14;81335:85;81363:6;81357:3;:12;81335:85;;;81393:15;81404:3;81393:10;:15::i;:::-;81371:5;;;:::i;:::-;;;81335:85;;;;81281:146;81247:180::o;78625:362::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;78757:11:::1;78753:61;;;78785:17;:15;:17::i;:::-;78842:87;78907:11;78842:46;78862:8;78871:4;78862:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;78842:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;78824:15;:105;;;;78968:11;78940:8;78949:4;78940:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;78625:362:::0;;;:::o;26283:103::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;26348:30:::1;26375:1;26348:18;:30::i;:::-;26283:103::o:0;80021:153::-;80120:7;80152:14;:3;80160:5;80152:7;:14::i;:::-;80145:21;80021:153;-1:-1:-1;;;80021:153:0:o;79830:115::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;79912:10:::1;:25:::0;79830:115::o;84417:570::-;84560:30;84621:15;;;:9;:15;;;;;84508:16;;;;84621:24;;:22;:24::i;:::-;84593:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84593:63:0;-1:-1:-1;84667:24:0;84708:15;;;:9;:15;;;;;84560:96;;-1:-1:-1;84667:24:0;84708;;:22;:24::i;:::-;84694:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84694:39:0;;84667:66;;84749:9;84744:194;84768:15;;;;:9;:15;;;;;:24;;:22;:24::i;:::-;84764:1;:28;84744:194;;;84833:15;;;;:9;:15;;;;;:21;;84852:1;84833:18;:21::i;:::-;84814:13;84828:1;84814:16;;;;;;;;:::i;:::-;-1:-1:-1;;;;;84814:40:0;;;:16;;;;;;;;;;:40;84882:14;;;;:8;:14;;;;;;84897:9;:15;;;;;:21;;84916:1;84897:18;:21::i;:::-;-1:-1:-1;;;;;84882:37:0;-1:-1:-1;;;;;84882:37:0;;;;;;;;;;;;:44;;;84869:7;84877:1;84869:10;;;;;;;;:::i;:::-;;;;;;;;;;:57;84794:3;;;;:::i;:::-;;;;84744:194;;;-1:-1:-1;84956:13:0;;84971:7;;-1:-1:-1;84417:570:0;-1:-1:-1;;84417:570:0:o;82553:867::-;82619:21;82643:8;82652:4;82643:14;;;;;;;;:::i;:::-;;;;;;;;;82692;;;:8;:14;;;;;;82707:10;82692:26;;;;;;;82643:14;;;;;;;;-1:-1:-1;82729:16:0;82701:4;82729:10;:16::i;:::-;82760:11;;:15;82756:258;;82792:15;82810:140;82934:4;:15;;;82810:101;82906:4;82810:73;82862:4;:20;;;82810:4;:29;;;:51;;:73;;;;:::i;:140::-;82792:158;;82965:37;82982:10;82994:7;82965:16;:37::i;:::-;82777:237;82756:258;83024:12;;:124;;-1:-1:-1;;;;;83024:12:0;83076:10;83110:4;83130:7;83024:29;:124::i;:::-;83173:11;;:24;;83189:7;83173:15;:24::i;:::-;83159:38;;;83242:20;;;;83226:47;;83268:4;;83226:37;;83159:38;83226:15;:37::i;:47::-;83208:15;;;:65;83288:11;;:15;83284:79;;83320:15;;;;:9;:15;;;;;:31;;83340:10;83320:19;:31::i;:::-;;83284:79;83378:34;;11630:25:1;;;83398:4:0;;83386:10;;83378:34;;11618:2:1;11603:18;83378:34:0;;;;;;;82608:812;;82553:867;;:::o;26541:238::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26644:22:0;::::1;26622:110;;;::::0;-1:-1:-1;;;26622:110:0;;8282:2:1;26622:110:0::1;::::0;::::1;8264:21:1::0;8321:2;8301:18;;;8294:30;8360:34;8340:18;;;8333:62;-1:-1:-1;;;8411:18:1;;;8404:36;8457:19;;26622:110:0::1;8080:402:1::0;26622:110:0::1;26743:28;26762:8;26743:18;:28::i;:::-;26541:238:::0;:::o;77661:82::-;25678:7;25705:6;-1:-1:-1;;;;;25705:6:0;24409:10;25852:23;25844:68;;;;-1:-1:-1;;;25844:68:0;;;;;;;:::i;:::-;77723:4:::1;:12:::0;;-1:-1:-1;;;;;;77723:12:0::1;-1:-1:-1::0;;;;;77723:12:0;;;::::1;::::0;;;::::1;::::0;;77661:82::o;19481:98::-;19539:7;19566:5;19570:1;19566;:5;:::i;20219:98::-;20277:7;20304:5;20308:1;20304;:5;:::i;20618:98::-;20676:7;20703:5;20707:1;20703;:5;:::i;19862:98::-;19920:7;19947:5;19951:1;19947;:5;:::i;85528:278::-;85622:4;;:29;;-1:-1:-1;;;85622:29:0;;85645:4;85622:29;;;4201:51:1;85604:15:0;;-1:-1:-1;;;;;85622:4:0;;:14;;4174:18:1;;85622:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85604:47;;85676:7;85666;:17;85662:137;;;85700:4;;:27;;-1:-1:-1;;;85700:27:0;;-1:-1:-1;;;;;5144:32:1;;;85700:27:0;;;5126:51:1;5193:18;;;5186:34;;;85700:4:0;;;;:13;;5099:18:1;;85700:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;85593:213;85528:278;;:::o;85662:137::-;85760:4;;:27;;-1:-1:-1;;;85760:27:0;;-1:-1:-1;;;;;5144:32:1;;;85760:27:0;;;5126:51:1;5193:18;;;5186:34;;;85760:4:0;;;;:13;;5099:18:1;;85760:27:0;4952:274:1;85662:137:0;85593:213;85528:278;;:::o;12679:248::-;12850:58;;-1:-1:-1;;;;;5144:32:1;;12850:58:0;;;5126:51:1;5193:18;;;5186:34;;;12796:123:0;;12830:5;;-1:-1:-1;;;12873:23:0;5099:18:1;;12850:58:0;;;;-1:-1:-1;;12850:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;12850:58:0;-1:-1:-1;;;;;;12850:58:0;;;;;;;;;;12796:19;:123::i;35570:181::-;35661:4;35690:53;35698:3;-1:-1:-1;;;;;35718:23:0;;35690:7;:53::i;13489:653::-;13853:10;;;13852:62;;-1:-1:-1;13869:39:0;;-1:-1:-1;;;13869:39:0;;13893:4;13869:39;;;4475:34:1;-1:-1:-1;;;;;4545:15:1;;;4525:18;;;4518:43;13869:15:0;;;;;4410:18:1;;13869:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;13852:62;13830:166;;;;-1:-1:-1;;;13830:166:0;;10914:2:1;13830:166:0;;;10896:21:1;10953:2;10933:18;;;10926:30;10992:34;10972:18;;;10965:62;-1:-1:-1;;;11043:18:1;;;11036:52;11105:19;;13830:166:0;10712:418:1;13830:166:0;14061:62;;-1:-1:-1;;;;;5144:32:1;;14061:62:0;;;5126:51:1;5193:18;;;5186:34;;;14007:127:0;;14041:5;;-1:-1:-1;;;14084:22:0;5099:18:1;;14061:62:0;4952:274:1;37333:298:0;37423:16;37457:22;37482:19;37490:3;37482:7;:19::i;26939:191::-;27013:16;27032:6;;-1:-1:-1;;;;;27049:17:0;;;-1:-1:-1;;;;;;27049:17:0;;;;;;27082:40;;27032:6;;;;;;;27082:40;;27013:16;27082:40;27002:128;26939:191;:::o;36122:117::-;36185:7;36212:19;36220:3;31354:18;;31271:109;36593:190;36694:7;36750:22;36754:3;36766:5;36750:3;:22::i;12935:285::-;13133:68;;-1:-1:-1;;;;;4830:15:1;;;13133:68:0;;;4812:34:1;4882:15;;4862:18;;;4855:43;4914:18;;;4907:34;;;13079:133:0;;13113:5;;-1:-1:-1;;;13156:27:0;4747:18:1;;13133:68:0;4572:375:1;35219:175:0;35307:4;35336:50;35341:3;-1:-1:-1;;;;;35361:23:0;;35336:4;:50::i;15646:802::-;16070:23;16096:106;16138:4;16096:106;;;;;;;;;;;;;;;;;16104:5;-1:-1:-1;;;;;16096:27:0;;;:106;;;;;:::i;:::-;16217:17;;16070:132;;-1:-1:-1;16217:21:0;16213:228;;16332:10;16321:30;;;;;;;;;;;;:::i;:::-;16295:134;;;;-1:-1:-1;;;16295:134:0;;10162:2:1;16295:134:0;;;10144:21:1;10201:2;10181:18;;;10174:30;10240:34;10220:18;;;10213:62;-1:-1:-1;;;10291:18:1;;;10284:40;10341:19;;16295:134:0;9960:406:1;29518:1420:0;29584:4;29723:19;;;:12;;;:19;;;;;;29759:15;;29755:1176;;30134:21;30158:14;30171:1;30158:10;:14;:::i;:::-;30207:18;;30134:38;;-1:-1:-1;30187:17:0;;30207:22;;30228:1;;30207:22;:::i;:::-;30187:42;;30263:13;30250:9;:26;30246:405;;30297:17;30317:3;:11;;30329:9;30317:22;;;;;;;;:::i;:::-;;;;;;;;;30297:42;;30471:9;30442:3;:11;;30454:13;30442:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;30556:23;;;:12;;;:23;;;;;:36;;;30246:405;30732:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30827:3;:12;;:19;30840:5;30827:19;;;;;;;;;;;30820:26;;;30870:4;30863:11;;;;;;;29755:1176;30914:5;30907:12;;;;;32436:111;32492:16;32528:3;:11;;32521:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32436:111;;;:::o;31734:152::-;31828:7;31860:3;:11;;31872:5;31860:18;;;;;;;;:::i;:::-;;;;;;;;;31853:25;;31734:152;;;;:::o;28928:414::-;28991:4;31153:19;;;:12;;;:19;;;;;;29008:327;;-1:-1:-1;29051:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;29234:18;;29212:19;;;:12;;;:19;;;;;;:40;;;;29267:11;;29008:327;-1:-1:-1;29318:5:0;29311:12;;7087:229;7224:12;7256:52;7278:6;7286:4;7292:1;7295:12;7256:21;:52::i;:::-;7249:59;7087:229;-1:-1:-1;;;;7087:229:0:o;8303:571::-;8473:12;8545:5;8520:21;:30;;8498:118;;;;-1:-1:-1;;;8498:118:0;;8689:2:1;8498:118:0;;;8671:21:1;8728:2;8708:18;;;8701:30;8767:34;8747:18;;;8740:62;-1:-1:-1;;;8818:18:1;;;8811:36;8864:19;;8498:118:0;8487:402:1;8498:118:0;-1:-1:-1;;;;;4540:19:0;;;8627:60;;;;-1:-1:-1;;;8627:60:0;;9457:2:1;8627:60:0;;;9439:21:1;9496:2;9476:18;;;9469:30;9535:31;9515:18;;;9508:59;9584:18;;8627:60:0;9255:353:1;8627:60:0;8701:12;8715:23;8742:6;-1:-1:-1;;;;;8742:11:0;8761:5;8782:4;8742:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8700:97;;;;8815:51;8832:7;8841:10;8853:12;8815:16;:51::i;:::-;8808:58;8303:571;-1:-1:-1;;;;;;;8303:571:0:o;11263:712::-;11413:12;11442:7;11438:530;;;-1:-1:-1;11473:10:0;11466:17;;11438:530;11587:17;;:21;11583:374;;11785:10;11779:17;11846:15;11833:10;11829:2;11825:19;11818:44;11583:374;11928:12;11921:20;;-1:-1:-1;;;11921:20:0;;;;;;;;:::i;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:245::-;333:6;386:2;374:9;365:7;361:23;357:32;354:52;;;402:1;399;392:12;354:52;434:9;428:16;453:28;475:5;453:28;:::i;516:184::-;586:6;639:2;627:9;618:7;614:23;610:32;607:52;;;655:1;652;645:12;607:52;-1:-1:-1;678:16:1;;516:184;-1:-1:-1;516:184:1:o;705:264::-;788:6;841:2;829:9;820:7;816:23;812:32;809:52;;;857:1;854;847:12;809:52;889:9;883:16;908:31;933:5;908:31;:::i;1513:180::-;1572:6;1625:2;1613:9;1604:7;1600:23;1596:32;1593:52;;;1641:1;1638;1631:12;1593:52;-1:-1:-1;1664:23:1;;1513:180;-1:-1:-1;1513:180:1:o;1887:315::-;1955:6;1963;2016:2;2004:9;1995:7;1991:23;1987:32;1984:52;;;2032:1;2029;2022:12;1984:52;2068:9;2055:23;2045:33;;2128:2;2117:9;2113:18;2100:32;2141:31;2166:5;2141:31;:::i;:::-;2191:5;2181:15;;;1887:315;;;;;:::o;2207:463::-;2294:6;2302;2310;2363:2;2351:9;2342:7;2338:23;2334:32;2331:52;;;2379:1;2376;2369:12;2331:52;2415:9;2402:23;2392:33;;2475:2;2464:9;2460:18;2447:32;2488:31;2513:5;2488:31;:::i;:::-;2538:5;-1:-1:-1;2595:2:1;2580:18;;2567:32;2608:30;2567:32;2608:30;:::i;:::-;2657:7;2647:17;;;2207:463;;;;;:::o;2675:248::-;2743:6;2751;2804:2;2792:9;2783:7;2779:23;2775:32;2772:52;;;2820:1;2817;2810:12;2772:52;-1:-1:-1;;2843:23:1;;;2913:2;2898:18;;;2885:32;;-1:-1:-1;2675:248:1:o;2928:377::-;3002:6;3010;3018;3071:2;3059:9;3050:7;3046:23;3042:32;3039:52;;;3087:1;3084;3077:12;3039:52;3123:9;3110:23;3100:33;;3180:2;3169:9;3165:18;3152:32;3142:42;;3234:2;3223:9;3219:18;3206:32;3247:28;3269:5;3247:28;:::i;3310:461::-;3363:3;3401:5;3395:12;3428:6;3423:3;3416:19;3454:4;3483:2;3478:3;3474:12;3467:19;;3520:2;3513:5;3509:14;3541:1;3551:195;3565:6;3562:1;3559:13;3551:195;;;3630:13;;-1:-1:-1;;;;;3626:39:1;3614:52;;3686:12;;;;3721:15;;;;3662:1;3580:9;3551:195;;;-1:-1:-1;3762:3:1;;3310:461;-1:-1:-1;;;;;3310:461:1:o;3776:274::-;3905:3;3943:6;3937:13;3959:53;4005:6;4000:3;3993:4;3985:6;3981:17;3959:53;:::i;:::-;4028:16;;;;;3776:274;-1:-1:-1;;3776:274:1:o;5231:261::-;5410:2;5399:9;5392:21;5373:4;5430:56;5482:2;5471:9;5467:18;5459:6;5430:56;:::i;5497:804::-;5754:2;5743:9;5736:21;5717:4;5780:56;5832:2;5821:9;5817:18;5809:6;5780:56;:::i;:::-;5893:22;;;5855:2;5873:18;;;5866:50;;;;5965:13;;5987:22;;;6063:15;;;;6025;;;6096:1;6106:169;6120:6;6117:1;6114:13;6106:169;;;6181:13;;6169:26;;6250:15;;;;6215:12;;;;6142:1;6135:9;6106:169;;;-1:-1:-1;6292:3:1;;5497:804;-1:-1:-1;;;;;;;5497:804:1:o;7692:383::-;7841:2;7830:9;7823:21;7804:4;7873:6;7867:13;7916:6;7911:2;7900:9;7896:18;7889:34;7932:66;7991:6;7986:2;7975:9;7971:18;7966:2;7958:6;7954:15;7932:66;:::i;:::-;8059:2;8038:15;-1:-1:-1;;8034:29:1;8019:45;;;;8066:2;8015:54;;7692:383;-1:-1:-1;;7692:383:1:o;8894:356::-;9096:2;9078:21;;;9115:18;;;9108:30;9174:34;9169:2;9154:18;;9147:62;9241:2;9226:18;;8894:356::o;11919:128::-;11959:3;11990:1;11986:6;11983:1;11980:13;11977:39;;;11996:18;;:::i;:::-;-1:-1:-1;12032:9:1;;11919:128::o;12052:217::-;12092:1;12118;12108:132;;12162:10;12157:3;12153:20;12150:1;12143:31;12197:4;12194:1;12187:15;12225:4;12222:1;12215:15;12108:132;-1:-1:-1;12254:9:1;;12052:217::o;12274:168::-;12314:7;12380:1;12376;12372:6;12368:14;12365:1;12362:21;12357:1;12350:9;12343:17;12339:45;12336:71;;;12387:18;;:::i;:::-;-1:-1:-1;12427:9:1;;12274:168::o;12447:125::-;12487:4;12515:1;12512;12509:8;12506:34;;;12520:18;;:::i;:::-;-1:-1:-1;12557:9:1;;12447:125::o;12577:258::-;12649:1;12659:113;12673:6;12670:1;12667:13;12659:113;;;12749:11;;;12743:18;12730:11;;;12723:39;12695:2;12688:10;12659:113;;;12790:6;12787:1;12784:13;12781:48;;;-1:-1:-1;;12825:1:1;12807:16;;12800:27;12577:258::o;12840:135::-;12879:3;-1:-1:-1;;12900:17:1;;12897:43;;;12920:18;;:::i;:::-;-1:-1:-1;12967:1:1;12956:13;;12840:135::o;12980:127::-;13041:10;13036:3;13032:20;13029:1;13022:31;13072:4;13069:1;13062:15;13096:4;13093:1;13086:15;13112:127;13173:10;13168:3;13164:20;13161:1;13154:31;13204:4;13201:1;13194:15;13228:4;13225:1;13218:15;13244:127;13305:10;13300:3;13296:20;13293:1;13286:31;13336:4;13333:1;13326:15;13360:4;13357:1;13350:15;13376:127;13437:10;13432:3;13428:20;13425:1;13418:31;13468:4;13465:1;13458:15;13492:4;13489:1;13482:15;13508:131;-1:-1:-1;;;;;13583:31:1;;13573:42;;13563:70;;13629:1;13626;13619:12;13644:118;13730:5;13723:13;13716:21;13709:5;13706:32;13696:60;;13752:1;13749;13742:12
Swarm Source
ipfs://ad873376756f5e3bec4c24d8921ae001f2b4e638bb8da1ca2f5af86d6040afd7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.