More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 19,748 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 10617131 | 47 days ago | IN | 0 MOVR | 0.00019293 | ||||
Deposit | 10581136 | 49 days ago | IN | 0 MOVR | 0.0002363 | ||||
Withdraw | 10477360 | 57 days ago | IN | 0 MOVR | 0.00023572 | ||||
Deposit | 10477353 | 57 days ago | IN | 0 MOVR | 0.0002363 | ||||
Deposit | 10448454 | 59 days ago | IN | 0 MOVR | 0.00019293 | ||||
Withdraw | 10255499 | 72 days ago | IN | 0 MOVR | 0.00251238 | ||||
Deposit | 10055679 | 86 days ago | IN | 0 MOVR | 0.0002363 | ||||
Deposit | 10055657 | 86 days ago | IN | 0 MOVR | 0.0002363 | ||||
Deposit | 10055322 | 86 days ago | IN | 0 MOVR | 0.0002363 | ||||
Withdraw | 10037346 | 88 days ago | IN | 0 MOVR | 0.00023572 | ||||
Deposit | 10037302 | 88 days ago | IN | 0 MOVR | 0.0002363 | ||||
Deposit | 9980557 | 92 days ago | IN | 0 MOVR | 0.00019293 | ||||
Deposit | 9769370 | 107 days ago | IN | 0 MOVR | 0.00077174 | ||||
Withdraw | 9703272 | 111 days ago | IN | 0 MOVR | 0.00094288 | ||||
Withdraw | 9703245 | 111 days ago | IN | 0 MOVR | 0.00076942 | ||||
Deposit | 9691750 | 112 days ago | IN | 0 MOVR | 0.00094456 | ||||
Deposit | 9360776 | 136 days ago | IN | 0 MOVR | 0.0007711 | ||||
Deposit | 9343330 | 137 days ago | IN | 0 MOVR | 0.0009452 | ||||
Withdraw | 9299949 | 140 days ago | IN | 0 MOVR | 0.00094288 | ||||
Withdraw | 9270614 | 142 days ago | IN | 0 MOVR | 0.00094288 | ||||
Deposit | 9270607 | 142 days ago | IN | 0 MOVR | 0.00093028 | ||||
Deposit | 9270607 | 142 days ago | IN | 0 MOVR | 0.0009452 | ||||
Deposit | 8955101 | 165 days ago | IN | 0 MOVR | 0.00094456 | ||||
Withdraw | 8853806 | 172 days ago | IN | 0 MOVR | 0.00094224 | ||||
Withdraw | 8753122 | 179 days ago | IN | 0 MOVR | 0.00019666 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-01-24 */ //SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity ^0.6.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.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 guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/KwikToken.sol pragma solidity 0.6.12; contract ROAR { /// @notice EIP-20 token name for this token string public constant name = "Alphadex"; /// @notice EIP-20 token symbol for this token string public constant symbol = "ROAR"; /// @notice EIP-20 token decimals for this token uint8 public constant decimals = 18; /// @notice Total number of tokens in circulation uint public totalSupply = 250_000_000e18; // 250,000,000 ROAR /// @notice Address which may mint new tokens address public minter; /// @notice The timestamp after which minting may occur uint public mintingAllowedAfter; /// @notice Minimum time between mints uint32 public constant minimumTimeBetweenMints = 1 days * 365; /// @notice Cap on the percentage of totalSupply that can be minted at each mint uint8 public constant mintCap = 2; mapping (address => mapping (address => uint96)) internal allowances; mapping (address => uint96) internal balances; /// @notice A record of each accounts delegate mapping (address => address) public delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint96 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice The EIP-712 typehash for the permit struct used by the contract bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when the minter address is changed event MinterChanged(address minter, address newMinter); /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /// @notice The standard EIP-20 transfer event event Transfer(address indexed from, address indexed to, uint256 amount); /// @notice The standard EIP-20 approval event event Approval(address indexed owner, address indexed spender, uint256 amount); constructor(address account, address minter_, uint mintingAllowedAfter_) public { require(mintingAllowedAfter_ >= block.timestamp, "ROAR::constructor: minting can only begin after deployment"); balances[account] = uint96(totalSupply); emit Transfer(address(0), account, totalSupply); minter = minter_; emit MinterChanged(address(0), minter); mintingAllowedAfter = mintingAllowedAfter_; } function setMinter(address minter_) external { require(msg.sender == minter, "ROAR::setMinter: only the minter can change the minter address"); emit MinterChanged(minter, minter_); minter = minter_; } function mint(address dst, uint rawAmount) external { require(msg.sender == minter, "ROAR::mint: only the minter can mint"); require(block.timestamp >= mintingAllowedAfter, "ROAR::mint: minting not allowed yet"); require(dst != address(0), "ROAR::mint: cannot transfer to the zero address"); // record the mint mintingAllowedAfter = SafeMath.add(block.timestamp, minimumTimeBetweenMints); // mint the amount uint96 amount = safe96(rawAmount, "ROAR::mint: amount exceeds 96 bits"); require(amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), "ROAR::mint: exceeded mint cap"); totalSupply = safe96(SafeMath.add(totalSupply, amount), "ROAR::mint: totalSupply exceeds 96 bits"); // transfer the amount to the recipient balances[dst] = add96(balances[dst], amount, "ROAR::mint: transfer amount overflows"); emit Transfer(address(0), dst, amount); // move delegates _moveDelegates(address(0), delegates[dst], amount); } /** * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` * @param account The address of the account holding the funds * @param spender The address of the account spending the funds * @return The number of tokens approved */ function allowance(address account, address spender) external view returns (uint) { return allowances[account][spender]; } function approve(address spender, uint rawAmount) external returns (bool) { uint96 amount; if (rawAmount == uint(-1)) { amount = uint96(-1); } else { amount = safe96(rawAmount, "ROAR::approve: amount exceeds 96 bits"); } allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external { uint96 amount; if (rawAmount == uint(-1)) { amount = uint96(-1); } else { amount = safe96(rawAmount, "ROAR::permit: amount exceeds 96 bits"); } bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "ROAR::permit: invalid signature"); require(signatory == owner, "ROAR::permit: unauthorized"); require(now <= deadline, "ROAR::permit: signature expired"); allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function transfer(address dst, uint rawAmount) external returns (bool) { uint96 amount = safe96(rawAmount, "ROAR::transfer: amount exceeds 96 bits"); _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint rawAmount) external returns (bool) { address spender = msg.sender; uint96 spenderAllowance = allowances[src][spender]; uint96 amount = safe96(rawAmount, "ROAR::approve: amount exceeds 96 bits"); if (spender != src && spenderAllowance != uint96(-1)) { uint96 newAllowance = sub96(spenderAllowance, amount, "ROAR::transferFrom: transfer amount exceeds spender allowance"); allowances[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function balanceOf(address account) external view returns (uint) { return balances[account]; } function delegate(address delegatee) public { return _delegate(msg.sender, delegatee); } function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public { bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "ROAR::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "ROAR::delegateBySig: invalid nonce"); require(now <= expiry, "ROAR::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } function getPriorVotes(address account, uint blockNumber) public view returns (uint96) { require(blockNumber < block.number, "ROAR::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function getCurrentVotes(address account) external view returns (uint96) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = delegates[delegator]; uint96 delegatorBalance = balances[delegator]; delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { uint32 srcRepNum = numCheckpoints[srcRep]; uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint96 srcRepNew = sub96(srcRepOld, amount, "ROAR::_moveVotes: vote amount underflows"); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { uint32 dstRepNum = numCheckpoints[dstRep]; uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint96 dstRepNew = add96(dstRepOld, amount, "ROAR::_moveVotes: vote amount overflows"); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _transferTokens(address src, address dst, uint96 amount) internal { require(src != address(0), "ROAR::_transferTokens: cannot transfer from the zero address"); require(dst != address(0), "ROAR::_transferTokens: cannot transfer to the zero address"); balances[src] = sub96(balances[src], amount, "ROAR::_transferTokens: transfer amount exceeds balance"); balances[dst] = add96(balances[dst], amount, "ROAR::_transferTokens: transfer amount overflows"); emit Transfer(src, dst, amount); _moveDelegates(delegates[src], delegates[dst], amount); } function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal { uint32 blockNumber = safe32(block.number, "ROAR::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe96(uint n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { require(b <= a, errorMessage); return a - b; } function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, errorMessage); return c; } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File: contracts/MasterChef.sol pragma solidity 0.6.12; 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); } interface IMasterChef { using SafeERC20 for IERC20; struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. roar to distribute per block. uint256 lastRewardBlock; // Last block number that roar distribution occurs. uint256 accKwikPerShare; // Accumulated roar per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function userInfo(uint256 pid,address user) external view returns(IMasterChef.UserInfo memory); function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; } // 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; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. bool migrated; // // 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; // Block number when bonus ROAR period ends. uint256 public bonusEndBlock; // ROAR tokens created per block. uint256 public roarPerBlock; // Bonus muliplier for early roar makers. uint256 public constant BONUS_MULTIPLIER = 10; // 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; // 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; // only can claim reward after this time. uint256 public claimWait; /// @notice Address of MCV1 contract. IMasterChef public immutable OLD_MASTER_CHEF; 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, uint256 _bonusEndBlock, uint256 _claimWait, IMasterChef _oldMasterChef ) public { roar = _roar; roarPerBlock = _roarPerBlock; bonusEndBlock = _bonusEndBlock; startBlock = _startBlock; claimWait = _claimWait; OLD_MASTER_CHEF = _oldMasterChef; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); IMasterChef.PoolInfo memory oldPool = OLD_MASTER_CHEF.poolInfo(poolInfo.length); if(address(oldPool.lpToken) == address(_lpToken)){ lastRewardBlock = oldPool.lastRewardBlock; } 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 { 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 last block function updateRewardBlock(uint _blockNumber) public onlyOwner{ bonusEndBlock = _blockNumber; } // function to update the first block function updateRewardFirstBlock(uint _blockNumber) public onlyOwner{ startBlock = _blockNumber; } // function to update claimWait function updateClaimWait(uint256 _claimWait) public onlyOwner{ require(block.timestamp < _claimWait , "claimWait has to be in future"); claimWait = _claimWait; } // function to withdraw the reward token function rewardWithdraw() public onlyOwner{ roar.transfer(msg.sender, roar.balanceOf(address(this))); } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= bonusEndBlock) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } else if (_from >= bonusEndBlock) { return _to.sub(_from); } else { return bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add( _to.sub(bonusEndBlock) ); } } // update the reward per block function setBlockReward(uint _tokens) public onlyOwner { roarPerBlock = _tokens; } // 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]; IMasterChef.UserInfo memory oldUser = OLD_MASTER_CHEF.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); if(block.timestamp>claimWait) accKwikPerShare = accKwikPerShare.add(roarReward.mul(1e12).div(lpSupply)); else accKwikPerShare= roarReward.mul(1e12).div(lpSupply); } if(oldUser.amount > 0&& !user.migrated) { return oldUser.amount.mul(accKwikPerShare).div(1e12); } 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; } if(block.timestamp>claimWait){ uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 roarReward = multiplier.mul(roarPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accKwikPerShare = pool.accKwikPerShare.add(roarReward.mul(1e12).div(lpSupply)); roar.transfer(address(this), roarReward); pool.lastRewardBlock = block.number; } } function migrateUser(uint256 _pid) internal { UserInfo storage user = userInfo[_pid][msg.sender]; if(!user.migrated) { IMasterChef.UserInfo memory oldUser = OLD_MASTER_CHEF.userInfo(_pid,msg.sender); if(oldUser.amount>0 ){ user.amount = user.amount.add(oldUser.amount); user.migrated = true; } } } // Deposit LP tokens to MasterChef for ROAR allocation. function deposit(uint256 _pid, uint256 _amount) public { migrateUser(_pid); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); // only give reward if claimWait is passed. if (user.amount > 0 && block.timestamp > claimWait) { 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); if (block.timestamp > claimWait) { user.rewardDebt = user.amount.mul(pool.accKwikPerShare).div(1e12); } emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public { migrateUser(_pid); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); // only give reward if claimWait is passed. if(block.timestamp > claimWait){ uint256 pending = user.amount.mul(pool.accKwikPerShare).div(1e12).sub(user.rewardDebt); safeKwikTransfer(msg.sender, pending); } user.amount = user.amount.sub(_amount); if(block.timestamp > claimWait){ user.rewardDebt = user.amount.mul(pool.accKwikPerShare).div(1e12); } pool.lpToken.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } // 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"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_claimWait","type":"uint256"},{"internalType":"contract IMasterChef","name":"_oldMasterChef","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OLD_MASTER_CHEF","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"rewardWithdraw","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":"uint256","name":"_tokens","type":"uint256"}],"name":"setBlockReward","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":"_claimWait","type":"uint256"}],"name":"updateClaimWait","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":"updateRewardBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"updateRewardFirstBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"bool","name":"migrated","type":"bool"}],"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
60a060405260006007553480156200001657600080fd5b50604051620023dc380380620023dc8339810160408190526200003991620000d9565b600062000045620000d5565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b03979097169690961790955560039390935560025560085560095560601b6001600160601b03191660805262000156565b3390565b60008060008060008060c08789031215620000f2578182fd5b8651620000ff816200013d565b809650506020870151945060408701519350606087015192506080870151915060a08701516200012f816200013d565b809150509295509295509295565b6001600160a01b03811681146200015357600080fd5b50565b60805160601c612259620001836000398061050452806107555280610985528061167052506122596000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806364482f791161010f578063cde0e832116100a2578063e598dd9d11610071578063e598dd9d146103ab578063e98030c7146103b3578063f1b37093146103c6578063f2fde38b146103ce576101e5565b8063cde0e8321461036a578063ddb541921461037d578063df5d034114610390578063e2bbb15814610398576101e5565b80638aa28550116100de5780638aa28550146103255780638da5cb5b1461032d5780638dbb1e3a1461033557806393f1a40b14610348576101e5565b806364482f79146102fa5780636f2789ec1461030d578063715018a6146103155780637cd07e471461031d576101e5565b80633cbbd6f21161018757806348cd4cb11161015657806348cd4cb1146102c457806351eb05a6146102cc5780635312ea8e146102df578063630b5ba1146102f2576101e5565b80633cbbd6f21461027657806342697c0214610289578063441a3e701461029e578063454b0608146102b1576101e5565b80631a18e707116101c35780631a18e707146102335780631aed6553146102485780631eaaa0451461025057806323cf311814610263576101e5565b8063081e3eda146101ea5780631526fe271461020857806317caf6f11461022b575b600080fd5b6101f26103e1565b6040516101ff9190612175565b60405180910390f35b61021b610216366004611d26565b6103e7565b6040516101ff9493929190611e9b565b6101f2610428565b610246610241366004611d26565b61042e565b005b6101f2610471565b61024661025e366004611d85565b610477565b610246610271366004611c4d565b61069e565b6101f2610284366004611d56565b6106f5565b610291610983565b6040516101ff9190611e30565b6102466102ac366004611dc6565b6109a7565b6102466102bf366004611d26565b610aee565b6101f2610d14565b6102466102da366004611d26565b610d1a565b6102466102ed366004611d26565b610edb565b610246610f7a565b610246610308366004611de7565b610f9d565b6101f2611016565b61024661101c565b61029161109b565b6101f26110aa565b6102916110af565b6101f2610343366004611dc6565b6110be565b61035b610356366004611d56565b611124565b6040516101ff93929190612195565b610246610378366004611d26565b611153565b61024661038b366004611d26565b61118d565b6102466111c7565b6102466103a6366004611dc6565b6112f5565b6101f261141a565b6102466103c1366004611d26565b611420565b610291611479565b6102466103dc366004611c4d565b611488565b60055490565b600581815481106103f457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b60075481565b61043661153e565b6000546001600160a01b0390811691161461046c5760405162461bcd60e51b815260040161046390611fb2565b60405180910390fd5b600355565b60025481565b61047f61153e565b6000546001600160a01b039081169116146104ac5760405162461bcd60e51b815260040161046390611fb2565b80156104ba576104ba610f7a565b600060085443116104cd576008546104cf565b435b6007549091506104df9085611542565b6007556104ea611c02565b600554604051631526fe2760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691631526fe27916105389190600401612175565b60806040518083038186803b15801561055057600080fd5b505afa158015610564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105889190611ca1565b9050836001600160a01b031681600001516001600160a01b031614156105b057806040015191505b50604080516080810182526001600160a01b0394851681526020810195865290810191825260006060820181815260058054600181018255925291517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0600490920291820180546001600160a01b031916919096161790945593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840155517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db28301555090517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db390910155565b6106a661153e565b6000546001600160a01b039081169116146106d35760405162461bcd60e51b815260040161046390611fb2565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806005848154811061070557fe5b600091825260208083208784526006825260408085206001600160a01b038916865290925292206004909102909101915061073e611c33565b6040516393f1a40b60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906393f1a40b9061078c908990899060040161217e565b604080518083038186803b1580156107a357600080fd5b505afa1580156107b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107db9190611cf3565b600384015484546040516370a0823160e01b815292935090916000916001600160a01b0316906370a0823190610815903090600401611e30565b60206040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190611d3e565b905084600201544311801561087957508015155b1561090a57600061088e8660020154436110be565b905060006108c16007546108bb89600101546108b56003548761156e90919063ffffffff16565b9061156e565b906115a8565b90506009544211156108f1576108ea6108e3846108bb8464e8d4a5100061156e565b8590611542565b9350610907565b610904836108bb8364e8d4a5100061156e565b93505b50505b82511580159061091f5750600284015460ff16155b1561094757825161093b9064e8d4a51000906108bb908561156e565b9550505050505061097d565b610975846001015461096f64e8d4a510006108bb86896000015461156e90919063ffffffff16565b906115ea565b955050505050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6109b08261162c565b6000600583815481106109bf57fe5b600091825260208083208684526006825260408085203386529092529220805460049092029092019250831115610a085760405162461bcd60e51b815260040161046390612055565b610a1184610d1a565b600954421115610a57576000610a49826001015461096f64e8d4a510006108bb8760030154876000015461156e90919063ffffffff16565b9050610a553382611723565b505b8054610a6390846115ea565b8155600954421115610a905760038201548154610a8a9164e8d4a51000916108bb9161156e565b60018201555b8154610aa6906001600160a01b031633856118c2565b83336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885604051610ae09190612175565b60405180910390a350505050565b6004546001600160a01b0316610b165760405162461bcd60e51b815260040161046390612147565b600060058281548110610b2557fe5b60009182526020822060049182020180546040516370a0823160e01b81529194506001600160a01b0316929183916370a0823191610b6591309101611e30565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190611d3e565b600454909150610bd2906001600160a01b03848116911683611918565b6004805460405163ce5494bb60e01b81526000926001600160a01b039092169163ce5494bb91610c0491879101611e30565b602060405180830381600087803b158015610c1e57600080fd5b505af1158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c569190611c85565b6040516370a0823160e01b81529091506001600160a01b038216906370a0823190610c85903090600401611e30565b60206040518083038186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd59190611d3e565b8214610cf35760405162461bcd60e51b8152600401610463906120cb565b83546001600160a01b0319166001600160a01b039190911617909255505050565b60085481565b600060058281548110610d2957fe5b9060005260206000209060040201905080600201544311610d4a5750610ed8565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d7a903090600401611e30565b60206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dca9190611d3e565b905080610dde575043600290910155610ed8565b600954421115610ed5576000610df88360020154436110be565b90506000610e1f6007546108bb86600101546108b56003548761156e90919063ffffffff16565b9050610e42610e37846108bb8464e8d4a5100061156e565b600386015490611542565b600385015560015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610e799030908590600401611e44565b602060405180830381600087803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611c69565b5050436002840155505b50505b50565b600060058281548110610eea57fe5b60009182526020808320858452600682526040808520338087529352909320805460049093029093018054909450610f2f926001600160a01b039190911691906118c2565b8054604051849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059591610f6391612175565b60405180910390a360008082556001909101555050565b60055460005b81811015610f9957610f9181610d1a565b600101610f80565b5050565b8015610fab57610fab610f7a565b610fe882610fe260058681548110610fbf57fe5b9060005260206000209060040201600101546007546115ea90919063ffffffff16565b90611542565b6007819055508160058481548110610ffc57fe5b906000526020600020906004020160010181905550505050565b60095481565b61102461153e565b6000546001600160a01b039081169116146110515760405162461bcd60e51b815260040161046390611fb2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6004546001600160a01b031681565b600a81565b6000546001600160a01b031690565b600060025482116110df576110d8600a6108b584866115ea565b905061097d565b60025483106110f2576110d882846115ea565b6110d861110a600254846115ea90919063ffffffff16565b610fe2600a6108b5876002546115ea90919063ffffffff16565b600660209081526000928352604080842090915290825290208054600182015460029092015490919060ff1683565b61115b61153e565b6000546001600160a01b039081169116146111885760405162461bcd60e51b815260040161046390611fb2565b600255565b61119561153e565b6000546001600160a01b039081169116146111c25760405162461bcd60e51b815260040161046390611fb2565b600855565b6111cf61153e565b6000546001600160a01b039081169116146111fc5760405162461bcd60e51b815260040161046390611fb2565b6001546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a0823190611236903090600401611e30565b60206040518083038186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112869190611d3e565b6040518363ffffffff1660e01b81526004016112a3929190611e44565b602060405180830381600087803b1580156112bd57600080fd5b505af11580156112d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190611c69565b6112fe8261162c565b60006005838154811061130d57fe5b6000918252602080832086845260068252604080852033865290925292206004909102909101915061133e84610d1a565b80541580159061134f575060095442115b15611390576000611382826001015461096f64e8d4a510006108bb8760030154876000015461156e90919063ffffffff16565b905061138e3382611723565b505b81546113a7906001600160a01b03163330866119db565b80546113b39084611542565b81556009544211156113e057600382015481546113da9164e8d4a51000916108bb9161156e565b60018201555b83336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1585604051610ae09190612175565b60035481565b61142861153e565b6000546001600160a01b039081169116146114555760405162461bcd60e51b815260040161046390611fb2565b8042106114745760405162461bcd60e51b815260040161046390611fe7565b600955565b6001546001600160a01b031681565b61149061153e565b6000546001600160a01b039081169116146114bd5760405162461bcd60e51b815260040161046390611fb2565b6001600160a01b0381166114e35760405162461bcd60e51b815260040161046390611ef4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000828201838110156115675760405162461bcd60e51b815260040161046390611f3a565b9392505050565b60008261157d5750600061097d565b8282028284828161158a57fe5b04146115675760405162461bcd60e51b815260040161046390611f71565b600061156783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506119fc565b600061156783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a33565b60008181526006602090815260408083203384529091529020600281015460ff16610f9957611659611c33565b6040516393f1a40b60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906393f1a40b906116a7908690339060040161217e565b604080518083038186803b1580156116be57600080fd5b505afa1580156116d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f69190611cf3565b805190915015610ed5578051825461170d91611542565b825560028201805460ff19166001179055505050565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611754903090600401611e30565b60206040518083038186803b15801561176c57600080fd5b505afa158015611780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a49190611d3e565b9050808211156118385760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906117e09086908590600401611e44565b602060405180830381600087803b1580156117fa57600080fd5b505af115801561180e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118329190611c69565b50610ed5565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061186a9086908690600401611e44565b602060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190611c69565b50505050565b610ed58363a9059cbb60e01b84846040516024016118e1929190611e44565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a5f565b8015806119a05750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061194e9030908690600401611e5d565b60206040518083038186803b15801561196657600080fd5b505afa15801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190611d3e565b155b6119bc5760405162461bcd60e51b8152600401610463906120f1565b610ed58363095ea7b360e01b84846040516024016118e1929190611e44565b6118bc846323b872dd60e01b8585856040516024016118e193929190611e77565b60008183611a1d5760405162461bcd60e51b81526004016104639190611ec1565b506000838581611a2957fe5b0495945050505050565b60008184841115611a575760405162461bcd60e51b81526004016104639190611ec1565b505050900390565b6060611ab4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611aee9092919063ffffffff16565b805190915015610ed55780806020019051810190611ad29190611c69565b610ed55760405162461bcd60e51b815260040161046390612081565b6060611afd8484600085611b05565b949350505050565b6060611b1085611bc9565b611b2c5760405162461bcd60e51b81526004016104639061201e565b60006060866001600160a01b03168587604051611b499190611e14565b60006040518083038185875af1925050503d8060008114611b86576040519150601f19603f3d011682016040523d82523d6000602084013e611b8b565b606091505b50915091508115611b9f579150611afd9050565b805115611baf5780518082602001fd5b8360405162461bcd60e51b81526004016104639190611ec1565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611afd575050151592915050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b600060208284031215611c5e578081fd5b813561156781612200565b600060208284031215611c7a578081fd5b815161156781612215565b600060208284031215611c96578081fd5b815161156781612200565b600060808284031215611cb2578081fd5b611cbc60806121ad565b8251611cc781612200565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060408284031215611d04578081fd5b611d0e60406121ad565b82518152602083015160208201528091505092915050565b600060208284031215611d37578081fd5b5035919050565b600060208284031215611d4f578081fd5b5051919050565b60008060408385031215611d68578081fd5b823591506020830135611d7a81612200565b809150509250929050565b600080600060608486031215611d99578081fd5b833592506020840135611dab81612200565b91506040840135611dbb81612215565b809150509250925092565b60008060408385031215611dd8578182fd5b50508035926020909101359150565b600080600060608486031215611dfb578283fd5b83359250602084013591506040840135611dbb81612215565b60008251611e268184602087016121d4565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6000602082528251806020840152611ee08160408501602087016121d4565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f636c61696d576169742068617320746f20626520696e20667574757265000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601290820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b1b5a59dc985d194e8818985960a21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526014908201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b92835260208301919091521515604082015260600190565b60405181810167ffffffffffffffff811182821017156121cc57600080fd5b604052919050565b60005b838110156121ef5781810151838201526020016121d7565b838111156118bc5750506000910152565b6001600160a01b0381168114610ed857600080fd5b8015158114610ed857600080fdfea2646970667358221220f59736948ed87612a444f350b487ddf48f3bfe1c973c3f62765c5f01a866fa4b64736f6c634300060c00330000000000000000000000008e7cd893d8f371051a39aa65976bca22d7b02a600000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000001351eb00000000000000000000000000000000000000000000000000000000001378fb0000000000000000000000000000000000000000000000000000000061f52c400000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b6199954
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806364482f791161010f578063cde0e832116100a2578063e598dd9d11610071578063e598dd9d146103ab578063e98030c7146103b3578063f1b37093146103c6578063f2fde38b146103ce576101e5565b8063cde0e8321461036a578063ddb541921461037d578063df5d034114610390578063e2bbb15814610398576101e5565b80638aa28550116100de5780638aa28550146103255780638da5cb5b1461032d5780638dbb1e3a1461033557806393f1a40b14610348576101e5565b806364482f79146102fa5780636f2789ec1461030d578063715018a6146103155780637cd07e471461031d576101e5565b80633cbbd6f21161018757806348cd4cb11161015657806348cd4cb1146102c457806351eb05a6146102cc5780635312ea8e146102df578063630b5ba1146102f2576101e5565b80633cbbd6f21461027657806342697c0214610289578063441a3e701461029e578063454b0608146102b1576101e5565b80631a18e707116101c35780631a18e707146102335780631aed6553146102485780631eaaa0451461025057806323cf311814610263576101e5565b8063081e3eda146101ea5780631526fe271461020857806317caf6f11461022b575b600080fd5b6101f26103e1565b6040516101ff9190612175565b60405180910390f35b61021b610216366004611d26565b6103e7565b6040516101ff9493929190611e9b565b6101f2610428565b610246610241366004611d26565b61042e565b005b6101f2610471565b61024661025e366004611d85565b610477565b610246610271366004611c4d565b61069e565b6101f2610284366004611d56565b6106f5565b610291610983565b6040516101ff9190611e30565b6102466102ac366004611dc6565b6109a7565b6102466102bf366004611d26565b610aee565b6101f2610d14565b6102466102da366004611d26565b610d1a565b6102466102ed366004611d26565b610edb565b610246610f7a565b610246610308366004611de7565b610f9d565b6101f2611016565b61024661101c565b61029161109b565b6101f26110aa565b6102916110af565b6101f2610343366004611dc6565b6110be565b61035b610356366004611d56565b611124565b6040516101ff93929190612195565b610246610378366004611d26565b611153565b61024661038b366004611d26565b61118d565b6102466111c7565b6102466103a6366004611dc6565b6112f5565b6101f261141a565b6102466103c1366004611d26565b611420565b610291611479565b6102466103dc366004611c4d565b611488565b60055490565b600581815481106103f457fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b60075481565b61043661153e565b6000546001600160a01b0390811691161461046c5760405162461bcd60e51b815260040161046390611fb2565b60405180910390fd5b600355565b60025481565b61047f61153e565b6000546001600160a01b039081169116146104ac5760405162461bcd60e51b815260040161046390611fb2565b80156104ba576104ba610f7a565b600060085443116104cd576008546104cf565b435b6007549091506104df9085611542565b6007556104ea611c02565b600554604051631526fe2760e01b81526001600160a01b037f0000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b61999541691631526fe27916105389190600401612175565b60806040518083038186803b15801561055057600080fd5b505afa158015610564573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105889190611ca1565b9050836001600160a01b031681600001516001600160a01b031614156105b057806040015191505b50604080516080810182526001600160a01b0394851681526020810195865290810191825260006060820181815260058054600181018255925291517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0600490920291820180546001600160a01b031916919096161790945593517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db1840155517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db28301555090517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db390910155565b6106a661153e565b6000546001600160a01b039081169116146106d35760405162461bcd60e51b815260040161046390611fb2565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806005848154811061070557fe5b600091825260208083208784526006825260408085206001600160a01b038916865290925292206004909102909101915061073e611c33565b6040516393f1a40b60e01b81526001600160a01b037f0000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b619995416906393f1a40b9061078c908990899060040161217e565b604080518083038186803b1580156107a357600080fd5b505afa1580156107b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107db9190611cf3565b600384015484546040516370a0823160e01b815292935090916000916001600160a01b0316906370a0823190610815903090600401611e30565b60206040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190611d3e565b905084600201544311801561087957508015155b1561090a57600061088e8660020154436110be565b905060006108c16007546108bb89600101546108b56003548761156e90919063ffffffff16565b9061156e565b906115a8565b90506009544211156108f1576108ea6108e3846108bb8464e8d4a5100061156e565b8590611542565b9350610907565b610904836108bb8364e8d4a5100061156e565b93505b50505b82511580159061091f5750600284015460ff16155b1561094757825161093b9064e8d4a51000906108bb908561156e565b9550505050505061097d565b610975846001015461096f64e8d4a510006108bb86896000015461156e90919063ffffffff16565b906115ea565b955050505050505b92915050565b7f0000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b619995481565b6109b08261162c565b6000600583815481106109bf57fe5b600091825260208083208684526006825260408085203386529092529220805460049092029092019250831115610a085760405162461bcd60e51b815260040161046390612055565b610a1184610d1a565b600954421115610a57576000610a49826001015461096f64e8d4a510006108bb8760030154876000015461156e90919063ffffffff16565b9050610a553382611723565b505b8054610a6390846115ea565b8155600954421115610a905760038201548154610a8a9164e8d4a51000916108bb9161156e565b60018201555b8154610aa6906001600160a01b031633856118c2565b83336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885604051610ae09190612175565b60405180910390a350505050565b6004546001600160a01b0316610b165760405162461bcd60e51b815260040161046390612147565b600060058281548110610b2557fe5b60009182526020822060049182020180546040516370a0823160e01b81529194506001600160a01b0316929183916370a0823191610b6591309101611e30565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb59190611d3e565b600454909150610bd2906001600160a01b03848116911683611918565b6004805460405163ce5494bb60e01b81526000926001600160a01b039092169163ce5494bb91610c0491879101611e30565b602060405180830381600087803b158015610c1e57600080fd5b505af1158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c569190611c85565b6040516370a0823160e01b81529091506001600160a01b038216906370a0823190610c85903090600401611e30565b60206040518083038186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd59190611d3e565b8214610cf35760405162461bcd60e51b8152600401610463906120cb565b83546001600160a01b0319166001600160a01b039190911617909255505050565b60085481565b600060058281548110610d2957fe5b9060005260206000209060040201905080600201544311610d4a5750610ed8565b80546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d7a903090600401611e30565b60206040518083038186803b158015610d9257600080fd5b505afa158015610da6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dca9190611d3e565b905080610dde575043600290910155610ed8565b600954421115610ed5576000610df88360020154436110be565b90506000610e1f6007546108bb86600101546108b56003548761156e90919063ffffffff16565b9050610e42610e37846108bb8464e8d4a5100061156e565b600386015490611542565b600385015560015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610e799030908590600401611e44565b602060405180830381600087803b158015610e9357600080fd5b505af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611c69565b5050436002840155505b50505b50565b600060058281548110610eea57fe5b60009182526020808320858452600682526040808520338087529352909320805460049093029093018054909450610f2f926001600160a01b039190911691906118c2565b8054604051849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059591610f6391612175565b60405180910390a360008082556001909101555050565b60055460005b81811015610f9957610f9181610d1a565b600101610f80565b5050565b8015610fab57610fab610f7a565b610fe882610fe260058681548110610fbf57fe5b9060005260206000209060040201600101546007546115ea90919063ffffffff16565b90611542565b6007819055508160058481548110610ffc57fe5b906000526020600020906004020160010181905550505050565b60095481565b61102461153e565b6000546001600160a01b039081169116146110515760405162461bcd60e51b815260040161046390611fb2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6004546001600160a01b031681565b600a81565b6000546001600160a01b031690565b600060025482116110df576110d8600a6108b584866115ea565b905061097d565b60025483106110f2576110d882846115ea565b6110d861110a600254846115ea90919063ffffffff16565b610fe2600a6108b5876002546115ea90919063ffffffff16565b600660209081526000928352604080842090915290825290208054600182015460029092015490919060ff1683565b61115b61153e565b6000546001600160a01b039081169116146111885760405162461bcd60e51b815260040161046390611fb2565b600255565b61119561153e565b6000546001600160a01b039081169116146111c25760405162461bcd60e51b815260040161046390611fb2565b600855565b6111cf61153e565b6000546001600160a01b039081169116146111fc5760405162461bcd60e51b815260040161046390611fb2565b6001546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a0823190611236903090600401611e30565b60206040518083038186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112869190611d3e565b6040518363ffffffff1660e01b81526004016112a3929190611e44565b602060405180830381600087803b1580156112bd57600080fd5b505af11580156112d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190611c69565b6112fe8261162c565b60006005838154811061130d57fe5b6000918252602080832086845260068252604080852033865290925292206004909102909101915061133e84610d1a565b80541580159061134f575060095442115b15611390576000611382826001015461096f64e8d4a510006108bb8760030154876000015461156e90919063ffffffff16565b905061138e3382611723565b505b81546113a7906001600160a01b03163330866119db565b80546113b39084611542565b81556009544211156113e057600382015481546113da9164e8d4a51000916108bb9161156e565b60018201555b83336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1585604051610ae09190612175565b60035481565b61142861153e565b6000546001600160a01b039081169116146114555760405162461bcd60e51b815260040161046390611fb2565b8042106114745760405162461bcd60e51b815260040161046390611fe7565b600955565b6001546001600160a01b031681565b61149061153e565b6000546001600160a01b039081169116146114bd5760405162461bcd60e51b815260040161046390611fb2565b6001600160a01b0381166114e35760405162461bcd60e51b815260040161046390611ef4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000828201838110156115675760405162461bcd60e51b815260040161046390611f3a565b9392505050565b60008261157d5750600061097d565b8282028284828161158a57fe5b04146115675760405162461bcd60e51b815260040161046390611f71565b600061156783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506119fc565b600061156783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a33565b60008181526006602090815260408083203384529091529020600281015460ff16610f9957611659611c33565b6040516393f1a40b60e01b81526001600160a01b037f0000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b619995416906393f1a40b906116a7908690339060040161217e565b604080518083038186803b1580156116be57600080fd5b505afa1580156116d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f69190611cf3565b805190915015610ed5578051825461170d91611542565b825560028201805460ff19166001179055505050565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611754903090600401611e30565b60206040518083038186803b15801561176c57600080fd5b505afa158015611780573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a49190611d3e565b9050808211156118385760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906117e09086908590600401611e44565b602060405180830381600087803b1580156117fa57600080fd5b505af115801561180e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118329190611c69565b50610ed5565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061186a9086908690600401611e44565b602060405180830381600087803b15801561188457600080fd5b505af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190611c69565b50505050565b610ed58363a9059cbb60e01b84846040516024016118e1929190611e44565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a5f565b8015806119a05750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e9061194e9030908690600401611e5d565b60206040518083038186803b15801561196657600080fd5b505afa15801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190611d3e565b155b6119bc5760405162461bcd60e51b8152600401610463906120f1565b610ed58363095ea7b360e01b84846040516024016118e1929190611e44565b6118bc846323b872dd60e01b8585856040516024016118e193929190611e77565b60008183611a1d5760405162461bcd60e51b81526004016104639190611ec1565b506000838581611a2957fe5b0495945050505050565b60008184841115611a575760405162461bcd60e51b81526004016104639190611ec1565b505050900390565b6060611ab4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611aee9092919063ffffffff16565b805190915015610ed55780806020019051810190611ad29190611c69565b610ed55760405162461bcd60e51b815260040161046390612081565b6060611afd8484600085611b05565b949350505050565b6060611b1085611bc9565b611b2c5760405162461bcd60e51b81526004016104639061201e565b60006060866001600160a01b03168587604051611b499190611e14565b60006040518083038185875af1925050503d8060008114611b86576040519150601f19603f3d011682016040523d82523d6000602084013e611b8b565b606091505b50915091508115611b9f579150611afd9050565b805115611baf5780518082602001fd5b8360405162461bcd60e51b81526004016104639190611ec1565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611afd575050151592915050565b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b600060208284031215611c5e578081fd5b813561156781612200565b600060208284031215611c7a578081fd5b815161156781612215565b600060208284031215611c96578081fd5b815161156781612200565b600060808284031215611cb2578081fd5b611cbc60806121ad565b8251611cc781612200565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060408284031215611d04578081fd5b611d0e60406121ad565b82518152602083015160208201528091505092915050565b600060208284031215611d37578081fd5b5035919050565b600060208284031215611d4f578081fd5b5051919050565b60008060408385031215611d68578081fd5b823591506020830135611d7a81612200565b809150509250929050565b600080600060608486031215611d99578081fd5b833592506020840135611dab81612200565b91506040840135611dbb81612215565b809150509250925092565b60008060408385031215611dd8578182fd5b50508035926020909101359150565b600080600060608486031215611dfb578283fd5b83359250602084013591506040840135611dbb81612215565b60008251611e268184602087016121d4565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b6000602082528251806020840152611ee08160408501602087016121d4565b601f01601f19169190910160400192915050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f636c61696d576169742068617320746f20626520696e20667574757265000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601290820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b1b5a59dc985d194e8818985960a21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526014908201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b92835260208301919091521515604082015260600190565b60405181810167ffffffffffffffff811182821017156121cc57600080fd5b604052919050565b60005b838110156121ef5781810151838201526020016121d7565b838111156118bc5750506000910152565b6001600160a01b0381168114610ed857600080fd5b8015158114610ed857600080fdfea2646970667358221220f59736948ed87612a444f350b487ddf48f3bfe1c973c3f62765c5f01a866fa4b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008e7cd893d8f371051a39aa65976bca22d7b02a600000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000001351eb00000000000000000000000000000000000000000000000000000000001378fb0000000000000000000000000000000000000000000000000000000061f52c400000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b6199954
-----Decoded View---------------
Arg [0] : _roar (address): 0x8E7Cd893D8f371051a39aA65976Bca22d7b02A60
Arg [1] : _roarPerBlock (uint256): 5000000000000000000
Arg [2] : _startBlock (uint256): 1266155
Arg [3] : _bonusEndBlock (uint256): 1276155
Arg [4] : _claimWait (uint256): 1643457600
Arg [5] : _oldMasterChef (address): 0x4d1D8Ee77e9d2d4EA53Ef1DF7E0D32F6B6199954
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008e7cd893d8f371051a39aa65976bca22d7b02a60
Arg [1] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [2] : 00000000000000000000000000000000000000000000000000000000001351eb
Arg [3] : 00000000000000000000000000000000000000000000000000000000001378fb
Arg [4] : 0000000000000000000000000000000000000000000000000000000061f52c40
Arg [5] : 0000000000000000000000004d1d8ee77e9d2d4ea53ef1df7e0d32f6b6199954
Deployed Bytecode Sourcemap
56215:11979:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59293:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58065:26;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;58308:34::-;;;:::i;62746:96::-;;;;;;:::i;:::-;;:::i;:::-;;57695:28;;;:::i;59557:726::-;;;;;;:::i;:::-;;:::i;60755:102::-;;;;;;:::i;:::-;;:::i;62906:1117::-;;;;;;:::i;:::-;;:::i;58554:44::-;;;:::i;:::-;;;;;;;:::i;66526:839::-;;;;;;:::i;:::-;;:::i;60980:491::-;;;;;;:::i;:::-;;:::i;58399:25::-;;;:::i;64362:787::-;;;;;;:::i;:::-;;:::i;67436:356::-;;;;;;:::i;:::-;;:::i;64106:180::-;;;:::i;60379:300::-;;;;;;:::i;:::-;;:::i;58478:24::-;;;:::i;28946:148::-;;;:::i;58000:29::-;;;:::i;57850:45::-;;;:::i;28304:79::-;;;:::i;62281:423::-;;;;;;:::i;:::-;;:::i;58147:66::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;61526:109::-;;;;;;:::i;:::-;;:::i;61691:111::-;;;;;;:::i;:::-;;:::i;62088:117::-;;;:::i;65612:862::-;;;;;;:::i;:::-;;:::i;57769:27::-;;;:::i;61845:185::-;;;;;;:::i;:::-;;:::i;57622:16::-;;;:::i;29249:244::-;;;;;;:::i;:::-;;:::i;59293:95::-;59365:8;:15;59293:95;:::o;58065:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58065:26:0;;;;-1:-1:-1;58065:26:0;;;:::o;58308:34::-;;;;:::o;62746:96::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;;;;;;;;;62812:12:::1;:22:::0;62746:96::o;57695:28::-;;;;:::o;59557:726::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;59658:11:::1;59654:61;;;59686:17;:15;:17::i;:::-;59725:23;59766:10;;59751:12;:25;:53;;59794:10;;59751:53;;;59779:12;59751:53;59833:15;::::0;59725:79;;-1:-1:-1;59833:32:0::1;::::0;59853:11;59833:19:::1;:32::i;:::-;59815:15;:50:::0;59876:35:::1;;:::i;:::-;59939:8;:15:::0;59914:41:::1;::::0;-1:-1:-1;;;59914:41:0;;-1:-1:-1;;;;;59914:15:0::1;:24;::::0;::::1;::::0;:41:::1;::::0;59939:15;59914:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59876:79;;60005:8;-1:-1:-1::0;;;;;59969:45:0::1;59977:7;:15;;;-1:-1:-1::0;;;;;59969:45:0::1;;59966:113;;;60044:7;:23;;;60026:41;;59966:113;-1:-1:-1::0;60103:171:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;60103:171:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;60103:171:0;;;;;;60089:8:::1;:186:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;60089:186:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;-1:-1:-1;60089:186:0;;;;;;;59557:726::o;60755:102::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;60829:8:::1;:20:::0;;-1:-1:-1;;;;;;60829:20:0::1;-1:-1:-1::0;;;;;60829:20:0;;;::::1;::::0;;;::::1;::::0;;60755:102::o;62906:1117::-;62979:7;62999:21;63023:8;63032:4;63023:14;;;;;;;;;;;;;;;;63072;;;:8;:14;;;;;;-1:-1:-1;;;;;63072:21:0;;;;;;;;;63023:14;;;;;;;;-1:-1:-1;63103:35:0;;:::i;:::-;63141:36;;-1:-1:-1;;;63141:36:0;;-1:-1:-1;;;;;63141:15:0;:24;;;;:36;;63166:4;;63171:5;;63141:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63214:20;;;;63264:12;;:37;;-1:-1:-1;;;63264:37:0;;63103:74;;-1:-1:-1;63214:20:0;;63188:23;;-1:-1:-1;;;;;63264:12:0;;:22;;:37;;63295:4;;63264:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63245:56;;63331:4;:20;;;63316:12;:35;:52;;;;-1:-1:-1;63355:13:0;;;63316:52;63312:477;;;63385:18;63406:49;63420:4;:20;;;63442:12;63406:13;:49::i;:::-;63385:70;;63470:18;63491:70;63545:15;;63491:49;63524:4;:15;;;63491:28;63506:12;;63491:10;:14;;:28;;;;:::i;:::-;:32;;:49::i;:::-;:53;;:70::i;:::-;63470:91;;63595:9;;63579:15;:25;63576:201;;;63637:55;63657:34;63682:8;63657:20;:10;63672:4;63657:14;:20::i;:34::-;63637:15;;:19;:55::i;:::-;63619:73;;63576:201;;;63743:34;63768:8;63743:20;:10;63758:4;63743:14;:20::i;:34::-;63726:51;;63576:201;63312:477;;;63802:14;;:18;;;;:35;;-1:-1:-1;63824:13:0;;;;;;63823:14;63802:35;63799:136;;;63868:14;;:45;;63908:4;;63868:35;;63887:15;63868:18;:35::i;:45::-;63861:52;;;;;;;;;63799:136;63952:63;63999:4;:15;;;63952:42;63989:4;63952:32;63968:15;63952:4;:11;;;:15;;:32;;;;:::i;:42::-;:46;;:63::i;:::-;63945:70;;;;;;;62906:1117;;;;;:::o;58554:44::-;;;:::o;66526:839::-;66593:17;66605:4;66593:11;:17::i;:::-;66621:21;66645:8;66654:4;66645:14;;;;;;;;;;;;;;;;66694;;;:8;:14;;;;;;66709:10;66694:26;;;;;;;66739:11;;66645:14;;;;;;;;-1:-1:-1;66739:22:0;-1:-1:-1;66739:22:0;66731:53;;;;-1:-1:-1;;;66731:53:0;;;;;;;:::i;:::-;66795:16;66806:4;66795:10;:16::i;:::-;66896:9;;66878:15;:27;66875:188;;;66917:15;66935:68;66987:4;:15;;;66935:47;66977:4;66935:37;66951:4;:20;;;66935:4;:11;;;:15;;:37;;;;:::i;:68::-;66917:86;;67014:37;67031:10;67043:7;67014:16;:37::i;:::-;66875:188;;67087:11;;:24;;67103:7;67087:15;:24::i;:::-;67073:38;;67143:9;;67125:15;:27;67122:119;;;67198:20;;;;67182:11;;:47;;67224:4;;67182:37;;:15;:37::i;:47::-;67164:15;;;:65;67122:119;67251:12;;:55;;-1:-1:-1;;;;;67251:12:0;67285:10;67298:7;67251:25;:55::i;:::-;67343:4;67331:10;-1:-1:-1;;;;;67322:35:0;;67349:7;67322:35;;;;;;:::i;:::-;;;;;;;;66526:839;;;;:::o;60980:491::-;61045:8;;-1:-1:-1;;;;;61045:8:0;61029:64;;;;-1:-1:-1;;;61029:64:0;;;;;;;:::i;:::-;61104:21;61128:8;61137:4;61128:14;;;;;;;;;;;;;;;;;;;;61170:12;;61207:32;;-1:-1:-1;;;61207:32:0;;61128:14;;-1:-1:-1;;;;;;61170:12:0;;61128:14;61170:12;;61207:17;;:32;;61233:4;;61207:32;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61278:8;;61193:46;;-1:-1:-1;61250:43:0;;-1:-1:-1;;;;;61250:19:0;;;;61278:8;61193:46;61250:19;:43::i;:::-;61324:8;;;:25;;-1:-1:-1;;;61324:25:0;;61304:17;;-1:-1:-1;;;;;61324:8:0;;;;:16;;:25;;61341:7;;61324:25;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61375:35;;-1:-1:-1;;;61375:35:0;;61304:45;;-1:-1:-1;;;;;;61375:20:0;;;;;:35;;61404:4;;61375:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61368:3;:42;61360:67;;;;-1:-1:-1;;;61360:67:0;;;;;;;:::i;:::-;61438:25;;-1:-1:-1;;;;;;61438:25:0;-1:-1:-1;;;;;61438:25:0;;;;;;;;-1:-1:-1;;;60980:491:0:o;58399:25::-;;;;:::o;64362:787::-;64414:21;64438:8;64447:4;64438:14;;;;;;;;;;;;;;;;;;64414:38;;64483:4;:20;;;64467:12;:36;64463:75;;64520:7;;;64463:75;64567:12;;:37;;-1:-1:-1;;;64567:37:0;;64548:16;;-1:-1:-1;;;;;64567:12:0;;:22;;:37;;64598:4;;64567:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64548:56;-1:-1:-1;64619:13:0;64615:102;;-1:-1:-1;64672:12:0;64649:20;;;;:35;64699:7;;64615:102;64746:9;;64730:15;:25;64727:415;;;64767:18;64788:49;64802:4;:20;;;64824:12;64788:13;:49::i;:::-;64767:70;;64848:18;64869:70;64923:15;;64869:49;64902:4;:15;;;64869:28;64884:12;;64869:10;:14;;:28;;;;:::i;:70::-;64848:91;-1:-1:-1;64973:60:0;64998:34;65023:8;64998:20;64848:91;65013:4;64998:14;:20::i;:34::-;64973:20;;;;;:24;:60::i;:::-;64950:20;;;:83;65044:4;;:40;;-1:-1:-1;;;65044:40:0;;-1:-1:-1;;;;;65044:4:0;;;;:13;;:40;;65066:4;;65073:10;;65044:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;65118:12:0;65095:20;;;:35;-1:-1:-1;64727:415:0;64362:787;;;;:::o;67436:356::-;67495:21;67519:8;67528:4;67519:14;;;;;;;;;;;;;;;;67568;;;:8;:14;;;;;;67583:10;67568:26;;;;;;;;67652:11;;67519:14;;;;;;;67605:12;;67519:14;;-1:-1:-1;67605:59:0;;-1:-1:-1;;;;;67605:12:0;;;;;67583:10;67605:25;:59::i;:::-;67716:11;;67680:48;;67710:4;;67698:10;;67680:48;;;;;:::i;:::-;;;;;;;;67753:1;67739:15;;;67765;;;;:19;-1:-1:-1;;67436:356:0:o;64106:180::-;64168:8;:15;64151:14;64194:85;64222:6;64216:3;:12;64194:85;;;64252:15;64263:3;64252:10;:15::i;:::-;64230:5;;64194:85;;;;64106:180;:::o;60379:300::-;60473:11;60469:61;;;60501:17;:15;:17::i;:::-;60558:63;60609:11;60558:46;60578:8;60587:4;60578:14;;;;;;;;;;;;;;;;;;:25;;;60558:15;;:19;;:46;;;;:::i;:::-;:50;;:63::i;:::-;60540:15;:81;;;;60660:11;60632:8;60641:4;60632:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;60379:300;;;:::o;58478:24::-;;;;:::o;28946:148::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;29053:1:::1;29037:6:::0;;29016:40:::1;::::0;-1:-1:-1;;;;;29037:6:0;;::::1;::::0;29016:40:::1;::::0;29053:1;;29016:40:::1;29084:1;29067:19:::0;;-1:-1:-1;;;;;;29067:19:0::1;::::0;;28946:148::o;58000:29::-;;;-1:-1:-1;;;;;58000:29:0;;:::o;57850:45::-;57893:2;57850:45;:::o;28304:79::-;28342:7;28369:6;-1:-1:-1;;;;;28369:6:0;28304:79;:::o;62281:423::-;62353:7;62384:13;;62377:3;:20;62373:324;;62421:36;57893:2;62421:14;:3;62429:5;62421:7;:14::i;:36::-;62414:43;;;;62373:324;62488:13;;62479:5;:22;62475:222;;62525:14;:3;62533:5;62525:7;:14::i;62475:222::-;62579:106;62648:22;62656:13;;62648:3;:7;;:22;;;;:::i;:::-;62579:46;57893:2;62579:24;62597:5;62579:13;;:17;;:24;;;;:::i;58147:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61526:109::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;61599:13:::1;:28:::0;61526:109::o;61691:111::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;61769:10:::1;:25:::0;61691:111::o;62088:117::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;62141:4:::1;::::0;62167:29:::1;::::0;-1:-1:-1;;;62167:29:0;;-1:-1:-1;;;;;62141:4:0;;::::1;::::0;:13:::1;::::0;62155:10:::1;::::0;62141:4;;62167:14:::1;::::0;:29:::1;::::0;62190:4:::1;::::0;62167:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62141:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65612:862::-:0;65678:17;65690:4;65678:11;:17::i;:::-;65706:21;65730:8;65739:4;65730:14;;;;;;;;;;;;;;;;65779;;;:8;:14;;;;;;65794:10;65779:26;;;;;;;65730:14;;;;;;;;-1:-1:-1;65816:16:0;65788:4;65816:10;:16::i;:::-;65900:11;;:15;;;;:46;;;65937:9;;65919:15;:27;65900:46;65896:217;;;65963:15;65981:68;66033:4;:15;;;65981:47;66023:4;65981:37;65997:4;:20;;;65981:4;:11;;;:15;;:37;;;;:::i;:68::-;65963:86;;66064:37;66081:10;66093:7;66064:16;:37::i;:::-;65896:217;;66123:12;;:74;;-1:-1:-1;;;;;66123:12:0;66161:10;66182:4;66189:7;66123:29;:74::i;:::-;66222:11;;:24;;66238:7;66222:15;:24::i;:::-;66208:38;;66286:9;;66268:15;:27;66264:153;;;66350:20;;;;66334:11;;:47;;66376:4;;66334:37;;:15;:37::i;:47::-;66316:15;;;:65;66264:153;66452:4;66440:10;-1:-1:-1;;;;;66432:34:0;;66458:7;66432:34;;;;;;:::i;57769:27::-;;;;:::o;61845:185::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;61943:10:::1;61925:15;:28;61917:71;;;;-1:-1:-1::0;;;61917:71:0::1;;;;;;;:::i;:::-;61999:9;:23:::0;61845:185::o;57622:16::-;;;-1:-1:-1;;;;;57622:16:0;;:::o;29249:244::-;28526:12;:10;:12::i;:::-;28516:6;;-1:-1:-1;;;;;28516:6:0;;;:22;;;28508:67;;;;-1:-1:-1;;;28508:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29338:22:0;::::1;29330:73;;;;-1:-1:-1::0;;;29330:73:0::1;;;;;;;:::i;:::-;29440:6;::::0;;29419:38:::1;::::0;-1:-1:-1;;;;;29419:38:0;;::::1;::::0;29440:6;::::1;::::0;29419:38:::1;::::0;::::1;29468:6;:17:::0;;-1:-1:-1;;;;;;29468:17:0::1;-1:-1:-1::0;;;;;29468:17:0;;;::::1;::::0;;;::::1;::::0;;29249:244::o;26856:106::-;26944:10;26856:106;:::o;3734:181::-;3792:7;3824:5;;;3848:6;;;;3840:46;;;;-1:-1:-1;;;3840:46:0;;;;;;;:::i;:::-;3906:1;3734:181;-1:-1:-1;;;3734:181:0:o;5088:471::-;5146:7;5391:6;5387:47;;-1:-1:-1;5421:1:0;5414:8;;5387:47;5458:5;;;5462:1;5458;:5;:1;5482:5;;;;;:10;5474:56;;;;-1:-1:-1;;;5474:56:0;;;;;;;:::i;6035:132::-;6093:7;6120:39;6124:1;6127;6120:39;;;;;;;;;;;;;;;;;:3;:39::i;4198:136::-;4256:7;4283:43;4287:1;4290;4283:43;;;;;;;;;;;;;;;;;:3;:43::i;65158:387::-;65213:21;65237:14;;;:8;:14;;;;;;;;65252:10;65237:26;;;;;;;65277:13;;;;;;65273:262;;65311:35;;:::i;:::-;65349:41;;-1:-1:-1;;;65349:41:0;;-1:-1:-1;;;;;65349:15:0;:24;;;;:41;;65374:4;;65379:10;;65349:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65403:14;;65311:79;;-1:-1:-1;65403:16:0;65400:123;;65463:14;;65447:11;;:31;;:15;:31::i;:::-;65433:45;;65490:13;;;:20;;-1:-1:-1;;65490:20:0;65506:4;65490:20;;;65273:262;65158:387;;:::o;67906:278::-;68000:4;;:29;;-1:-1:-1;;;68000:29:0;;67982:15;;-1:-1:-1;;;;;68000:4:0;;:14;;:29;;68023:4;;68000:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67982:47;;68054:7;68044;:17;68040:137;;;68078:4;;:27;;-1:-1:-1;;;68078:27:0;;-1:-1:-1;;;;;68078:4:0;;;;:13;;:27;;68092:3;;68097:7;;68078:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68040:137;;;68138:4;;:27;;-1:-1:-1;;;68138:27:0;;-1:-1:-1;;;;;68138:4:0;;;;:13;;:27;;68152:3;;68157:7;;68138:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67906:278;;;:::o;15096:177::-;15179:86;15199:5;15229:23;;;15254:2;15258:5;15206:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15206:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15206:58:0;-1:-1:-1;;;;;;15206:58:0;;;;;;;;;;15179:19;:86::i;15755:622::-;16125:10;;;16124:62;;-1:-1:-1;16141:39:0;;-1:-1:-1;;;16141:39:0;;-1:-1:-1;;;;;16141:15:0;;;;;:39;;16165:4;;16172:7;;16141:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;16124:62;16116:152;;;;-1:-1:-1;;;16116:152:0;;;;;;;:::i;:::-;16279:90;16299:5;16329:22;;;16353:7;16362:5;16306:62;;;;;;;;;:::i;15281:205::-;15382:96;15402:5;15432:27;;;15461:4;15467:2;15471:5;15409:68;;;;;;;;;;:::i;6663:278::-;6749:7;6784:12;6777:5;6769:28;;;;-1:-1:-1;;;6769:28:0;;;;;;;;:::i;:::-;;6808:9;6824:1;6820;:5;;;;;;;6663:278;-1:-1:-1;;;;;6663:278:0:o;4637:192::-;4723:7;4759:12;4751:6;;;;4743:29;;;;-1:-1:-1;;;4743:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4795:5:0;;;4637:192::o;17401:761::-;17825:23;17851:69;17879:4;17851:69;;;;;;;;;;;;;;;;;17859:5;-1:-1:-1;;;;;17851:27:0;;;:69;;;;;:::i;:::-;17935:17;;17825:95;;-1:-1:-1;17935:21:0;17931:224;;18077:10;18066:30;;;;;;;;;;;;:::i;:::-;18058:85;;;;-1:-1:-1;;;18058:85:0;;;;;;;:::i;12075:196::-;12178:12;12210:53;12233:6;12241:4;12247:1;12250:12;12210:22;:53::i;:::-;12203:60;12075:196;-1:-1:-1;;;;12075:196:0:o;13452:979::-;13582:12;13615:18;13626:6;13615:10;:18::i;:::-;13607:60;;;;-1:-1:-1;;;13607:60:0;;;;;;;:::i;:::-;13741:12;13755:23;13782:6;-1:-1:-1;;;;;13782:11:0;13802:8;13813:4;13782:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13740:78;;;;13833:7;13829:595;;;13864:10;-1:-1:-1;13857:17:0;;-1:-1:-1;13857:17:0;13829:595;13978:17;;:21;13974:439;;14241:10;14235:17;14302:15;14289:10;14285:2;14281:19;14274:44;14189:148;14384:12;14377:20;;-1:-1:-1;;;14377:20:0;;;;;;;;:::i;8960:619::-;9020:4;9488:20;;9331:66;9528:23;;;;;;:42;;-1:-1:-1;;9555:15:0;;;9520:51;-1:-1:-1;;8960:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;2643:241::-;;2747:2;2735:9;2726:7;2722:23;2718:32;2715:2;;;-1:-1;;2753:12;2715:2;85:6;72:20;97:33;124:5;97:33;:::i;2891:257::-;;3003:2;2991:9;2982:7;2978:23;2974:32;2971:2;;;-1:-1;;3009:12;2971:2;354:6;348:13;366:30;390:5;366:30;:::i;3155:289::-;;3283:2;3271:9;3262:7;3258:23;3254:32;3251:2;;;-1:-1;;3289:12;3251:2;668:6;662:13;680:46;720:5;680:46;:::i;3743:316::-;;3884:3;3872:9;3863:7;3859:23;3855:33;3852:2;;;-1:-1;;3891:12;3852:2;1115:20;3884:3;1115:20;:::i;:::-;668:6;662:13;680:46;720:5;680:46;:::i;:::-;1220:73;1202:16;1195:99;;1361:2;1430:9;1426:22;2580:13;1361:2;1380:5;1376:16;1369:86;1527:2;1596:9;1592:22;2580:13;1527:2;1546:5;1542:16;1535:86;1693:2;1762:9;1758:22;2580:13;1693:2;1712:5;1708:16;1701:86;3943:100;;;;3846:213;;;;:::o;4066:315::-;;4207:2;4195:9;4186:7;4182:23;4178:32;4175:2;;;-1:-1;;4213:12;4175:2;2011:20;4207:2;2011:20;:::i;:::-;2147:22;2580:13;2097:16;2090:86;2243:2;2312:9;2308:22;2580:13;2243:2;2262:5;2258:16;2251:86;4265:100;;;;4169:212;;;;:::o;4388:241::-;;4492:2;4480:9;4471:7;4467:23;4463:32;4460:2;;;-1:-1;;4498:12;4460:2;-1:-1;2432:20;;4454:175;-1:-1;4454:175::o;4636:263::-;;4751:2;4739:9;4730:7;4726:23;4722:32;4719:2;;;-1:-1;;4757:12;4719:2;-1:-1;2580:13;;4713:186;-1:-1;4713:186::o;4906:366::-;;;5027:2;5015:9;5006:7;5002:23;4998:32;4995:2;;;-1:-1;;5033:12;4995:2;2445:6;2432:20;5085:63;;5185:2;5228:9;5224:22;72:20;97:33;124:5;97:33;:::i;:::-;5193:63;;;;4989:283;;;;;:::o;5279:511::-;;;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;-1:-1;;5433:12;5395:2;2445:6;2432:20;5485:63;;5585:2;5641:9;5637:22;488:20;513:46;553:5;513:46;:::i;:::-;5593:76;-1:-1;5706:2;5742:22;;206:20;231:30;206:20;231:30;:::i;:::-;5714:60;;;;5389:401;;;;;:::o;5797:366::-;;;5918:2;5906:9;5897:7;5893:23;5889:32;5886:2;;;-1:-1;;5924:12;5886:2;-1:-1;;2432:20;;;6076:2;6115:22;;;2432:20;;-1:-1;5880:283::o;6170:485::-;;;;6305:2;6293:9;6284:7;6280:23;6276:32;6273:2;;;-1:-1;;6311:12;6273:2;2445:6;2432:20;6363:63;;6463:2;6506:9;6502:22;2432:20;6471:63;;6571:2;6611:9;6607:22;206:20;231:30;255:5;231:30;:::i;12428:271::-;;7202:5;22747:12;7313:52;7358:6;7353:3;7346:4;7339:5;7335:16;7313:52;:::i;:::-;7377:16;;;;;12562:137;-1:-1;;12562:137::o;12706:222::-;-1:-1;;;;;23725:54;;;;6882:37;;12833:2;12818:18;;12804:124::o;12935:349::-;-1:-1;;;;;23725:54;;;;6741:58;;13270:2;13255:18;;12379:37;13098:2;13083:18;;13069:215::o;13291:333::-;-1:-1;;;;;23725:54;;;6882:37;;23725:54;;13610:2;13595:18;;6882:37;13446:2;13431:18;;13417:207::o;13631:444::-;-1:-1;;;;;23725:54;;;6882:37;;23725:54;;;;13978:2;13963:18;;6882:37;14061:2;14046:18;;12379:37;;;;13814:2;13799:18;;13785:290::o;14677:582::-;-1:-1;;;;;23725:54;;;;7489:63;;15079:2;15064:18;;12379:37;;;;15162:2;15147:18;;12379:37;15245:2;15230:18;;12379:37;14901:3;14886:19;;14872:387::o;16063:310::-;;16210:2;16231:17;16224:47;8218:5;22747:12;23186:6;16210:2;16199:9;16195:18;23174:19;8312:52;8357:6;23214:14;16199:9;23214:14;16210:2;8338:5;8334:16;8312:52;:::i;:::-;25786:7;25770:14;-1:-1;;25766:28;8376:39;;;;23214:14;8376:39;;16181:192;-1:-1;;16181:192::o;16380:416::-;16580:2;16594:47;;;8652:2;16565:18;;;23174:19;8688:34;23214:14;;;8668:55;-1:-1;;;8743:12;;;8736:30;8785:12;;;16551:245::o;16803:416::-;17003:2;17017:47;;;9036:2;16988:18;;;23174:19;9072:29;23214:14;;;9052:50;9121:12;;;16974:245::o;17226:416::-;17426:2;17440:47;;;9372:2;17411:18;;;23174:19;9408:34;23214:14;;;9388:55;-1:-1;;;9463:12;;;9456:25;9500:12;;;17397:245::o;17649:416::-;17849:2;17863:47;;;17834:18;;;23174:19;9787:34;23214:14;;;9767:55;9841:12;;;17820:245::o;18072:416::-;18272:2;18286:47;;;10092:2;18257:18;;;23174:19;10128:31;23214:14;;;10108:52;10179:12;;;18243:245::o;18495:416::-;18695:2;18709:47;;;10430:2;18680:18;;;23174:19;10466:31;23214:14;;;10446:52;10517:12;;;18666:245::o;18918:416::-;19118:2;19132:47;;;10768:2;19103:18;;;23174:19;-1:-1;;;23214:14;;;10784:41;10844:12;;;19089:245::o;19341:416::-;19541:2;19555:47;;;11095:2;19526:18;;;23174:19;11131:34;23214:14;;;11111:55;-1:-1;;;11186:12;;;11179:34;11232:12;;;19512:245::o;19764:416::-;19964:2;19978:47;;;11483:2;19949:18;;;23174:19;-1:-1;;;23214:14;;;11499:35;11553:12;;;19935:245::o;20187:416::-;20387:2;20401:47;;;11804:2;20372:18;;;23174:19;11840:34;23214:14;;;11820:55;-1:-1;;;11895:12;;;11888:46;11953:12;;;20358:245::o;20610:416::-;20810:2;20824:47;;;12204:2;20795:18;;;23174:19;-1:-1;;;23214:14;;;12220:43;12282:12;;;20781:245::o;21033:222::-;12379:37;;;21160:2;21145:18;;21131:124::o;21262:333::-;12379:37;;;-1:-1;;;;;23725:54;21581:2;21566:18;;6882:37;21417:2;21402:18;;21388:207::o;21958:432::-;12379:37;;;22299:2;22284:18;;12379:37;;;;23406:13;23399:21;22376:2;22361:18;;6996:34;22135:2;22120:18;;22106:284::o;22397:256::-;22459:2;22453:9;22485:17;;;22560:18;22545:34;;22581:22;;;22542:62;22539:2;;;22617:1;;22607:12;22539:2;22459;22626:22;22437:216;;-1:-1;22437:216::o;25426:268::-;25491:1;25498:101;25512:6;25509:1;25506:13;25498:101;;;25579:11;;;25573:18;25560:11;;;25553:39;25534:2;25527:10;25498:101;;;25614:6;25611:1;25608:13;25605:2;;;-1:-1;;25491:1;25661:16;;25654:27;25475:219::o;25807:117::-;-1:-1;;;;;23725:54;;25866:35;;25856:2;;25915:1;;25905:12;25931:111;26012:5;23406:13;23399:21;25990:5;25987:32;25977:2;;26033:1;;26023:12
Swarm Source
ipfs://f59736948ed87612a444f350b487ddf48f3bfe1c973c3f62765c5f01a866fa4b
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
MOVR | 100.00% | $0.001135 | 1,959,588.8456 | $2,223.45 |
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.