Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 112 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Expired... | 19122103 | 180 days ago | IN | 0 ETH | 0.00187838 | ||||
Get Reward | 19122101 | 180 days ago | IN | 0 ETH | 0.00239464 | ||||
Stake | 18923596 | 208 days ago | IN | 0 ETH | 0.00349578 | ||||
Get Reward | 18913514 | 210 days ago | IN | 0 ETH | 0.00157034 | ||||
Withdraw Expired... | 18900438 | 211 days ago | IN | 0 ETH | 0.00158727 | ||||
Get Reward | 18900436 | 211 days ago | IN | 0 ETH | 0.00196304 | ||||
Withdraw | 18892373 | 213 days ago | IN | 0 ETH | 0.00291218 | ||||
Withdraw Expired... | 18892372 | 213 days ago | IN | 0 ETH | 0.00235284 | ||||
Withdraw Expired... | 18878049 | 215 days ago | IN | 0 ETH | 0.00391655 | ||||
Get Reward | 18878041 | 215 days ago | IN | 0 ETH | 0.0058266 | ||||
Withdraw Expired... | 18855191 | 218 days ago | IN | 0 ETH | 0.00185548 | ||||
Stake | 18853585 | 218 days ago | IN | 0 ETH | 0.00327616 | ||||
Withdraw Expired... | 18844917 | 219 days ago | IN | 0 ETH | 0.00186142 | ||||
Get Reward | 18844915 | 219 days ago | IN | 0 ETH | 0.00256864 | ||||
Get Reward | 18835956 | 221 days ago | IN | 0 ETH | 0.00543562 | ||||
Withdraw Expired... | 18820017 | 223 days ago | IN | 0 ETH | 0.00400984 | ||||
Get Reward | 18820005 | 223 days ago | IN | 0 ETH | 0.00622018 | ||||
Withdraw Expired... | 18816612 | 223 days ago | IN | 0 ETH | 0.00346251 | ||||
Withdraw | 18807668 | 225 days ago | IN | 0 ETH | 0.00349131 | ||||
Withdraw | 18794464 | 226 days ago | IN | 0 ETH | 0.00685464 | ||||
Get Reward | 18791938 | 227 days ago | IN | 0 ETH | 0.00638194 | ||||
Emergency Withdr... | 18784231 | 228 days ago | IN | 0 ETH | 0.00456593 | ||||
Stake | 18774729 | 229 days ago | IN | 0 ETH | 0.00713513 | ||||
Get Reward | 18774088 | 229 days ago | IN | 0 ETH | 0.00454939 | ||||
Withdraw | 18774086 | 229 days ago | IN | 0 ETH | 0.00492435 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PotionDaoStaking
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-08 */ // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File contracts/interfaces/IYToken.sol pragma solidity 0.8.4; interface IYToken is IERC20 { function burn(uint256 _amount) external; } // File contracts/interfaces/IYTokenReserve.sol pragma solidity 0.8.4; interface IYTokenReserve { function transfer(address _address, uint256 _amount) external; function setRewarder(address _rewarder) external returns (bool); function setPool(address _pool) external returns (bool); } // File contracts/interfaces/IWETH.sol pragma solidity 0.8.4; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256 wad) external; } // File contracts/libs/WethUtils.sol pragma solidity 0.8.4; library WethUtils { using SafeERC20 for IWETH; using SafeERC20 for IERC20; IWETH public constant weth = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); //WETH IERC20 public constant POTION = IERC20(0x276e84Edc5Bd94731B65C207dc1512FC5391572F); //PTN token function isWeth(address token) internal pure returns (bool) { return address(weth) == token; } function wrap(uint256 amount) internal { weth.deposit{value: amount}(); } function unwrap(uint256 amount) internal { weth.withdraw(amount); } function transfer(address to, uint256 amount) internal { weth.safeTransfer(to, amount); } } // File contracts/farms/PotionDaoStaking.sol pragma solidity 0.8.4; // Based on EPS's & Geist's MultiFeeDistribution contract PotionDaoStaking is ReentrancyGuard, Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; using SafeERC20 for IYToken; /* ========== STATE VARIABLES ========== */ struct Reward { uint256 periodFinish; uint256 rewardRate; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } struct Balances { uint256 total; uint256 unlocked; uint256 locked; uint256 earned; } struct LockedBalance { uint256 amount; uint256 unlockTime; } struct RewardData { address token; uint256 amount; } IYToken public stakingToken; IYTokenReserve public stakingTokenReserve; address[] public rewardTokens; mapping(address => Reward) public rewardData; // Duration that rewards are streamed over uint256 public constant rewardsDuration = 86400 * 4; // 4 days // Duration of lock/earned penalty period uint256 public constant lockDuration = 86400 * 7 * 2; // 2 weeks // Addresses approved to call mint mapping(address => bool) public minters; address[] public mintersArray; // reward token -> distributor -> is approved to add rewards mapping(address => mapping(address => bool)) public rewardDistributors; // user -> reward token -> amount mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public rewards; uint256 public totalSupply; uint256 public lockedSupply; // Private mappings for balance data mapping(address => Balances) private balances; mapping(address => LockedBalance[]) private userLocks; mapping(address => LockedBalance[]) private userEarnings; //team reward uint256 public teamRewardPercent = 20; //20% address public teamWalletAddress; /* ========== CONSTRUCTOR ========== */ constructor( address _stakingToken, address _stakingTokenReserve, address[] memory _minters, address _teamWalletAddress, address initialOwner ) Ownable() { stakingToken = IYToken(_stakingToken); stakingTokenReserve = IYTokenReserve(_stakingTokenReserve); stakingTokenReserve.setRewarder(address(this)); for (uint256 i; i < _minters.length; i++) { minters[_minters[i]] = true; mintersArray.push(_minters[i]); } // First reward MUST be the staking token or things will break // related to the 50% penalty and distribution to locked balances rewardTokens.push(_stakingToken); rewardData[_stakingToken].lastUpdateTime = block.timestamp; rewardData[_stakingToken].periodFinish = block.timestamp; transferOwnership(initialOwner); teamWalletAddress = _teamWalletAddress; } /* ========== ADMIN CONFIGURATION ========== */ // Add a new reward token to be distributed to stakers function addReward(address _rewardsToken, address _distributor) public onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime == 0, "MultiFeeDistribution::addReward: Invalid"); rewardTokens.push(_rewardsToken); rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp; rewardDistributors[_rewardsToken][_distributor] = true; emit RewardTokenAdded(_rewardsToken); emit RewardDistributorApproved(_rewardsToken, _distributor, true); } // Modify approval for an address to call notifyRewardAmount function approveRewardDistributor( address _rewardsToken, address _distributor, bool _approved ) external onlyOwner { require(rewardData[_rewardsToken].lastUpdateTime > 0, "MultiFeeDistribution::approveRewardDistributor: Invalid"); rewardDistributors[_rewardsToken][_distributor] = _approved; emit RewardDistributorApproved(_rewardsToken, _distributor, _approved); } /* ========== VIEWS ========== */ function _rewardPerToken(address _rewardsToken, uint256 _supply) internal view returns (uint256) { if (_supply == 0) { return rewardData[_rewardsToken].rewardPerTokenStored; } return rewardData[_rewardsToken].rewardPerTokenStored.add( lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_supply) ); } function _earned( address _user, address _rewardsToken, uint256 _balance, uint256 supply ) internal view returns (uint256) { return _balance.mul(_rewardPerToken(_rewardsToken, supply).sub(userRewardPerTokenPaid[_user][_rewardsToken])).div(1e18).add(rewards[_user][_rewardsToken]); } function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish); } function rewardPerToken(address _rewardsToken) external view returns (uint256) { uint256 supply = _rewardsToken == address(stakingToken) ? lockedSupply : totalSupply; return _rewardPerToken(_rewardsToken, supply); } function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardData[_rewardsToken].rewardRate.mul(rewardsDuration); } // Address and claimable amount of all reward tokens for the given account function claimableRewards(address account) external view returns (RewardData[] memory _rewards) { _rewards = new RewardData[](rewardTokens.length); for (uint256 i = 0; i < _rewards.length; i++) { // If i == 0 this is the stakingReward, distribution is based on locked balances uint256 balance = i == 0 ? balances[account].locked : balances[account].total; uint256 supply = i == 0 ? lockedSupply : totalSupply; _rewards[i].token = rewardTokens[i]; _rewards[i].amount = _earned(account, _rewards[i].token, balance, supply); } return _rewards; } // Total balance of an account, including unlocked, locked and earned tokens function totalBalance(address user) external view returns (uint256 amount) { return balances[user].total; } // Total withdrawable balance for an account to which no penalty is applied function unlockedBalance(address user) external view returns (uint256 amount) { amount = balances[user].unlocked; LockedBalance[] storage earnings = userEarnings[msg.sender]; for (uint256 i = 0; i < earnings.length; i++) { if (earnings[i].unlockTime > block.timestamp) { break; } amount = amount.add(earnings[i].amount); } return amount; } // Information on the "earned" balances of a user // Earned balances may be withdrawn immediately for a 50% penalty function earnedBalances(address user) external view returns (uint256 total, LockedBalance[] memory earningsData) { LockedBalance[] storage earnings = userEarnings[user]; uint256 idx; for (uint256 i = 0; i < earnings.length; i++) { if (earnings[i].unlockTime > block.timestamp) { if (idx == 0) { earningsData = new LockedBalance[](earnings.length - i); } earningsData[idx] = earnings[i]; idx++; total = total.add(earnings[i].amount); } } return (total, earningsData); } // Information on a user's locked balances function lockedBalances(address user) external view returns ( uint256 total, uint256 unlockable, uint256 locked, LockedBalance[] memory lockData ) { LockedBalance[] storage locks = userLocks[user]; uint256 idx; for (uint256 i = 0; i < locks.length; i++) { if (locks[i].unlockTime > block.timestamp) { if (idx == 0) { lockData = new LockedBalance[](locks.length - i); } lockData[idx] = locks[i]; idx++; locked = locked.add(locks[i].amount); } else { unlockable = unlockable.add(locks[i].amount); } } return (balances[user].locked, unlockable, locked, lockData); } // Final balance received and penalty balance paid by user upon calling exit function withdrawableBalance(address user) public view returns (uint256 amount, uint256 penaltyAmount) { Balances storage bal = balances[user]; if (bal.earned > 0) { uint256 amountWithoutPenalty; uint256 length = userEarnings[user].length; for (uint256 i = 0; i < length; i++) { uint256 earnedAmount = userEarnings[user][i].amount; if (earnedAmount == 0) continue; if (userEarnings[user][i].unlockTime > block.timestamp) { break; } amountWithoutPenalty = amountWithoutPenalty.add(earnedAmount); } penaltyAmount = bal.earned.sub(amountWithoutPenalty).div(2); } amount = bal.unlocked.add(bal.earned).sub(penaltyAmount); return (amount, penaltyAmount); } /* ========== MUTATIVE FUNCTIONS ========== */ // Stake tokens to receive rewards // Locked tokens cannot be withdrawn for lockDuration and are eligible to receive stakingReward rewards function stake(uint256 amount, bool lock) external nonReentrant updateReward(msg.sender) { require(amount > 0, "MultiFeeDistribution::stake: Cannot stake 0"); totalSupply = totalSupply.add(amount); Balances storage bal = balances[msg.sender]; bal.total = bal.total.add(amount); if (lock) { lockedSupply = lockedSupply.add(amount); bal.locked = bal.locked.add(amount); uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration); uint256 idx = userLocks[msg.sender].length; if (idx == 0 || userLocks[msg.sender][idx - 1].unlockTime < unlockTime) { userLocks[msg.sender].push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { userLocks[msg.sender][idx - 1].amount = userLocks[msg.sender][idx - 1].amount.add(amount); } } else { bal.unlocked = bal.unlocked.add(amount); } stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, amount); } // Mint new tokens // Minted tokens receive rewards normally but incur a 50% penalty when // withdrawn before lockDuration has passed. function mint(address user, uint256 amount) external updateReward(user) { require(minters[msg.sender], "MultiFeeDistribution::mint: Only minters allowed"); totalSupply = totalSupply.add(amount); Balances storage bal = balances[user]; bal.total = bal.total.add(amount); bal.earned = bal.earned.add(amount); uint256 unlockTime = block.timestamp.div(rewardsDuration).mul(rewardsDuration).add(lockDuration); LockedBalance[] storage earnings = userEarnings[user]; uint256 idx = earnings.length; if (idx == 0 || earnings[idx - 1].unlockTime < unlockTime) { earnings.push(LockedBalance({amount: amount, unlockTime: unlockTime})); } else { earnings[idx - 1].amount = earnings[idx - 1].amount.add(amount); } stakingTokenReserve.transfer(address(this), amount); emit Staked(user, amount); } // Withdraw staked tokens // First withdraws unlocked tokens, then earned tokens. Withdrawing earned tokens // incurs a 50% penalty which is distributed based on locked balances. function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "MultiFeeDistribution::withdraw: Cannot withdraw 0"); Balances storage bal = balances[msg.sender]; uint256 penaltyAmount; if (amount <= bal.unlocked) { bal.unlocked = bal.unlocked.sub(amount); } else { uint256 remaining = amount.sub(bal.unlocked); require(bal.earned >= remaining, "MultiFeeDistribution::withdraw: Insufficient unlocked balance"); bal.unlocked = 0; bal.earned = bal.earned.sub(remaining); for (uint256 i = 0; ; i++) { uint256 earnedAmount = userEarnings[msg.sender][i].amount; if (earnedAmount == 0) continue; if (penaltyAmount == 0 && userEarnings[msg.sender][i].unlockTime > block.timestamp) { penaltyAmount = remaining; require(bal.earned >= remaining, "MultiFeeDistribution::withdraw: Insufficient balance after penalty"); bal.earned = bal.earned.sub(remaining); if (bal.earned == 0) { delete userEarnings[msg.sender]; break; } remaining = remaining.mul(2); } if (remaining <= earnedAmount) { userEarnings[msg.sender][i].amount = earnedAmount.sub(remaining); break; } else { delete userEarnings[msg.sender][i]; remaining = remaining.sub(earnedAmount); } } } uint256 adjustedAmount = amount.add(penaltyAmount); bal.total = bal.total.sub(adjustedAmount); totalSupply = totalSupply.sub(adjustedAmount); stakingToken.safeTransfer(msg.sender, amount); if (penaltyAmount > 0) { _notifyReward(address(stakingToken), penaltyAmount); } emit Withdrawn(msg.sender, amount); } // Claim all pending staking rewards function getReward() public nonReentrant updateReward(msg.sender) { for (uint256 i; i < rewardTokens.length; i++) { address _rewardToken = rewardTokens[i]; uint256 reward = rewards[msg.sender][_rewardToken]; if (reward > 0) { rewards[msg.sender][_rewardToken] = 0; if (WethUtils.isWeth(_rewardToken)) { WethUtils.unwrap(reward); // Address.sendValue(payable(msg.sender), reward); payable(msg.sender).transfer(reward); } else { IERC20(_rewardToken).safeTransfer(msg.sender, reward); } emit RewardPaid(msg.sender, _rewardToken, reward); } } } // Withdraw full unlocked balance and claim pending rewards function emergencyWithdraw() external updateReward(msg.sender) { (uint256 amount, uint256 penaltyAmount) = withdrawableBalance(msg.sender); delete userEarnings[msg.sender]; Balances storage bal = balances[msg.sender]; bal.total = bal.total.sub(bal.unlocked).sub(bal.earned); bal.unlocked = 0; bal.earned = 0; totalSupply = totalSupply.sub(amount.add(penaltyAmount)); stakingToken.safeTransfer(msg.sender, amount); if (penaltyAmount > 0) { _notifyReward(address(stakingToken), penaltyAmount); } getReward(); } // Withdraw all currently locked tokens where the unlock time has passed function withdrawExpiredLocks() external { LockedBalance[] storage locks = userLocks[msg.sender]; Balances storage bal = balances[msg.sender]; uint256 amount; uint256 length = locks.length; if (locks[length - 1].unlockTime <= block.timestamp) { amount = bal.locked; delete userLocks[msg.sender]; } else { for (uint256 i = 0; i < length; i++) { if (locks[i].unlockTime > block.timestamp) break; amount = amount.add(locks[i].amount); delete locks[i]; } } bal.locked = bal.locked.sub(amount); bal.total = bal.total.sub(amount); totalSupply = totalSupply.sub(amount); lockedSupply = lockedSupply.sub(amount); stakingToken.safeTransfer(msg.sender, amount); } /* ========== RESTRICTED FUNCTIONS ========== */ function _notifyReward(address _rewardsToken, uint256 reward) internal { if (block.timestamp >= rewardData[_rewardsToken].periodFinish) { rewardData[_rewardsToken].rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate); rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(rewardsDuration); } rewardData[_rewardsToken].lastUpdateTime = block.timestamp; rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardsDuration); } function notifyRewardAmount(address _rewardsToken, uint256 reward) external updateReward(address(0)) { require(rewardDistributors[_rewardsToken][msg.sender], "MultiFeeDistribution::notifyRewardAmount: Only reward distributors allowed"); require(reward > 0, "MultiFeeDistribution::notifyRewardAmount: No reward"); // handle the transfer of reward tokens via `transferFrom` to reduce the number // of transactions required and ensure correctness of the reward amount uint256 teamReward = reward.mul(teamRewardPercent).div(100); uint256 rewardToAdd = reward.sub(teamReward); IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), rewardToAdd); IERC20(_rewardsToken).safeTransferFrom(msg.sender, teamWalletAddress, teamReward); _notifyReward(_rewardsToken, rewardToAdd); emit WithrewTeamReward(teamReward); emit RewardAdded(rewardToAdd); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(stakingToken), "MultiFeeDistribution::recoverERC20: Cannot withdraw staking token"); require(rewardData[tokenAddress].lastUpdateTime == 0, "MultiFeeDistribution::recoverERC20: Cannot withdraw reward token"); IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } // Set the address of team wallet function setTeamWalletAddress(address _newWalletAddress) external { require(owner() == msg.sender || teamWalletAddress == msg.sender, "MultiFeeDistribution::setTeamWalletAddress: not allowed"); teamWalletAddress = _newWalletAddress; emit updatedTeamWalletAddress(_newWalletAddress); } // Set percent of team reward function setTeamRewardPercent(uint256 _percent) external { require(owner() == msg.sender, "MultiFeeDistribution::setTeamRewardPercent: not allowed"); require(_percent <= 40, "MultiFeeDistribution::setTeamRewardPercent: invalid value"); teamRewardPercent = _percent; emit updatedTeamRewardPercent(_percent); } /* ========== MODIFIERS ========== */ modifier updateReward(address account) { address token = address(stakingToken); uint256 balance; uint256 supply = lockedSupply; rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { // Special case, use the locked balances and supply for stakingReward rewards rewards[account][token] = _earned(account, token, balances[account].locked, supply); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; balance = balances[account].total; } supply = totalSupply; for (uint256 i = 1; i < rewardTokens.length; i++) { token = rewardTokens[i]; rewardData[token].rewardPerTokenStored = _rewardPerToken(token, supply); rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token); if (account != address(0)) { rewards[account][token] = _earned(account, token, balance, supply); userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored; } } _; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event WithrewTeamReward(uint256 reward); event RewardTokenAdded(address indexed rewardTokenAddress); event RewardDistributorApproved(address indexed rewardAddress, address indexed distributor, bool approved); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, address indexed rewardsToken, uint256 reward); event Recovered(address token, uint256 amount); event updatedTeamRewardPercent(uint256 percent); event updatedTeamWalletAddress(address newAddress); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_stakingTokenReserve","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"},{"internalType":"address","name":"_teamWalletAddress","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardAddress","type":"address"},{"indexed":true,"internalType":"address","name":"distributor","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"RewardDistributorApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"}],"name":"RewardTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"WithrewTeamReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updatedTeamRewardPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"updatedTeamWalletAddress","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"approveRewardDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableRewards","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PotionDaoStaking.RewardData[]","name":"_rewards","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"earnedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct PotionDaoStaking.LockedBalance[]","name":"earningsData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lockedBalances","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlockable","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"internalType":"struct PotionDaoStaking.LockedBalance[]","name":"lockData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintersArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewardDistributors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"setTeamRewardPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWalletAddress","type":"address"}],"name":"setTeamWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IYToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingTokenReserve","outputs":[{"internalType":"contract IYTokenReserve","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamRewardPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"address","name":"user","type":"address"}],"name":"unlockedBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawExpiredLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"withdrawableBalance","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260146010553480156200001657600080fd5b506040516200410d3803806200410d8339810160408190526200003991620003ac565b6001600055620000493362000268565b600280546001600160a01b038781166001600160a01b031992831617909255600380549287169290911682179055604051630e9918b960e21b8152306004820152633a6462e490602401602060405180830381600087803b158015620000ae57600080fd5b505af1158015620000c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e99190620004ce565b5060005b8351811015620001d0576001600660008684815181106200011e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060078482815181106200018057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580620001c781620004f7565b915050620000ed565b5060048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0387169081179091556000908152600560205260409020426002820181905590556200023d81620002ba565b50601180546001600160a01b0319166001600160a01b03929092169190911790555062000535915050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001546001600160a01b031633146200031a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b038116620003815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000311565b6200038c8162000268565b50565b80516001600160a01b0381168114620003a757600080fd5b919050565b600080600080600060a08688031215620003c4578081fd5b620003cf866200038f565b94506020620003e08188016200038f565b60408801519095506001600160401b0380821115620003fd578384fd5b818901915089601f83011262000411578384fd5b8151818111156200042657620004266200051f565b8060051b604051601f19603f830116810181811085821117156200044e576200044e6200051f565b604052828152858101935084860182860187018e10156200046d578788fd5b8795505b838610156200049a5762000485816200038f565b85526001959095019493860193860162000471565b50809850505050505050620004b2606087016200038f565b9150620004c2608087016200038f565b90509295509295909350565b600060208284031215620004e0578081fd5b81518015158114620004f0578182fd5b9392505050565b60006000198214156200051857634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b613bc880620005456000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80636eacd3981161013b578063bcd11014116100b8578063dfd128751161007c578063dfd128751461057c578063e70b9e2714610585578063f1229777146105b0578063f2fde38b146105c3578063f46eccc4146105d657600080fd5b8063bcd1101414610517578063ca5c7b911461052a578063db2e21bc14610533578063dc01f60d1461053b578063df3798761461055b57600080fd5b80638980f11f116100ff5780638980f11f146104c55780638da5cb5b146104d8578063a01c77bc146104e9578063abe50f19146104f1578063b66503cf1461050457600080fd5b80636eacd398146104435780637035ab981461046c578063715018a61461049757806372f702f31461049f5780637bb7bed1146104b257600080fd5b806339fc9713116101c957806348e5d9f81161018d57806348e5d9f8146103a25780635e0fac2e146103f7578063638634ee1461040a5780636724c9101461041d5780636b61a1721461043057600080fd5b806339fc9713146103235780633d18b9121461036157806340b47e1a1461036957806340c10f191461037c57806341ac34e51461038f57600080fd5b80631245e347116102105780631245e347146102bf57806318160ddd146102ea5780632c4b2334146102f35780632e1a7d4d14610306578063386a95251461031957600080fd5b806302b6293814610242578063045544431461026f5780630483a7f6146102875780630f1dde42146102aa575b600080fd5b6102556102503660046137fb565b6105f9565b604080519283526020830191909152015b60405180910390f35b6102796212750081565b604051908152602001610266565b61029a6102953660046137fb565b61076a565b6040516102669493929190613a8a565b6102bd6102b83660046138d2565b61098f565b005b6011546102d2906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b610279600b5481565b6102bd6103013660046137fb565b610ad6565b6102bd6103143660046138d2565b610bc8565b6102796205460081565b610351610331366004613815565b600860209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610266565b6102bd611216565b6102bd610377366004613815565b611596565b6102bd61038a36600461388d565b611739565b6102d261039d3660046138d2565b611bf7565b6103d76103b03660046137fb565b60056020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610266565b6102796104053660046137fb565b611c21565b6102796104183660046137fb565b611cea565b6102bd61042b366004613847565b611d14565b6003546102d2906001600160a01b031681565b6102796104513660046137fb565b6001600160a01b03166000908152600d602052604090205490565b61027961047a366004613815565b600960209081526000928352604080842090915290825290205481565b6102bd611e39565b6002546102d2906001600160a01b031681565b6102d26104c03660046138d2565b611e6f565b6102bd6104d336600461388d565b611e7f565b6001546001600160a01b03166102d2565b6102bd612034565b6102bd6104ff3660046138ea565b6121d2565b6102bd61051236600461388d565b612664565b6102796105253660046137fb565b612a4e565b610279600c5481565b6102bd612a77565b61054e6105493660046137fb565b612d34565b604051610266919061397a565b61056e6105693660046137fb565b612f14565b604051610266929190613a71565b61027960105481565b610279610593366004613815565b600a60209081526000928352604080842090915290825290205481565b6102796105be3660046137fb565b6130bb565b6102bd6105d13660046137fb565b6130f4565b6103516105e43660046137fb565b60066020526000908152604090205460ff1681565b6001600160a01b0381166000908152600d6020526040812060038101548291901561073d576001600160a01b0384166000908152600f6020526040812054815b81811015610715576001600160a01b0387166000908152600f6020526040812080548390811061067957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050806000141561069c5750610703565b6001600160a01b0388166000908152600f602052604090208054429190849081106106d757634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015411156106f55750610715565b6106ff848261318f565b9350505b8061070d81613b53565b915050610639565b50610738600261073284866003015461319b90919063ffffffff16565b906131a7565b935050505b6107628261075c8360030154846001015461318f90919063ffffffff16565b9061319b565b925050915091565b6001600160a01b0381166000908152600e602052604081208190819060609082805b825481101561096757428382815481106107b657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101541115610917578161084f5782546107e0908290613b10565b67ffffffffffffffff81111561080657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561084b57816020015b60408051808201909152600080825260208201528152602001906001900390816108245790505b5093505b82818154811061086f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106108bc57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806108d290613b53565b9250506109108382815481106108f857634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154869061318f565b9450610955565b61095283828154811061093a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154879061318f565b95505b8061095f81613b53565b91505061078c565b5050506001600160a01b0385166000908152600d602052604090206002015493509193509193565b336109a26001546001600160a01b031690565b6001600160a01b031614610a235760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d52657760448201527f61726450657263656e743a206e6f7420616c6c6f77656400000000000000000060648201526084015b60405180910390fd5b6028811115610a9a5760405162461bcd60e51b815260206004820152603960248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d52657760448201527f61726450657263656e743a20696e76616c69642076616c7565000000000000006064820152608401610a1a565b60108190556040518181527f2c07c8405293b2e2c430ac2eacfcf48630d12c06587c60d67ba3a7e856d2ae10906020015b60405180910390a150565b33610ae96001546001600160a01b031690565b6001600160a01b03161480610b0857506011546001600160a01b031633145b610b7a5760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d57616c60448201527f6c6574416464726573733a206e6f7420616c6c6f7765640000000000000000006064820152608401610a1a565b601180546001600160a01b0319166001600160a01b0383169081179091556040519081527f9e86385d911e7e56467ac33a3e55b03712a0a09d252d5590d5603d9a383430f090602001610acb565b60026000541415610beb5760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b039092169190610c1083826131b3565b6001600160a01b038416600090815260056020526040902060030155610c3583611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615610ce1576001600160a01b0384166000908152600d6020526040902060020154610c86908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015610deb5760048181548110610d1357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169350610d3484836131b3565b6001600160a01b038516600090815260056020526040902060030155610d5984611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615610dd957610d8c85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b80610de381613b53565b915050610ce8565b5060008511610e565760405162461bcd60e51b815260206004820152603160248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a20604482015270043616e6e6f74207769746864726177203607c1b6064820152608401610a1a565b336000908152600d6020526040812060018101549091908711610e8c576001820154610e82908861319b565b6001830155611172565b6000610ea583600101548961319b90919063ffffffff16565b90508083600301541015610f215760405162461bcd60e51b815260206004820152603d60248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a2060448201527f496e73756666696369656e7420756e6c6f636b65642062616c616e63650000006064820152608401610a1a565b600060018401556003830154610f37908261319b565b600384015560005b336000908152600f60205260408120805483908110610f6e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015490508060001415610f91575061115d565b83158015610fe05750336000908152600f60205260409020805442919084908110610fcc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154115b156110b357829350828560030154101561106d5760405162461bcd60e51b815260206004820152604260248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a2060448201527f496e73756666696369656e742062616c616e63652061667465722070656e616c606482015261747960f01b608482015260a401610a1a565b600385015461107c908461319b565b600386018190556110a557336000908152600f6020526040812061109f916137a4565b5061116f565b6110b08360026132ba565b92505b80831161110a576110c4818461319b565b336000908152600f602052604090208054849081106110f357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555061116f565b336000908152600f6020526040902080548390811061113957634e487b7160e01b600052603260045260246000fd5b60009182526020822060029091020181815560010155611159838261319b565b9250505b8061116781613b53565b915050610f3f565b50505b600061117e888361318f565b835490915061118d908261319b565b8355600b5461119c908261319b565b600b556002546111b6906001600160a01b0316338a6132c6565b81156111d2576002546111d2906001600160a01b03168361332e565b60405188815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250506001600055505050505050565b600260005414156112395760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b03909216919061125e83826131b3565b6001600160a01b03841660009081526005602052604090206003015561128383611cea565b6001600160a01b0380851660009081526005602052604090206002019190915584161561132f576001600160a01b0384166000908152600d60205260409020600201546112d4908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015611439576004818154811061136157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061138284836131b3565b6001600160a01b0385166000908152600560205260409020600301556113a784611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615611427576113da85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061143181613b53565b915050611336565b5060005b60045481101561158a5760006004828154811061146a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910154338352600a825260408084206001600160a01b0390921680855291909252912054909150801561157557336000908152600a602090815260408083206001600160a01b038616808552925282209190915573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611520576114ed81613449565b604051339082156108fc029083906000818181858888f1935050505015801561151a573d6000803e3d6000fd5b50611534565b6115346001600160a01b03831633836132c6565b6040518181526001600160a01b0383169033907f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9060200160405180910390a35b5050808061158290613b53565b91505061143d565b50506001600055505050565b6001546001600160a01b031633146115c05760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b0382166000908152600560205260409020600201541561163a5760405162461bcd60e51b815260206004820152602860248201527f4d756c7469466565446973747269627574696f6e3a3a6164645265776172643a60448201526708125b9d985b1a5960c21b6064820152608401610a1a565b6004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03858116918217909255600081815260056020908152604080832042600282018190559055600882528083209487168352939052828120805460ff1916909417909355905190917ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf82691a2806001600160a01b0316826001600160a01b03167fd890240fb430b9ed4ff1d263f43a0a2922d16349b3d2d71015f86a3e1d3e8848600160405161172d911515815260200190565b60405180910390a35050565b600254600c5483916001600160a01b03169060009061175883826131b3565b6001600160a01b03841660009081526005602052604090206003015561177d83611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615611829576001600160a01b0384166000908152600d60205260409020600201546117ce908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015611933576004818154811061185b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061187c84836131b3565b6001600160a01b0385166000908152600560205260409020600301556118a184611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615611921576118d485858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061192b81613b53565b915050611830565b503360009081526006602052604090205460ff166119ac5760405162461bcd60e51b815260206004820152603060248201527f4d756c7469466565446973747269627574696f6e3a3a6d696e743a204f6e6c7960448201526f081b5a5b9d195c9cc8185b1b1bddd95960821b6064820152608401610a1a565b600b546119b9908661318f565b600b556001600160a01b0386166000908152600d6020526040902080546119e0908761318f565b815560038101546119f1908761318f565b60038201556000611a1c62127500611a1662054600611a1042826131a7565b906132ba565b9061318f565b6001600160a01b0389166000908152600f60205260409020805491925090801580611a8157508282611a4f600184613b10565b81548110611a6d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154105b15611ac3576040805180820190915289815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155611b44565b611b088983611ad3600185613b10565b81548110611af157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201549061318f565b82611b14600184613b10565b81548110611b3257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555b60035460405163a9059cbb60e01b8152306004820152602481018b90526001600160a01b039091169063a9059cbb90604401600060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b50505050896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a604051611be391815260200190565b60405180910390a250505050505050505050565b60078181548110611c0757600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0381166000908152600d6020908152604080832060010154338452600f909252822090915b8154811015611ce35742828281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101541115611c9457611ce3565b611ccf828281548110611cb757634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154849061318f565b925080611cdb81613b53565b915050611c4d565b5050919050565b6001600160a01b038116600090815260056020526040812054611d0e9042906134b1565b92915050565b6001546001600160a01b03163314611d3e5760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b038316600090815260056020526040902060020154611dcc5760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a617070726f766552657760448201527f6172644469737472696275746f723a20496e76616c69640000000000000000006064820152608401610a1a565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527fd890240fb430b9ed4ff1d263f43a0a2922d16349b3d2d71015f86a3e1d3e8848910160405180910390a3505050565b6001546001600160a01b03163314611e635760405162461bcd60e51b8152600401610a1a90613a05565b611e6d60006134c7565b565b60048181548110611c0757600080fd5b6001546001600160a01b03163314611ea95760405162461bcd60e51b8152600401610a1a90613a05565b6002546001600160a01b0383811691161415611f375760405162461bcd60e51b815260206004820152604160248201527f4d756c7469466565446973747269627574696f6e3a3a7265636f76657245524360448201527f32303a2043616e6e6f74207769746864726177207374616b696e6720746f6b656064820152603760f91b608482015260a401610a1a565b6001600160a01b03821660009081526005602052604090206002015415611fc8576040805162461bcd60e51b81526020600482015260248101919091527f4d756c7469466565446973747269627574696f6e3a3a7265636f76657245524360448201527f32303a2043616e6e6f742077697468647261772072657761726420746f6b656e6064820152608401610a1a565b611fee611fdd6001546001600160a01b031690565b6001600160a01b03841690836132c6565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b336000908152600e60209081526040808320600d90925282208154919290914284612060600184613b10565b8154811061207e57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154116120bb576002830154336000908152600e602052604081209193506120b691906137a4565b612173565b60005b8181101561217157428582815481106120e757634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154111561210457612171565b612127858281548110611cb757634e487b7160e01b600052603260045260246000fd5b925084818154811061214957634e487b7160e01b600052603260045260246000fd5b600091825260208220600290910201818155600101558061216981613b53565b9150506120be565b505b6002830154612182908361319b565b60028401558254612193908361319b565b8355600b546121a2908361319b565b600b55600c546121b2908361319b565b600c556002546121cc906001600160a01b031633846132c6565b50505050565b600260005414156121f55760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b03909216919061221a83826131b3565b6001600160a01b03841660009081526005602052604090206003015561223f83611cea565b6001600160a01b038085166000908152600560205260409020600201919091558416156122eb576001600160a01b0384166000908152600d6020526040902060020154612290908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b6004548110156123f5576004818154811061231d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061233e84836131b3565b6001600160a01b03851660009081526005602052604090206003015561236384611cea565b6001600160a01b038086166000908152600560205260409020600201919091558516156123e35761239685858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b806123ed81613b53565b9150506122f2565b506000861161245a5760405162461bcd60e51b815260206004820152602b60248201527f4d756c7469466565446973747269627574696f6e3a3a7374616b653a2043616e60448201526a06e6f74207374616b6520360ac1b6064820152608401610a1a565b600b54612467908761318f565b600b55336000908152600d602052604090208054612485908861318f565b815585156125f457600c5461249a908861318f565b600c5560028101546124ac908861318f565b600282015560006124cb62127500611a1662054600611a1042826131a7565b336000908152600e60205260409020549091508015806125345750336000908152600e602052604090208290612502600184613b10565b8154811061252057634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154105b1561258357336000908152600e6020908152604080832081518083019092528c8252818301868152815460018181018455928652939094209151600290930290910191825591519101556125ed565b336000908152600e602052604090206125a3908a90611ad3600185613b10565b336000908152600e602052604090206125bd600184613b10565b815481106125db57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555b5050612609565b6001810154612603908861318f565b60018201555b600254612621906001600160a01b031633308a613519565b60405187815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a2505060016000555050505050565b600254600c546000916001600160a01b031690829061268383826131b3565b6001600160a01b0384166000908152600560205260409020600301556126a883611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615612754576001600160a01b0384166000908152600d60205260409020600201546126f9908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b60045481101561285e576004818154811061278657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031693506127a784836131b3565b6001600160a01b0385166000908152600560205260409020600301556127cc84611cea565b6001600160a01b0380861660009081526005602052604090206002019190915585161561284c576127ff85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061285681613b53565b91505061275b565b506001600160a01b038616600090815260086020908152604080832033845290915290205460ff1661290b5760405162461bcd60e51b815260206004820152604a60248201527f4d756c7469466565446973747269627574696f6e3a3a6e6f746966795265776160448201527f7264416d6f756e743a204f6e6c7920726577617264206469737472696275746f6064820152691c9cc8185b1b1bddd95960b21b608482015260a401610a1a565b600085116129775760405162461bcd60e51b815260206004820152603360248201527f4d756c7469466565446973747269627574696f6e3a3a6e6f74696679526577616044820152721c99105b5bdd5b9d0e88139bc81c995dd85c99606a1b6064820152608401610a1a565b60006129936064610732601054896132ba90919063ffffffff16565b905060006129a1878361319b565b90506129b86001600160a01b038916333084613519565b6011546129d4906001600160a01b038a81169133911685613519565b6129de888261332e565b6040518281527fae0228d45eea5708b1ac27ea2a812bf958a177a409f6bdcee727c1776526fdaf9060200160405180910390a16040518181527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a15050505050505050565b6001600160a01b038116600090815260056020526040812060010154611d0e90620546006132ba565b600254600c5433916001600160a01b031690600090612a9683826131b3565b6001600160a01b038416600090815260056020526040902060030155612abb83611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615612b67576001600160a01b0384166000908152600d6020526040902060020154612b0c908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015612c715760048181548110612b9957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169350612bba84836131b3565b6001600160a01b038516600090815260056020526040902060030155612bdf84611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615612c5f57612c1285858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b80612c6981613b53565b915050612b6e565b50600080612c7e336105f9565b336000908152600f60205260408120929450909250612c9d91906137a4565b336000908152600d60205260409020600381015460018201548254612cc7929161075c919061319b565b81556000600182018190556003820155612ced612ce4848461318f565b600b549061319b565b600b55600254612d07906001600160a01b031633856132c6565b8115612d2357600254612d23906001600160a01b03168361332e565b612d2b611216565b50505050505050565b60045460609067ffffffffffffffff811115612d6057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612da557816020015b6040805180820190915260008082526020820152815260200190600190039081612d7e5790505b50905060005b8151811015612f0e5760008115612dda576001600160a01b0384166000908152600d6020526040902054612df7565b6001600160a01b0384166000908152600d60205260409020600201545b905060008215612e0957600b54612e0d565b600c545b905060048381548110612e3057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110612e6e57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050612ec985858581518110612eb657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001518484613248565b848481518110612ee957634e487b7160e01b600052603260045260246000fd5b6020026020010151602001818152505050508080612f0690613b53565b915050612dab565b50919050565b6001600160a01b0381166000908152600f6020526040812060609082805b82548110156130b35742838281548110612f5c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015411156130a15781612ff5578254612f86908290613b10565b67ffffffffffffffff811115612fac57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ff157816020015b6040805180820190915260008082526020820152815260200190600190039081612fca5790505b5093505b82818154811061301557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061306257634e487b7160e01b600052603260045260246000fd5b6020026020010181905250818061307890613b53565b92505061309e8382815481106108f857634e487b7160e01b600052603260045260246000fd5b94505b806130ab81613b53565b915050612f32565b505050915091565b60025460009081906001600160a01b038481169116146130dd57600b546130e1565b600c545b90506130ed83826131b3565b9392505050565b6001546001600160a01b0316331461311e5760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b0381166131835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a1a565b61318c816134c7565b50565b60006130ed8284613ab9565b60006130ed8284613b10565b60006130ed8284613ad1565b6000816131dc57506001600160a01b038216600090815260056020526040902060030154611d0e565b6001600160a01b038316600090815260056020526040902060018101546002909101546130ed9161322691859161073291670de0b6b3a764000091611a1091829061075c8c611cea565b6001600160a01b0385166000908152600560205260409020600301549061318f565b6001600160a01b038085166000818152600a602090815260408083209488168084529482528083205493835260098252808320948352939052918220546132b19190611a1690670de0b6b3a764000090610732906132aa9061075c8b8a6131b3565b88906132ba565b95945050505050565b60006130ed8284613af1565b6040516001600160a01b03831660248201526044810182905261332990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613551565b505050565b6001600160a01b038216600090815260056020526040902054421061337b5761335a81620546006131a7565b6001600160a01b0383166000908152600560205260409020600101556133fb565b6001600160a01b03821660009081526005602052604081205461339e904261319b565b6001600160a01b038416600090815260056020526040812060010154919250906133c99083906132ba565b90506133dc62054600610732858461318f565b6001600160a01b03851660009081526005602052604090206001015550505b6001600160a01b0382166000908152600560205260409020426002909101819055613429906205460061318f565b6001600160a01b0390921660009081526005602052604090209190915550565b604051632e1a7d4d60e01b81526004810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561349657600080fd5b505af11580156134aa573d6000803e3d6000fd5b5050505050565b60008183106134c057816130ed565b5090919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526121cc9085906323b872dd60e01b906084016132f2565b60006135a6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136239092919063ffffffff16565b80519091501561332957808060200190518101906135c491906138b6565b6133295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a1a565b6060613632848460008561363a565b949350505050565b60608247101561369b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a1a565b6001600160a01b0385163b6136f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a1a565b600080866001600160a01b0316858760405161370e919061395e565b60006040518083038185875af1925050503d806000811461374b576040519150601f19603f3d011682016040523d82523d6000602084013e613750565b606091505b509150915061376082828661376b565b979650505050505050565b6060831561377a5750816130ed565b82511561378a5782518084602001fd5b8160405162461bcd60e51b8152600401610a1a91906139d2565b508054600082556002029060005260206000209081019061318c91905b808211156137db57600080825560018201556002016137c1565b5090565b80356001600160a01b03811681146137f657600080fd5b919050565b60006020828403121561380c578081fd5b6130ed826137df565b60008060408385031215613827578081fd5b613830836137df565b915061383e602084016137df565b90509250929050565b60008060006060848603121561385b578081fd5b613864846137df565b9250613872602085016137df565b9150604084013561388281613b84565b809150509250925092565b6000806040838503121561389f578182fd5b6138a8836137df565b946020939093013593505050565b6000602082840312156138c7578081fd5b81516130ed81613b84565b6000602082840312156138e3578081fd5b5035919050565b600080604083850312156138fc578182fd5b82359150602083013561390e81613b84565b809150509250929050565b6000815180845260208085019450808401835b8381101561395357815180518852830151838801526040909601959082019060010161392c565b509495945050505050565b60008251613970818460208701613b27565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b828110156139c557815180516001600160a01b03168552860151868501529284019290850190600101613997565b5091979650505050505050565b60208152600082518060208401526139f1816040850160208701613b27565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b8281526040602082015260006136326040830184613919565b848152836020820152826040820152608060608201526000613aaf6080830184613919565b9695505050505050565b60008219821115613acc57613acc613b6e565b500190565b600082613aec57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613b0b57613b0b613b6e565b500290565b600082821015613b2257613b22613b6e565b500390565b60005b83811015613b42578181015183820152602001613b2a565b838111156121cc5750506000910152565b6000600019821415613b6757613b67613b6e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b801515811461318c57600080fdfea26469706673582212200e6985a1ae31e1cf4a4bca80c0a53d51b93e3f742f912d7db28a7005f1007e7a64736f6c63430008040033000000000000000000000000276e84edc5bd94731b65c207dc1512fc5391572f000000000000000000000000043ef739a8c7ff3ca0423ecf40ceadb2e824d60a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd38000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd380000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5b341f6e931b6a510420e9030ef15ac17b8946c
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80636eacd3981161013b578063bcd11014116100b8578063dfd128751161007c578063dfd128751461057c578063e70b9e2714610585578063f1229777146105b0578063f2fde38b146105c3578063f46eccc4146105d657600080fd5b8063bcd1101414610517578063ca5c7b911461052a578063db2e21bc14610533578063dc01f60d1461053b578063df3798761461055b57600080fd5b80638980f11f116100ff5780638980f11f146104c55780638da5cb5b146104d8578063a01c77bc146104e9578063abe50f19146104f1578063b66503cf1461050457600080fd5b80636eacd398146104435780637035ab981461046c578063715018a61461049757806372f702f31461049f5780637bb7bed1146104b257600080fd5b806339fc9713116101c957806348e5d9f81161018d57806348e5d9f8146103a25780635e0fac2e146103f7578063638634ee1461040a5780636724c9101461041d5780636b61a1721461043057600080fd5b806339fc9713146103235780633d18b9121461036157806340b47e1a1461036957806340c10f191461037c57806341ac34e51461038f57600080fd5b80631245e347116102105780631245e347146102bf57806318160ddd146102ea5780632c4b2334146102f35780632e1a7d4d14610306578063386a95251461031957600080fd5b806302b6293814610242578063045544431461026f5780630483a7f6146102875780630f1dde42146102aa575b600080fd5b6102556102503660046137fb565b6105f9565b604080519283526020830191909152015b60405180910390f35b6102796212750081565b604051908152602001610266565b61029a6102953660046137fb565b61076a565b6040516102669493929190613a8a565b6102bd6102b83660046138d2565b61098f565b005b6011546102d2906001600160a01b031681565b6040516001600160a01b039091168152602001610266565b610279600b5481565b6102bd6103013660046137fb565b610ad6565b6102bd6103143660046138d2565b610bc8565b6102796205460081565b610351610331366004613815565b600860209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610266565b6102bd611216565b6102bd610377366004613815565b611596565b6102bd61038a36600461388d565b611739565b6102d261039d3660046138d2565b611bf7565b6103d76103b03660046137fb565b60056020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610266565b6102796104053660046137fb565b611c21565b6102796104183660046137fb565b611cea565b6102bd61042b366004613847565b611d14565b6003546102d2906001600160a01b031681565b6102796104513660046137fb565b6001600160a01b03166000908152600d602052604090205490565b61027961047a366004613815565b600960209081526000928352604080842090915290825290205481565b6102bd611e39565b6002546102d2906001600160a01b031681565b6102d26104c03660046138d2565b611e6f565b6102bd6104d336600461388d565b611e7f565b6001546001600160a01b03166102d2565b6102bd612034565b6102bd6104ff3660046138ea565b6121d2565b6102bd61051236600461388d565b612664565b6102796105253660046137fb565b612a4e565b610279600c5481565b6102bd612a77565b61054e6105493660046137fb565b612d34565b604051610266919061397a565b61056e6105693660046137fb565b612f14565b604051610266929190613a71565b61027960105481565b610279610593366004613815565b600a60209081526000928352604080842090915290825290205481565b6102796105be3660046137fb565b6130bb565b6102bd6105d13660046137fb565b6130f4565b6103516105e43660046137fb565b60066020526000908152604090205460ff1681565b6001600160a01b0381166000908152600d6020526040812060038101548291901561073d576001600160a01b0384166000908152600f6020526040812054815b81811015610715576001600160a01b0387166000908152600f6020526040812080548390811061067957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001549050806000141561069c5750610703565b6001600160a01b0388166000908152600f602052604090208054429190849081106106d757634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015411156106f55750610715565b6106ff848261318f565b9350505b8061070d81613b53565b915050610639565b50610738600261073284866003015461319b90919063ffffffff16565b906131a7565b935050505b6107628261075c8360030154846001015461318f90919063ffffffff16565b9061319b565b925050915091565b6001600160a01b0381166000908152600e602052604081208190819060609082805b825481101561096757428382815481106107b657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101541115610917578161084f5782546107e0908290613b10565b67ffffffffffffffff81111561080657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561084b57816020015b60408051808201909152600080825260208201528152602001906001900390816108245790505b5093505b82818154811061086f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508483815181106108bc57634e487b7160e01b600052603260045260246000fd5b602002602001018190525081806108d290613b53565b9250506109108382815481106108f857634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154869061318f565b9450610955565b61095283828154811061093a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154879061318f565b95505b8061095f81613b53565b91505061078c565b5050506001600160a01b0385166000908152600d602052604090206002015493509193509193565b336109a26001546001600160a01b031690565b6001600160a01b031614610a235760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d52657760448201527f61726450657263656e743a206e6f7420616c6c6f77656400000000000000000060648201526084015b60405180910390fd5b6028811115610a9a5760405162461bcd60e51b815260206004820152603960248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d52657760448201527f61726450657263656e743a20696e76616c69642076616c7565000000000000006064820152608401610a1a565b60108190556040518181527f2c07c8405293b2e2c430ac2eacfcf48630d12c06587c60d67ba3a7e856d2ae10906020015b60405180910390a150565b33610ae96001546001600160a01b031690565b6001600160a01b03161480610b0857506011546001600160a01b031633145b610b7a5760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a7365745465616d57616c60448201527f6c6574416464726573733a206e6f7420616c6c6f7765640000000000000000006064820152608401610a1a565b601180546001600160a01b0319166001600160a01b0383169081179091556040519081527f9e86385d911e7e56467ac33a3e55b03712a0a09d252d5590d5603d9a383430f090602001610acb565b60026000541415610beb5760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b039092169190610c1083826131b3565b6001600160a01b038416600090815260056020526040902060030155610c3583611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615610ce1576001600160a01b0384166000908152600d6020526040902060020154610c86908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015610deb5760048181548110610d1357634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169350610d3484836131b3565b6001600160a01b038516600090815260056020526040902060030155610d5984611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615610dd957610d8c85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b80610de381613b53565b915050610ce8565b5060008511610e565760405162461bcd60e51b815260206004820152603160248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a20604482015270043616e6e6f74207769746864726177203607c1b6064820152608401610a1a565b336000908152600d6020526040812060018101549091908711610e8c576001820154610e82908861319b565b6001830155611172565b6000610ea583600101548961319b90919063ffffffff16565b90508083600301541015610f215760405162461bcd60e51b815260206004820152603d60248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a2060448201527f496e73756666696369656e7420756e6c6f636b65642062616c616e63650000006064820152608401610a1a565b600060018401556003830154610f37908261319b565b600384015560005b336000908152600f60205260408120805483908110610f6e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015490508060001415610f91575061115d565b83158015610fe05750336000908152600f60205260409020805442919084908110610fcc57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154115b156110b357829350828560030154101561106d5760405162461bcd60e51b815260206004820152604260248201527f4d756c7469466565446973747269627574696f6e3a3a77697468647261773a2060448201527f496e73756666696369656e742062616c616e63652061667465722070656e616c606482015261747960f01b608482015260a401610a1a565b600385015461107c908461319b565b600386018190556110a557336000908152600f6020526040812061109f916137a4565b5061116f565b6110b08360026132ba565b92505b80831161110a576110c4818461319b565b336000908152600f602052604090208054849081106110f357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555061116f565b336000908152600f6020526040902080548390811061113957634e487b7160e01b600052603260045260246000fd5b60009182526020822060029091020181815560010155611159838261319b565b9250505b8061116781613b53565b915050610f3f565b50505b600061117e888361318f565b835490915061118d908261319b565b8355600b5461119c908261319b565b600b556002546111b6906001600160a01b0316338a6132c6565b81156111d2576002546111d2906001600160a01b03168361332e565b60405188815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250506001600055505050505050565b600260005414156112395760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b03909216919061125e83826131b3565b6001600160a01b03841660009081526005602052604090206003015561128383611cea565b6001600160a01b0380851660009081526005602052604090206002019190915584161561132f576001600160a01b0384166000908152600d60205260409020600201546112d4908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015611439576004818154811061136157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061138284836131b3565b6001600160a01b0385166000908152600560205260409020600301556113a784611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615611427576113da85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061143181613b53565b915050611336565b5060005b60045481101561158a5760006004828154811061146a57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910154338352600a825260408084206001600160a01b0390921680855291909252912054909150801561157557336000908152600a602090815260408083206001600160a01b038616808552925282209190915573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611520576114ed81613449565b604051339082156108fc029083906000818181858888f1935050505015801561151a573d6000803e3d6000fd5b50611534565b6115346001600160a01b03831633836132c6565b6040518181526001600160a01b0383169033907f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9060200160405180910390a35b5050808061158290613b53565b91505061143d565b50506001600055505050565b6001546001600160a01b031633146115c05760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b0382166000908152600560205260409020600201541561163a5760405162461bcd60e51b815260206004820152602860248201527f4d756c7469466565446973747269627574696f6e3a3a6164645265776172643a60448201526708125b9d985b1a5960c21b6064820152608401610a1a565b6004805460018082019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b03858116918217909255600081815260056020908152604080832042600282018190559055600882528083209487168352939052828120805460ff1916909417909355905190917ff3e4c2c64e71e6ba2eaab9a599bced62f9eb91d2cda610bf41aa8c80ff2cf82691a2806001600160a01b0316826001600160a01b03167fd890240fb430b9ed4ff1d263f43a0a2922d16349b3d2d71015f86a3e1d3e8848600160405161172d911515815260200190565b60405180910390a35050565b600254600c5483916001600160a01b03169060009061175883826131b3565b6001600160a01b03841660009081526005602052604090206003015561177d83611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615611829576001600160a01b0384166000908152600d60205260409020600201546117ce908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015611933576004818154811061185b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061187c84836131b3565b6001600160a01b0385166000908152600560205260409020600301556118a184611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615611921576118d485858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061192b81613b53565b915050611830565b503360009081526006602052604090205460ff166119ac5760405162461bcd60e51b815260206004820152603060248201527f4d756c7469466565446973747269627574696f6e3a3a6d696e743a204f6e6c7960448201526f081b5a5b9d195c9cc8185b1b1bddd95960821b6064820152608401610a1a565b600b546119b9908661318f565b600b556001600160a01b0386166000908152600d6020526040902080546119e0908761318f565b815560038101546119f1908761318f565b60038201556000611a1c62127500611a1662054600611a1042826131a7565b906132ba565b9061318f565b6001600160a01b0389166000908152600f60205260409020805491925090801580611a8157508282611a4f600184613b10565b81548110611a6d57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154105b15611ac3576040805180820190915289815260208082018581528454600181810187556000878152939093209351600290910290930192835551910155611b44565b611b088983611ad3600185613b10565b81548110611af157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201549061318f565b82611b14600184613b10565b81548110611b3257634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555b60035460405163a9059cbb60e01b8152306004820152602481018b90526001600160a01b039091169063a9059cbb90604401600060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b50505050896001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d8a604051611be391815260200190565b60405180910390a250505050505050505050565b60078181548110611c0757600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0381166000908152600d6020908152604080832060010154338452600f909252822090915b8154811015611ce35742828281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101541115611c9457611ce3565b611ccf828281548110611cb757634e487b7160e01b600052603260045260246000fd5b6000918252602090912060029091020154849061318f565b925080611cdb81613b53565b915050611c4d565b5050919050565b6001600160a01b038116600090815260056020526040812054611d0e9042906134b1565b92915050565b6001546001600160a01b03163314611d3e5760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b038316600090815260056020526040902060020154611dcc5760405162461bcd60e51b815260206004820152603760248201527f4d756c7469466565446973747269627574696f6e3a3a617070726f766552657760448201527f6172644469737472696275746f723a20496e76616c69640000000000000000006064820152608401610a1a565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527fd890240fb430b9ed4ff1d263f43a0a2922d16349b3d2d71015f86a3e1d3e8848910160405180910390a3505050565b6001546001600160a01b03163314611e635760405162461bcd60e51b8152600401610a1a90613a05565b611e6d60006134c7565b565b60048181548110611c0757600080fd5b6001546001600160a01b03163314611ea95760405162461bcd60e51b8152600401610a1a90613a05565b6002546001600160a01b0383811691161415611f375760405162461bcd60e51b815260206004820152604160248201527f4d756c7469466565446973747269627574696f6e3a3a7265636f76657245524360448201527f32303a2043616e6e6f74207769746864726177207374616b696e6720746f6b656064820152603760f91b608482015260a401610a1a565b6001600160a01b03821660009081526005602052604090206002015415611fc8576040805162461bcd60e51b81526020600482015260248101919091527f4d756c7469466565446973747269627574696f6e3a3a7265636f76657245524360448201527f32303a2043616e6e6f742077697468647261772072657761726420746f6b656e6064820152608401610a1a565b611fee611fdd6001546001600160a01b031690565b6001600160a01b03841690836132c6565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b336000908152600e60209081526040808320600d90925282208154919290914284612060600184613b10565b8154811061207e57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154116120bb576002830154336000908152600e602052604081209193506120b691906137a4565b612173565b60005b8181101561217157428582815481106120e757634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154111561210457612171565b612127858281548110611cb757634e487b7160e01b600052603260045260246000fd5b925084818154811061214957634e487b7160e01b600052603260045260246000fd5b600091825260208220600290910201818155600101558061216981613b53565b9150506120be565b505b6002830154612182908361319b565b60028401558254612193908361319b565b8355600b546121a2908361319b565b600b55600c546121b2908361319b565b600c556002546121cc906001600160a01b031633846132c6565b50505050565b600260005414156121f55760405162461bcd60e51b8152600401610a1a90613a3a565b600260008181559054600c5433926001600160a01b03909216919061221a83826131b3565b6001600160a01b03841660009081526005602052604090206003015561223f83611cea565b6001600160a01b038085166000908152600560205260409020600201919091558416156122eb576001600160a01b0384166000908152600d6020526040902060020154612290908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b6004548110156123f5576004818154811061231d57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316935061233e84836131b3565b6001600160a01b03851660009081526005602052604090206003015561236384611cea565b6001600160a01b038086166000908152600560205260409020600201919091558516156123e35761239685858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b806123ed81613b53565b9150506122f2565b506000861161245a5760405162461bcd60e51b815260206004820152602b60248201527f4d756c7469466565446973747269627574696f6e3a3a7374616b653a2043616e60448201526a06e6f74207374616b6520360ac1b6064820152608401610a1a565b600b54612467908761318f565b600b55336000908152600d602052604090208054612485908861318f565b815585156125f457600c5461249a908861318f565b600c5560028101546124ac908861318f565b600282015560006124cb62127500611a1662054600611a1042826131a7565b336000908152600e60205260409020549091508015806125345750336000908152600e602052604090208290612502600184613b10565b8154811061252057634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154105b1561258357336000908152600e6020908152604080832081518083019092528c8252818301868152815460018181018455928652939094209151600290930290910191825591519101556125ed565b336000908152600e602052604090206125a3908a90611ad3600185613b10565b336000908152600e602052604090206125bd600184613b10565b815481106125db57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201555b5050612609565b6001810154612603908861318f565b60018201555b600254612621906001600160a01b031633308a613519565b60405187815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a2505060016000555050505050565b600254600c546000916001600160a01b031690829061268383826131b3565b6001600160a01b0384166000908152600560205260409020600301556126a883611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615612754576001600160a01b0384166000908152600d60205260409020600201546126f9908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b60045481101561285e576004818154811061278657634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031693506127a784836131b3565b6001600160a01b0385166000908152600560205260409020600301556127cc84611cea565b6001600160a01b0380861660009081526005602052604090206002019190915585161561284c576127ff85858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b8061285681613b53565b91505061275b565b506001600160a01b038616600090815260086020908152604080832033845290915290205460ff1661290b5760405162461bcd60e51b815260206004820152604a60248201527f4d756c7469466565446973747269627574696f6e3a3a6e6f746966795265776160448201527f7264416d6f756e743a204f6e6c7920726577617264206469737472696275746f6064820152691c9cc8185b1b1bddd95960b21b608482015260a401610a1a565b600085116129775760405162461bcd60e51b815260206004820152603360248201527f4d756c7469466565446973747269627574696f6e3a3a6e6f74696679526577616044820152721c99105b5bdd5b9d0e88139bc81c995dd85c99606a1b6064820152608401610a1a565b60006129936064610732601054896132ba90919063ffffffff16565b905060006129a1878361319b565b90506129b86001600160a01b038916333084613519565b6011546129d4906001600160a01b038a81169133911685613519565b6129de888261332e565b6040518281527fae0228d45eea5708b1ac27ea2a812bf958a177a409f6bdcee727c1776526fdaf9060200160405180910390a16040518181527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a15050505050505050565b6001600160a01b038116600090815260056020526040812060010154611d0e90620546006132ba565b600254600c5433916001600160a01b031690600090612a9683826131b3565b6001600160a01b038416600090815260056020526040902060030155612abb83611cea565b6001600160a01b03808516600090815260056020526040902060020191909155841615612b67576001600160a01b0384166000908152600d6020526040902060020154612b0c908590859084613248565b6001600160a01b038086166000818152600a602090815260408083209489168084529482528083209590955560058152848220600301548383526009825285832094835293815284822093909355908152600d909152205491505b50600b5460015b600454811015612c715760048181548110612b9957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169350612bba84836131b3565b6001600160a01b038516600090815260056020526040902060030155612bdf84611cea565b6001600160a01b03808616600090815260056020526040902060020191909155851615612c5f57612c1285858585613248565b6001600160a01b038087166000818152600a60209081526040808320948a168084529482528083209590955560058152848220600301549282526009815284822093825292909252919020555b80612c6981613b53565b915050612b6e565b50600080612c7e336105f9565b336000908152600f60205260408120929450909250612c9d91906137a4565b336000908152600d60205260409020600381015460018201548254612cc7929161075c919061319b565b81556000600182018190556003820155612ced612ce4848461318f565b600b549061319b565b600b55600254612d07906001600160a01b031633856132c6565b8115612d2357600254612d23906001600160a01b03168361332e565b612d2b611216565b50505050505050565b60045460609067ffffffffffffffff811115612d6057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612da557816020015b6040805180820190915260008082526020820152815260200190600190039081612d7e5790505b50905060005b8151811015612f0e5760008115612dda576001600160a01b0384166000908152600d6020526040902054612df7565b6001600160a01b0384166000908152600d60205260409020600201545b905060008215612e0957600b54612e0d565b600c545b905060048381548110612e3057634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316848481518110612e6e57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001906001600160a01b031690816001600160a01b031681525050612ec985858581518110612eb657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001518484613248565b848481518110612ee957634e487b7160e01b600052603260045260246000fd5b6020026020010151602001818152505050508080612f0690613b53565b915050612dab565b50919050565b6001600160a01b0381166000908152600f6020526040812060609082805b82548110156130b35742838281548110612f5c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015411156130a15781612ff5578254612f86908290613b10565b67ffffffffffffffff811115612fac57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ff157816020015b6040805180820190915260008082526020820152815260200190600190039081612fca5790505b5093505b82818154811061301557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505084838151811061306257634e487b7160e01b600052603260045260246000fd5b6020026020010181905250818061307890613b53565b92505061309e8382815481106108f857634e487b7160e01b600052603260045260246000fd5b94505b806130ab81613b53565b915050612f32565b505050915091565b60025460009081906001600160a01b038481169116146130dd57600b546130e1565b600c545b90506130ed83826131b3565b9392505050565b6001546001600160a01b0316331461311e5760405162461bcd60e51b8152600401610a1a90613a05565b6001600160a01b0381166131835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a1a565b61318c816134c7565b50565b60006130ed8284613ab9565b60006130ed8284613b10565b60006130ed8284613ad1565b6000816131dc57506001600160a01b038216600090815260056020526040902060030154611d0e565b6001600160a01b038316600090815260056020526040902060018101546002909101546130ed9161322691859161073291670de0b6b3a764000091611a1091829061075c8c611cea565b6001600160a01b0385166000908152600560205260409020600301549061318f565b6001600160a01b038085166000818152600a602090815260408083209488168084529482528083205493835260098252808320948352939052918220546132b19190611a1690670de0b6b3a764000090610732906132aa9061075c8b8a6131b3565b88906132ba565b95945050505050565b60006130ed8284613af1565b6040516001600160a01b03831660248201526044810182905261332990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613551565b505050565b6001600160a01b038216600090815260056020526040902054421061337b5761335a81620546006131a7565b6001600160a01b0383166000908152600560205260409020600101556133fb565b6001600160a01b03821660009081526005602052604081205461339e904261319b565b6001600160a01b038416600090815260056020526040812060010154919250906133c99083906132ba565b90506133dc62054600610732858461318f565b6001600160a01b03851660009081526005602052604090206001015550505b6001600160a01b0382166000908152600560205260409020426002909101819055613429906205460061318f565b6001600160a01b0390921660009081526005602052604090209190915550565b604051632e1a7d4d60e01b81526004810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561349657600080fd5b505af11580156134aa573d6000803e3d6000fd5b5050505050565b60008183106134c057816130ed565b5090919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526121cc9085906323b872dd60e01b906084016132f2565b60006135a6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136239092919063ffffffff16565b80519091501561332957808060200190518101906135c491906138b6565b6133295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a1a565b6060613632848460008561363a565b949350505050565b60608247101561369b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a1a565b6001600160a01b0385163b6136f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a1a565b600080866001600160a01b0316858760405161370e919061395e565b60006040518083038185875af1925050503d806000811461374b576040519150601f19603f3d011682016040523d82523d6000602084013e613750565b606091505b509150915061376082828661376b565b979650505050505050565b6060831561377a5750816130ed565b82511561378a5782518084602001fd5b8160405162461bcd60e51b8152600401610a1a91906139d2565b508054600082556002029060005260206000209081019061318c91905b808211156137db57600080825560018201556002016137c1565b5090565b80356001600160a01b03811681146137f657600080fd5b919050565b60006020828403121561380c578081fd5b6130ed826137df565b60008060408385031215613827578081fd5b613830836137df565b915061383e602084016137df565b90509250929050565b60008060006060848603121561385b578081fd5b613864846137df565b9250613872602085016137df565b9150604084013561388281613b84565b809150509250925092565b6000806040838503121561389f578182fd5b6138a8836137df565b946020939093013593505050565b6000602082840312156138c7578081fd5b81516130ed81613b84565b6000602082840312156138e3578081fd5b5035919050565b600080604083850312156138fc578182fd5b82359150602083013561390e81613b84565b809150509250929050565b6000815180845260208085019450808401835b8381101561395357815180518852830151838801526040909601959082019060010161392c565b509495945050505050565b60008251613970818460208701613b27565b9190910192915050565b602080825282518282018190526000919060409081850190868401855b828110156139c557815180516001600160a01b03168552860151868501529284019290850190600101613997565b5091979650505050505050565b60208152600082518060208401526139f1816040850160208701613b27565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b8281526040602082015260006136326040830184613919565b848152836020820152826040820152608060608201526000613aaf6080830184613919565b9695505050505050565b60008219821115613acc57613acc613b6e565b500190565b600082613aec57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613b0b57613b0b613b6e565b500290565b600082821015613b2257613b22613b6e565b500390565b60005b83811015613b42578181015183820152602001613b2a565b838111156121cc5750506000910152565b6000600019821415613b6757613b67613b6e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b801515811461318c57600080fdfea26469706673582212200e6985a1ae31e1cf4a4bca80c0a53d51b93e3f742f912d7db28a7005f1007e7a64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000276e84edc5bd94731b65c207dc1512fc5391572f000000000000000000000000043ef739a8c7ff3ca0423ecf40ceadb2e824d60a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd38000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd380000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5b341f6e931b6a510420e9030ef15ac17b8946c
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x276e84Edc5Bd94731B65C207dc1512FC5391572F
Arg [1] : _stakingTokenReserve (address): 0x043EF739a8c7FF3Ca0423eCf40CeaDB2E824d60A
Arg [2] : _minters (address[]): 0xa5B341F6E931B6A510420e9030EF15aC17b8946c
Arg [3] : _teamWalletAddress (address): 0xfaDf60115930f3CD497aC01da7B9Ce551facfD38
Arg [4] : initialOwner (address): 0xfaDf60115930f3CD497aC01da7B9Ce551facfD38
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000276e84edc5bd94731b65c207dc1512fc5391572f
Arg [1] : 000000000000000000000000043ef739a8c7ff3ca0423ecf40ceadb2e824d60a
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd38
Arg [4] : 000000000000000000000000fadf60115930f3cd497ac01da7b9ce551facfd38
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 000000000000000000000000a5b341f6e931b6a510420e9030ef15ac17b8946c
Deployed Bytecode Sourcemap
31450:22058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40347:874;;;;;;:::i;:::-;;:::i;:::-;;;;14812:25:1;;;14868:2;14853:18;;14846:34;;;;14785:18;40347:874:0;;;;;;;;32463:52;;32502:13;32463:52;;;;;14190:25:1;;;14178:2;14163:18;32463:52:0;14145:76:1;39390:867:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;51159:351::-;;;;;;:::i;:::-;;:::i;:::-;;33355:32;;;;;-1:-1:-1;;;;;33355:32:0;;;;;;-1:-1:-1;;;;;3105:32:1;;;3087:51;;3075:2;3060:18;33355:32:0;3042:102:1;32998:26:0;;;;;;50800:316;;;;;;:::i;:::-;;:::i;43869:2094::-;;;;;;:::i;:::-;;:::i;32346:51::-;;32388:9;32346:51;;32725:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4801:14:1;;4794:22;4776:41;;4764:2;4749:18;32725:70:0;4731:92:1;46013:784:0;;;:::i;34520:565::-;;;;;;:::i;:::-;;:::i;42737:930::-;;;;;;:::i;:::-;;:::i;32621:29::-;;;;;;:::i;:::-;;:::i;32245:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15678:25:1;;;15734:2;15719:18;;15712:34;;;;15762:18;;;15755:34;15820:2;15805:18;;15798:34;15665:3;15650:19;32245:44:0;15632:206:1;38105:445:0;;;;;;:::i;:::-;;:::i;36469:178::-;;;;;;:::i;:::-;;:::i;35159:430::-;;;;;;:::i;:::-;;:::i;32161:41::-;;;;;-1:-1:-1;;;;;32161:41:0;;;37895:121;;;;;;:::i;:::-;-1:-1:-1;;;;;37988:14:0;37954;37988;;;:8;:14;;;;;:20;;37895:121;32843:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2647:103;;;:::i;32127:27::-;;;;;-1:-1:-1;;;;;32127:27:0;;;32209:29;;;;;;:::i;:::-;;:::i;50285:468::-;;;;;;:::i;:::-;;:::i;1996:87::-;2069:6;;-1:-1:-1;;;;;2069:6:0;1996:87;;47583:869;;;:::i;41432:1147::-;;;;;;:::i;:::-;;:::i;49220:950::-;;;;;;:::i;:::-;;:::i;36901:168::-;;;;;;:::i;:::-;;:::i;33031:27::-;;;;;;46870:627;;;:::i;37157:648::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38684:650::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;33305:37::-;;;;;;32927:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36655:238;;;;;;:::i;:::-;;:::i;2905:201::-;;;;;;:::i;:::-;;:::i;32575:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40347:874;-1:-1:-1;;;;;40484:14:0;;40411;40484;;;:8;:14;;;;;40513:10;;;;40411:14;;40484;40513;40509:597;;-1:-1:-1;;;;;40604:18:0;;40544:28;40604:18;;;:12;:18;;;;;:25;40544:28;40644:375;40668:6;40664:1;:10;40644:375;;;-1:-1:-1;;;;;40723:18:0;;40700:20;40723:18;;;:12;:18;;;;;:21;;40742:1;;40723:21;;;;-1:-1:-1;;;40723:21:0;;;;;;;;;;;;;;;;;;;:28;;;40700:51;;40774:12;40790:1;40774:17;40770:31;;;40793:8;;;40770:31;-1:-1:-1;;;;;40824:18:0;;;;;;:12;:18;;;;;:21;;40859:15;;40824:18;40843:1;;40824:21;;;;-1:-1:-1;;;40824:21:0;;;;;;;;;;;;;;;;;;;:32;;;:50;40820:104;;;40899:5;;;40820:104;40965:38;:20;40990:12;40965:24;:38::i;:::-;40942:61;;40644:375;;40676:3;;;;:::i;:::-;;;;40644:375;;;;41051:43;41092:1;41051:36;41066:20;41051:3;:10;;;:14;;:36;;;;:::i;:::-;:40;;:43::i;:::-;41035:59;;40509:597;;;41125:47;41158:13;41125:28;41142:3;:10;;;41125:3;:12;;;:16;;:28;;;;:::i;:::-;:32;;:47::i;:::-;41116:56;;41183:30;40347:874;;;:::o;39390:867::-;-1:-1:-1;;;;;39673:15:0;;39492:13;39673:15;;;:9;:15;;;;;39492:13;;;;39582:31;;39492:13;;39721:458;39745:12;;39741:16;;39721:458;;;39805:15;39783:5;39789:1;39783:8;;;;;;-1:-1:-1;;;39783:8:0;;;;;;;;;;;;;;;;;;;:19;;;:37;39779:389;;;39845:8;39841:105;;39909:12;;:16;;39924:1;;39909:16;:::i;:::-;39889:37;;;;;;-1:-1:-1;;;39889:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;39889:37:0;;;;;;;;;;;;;;;;39878:48;;39841:105;39980:5;39986:1;39980:8;;;;;;-1:-1:-1;;;39980:8:0;;;;;;;;;;;;;;;;;;;39964:24;;;;;;;;;;;;;;;;;;;;;;;;;:8;39973:3;39964:13;;;;;;-1:-1:-1;;;39964:13:0;;;;;;;;;;;;;;:24;;;;40007:5;;;;;:::i;:::-;;;;40040:27;40051:5;40057:1;40051:8;;;;;;-1:-1:-1;;;40051:8:0;;;;;;;;;;;;;;;;;;;;;;:15;40040:6;;:10;:27::i;:::-;40031:36;;39779:389;;;40121:31;40136:5;40142:1;40136:8;;;;;;-1:-1:-1;;;40136:8:0;;;;;;;;;;;;;;;;;;;;;;:15;40121:10;;:14;:31::i;:::-;40108:44;;39779:389;39759:3;;;;:::i;:::-;;;;39721:458;;;-1:-1:-1;;;;;;;;40197:14:0;;;;;;:8;:14;;;;;:21;;;;-1:-1:-1;39390:867:0;;;;;:::o;51159:351::-;51246:10;51235:7;2069:6;;-1:-1:-1;;;;;2069:6:0;;1996:87;51235:7;-1:-1:-1;;;;;51235:21:0;;51227:89;;;;-1:-1:-1;;;51227:89:0;;8005:2:1;51227:89:0;;;7987:21:1;8044:2;8024:18;;;8017:30;8083:34;8063:18;;;8056:62;8154:25;8134:18;;;8127:53;8197:19;;51227:89:0;;;;;;;;;51347:2;51335:8;:14;;51327:84;;;;-1:-1:-1;;;51327:84:0;;7172:2:1;51327:84:0;;;7154:21:1;7211:2;7191:18;;;7184:30;7250:34;7230:18;;;7223:62;7321:27;7301:18;;;7294:55;7366:19;;51327:84:0;7144:247:1;51327:84:0;51424:17;:28;;;51468:34;;14190:25:1;;;51468:34:0;;14178:2:1;14163:18;51468:34:0;;;;;;;;51159:351;:::o;50800:316::-;50896:10;50885:7;2069:6;;-1:-1:-1;;;;;2069:6:0;;1996:87;50885:7;-1:-1:-1;;;;;50885:21:0;;:56;;;-1:-1:-1;50910:17:0;;-1:-1:-1;;;;;50910:17:0;50931:10;50910:31;50885:56;50877:124;;;;-1:-1:-1;;;50877:124:0;;12210:2:1;50877:124:0;;;12192:21:1;12249:2;12229:18;;;12222:30;12288:34;12268:18;;;12261:62;12359:25;12339:18;;;12332:53;12402:19;;50877:124:0;12182:245:1;50877:124:0;51012:17;:37;;-1:-1:-1;;;;;;51012:37:0;-1:-1:-1;;;;;51012:37:0;;;;;;;;51065:43;;3087:51:1;;;51065:43:0;;3075:2:1;3060:18;51065:43:0;3042:102:1;43869:2094:0;5280:1;5878:7;;:19;;5870:63;;;;-1:-1:-1;;;5870:63:0;;;;;;;:::i;:::-;5280:1;6011:7;:18;;;51637:12;;51704::::1;::::0;43936:10:::1;::::0;-1:-1:-1;;;;;51637:12:0;;::::1;::::0;6011:7;51768:30:::1;51637:12:::0;51704;51768:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;51727:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;51844:31:::1;51738:5:::0;51844:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;51809:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;51890:21;::::1;::::0;51886:370:::1;;-1:-1:-1::0;;;;;52069:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;52045:57:::1;::::0;52053:7;;52062:5;;52095:6;52045:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;52019:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;52158:10:::1;:17:::0;;;;;:38:::1;;::::0;52117:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;51886:370:0::1;-1:-1:-1::0;52277:11:0::1;::::0;52316:1:::1;52299:507;52323:12;:19:::0;52319:23;::::1;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1::0;;;52372:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;52372:15:0::1;::::0;-1:-1:-1;52443:30:0::1;52372:15:::0;52466:6;52443:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;52402:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;52523:31:::1;52413:5:::0;52523:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;52488:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;52573:21;::::1;::::0;52569:226:::1;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1::0;;;;;52615:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;52741:10:::1;:17:::0;;;;;:38:::1;;::::0;52700:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;52569:226:::1;52344:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52299:507;;;;43976:1:::2;43967:6;:10;43959:72;;;::::0;-1:-1:-1;;;43959:72:0;;6754:2:1;43959:72:0::2;::::0;::::2;6736:21:1::0;6793:2;6773:18;;;6766:30;6832:34;6812:18;;;6805:62;-1:-1:-1;;;6883:18:1;;;6876:47;6940:19;;43959:72:0::2;6726:239:1::0;43959:72:0::2;44074:10;44042:20;44065::::0;;;:8:::2;:20;::::0;;;;44144:12:::2;::::0;::::2;::::0;44065:20;;44042;44134:22;::::2;44130:1443;;44188:12;::::0;::::2;::::0;:24:::2;::::0;44205:6;44188:16:::2;:24::i;:::-;44173:12;::::0;::::2;:39:::0;44130:1443:::2;;;44245:17;44265:24;44276:3;:12;;;44265:6;:10;;:24;;;;:::i;:::-;44245:44;;44326:9;44312:3;:10;;;:23;;44304:97;;;::::0;-1:-1:-1;;;44304:97:0;;8838:2:1;44304:97:0::2;::::0;::::2;8820:21:1::0;8877:2;8857:18;;;8850:30;8916:34;8896:18;;;8889:62;8987:31;8967:18;;;8960:59;9036:19;;44304:97:0::2;8810:251:1::0;44304:97:0::2;44431:1;44416:12;::::0;::::2;:16:::0;44460:10:::2;::::0;::::2;::::0;:25:::2;::::0;44475:9;44460:14:::2;:25::i;:::-;44447:10;::::0;::::2;:38:::0;44505:9:::2;44500:1062;44582:10;44546:20;44569:24:::0;;;:12:::2;:24;::::0;;;;:27;;44594:1;;44569:27;::::2;;;-1:-1:-1::0;;;44569:27:0::2;;;;;;;;;;;;;;;;;;;:34;;;44546:57;;44626:12;44642:1;44626:17;44622:31;;;44645:8;;;44622:31;44676:18:::0;;:78;::::2;;;-1:-1:-1::0;44711:10:0::2;44698:24;::::0;;;:12:::2;:24;::::0;;;;:27;;44739:15:::2;::::0;44698:24;44723:1;;44698:27;::::2;;;-1:-1:-1::0;;;44698:27:0::2;;;;;;;;;;;;;;;;;;;:38;;;:56;44676:78;44672:546;;;44795:9;44779:25;;44849:9;44835:3;:10;;;:23;;44827:102;;;::::0;-1:-1:-1;;;44827:102:0;;11735:2:1;44827:102:0::2;::::0;::::2;11717:21:1::0;11774:2;11754:18;;;11747:30;11813:34;11793:18;;;11786:62;11884:34;11864:18;;;11857:62;-1:-1:-1;;;11935:19:1;;;11928:33;11978:19;;44827:102:0::2;11707:296:1::0;44827:102:0::2;44965:10;::::0;::::2;::::0;:25:::2;::::0;44980:9;44965:14:::2;:25::i;:::-;44952:10;::::0;::::2;:38:::0;;;45013:135:::2;;45081:10;45068:24;::::0;;;:12:::2;:24;::::0;;;;45061:31:::2;::::0;::::2;:::i;:::-;45119:5;;;45013:135;45182:16;:9:::0;45196:1:::2;45182:13;:16::i;:::-;45170:28;;44672:546;45253:12;45240:9;:25;45236:311;;45327:27;:12:::0;45344:9;45327:16:::2;:27::i;:::-;45303:10;45290:24;::::0;;;:12:::2;:24;::::0;;;;:27;;45315:1;;45290:27;::::2;;;-1:-1:-1::0;;;45290:27:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:64:::0;-1:-1:-1;45377:5:0::2;;45236:311;45451:10;45438:24;::::0;;;:12:::2;:24;::::0;;;;:27;;45463:1;;45438:27;::::2;;;-1:-1:-1::0;;;45438:27:0::2;;;;;;;;;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;45431:34:::0;;;::::2;;::::0;45500:27:::2;:9:::0;45514:12;45500:13:::2;:27::i;:::-;45488:39;;44500:1062;;44522:3:::0;::::2;::::0;::::2;:::i;:::-;;;;44500:1062;;;;44130:1443;;45585:22;45610:25;:6:::0;45621:13;45610:10:::2;:25::i;:::-;45658:9:::0;;45585:50;;-1:-1:-1;45658:29:0::2;::::0;45585:50;45658:13:::2;:29::i;:::-;45646:41:::0;;45712:11:::2;::::0;:31:::2;::::0;45728:14;45712:15:::2;:31::i;:::-;45698:11;:45:::0;45754:12:::2;::::0;:45:::2;::::0;-1:-1:-1;;;;;45754:12:0::2;45780:10;45792:6:::0;45754:25:::2;:45::i;:::-;45814:17:::0;;45810:101:::2;;45870:12;::::0;45848:51:::2;::::0;-1:-1:-1;;;;;45870:12:0::2;45885:13:::0;45848::::2;:51::i;:::-;45926:29;::::0;14190:25:1;;;45936:10:0::2;::::0;45926:29:::2;::::0;14178:2:1;14163:18;45926:29:0::2;;;;;;;-1:-1:-1::0;;5236:1:0;6190:7;:22;-1:-1:-1;;;;;;43869:2094:0:o;46013:784::-;5280:1;5878:7;;:19;;5870:63;;;;-1:-1:-1;;;5870:63:0;;;;;;;:::i;:::-;5280:1;6011:7;:18;;;51637:12;;51704::::1;::::0;46067:10:::1;::::0;-1:-1:-1;;;;;51637:12:0;;::::1;::::0;6011:7;51768:30:::1;51637:12:::0;51704;51768:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;51727:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;51844:31:::1;51738:5:::0;51844:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;51809:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;51890:21;::::1;::::0;51886:370:::1;;-1:-1:-1::0;;;;;52069:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;52045:57:::1;::::0;52053:7;;52062:5;;52095:6;52045:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;52019:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;52158:10:::1;:17:::0;;;;;:38:::1;;::::0;52117:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;51886:370:0::1;-1:-1:-1::0;52277:11:0::1;::::0;52316:1:::1;52299:507;52323:12;:19:::0;52319:23;::::1;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1::0;;;52372:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;52372:15:0::1;::::0;-1:-1:-1;52443:30:0::1;52372:15:::0;52466:6;52443:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;52402:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;52523:31:::1;52413:5:::0;52523:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;52488:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;52573:21;::::1;::::0;52569:226:::1;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1::0;;;;;52615:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;52741:10:::1;:17:::0;;;;;:38:::1;;::::0;52700:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;52569:226:::1;52344:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52299:507;;;;46095:9:::2;46090:700;46110:12;:19:::0;46106:23;::::2;46090:700;;;46151:20;46174:12;46187:1;46174:15;;;;;;-1:-1:-1::0;;;46174:15:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;;;::::2;::::0;46229:10:::2;46221:19:::0;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;46174:15:0;;::::2;46221:33:::0;;;;;;;;;;46174:15;;-1:-1:-1;46273:10:0;;46269:510:::2;;46312:10;46340:1;46304:19:::0;;;:7:::2;:19;::::0;;;;;;;-1:-1:-1;;;;;46304:33:0;::::2;::::0;;;;;;;:37;;;;30756:42;30994:22;46360:336:::2;;;46419:24;46436:6;46419:16;:24::i;:::-;46538:36;::::0;46546:10:::2;::::0;46538:36;::::2;;;::::0;46567:6;;46538:36:::2;::::0;;;46567:6;46546:10;46538:36;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;46360:336;;;46623:53;-1:-1:-1::0;;;;;46623:33:0;::::2;46657:10;46669:6:::0;46623:33:::2;:53::i;:::-;46719:44;::::0;14190:25:1;;;-1:-1:-1;;;;;46719:44:0;::::2;::::0;46730:10:::2;::::0;46719:44:::2;::::0;14178:2:1;14163:18;46719:44:0::2;;;;;;;46269:510;46090:700;;46131:3;;;;;:::i;:::-;;;;46090:700;;;-1:-1:-1::0;;5236:1:0;6190:7;:22;-1:-1:-1;;;46013:784:0:o;34520:565::-;2069:6;;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34620:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;:45;34612:98:::1;;;::::0;-1:-1:-1;;;34612:98:0;;8429:2:1;34612:98:0::1;::::0;::::1;8411:21:1::0;8468:2;8448:18;;;8441:30;8507:34;8487:18;;;8480:62;-1:-1:-1;;;8558:18:1;;;8551:38;8606:19;;34612:98:0::1;8401:230:1::0;34612:98:0::1;34721:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;34721:32:0::1;-1:-1:-1::0;;;;;34721:32:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;34764:25:0;;;:10:::1;34721:32;34764:25:::0;;;;;;;34807:15:::1;34764:40;::::0;::::1;:58:::0;;;34833:56;;34900:18:::1;:33:::0;;;;;:47;;::::1;::::0;;;;;;;;:54;;-1:-1:-1;;34900:54:0::1;::::0;;::::1;::::0;;;34970:31;;34721:32;;34970:31:::1;::::0;::::1;35058:12;-1:-1:-1::0;;;;;35017:60:0::1;35043:13;-1:-1:-1::0;;;;;35017:60:0::1;;35072:4;35017:60;;;;4801:14:1::0;4794:22;4776:41;;4764:2;4749:18;;4731:92;35017:60:0::1;;;;;;;;34520:565:::0;;:::o;42737:930::-;51637:12;;51704;;42803:4;;-1:-1:-1;;;;;51637:12:0;;51613:13;;51768:30;51637:12;51704;51768:15;:30::i;:::-;-1:-1:-1;;;;;51727:17:0;;;;;;:10;:17;;;;;:38;;:71;51844:31;51738:5;51844:24;:31::i;:::-;-1:-1:-1;;;;;51809:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;51890:21;;;51886:370;;-1:-1:-1;;;;;52069:17:0;;;;;;:8;:17;;;;;:24;;;52045:57;;52053:7;;52062:5;;52095:6;52045:7;:57::i;:::-;-1:-1:-1;;;;;52019:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;52158:10;:17;;;;;:38;;;52117:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8;:17;;;;:23;;-1:-1:-1;51886:370:0;-1:-1:-1;52277:11:0;;52316:1;52299:507;52323:12;:19;52319:23;;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1;;;52372:15:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52372:15:0;;-1:-1:-1;52443:30:0;52372:15;52466:6;52443:15;:30::i;:::-;-1:-1:-1;;;;;52402:17:0;;;;;;:10;:17;;;;;:38;;:71;52523:31;52413:5;52523:24;:31::i;:::-;-1:-1:-1;;;;;52488:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;52573:21;;;52569:226;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1;;;;;52615:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;52741:10;:17;;;;;:38;;;52700:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;52569:226;52344:3;;;;:::i;:::-;;;;52299:507;;;-1:-1:-1;42836:10:0::1;42828:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;42820:80;;;::::0;-1:-1:-1;;;42820:80:0;;13829:2:1;42820:80:0::1;::::0;::::1;13811:21:1::0;13868:2;13848:18;;;13841:30;13907:34;13887:18;;;13880:62;-1:-1:-1;;;13958:18:1;;;13951:46;14014:19;;42820:80:0::1;13801:238:1::0;42820:80:0::1;42925:11;::::0;:23:::1;::::0;42941:6;42925:15:::1;:23::i;:::-;42911:11;:37:::0;-1:-1:-1;;;;;42982:14:0;::::1;42959:20;42982:14:::0;;;:8:::1;:14;::::0;;;;43019:9;;:21:::1;::::0;43033:6;43019:13:::1;:21::i;:::-;43007:33:::0;;43064:10:::1;::::0;::::1;::::0;:22:::1;::::0;43079:6;43064:14:::1;:22::i;:::-;43051:10;::::0;::::1;:35:::0;43097:18:::1;43118:75;32502:13;43118:57;32388:9;43118:36;:15;32388:9:::0;43118:19:::1;:36::i;:::-;:40:::0;::::1;:57::i;:::-;:61:::0;::::1;:75::i;:::-;-1:-1:-1::0;;;;;43239:18:0;::::1;43204:32;43239:18:::0;;;:12:::1;:18;::::0;;;;43282:15;;43097:96;;-1:-1:-1;43239:18:0;43314:8;;;:53:::1;;-1:-1:-1::0;43357:10:0;43326:8;43335:7:::1;43341:1;43335:3:::0;:7:::1;:::i;:::-;43326:17;;;;;;-1:-1:-1::0;;;43326:17:0::1;;;;;;;;;;;;;;;;;;;:28;;;:41;43314:53;43310:252;;;43398:55;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;43384:70;;::::1;::::0;;::::1;::::0;;-1:-1:-1;43384:70:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;43310:252:::1;;;43514:36;43543:6:::0;43514:8;43523:7:::1;43529:1;43523:3:::0;:7:::1;:::i;:::-;43514:17;;;;;;-1:-1:-1::0;;;43514:17:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:24:::0;;:28:::1;:36::i;:::-;43487:8:::0;43496:7:::1;43502:1;43496:3:::0;:7:::1;:::i;:::-;43487:17;;;;;;-1:-1:-1::0;;;43487:17:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:63:::0;43310:252:::1;43572:19;::::0;:51:::1;::::0;-1:-1:-1;;;43572:51:0;;43609:4:::1;43572:51;::::0;::::1;3703::1::0;3770:18;;;3763:34;;;-1:-1:-1;;;;;43572:19:0;;::::1;::::0;:28:::1;::::0;3676:18:1;;43572:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43646:4;-1:-1:-1::0;;;;;43639:20:0::1;;43652:6;43639:20;;;;14190:25:1::0;;14178:2;14163:18;;14145:76;43639:20:0::1;;;;;;;;52816:1;;;;42737:930:::0;;;;;;:::o;32621:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32621:29:0;;-1:-1:-1;32621:29:0;:::o;38105:445::-;-1:-1:-1;;;;;38203:14:0;;38167;38203;;;:8;:14;;;;;;;;:23;;;38285:10;38272:24;;:12;:24;;;;;38203:23;;38307:212;38331:15;;38327:19;;38307:212;;;38397:15;38372:8;38381:1;38372:11;;;;;;-1:-1:-1;;;38372:11:0;;;;;;;;;;;;;;;;;;;:22;;;:40;38368:86;;;38433:5;;38368:86;38477:30;38488:8;38497:1;38488:11;;;;;;-1:-1:-1;;;38488:11:0;;;;;;;;;;;;;;;;;;;;;;:18;38477:6;;:10;:30::i;:::-;38468:39;-1:-1:-1;38348:3:0;;;;:::i;:::-;;;;38307:212;;;;38529:13;38105:445;;;:::o;36469:178::-;-1:-1:-1;;;;;36600:25:0;;36547:7;36600:25;;;:10;:25;;;;;:38;36574:65;;36583:15;;36574:8;:65::i;:::-;36567:72;36469:178;-1:-1:-1;;36469:178:0:o;35159:430::-;2069:6;;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35326:25:0;::::1;35369:1;35326:25:::0;;;:10:::1;:25;::::0;;;;:40:::1;;::::0;35318:112:::1;;;::::0;-1:-1:-1;;;35318:112:0;;12634:2:1;35318:112:0::1;::::0;::::1;12616:21:1::0;12673:2;12653:18;;;12646:30;12712:34;12692:18;;;12685:62;12783:25;12763:18;;;12756:53;12826:19;;35318:112:0::1;12606:245:1::0;35318:112:0::1;-1:-1:-1::0;;;;;35441:33:0;;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;:47;;::::1;::::0;;;;;;;;;;:59;;-1:-1:-1;;35441:59:0::1;::::0;::::1;;::::0;;::::1;::::0;;;35516:65;;4776:41:1;;;35516:65:0::1;::::0;4749:18:1;35516:65:0::1;;;;;;;35159:430:::0;;;:::o;2647:103::-;2069:6;;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;2712:30:::1;2739:1;2712:18;:30::i;:::-;2647:103::o:0;32209:29::-;;;;;;;;;;;;50285:468;2069:6;;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;50412:12:::1;::::0;-1:-1:-1;;;;;50388:37:0;;::::1;50412:12:::0;::::1;50388:37;;50380:115;;;::::0;-1:-1:-1;;;50380:115:0;;5873:2:1;50380:115:0::1;::::0;::::1;5855:21:1::0;5912:2;5892:18;;;5885:30;5951:34;5931:18;;;5924:62;6022:34;6002:18;;;5995:62;-1:-1:-1;;;6073:19:1;;;6066:32;6115:19;;50380:115:0::1;5845:295:1::0;50380:115:0::1;-1:-1:-1::0;;;;;50514:24:0;::::1;;::::0;;;:10:::1;:24;::::0;;;;:39:::1;;::::0;:44;50506:121:::1;;;::::0;;-1:-1:-1;;;50506:121:0;;9268:2:1;50506:121:0::1;::::0;::::1;9250:21:1::0;9287:18;;;9280:30;;;;9346:34;9326:18;;;9319:62;9417:34;9397:18;;;9390:62;9469:19;;50506:121:0::1;9240:254:1::0;50506:121:0::1;50638:55;50672:7;2069:6:::0;;-1:-1:-1;;;;;2069:6:0;;1996:87;50672:7:::1;-1:-1:-1::0;;;;;50638:33:0;::::1;::::0;50681:11;50638:33:::1;:55::i;:::-;50709:36;::::0;;-1:-1:-1;;;;;3721:32:1;;3703:51;;3785:2;3770:18;;3763:34;;;50709:36:0::1;::::0;3676:18:1;50709:36:0::1;;;;;;;50285:468:::0;;:::o;47583:869::-;47677:10;47635:29;47667:21;;;:9;:21;;;;;;;;47722:8;:20;;;;;47795:12;;47667:21;;47722:20;;47854:15;47667:21;47828:10;47837:1;47795:12;47828:10;:::i;:::-;47822:17;;;;;;-1:-1:-1;;;47822:17:0;;;;;;;;;;;;;;;;;;;:28;;;:47;47818:383;;47895:10;;;;47937;47927:21;;;;:9;:21;;;;;47895:10;;-1:-1:-1;47920:28:0;;47927:21;47920:28;:::i;:::-;47818:383;;;47986:9;47981:209;48005:6;48001:1;:10;47981:209;;;48063:15;48041:5;48047:1;48041:8;;;;;;-1:-1:-1;;;48041:8:0;;;;;;;;;;;;;;;;;;;:19;;;:37;48037:48;;;48080:5;;48037:48;48113:27;48124:5;48130:1;48124:8;;;;;;-1:-1:-1;;;48124:8:0;;;;;;;;48113:27;48104:36;;48166:5;48172:1;48166:8;;;;;;-1:-1:-1;;;48166:8:0;;;;;;;;;;;;;;;;;;;;;48159:15;;;;;;48013:3;;;;:::i;:::-;;;;47981:209;;;;47818:383;48224:10;;;;:22;;48239:6;48224:14;:22::i;:::-;48211:10;;;:35;48269:9;;:21;;48283:6;48269:13;:21::i;:::-;48257:33;;48315:11;;:23;;48331:6;48315:15;:23::i;:::-;48301:11;:37;48364:12;;:24;;48381:6;48364:16;:24::i;:::-;48349:12;:39;48399:12;;:45;;-1:-1:-1;;;;;48399:12:0;48425:10;48437:6;48399:25;:45::i;:::-;47583:869;;;;:::o;41432:1147::-;5280:1;5878:7;;:19;;5870:63;;;;-1:-1:-1;;;5870:63:0;;;;;;;:::i;:::-;5280:1;6011:7;:18;;;51637:12;;51704::::1;::::0;41509:10:::1;::::0;-1:-1:-1;;;;;51637:12:0;;::::1;::::0;6011:7;51768:30:::1;51637:12:::0;51704;51768:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;51727:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;51844:31:::1;51738:5:::0;51844:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;51809:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;51890:21;::::1;::::0;51886:370:::1;;-1:-1:-1::0;;;;;52069:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24:::1;;::::0;52045:57:::1;::::0;52053:7;;52062:5;;52095:6;52045:7:::1;:57::i;:::-;-1:-1:-1::0;;;;;52019:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:83;;;;52158:10:::1;:17:::0;;;;;:38:::1;;::::0;52117:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8:::1;:17:::0;;;;:23;;-1:-1:-1;51886:370:0::1;-1:-1:-1::0;52277:11:0::1;::::0;52316:1:::1;52299:507;52323:12;:19:::0;52319:23;::::1;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1::0;;;52372:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;52372:15:0::1;::::0;-1:-1:-1;52443:30:0::1;52372:15:::0;52466:6;52443:15:::1;:30::i;:::-;-1:-1:-1::0;;;;;52402:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:38:::1;;:71:::0;52523:31:::1;52413:5:::0;52523:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;52488:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;52573:21;::::1;::::0;52569:226:::1;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1::0;;;;;52615:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:66;;;;52741:10:::1;:17:::0;;;;;:38:::1;;::::0;52700:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;52569:226:::1;52344:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52299:507;;;;41549:1:::2;41540:6;:10;41532:66;;;::::0;-1:-1:-1;;;41532:66:0;;10062:2:1;41532:66:0::2;::::0;::::2;10044:21:1::0;10101:2;10081:18;;;10074:30;10140:34;10120:18;;;10113:62;-1:-1:-1;;;10191:18:1;;;10184:41;10242:19;;41532:66:0::2;10034:233:1::0;41532:66:0::2;41623:11;::::0;:23:::2;::::0;41639:6;41623:15:::2;:23::i;:::-;41609:11;:37:::0;41689:10:::2;41657:20;41680::::0;;;:8:::2;:20;::::0;;;;41723:9;;:21:::2;::::0;41737:6;41723:13:::2;:21::i;:::-;41711:33:::0;;41755:700;::::2;;;41795:12;::::0;:24:::2;::::0;41812:6;41795:16:::2;:24::i;:::-;41780:12;:39:::0;41847:10:::2;::::0;::::2;::::0;:22:::2;::::0;41862:6;41847:14:::2;:22::i;:::-;41834:10;::::0;::::2;:35:::0;41884:18:::2;41905:75;32502:13;41905:57;32388:9;41905:36;:15;32388:9:::0;41905:19:::2;:36::i;:75::-;42019:10;41995:11;42009:21:::0;;;:9:::2;:21;::::0;;;;:28;41884:96;;-1:-1:-1;42056:8:0;;;:66:::2;;-1:-1:-1::0;42078:10:0::2;42068:21;::::0;;;:9:::2;:21;::::0;;;;42112:10;;42090:7:::2;42096:1;42090:3:::0;:7:::2;:::i;:::-;42068:30;;;;;;-1:-1:-1::0;;;42068:30:0::2;;;;;;;;;;;;;;;;;;;:41;;;:54;42056:66;42052:320;;;42153:10;42143:21;::::0;;;:9:::2;:21;::::0;;;;;;;42170:55;;;;::::2;::::0;;;;;;;;::::2;::::0;;;42143:83;;::::2;::::0;;::::2;::::0;;;;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;42052:320:::2;;;42317:10;42307:21;::::0;;;:9:::2;:21;::::0;;;;:49:::2;::::0;42349:6;;42329:7:::2;42335:1;42329:3:::0;:7:::2;:::i;42307:49::-;42277:10;42267:21;::::0;;;:9:::2;:21;::::0;;;;42289:7:::2;42295:1;42289:3:::0;:7:::2;:::i;:::-;42267:30;;;;;;-1:-1:-1::0;;;42267:30:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:89:::0;42052:320:::2;41755:700;;;;;42419:12;::::0;::::2;::::0;:24:::2;::::0;42436:6;42419:16:::2;:24::i;:::-;42404:12;::::0;::::2;:39:::0;41755:700:::2;42465:12;::::0;:64:::2;::::0;-1:-1:-1;;;;;42465:12:0::2;42495:10;42515:4;42522:6:::0;42465:29:::2;:64::i;:::-;42545:26;::::0;14190:25:1;;;42552:10:0::2;::::0;42545:26:::2;::::0;14178:2:1;14163:18;42545:26:0::2;;;;;;;-1:-1:-1::0;;5236:1:0;6190:7;:22;-1:-1:-1;;;;;41432:1147:0:o;49220:950::-;51637:12;;51704;;49317:1;;-1:-1:-1;;;;;51637:12:0;;49317:1;;51768:30;51637:12;51704;51768:15;:30::i;:::-;-1:-1:-1;;;;;51727:17:0;;;;;;:10;:17;;;;;:38;;:71;51844:31;51738:5;51844:24;:31::i;:::-;-1:-1:-1;;;;;51809:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;51890:21;;;51886:370;;-1:-1:-1;;;;;52069:17:0;;;;;;:8;:17;;;;;:24;;;52045:57;;52053:7;;52062:5;;52095:6;52045:7;:57::i;:::-;-1:-1:-1;;;;;52019:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;52158:10;:17;;;;;:38;;;52117:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8;:17;;;;:23;;-1:-1:-1;51886:370:0;-1:-1:-1;52277:11:0;;52316:1;52299:507;52323:12;:19;52319:23;;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1;;;52372:15:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52372:15:0;;-1:-1:-1;52443:30:0;52372:15;52466:6;52443:15;:30::i;:::-;-1:-1:-1;;;;;52402:17:0;;;;;;:10;:17;;;;;:38;;:71;52523:31;52413:5;52523:24;:31::i;:::-;-1:-1:-1;;;;;52488:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;52573:21;;;52569:226;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1;;;;;52615:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;52741:10;:17;;;;;:38;;;52700:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;52569:226;52344:3;;;;:::i;:::-;;;;52299:507;;;-1:-1:-1;;;;;;49340:33:0;::::1;;::::0;;;:18:::1;:33;::::0;;;;;;;49374:10:::1;49340:45:::0;;;;;;;;::::1;;49332:132;;;::::0;-1:-1:-1;;;49332:132:0;;10474:2:1;49332:132:0::1;::::0;::::1;10456:21:1::0;10513:2;10493:18;;;10486:30;10552:34;10532:18;;;10525:62;10623:34;10603:18;;;10596:62;-1:-1:-1;;;10674:19:1;;;10667:41;10725:19;;49332:132:0::1;10446:304:1::0;49332:132:0::1;49492:1;49483:6;:10;49475:74;;;::::0;-1:-1:-1;;;49475:74:0;;10957:2:1;49475:74:0::1;::::0;::::1;10939:21:1::0;10996:2;10976:18;;;10969:30;11035:34;11015:18;;;11008:62;-1:-1:-1;;;11086:18:1;;;11079:49;11145:19;;49475:74:0::1;10929:241:1::0;49475:74:0::1;49730:18;49751:38;49785:3;49751:29;49762:17;;49751:6;:10;;:29;;;;:::i;:38::-;49730:59:::0;-1:-1:-1;49800:19:0::1;49822:22;:6:::0;49730:59;49822:10:::1;:22::i;:::-;49800:44:::0;-1:-1:-1;49855:78:0::1;-1:-1:-1::0;;;;;49855:38:0;::::1;49894:10;49914:4;49800:44:::0;49855:38:::1;:78::i;:::-;49995:17;::::0;49944:81:::1;::::0;-1:-1:-1;;;;;49944:38:0;;::::1;::::0;49983:10:::1;::::0;49995:17:::1;50014:10:::0;49944:38:::1;:81::i;:::-;50036:41;50050:13;50065:11;50036:13;:41::i;:::-;50093:29;::::0;14190:25:1;;;50093:29:0::1;::::0;14178:2:1;14163:18;50093:29:0::1;;;;;;;50138:24;::::0;14190:25:1;;;50138:24:0::1;::::0;14178:2:1;14163:18;50138:24:0::1;;;;;;;52816:1;;49220:950:::0;;;;;;:::o;36901:168::-;-1:-1:-1;;;;;37004:25:0;;36977:7;37004:25;;;:10;:25;;;;;:36;;;:57;;32388:9;37004:40;:57::i;46870:627::-;51637:12;;51704;;46921:10;;-1:-1:-1;;;;;51637:12:0;;51613:13;;51768:30;51637:12;51704;51768:15;:30::i;:::-;-1:-1:-1;;;;;51727:17:0;;;;;;:10;:17;;;;;:38;;:71;51844:31;51738:5;51844:24;:31::i;:::-;-1:-1:-1;;;;;51809:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;51890:21;;;51886:370;;-1:-1:-1;;;;;52069:17:0;;;;;;:8;:17;;;;;:24;;;52045:57;;52053:7;;52062:5;;52095:6;52045:7;:57::i;:::-;-1:-1:-1;;;;;52019:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:83;;;;52158:10;:17;;;;;:38;;;52117:31;;;:22;:31;;;;;:38;;;;;;;;;:79;;;;52221:17;;;:8;:17;;;;:23;;-1:-1:-1;51886:370:0;-1:-1:-1;52277:11:0;;52316:1;52299:507;52323:12;:19;52319:23;;52299:507;;;52372:12;52385:1;52372:15;;;;;;-1:-1:-1;;;52372:15:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52372:15:0;;-1:-1:-1;52443:30:0;52372:15;52466:6;52443:15;:30::i;:::-;-1:-1:-1;;;;;52402:17:0;;;;;;:10;:17;;;;;:38;;:71;52523:31;52413:5;52523:24;:31::i;:::-;-1:-1:-1;;;;;52488:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;52573:21;;;52569:226;;52641:40;52649:7;52658:5;52665:7;52674:6;52641:7;:40::i;:::-;-1:-1:-1;;;;;52615:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:66;;;;52741:10;:17;;;;;:38;;;52700:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;52569:226;52344:3;;;;:::i;:::-;;;;52299:507;;;;46945:14:::1;46961:21:::0;46986:31:::1;47006:10;46986:19;:31::i;:::-;47048:10;47035:24;::::0;;;:12:::1;:24;::::0;;;;46944:73;;-1:-1:-1;46944:73:0;;-1:-1:-1;47028:31:0::1;::::0;47035:24;47028:31:::1;:::i;:::-;47102:10;47070:20;47093::::0;;;:8:::1;:20;::::0;;;;47168:10:::1;::::0;::::1;::::0;47150:12:::1;::::0;::::1;::::0;47136:9;;:43:::1;::::0;47168:10;47136:27:::1;::::0;:9;:13:::1;:27::i;:43::-;47124:55:::0;;:9:::1;47190:12;::::0;::::1;:16:::0;;;47217:10:::1;::::0;::::1;:14:::0;47258:42:::1;47274:25;:6:::0;47285:13;47274:10:::1;:25::i;:::-;47258:11;::::0;;:15:::1;:42::i;:::-;47244:11;:56:::0;47311:12:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;47311:12:0::1;47337:10;47349:6:::0;47311:25:::1;:45::i;:::-;47371:17:::0;;47367:101:::1;;47427:12;::::0;47405:51:::1;::::0;-1:-1:-1;;;;;47427:12:0::1;47442:13:::0;47405::::1;:51::i;:::-;47478:11;:9;:11::i;:::-;52816:1;;;46870:627:::0;;;;:::o;37157:648::-;37292:12;:19;37223:28;;37275:37;;;;;;-1:-1:-1;;;37275:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;37275:37:0;;;;;;;;;;;;;;;;37264:48;;37328:9;37323:449;37347:8;:15;37343:1;:19;37323:449;;;37478:15;37496:6;;:59;;-1:-1:-1;;;;;37532:17:0;;;;;;:8;:17;;;;;:23;37496:59;;;-1:-1:-1;;;;;37505:17:0;;;;;;:8;:17;;;;;:24;;;37496:59;37478:77;-1:-1:-1;37570:14:0;37587:6;;:35;;37611:11;;37587:35;;;37596:12;;37587:35;37570:52;;37657:12;37670:1;37657:15;;;;;;-1:-1:-1;;;37657:15:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37657:15:0;37637:8;37646:1;37637:11;;;;;;-1:-1:-1;;;37637:11:0;;;;;;;;;;;;;;;:17;;:35;-1:-1:-1;;;;;37637:35:0;;;-1:-1:-1;;;;;37637:35:0;;;;;37708:52;37716:7;37725:8;37734:1;37725:11;;;;;;-1:-1:-1;;;37725:11:0;;;;;;;;;;;;;;;:17;;;37744:7;37753:6;37708:7;:52::i;:::-;37687:8;37696:1;37687:11;;;;;;-1:-1:-1;;;37687:11:0;;;;;;;;;;;;;;;:18;;:73;;;;;37323:449;;37364:3;;;;;:::i;:::-;;;;37323:449;;;;37157:648;;;:::o;38684:650::-;-1:-1:-1;;;;;38843:18:0;;38745:13;38843:18;;;:12;:18;;;;;38760:35;;38745:13;;38894:394;38918:15;;38914:19;;38894:394;;;38984:15;38959:8;38968:1;38959:11;;;;;;-1:-1:-1;;;38959:11:0;;;;;;;;;;;;;;;;;;;:22;;;:40;38955:322;;;39024:8;39020:112;;39092:15;;:19;;39110:1;;39092:19;:::i;:::-;39072:40;;;;;;-1:-1:-1;;;39072:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;39072:40:0;;;;;;;;;;;;;;;;39057:55;;39020:112;39170:8;39179:1;39170:11;;;;;;-1:-1:-1;;;39170:11:0;;;;;;;;;;;;;;;;;;;39150:31;;;;;;;;;;;;;;;;;;;;;;;;;:12;39163:3;39150:17;;;;;;-1:-1:-1;;;39150:17:0;;;;;;;;;;;;;;:31;;;;39200:5;;;;;:::i;:::-;;;;39232:29;39242:8;39251:1;39242:11;;;;;;-1:-1:-1;;;39242:11:0;;;;;;;;39232:29;39224:37;;38955:322;38935:3;;;;:::i;:::-;;;;38894:394;;;;39298:28;;38684:650;;;:::o;36655:238::-;36787:12;;36725:7;;;;-1:-1:-1;;;;;36762:38:0;;;36787:12;;36762:38;:67;;36818:11;;36762:67;;;36803:12;;36762:67;36745:84;;36847:38;36863:13;36878:6;36847:15;:38::i;:::-;36840:45;36655:238;-1:-1:-1;;;36655:238:0:o;2905:201::-;2069:6;;-1:-1:-1;;;;;2069:6:0;798:10;2216:23;2208:68;;;;-1:-1:-1;;;2208:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2994:22:0;::::1;2986:73;;;::::0;-1:-1:-1;;;2986:73:0;;6347:2:1;2986:73:0::1;::::0;::::1;6329:21:1::0;6386:2;6366:18;;;6359:30;6425:34;6405:18;;;6398:62;-1:-1:-1;;;6476:18:1;;;6469:36;6522:19;;2986:73:0::1;6319:228:1::0;2986:73:0::1;3070:28;3089:8;3070:18;:28::i;:::-;2905:201:::0;:::o;25740:98::-;25798:7;25825:5;25829:1;25825;:5;:::i;26121:98::-;26179:7;26206:5;26210:1;26206;:5;:::i;26877:98::-;26935:7;26962:5;26966:1;26962;:5;:::i;35638:478::-;35726:7;35750:12;35746:98;;-1:-1:-1;;;;;;35786:25:0;;;;;;:10;:25;;;;;:46;;;35779:53;;35746:98;-1:-1:-1;;;;;36033:25:0;;;;;;:10;:25;;;;;:36;;;;35987:40;;;;;35874:234;;35943:150;;36085:7;;35943:137;;36075:4;;35943:127;;;;:39;36044:13;35943:24;:39::i;:150::-;-1:-1:-1;;;;;35874:25:0;;;;;;:10;:25;;;;;:46;;;;:50;:234::i;36124:337::-;-1:-1:-1;;;;;36423:14:0;;;36279:7;36423:14;;;:7;:14;;;;;;;;:29;;;;;;;;;;;;;36362;;;:22;:29;;;;;:44;;;;;;;;;;36306:147;;36423:29;36306:112;;36413:4;;36306:102;;36319:88;;:38;36438:13;36350:6;36319:15;:38::i;:88::-;36306:8;;:12;:102::i;:147::-;36299:154;36124:337;-1:-1:-1;;;;;36124:337:0:o;26478:98::-;26536:7;26563:5;26567:1;26563;:5;:::i;18314:211::-;18458:58;;-1:-1:-1;;;;;3721:32:1;;18458:58:0;;;3703:51:1;3770:18;;;3763:34;;;18431:86:0;;18451:5;;-1:-1:-1;;;18481:23:0;3676:18:1;;18458:58:0;;;;-1:-1:-1;;18458:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;18458:58:0;-1:-1:-1;;;;;;18458:58:0;;;;;;;;;;18431:19;:86::i;:::-;18314:211;;;:::o;48516:696::-;-1:-1:-1;;;;;48621:25:0;;;;;;:10;:25;;;;;:38;48602:15;:57;48598:448;;48715:27;:6;32388:9;48715:10;:27::i;:::-;-1:-1:-1;;;;;48676:25:0;;;;;;:10;:25;;;;;:36;;:66;48598:448;;;-1:-1:-1;;;;;48795:25:0;;48775:17;48795:25;;;:10;:25;;;;;:38;:59;;48838:15;48795:42;:59::i;:::-;-1:-1:-1;;;;;48902:25:0;;48869:16;48902:25;;;:10;:25;;;;;:36;;;48775:79;;-1:-1:-1;48869:16:0;48888:51;;48775:79;;48888:13;:51::i;:::-;48869:70;-1:-1:-1;48993:41:0;32388:9;48993:20;:6;48869:70;48993:10;:20::i;:41::-;-1:-1:-1;;;;;48954:25:0;;;;;;:10;:25;;;;;:36;;:80;-1:-1:-1;;48598:448:0;-1:-1:-1;;;;;49058:25:0;;;;;;:10;:25;;;;;49101:15;49058:40;;;;:58;;;49168:36;;32388:9;49168:19;:36::i;:::-;-1:-1:-1;;;;;49127:25:0;;;;;;;:10;:25;;;;;:77;;;;-1:-1:-1;48516:696:0:o;31127:81::-;31179:21;;-1:-1:-1;;;31179:21:0;;;;;14190:25:1;;;30756:42:0;;31179:13;;14163:18:1;;31179:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31127:81;:::o;22082:106::-;22140:7;22171:1;22167;:5;:13;;22179:1;22167:13;;;-1:-1:-1;22175:1:0;;22082:106;-1:-1:-1;22082:106:0:o;3266:191::-;3359:6;;;-1:-1:-1;;;;;3376:17:0;;;-1:-1:-1;;;;;;3376:17:0;;;;;;;3409:40;;3359:6;;;3376:17;3359:6;;3409:40;;3340:16;;3409:40;3266:191;;:::o;18533:248::-;18704:68;;-1:-1:-1;;;;;3407:15:1;;;18704:68:0;;;3389:34:1;3459:15;;3439:18;;;3432:43;3491:18;;;3484:34;;;18677:96:0;;18697:5;;-1:-1:-1;;;18727:27:0;3324:18:1;;18704:68:0;3306:218:1;20850:716:0;21274:23;21300:69;21328:4;21300:69;;;;;;;;;;;;;;;;;21308:5;-1:-1:-1;;;;;21300:27:0;;;:69;;;;;:::i;:::-;21384:17;;21274:95;;-1:-1:-1;21384:21:0;21380:179;;21481:10;21470:30;;;;;;;;;;;;:::i;:::-;21462:85;;;;-1:-1:-1;;;21462:85:0;;13058:2:1;21462:85:0;;;13040:21:1;13097:2;13077:18;;;13070:30;13136:34;13116:18;;;13109:62;-1:-1:-1;;;13187:18:1;;;13180:40;13237:19;;21462:85:0;13030:232:1;13092:229:0;13229:12;13261:52;13283:6;13291:4;13297:1;13300:12;13261:21;:52::i;:::-;13254:59;13092:229;-1:-1:-1;;;;13092:229:0:o;14212:510::-;14382:12;14440:5;14415:21;:30;;14407:81;;;;-1:-1:-1;;;14407:81:0;;7598:2:1;14407:81:0;;;7580:21:1;7637:2;7617:18;;;7610:30;7676:34;7656:18;;;7649:62;-1:-1:-1;;;7727:18:1;;;7720:36;7773:19;;14407:81:0;7570:228:1;14407:81:0;-1:-1:-1;;;;;10642:19:0;;;14499:60;;;;-1:-1:-1;;;14499:60:0;;11377:2:1;14499:60:0;;;11359:21:1;11416:2;11396:18;;;11389:30;11455:31;11435:18;;;11428:59;11504:18;;14499:60:0;11349:179:1;14499:60:0;14573:12;14587:23;14614:6;-1:-1:-1;;;;;14614:11:0;14633:5;14640:4;14614:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14572:73;;;;14663:51;14680:7;14689:10;14701:12;14663:16;:51::i;:::-;14656:58;14212:510;-1:-1:-1;;;;;;;14212:510:0:o;16898:712::-;17048:12;17077:7;17073:530;;;-1:-1:-1;17108:10:0;17101:17;;17073:530;17222:17;;:21;17218:374;;17420:10;17414:17;17481:15;17468:10;17464:2;17460:19;17453:44;17368:148;17563:12;17556:20;;-1:-1:-1;;;17556:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:399::-;742:6;750;758;811:2;799:9;790:7;786:23;782:32;779:2;;;832:6;824;817:22;779:2;860:29;879:9;860:29;:::i;:::-;850:39;;908:38;942:2;931:9;927:18;908:38;:::i;:::-;898:48;;996:2;985:9;981:18;968:32;1009:28;1031:5;1009:28;:::i;:::-;1056:5;1046:15;;;769:298;;;;;:::o;1072:264::-;1140:6;1148;1201:2;1189:9;1180:7;1176:23;1172:32;1169:2;;;1222:6;1214;1207:22;1169:2;1250:29;1269:9;1250:29;:::i;:::-;1240:39;1326:2;1311:18;;;;1298:32;;-1:-1:-1;;;1159:177:1:o;1341:255::-;1408:6;1461:2;1449:9;1440:7;1436:23;1432:32;1429:2;;;1482:6;1474;1467:22;1429:2;1519:9;1513:16;1538:28;1560:5;1538:28;:::i;1601:190::-;1660:6;1713:2;1701:9;1692:7;1688:23;1684:32;1681:2;;;1734:6;1726;1719:22;1681:2;-1:-1:-1;1762:23:1;;1671:120;-1:-1:-1;1671:120:1:o;1796:319::-;1861:6;1869;1922:2;1910:9;1901:7;1897:23;1893:32;1890:2;;;1943:6;1935;1928:22;1890:2;1984:9;1971:23;1961:33;;2044:2;2033:9;2029:18;2016:32;2057:28;2079:5;2057:28;:::i;:::-;2104:5;2094:15;;;1880:235;;;;;:::o;2120:537::-;2186:3;2224:5;2218:12;2251:6;2246:3;2239:19;2277:4;2306:2;2301:3;2297:12;2290:19;;2343:2;2336:5;2332:14;2364:3;2376:256;2390:6;2387:1;2384:13;2376:256;;;2449:13;;2487:9;;2475:22;;2537:11;;2531:18;2517:12;;;2510:40;2579:4;2570:14;;;;2607:15;;;;2412:1;2405:9;2376:256;;;-1:-1:-1;2648:3:1;;2194:463;-1:-1:-1;;;;;2194:463:1:o;2662:274::-;2791:3;2829:6;2823:13;2845:53;2891:6;2886:3;2879:4;2871:6;2867:17;2845:53;:::i;:::-;2914:16;;;;;2799:137;-1:-1:-1;;2799:137:1:o;3808:823::-;4035:2;4087:21;;;4157:13;;4060:18;;;4179:22;;;4006:4;;4035:2;4220;;4238:18;;;;4279:15;;;4006:4;4325:280;4339:6;4336:1;4333:13;4325:280;;;4398:13;;4440:9;;-1:-1:-1;;;;;4436:35:1;4424:48;;4512:11;;4506:18;4492:12;;;4485:40;4545:12;;;;4580:15;;;;4468:1;4354:9;4325:280;;;-1:-1:-1;4622:3:1;;4015:616;-1:-1:-1;;;;;;;4015:616:1:o;5283:383::-;5432:2;5421:9;5414:21;5395:4;5464:6;5458:13;5507:6;5502:2;5491:9;5487:18;5480:34;5523:66;5582:6;5577:2;5566:9;5562:18;5557:2;5549:6;5545:15;5523:66;:::i;:::-;5650:2;5629:15;-1:-1:-1;;5625:29:1;5610:45;;;;5657:2;5606:54;;5404:262;-1:-1:-1;;5404:262:1:o;9499:356::-;9701:2;9683:21;;;9720:18;;;9713:30;9779:34;9774:2;9759:18;;9752:62;9846:2;9831:18;;9673:182::o;13267:355::-;13469:2;13451:21;;;13508:2;13488:18;;;13481:30;13547:33;13542:2;13527:18;;13520:61;13613:2;13598:18;;13441:181::o;14226:407::-;14495:6;14484:9;14477:25;14538:2;14533;14522:9;14518:18;14511:30;14458:4;14558:69;14623:2;14612:9;14608:18;14600:6;14558:69;:::i;14891:551::-;15216:6;15205:9;15198:25;15259:6;15254:2;15243:9;15239:18;15232:34;15302:6;15297:2;15286:9;15282:18;15275:34;15345:3;15340:2;15329:9;15325:18;15318:31;15179:4;15366:70;15431:3;15420:9;15416:19;15408:6;15366:70;:::i;:::-;15358:78;15188:254;-1:-1:-1;;;;;;15188:254:1:o;15843:128::-;15883:3;15914:1;15910:6;15907:1;15904:13;15901:2;;;15920:18;;:::i;:::-;-1:-1:-1;15956:9:1;;15891:80::o;15976:217::-;16016:1;16042;16032:2;;-1:-1:-1;;;16067:31:1;;16121:4;16118:1;16111:15;16149:4;16074:1;16139:15;16032:2;-1:-1:-1;16178:9:1;;16022:171::o;16198:168::-;16238:7;16304:1;16300;16296:6;16292:14;16289:1;16286:21;16281:1;16274:9;16267:17;16263:45;16260:2;;;16311:18;;:::i;:::-;-1:-1:-1;16351:9:1;;16250:116::o;16371:125::-;16411:4;16439:1;16436;16433:8;16430:2;;;16444:18;;:::i;:::-;-1:-1:-1;16481:9:1;;16420:76::o;16501:258::-;16573:1;16583:113;16597:6;16594:1;16591:13;16583:113;;;16673:11;;;16667:18;16654:11;;;16647:39;16619:2;16612:10;16583:113;;;16714:6;16711:1;16708:13;16705:2;;;-1:-1:-1;;16749:1:1;16731:16;;16724:27;16554:205::o;16764:135::-;16803:3;-1:-1:-1;;16824:17:1;;16821:2;;;16844:18;;:::i;:::-;-1:-1:-1;16891:1:1;16880:13;;16811:88::o;16904:127::-;16965:10;16960:3;16956:20;16953:1;16946:31;16996:4;16993:1;16986:15;17020:4;17017:1;17010:15;17036:118;17122:5;17115:13;17108:21;17101:5;17098:32;17088:2;;17144:1;17141;17134:12
Swarm Source
ipfs://0e6985a1ae31e1cf4a4bca80c0a53d51b93e3f742f912d7db28a7005f1007e7a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.