Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,756 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Reward | 20791786 | 99 days ago | IN | 0 ETH | 0.00037371 | ||||
Withdraw Remaini... | 19361362 | 299 days ago | IN | 0 ETH | 0.00461761 | ||||
Withdraw | 19140115 | 330 days ago | IN | 0 ETH | 0.00273365 | ||||
Withdraw | 19011832 | 348 days ago | IN | 0 ETH | 0.00287859 | ||||
Claim Reward | 18995156 | 351 days ago | IN | 0 ETH | 0.00183916 | ||||
Withdraw | 18948384 | 357 days ago | IN | 0 ETH | 0.00279125 | ||||
Claim Reward | 18948381 | 357 days ago | IN | 0 ETH | 0.00271119 | ||||
Withdraw | 18901439 | 364 days ago | IN | 0 ETH | 0.00167205 | ||||
Claim Reward | 18901434 | 364 days ago | IN | 0 ETH | 0.00205946 | ||||
Withdraw | 18897580 | 364 days ago | IN | 0 ETH | 0.00170401 | ||||
Withdraw | 18746745 | 386 days ago | IN | 0 ETH | 0.00378179 | ||||
Claim Reward | 18746704 | 386 days ago | IN | 0 ETH | 0.0040366 | ||||
Withdraw | 18606808 | 405 days ago | IN | 0 ETH | 0.00241243 | ||||
Withdraw | 18240872 | 456 days ago | IN | 0 ETH | 0.00110579 | ||||
Withdraw | 18230087 | 458 days ago | IN | 0 ETH | 0.00113016 | ||||
Withdraw | 18229134 | 458 days ago | IN | 0 ETH | 0.00098517 | ||||
Claim Reward | 18229091 | 458 days ago | IN | 0 ETH | 0.00149568 | ||||
Withdraw | 18229057 | 458 days ago | IN | 0 ETH | 0.00151343 | ||||
Withdraw | 18228080 | 458 days ago | IN | 0 ETH | 0.00179072 | ||||
Claim Reward | 18228051 | 458 days ago | IN | 0 ETH | 0.00217794 | ||||
Withdraw | 18176036 | 466 days ago | IN | 0 ETH | 0.00131883 | ||||
Withdraw | 18166957 | 467 days ago | IN | 0 ETH | 0.00077891 | ||||
Claim Reward | 18166953 | 467 days ago | IN | 0 ETH | 0.00092962 | ||||
Withdraw | 18158260 | 468 days ago | IN | 0 ETH | 0.00107274 | ||||
Claim Reward | 18158252 | 468 days ago | IN | 0 ETH | 0.00105034 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingManager
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./Pool.sol"; /// @title Efforce staking manager is the contract for managing the farming pools /// @author Ackee Blockchain /// @notice Staking manager contracts handles 4 staking pools with different staking periods contract StakingManager is Ownable { using SafeERC20 for IERC20; struct PoolInfo { address payable addr; uint256 totalRewards; uint256 rewardPerMinute; uint256 claimedRewards; mapping(address => uint256) lastRewardsClaim; } bytes32 public constant CONTRACT_TYPE = keccak256("Efforce Staking Manager"); uint256 public constant CAMPAIGN_PERIOD = 365 days; uint256 public constant BUFFER_PERIOD = 3 days; IERC20 public immutable wozxToken; // 0x34950ff2b487d9e5282c5ab342d08a2f712eb79f; PoolInfo[4] public pools; uint256 public campaignStart; event PoolBalanceChanged(uint8 indexed poolId, uint256 totalPoolAmount); event UserBalanceChanged(address indexed account, uint8 indexed poolId, uint256 totalUserDeposits); modifier isInitialized() { require(campaignStart != 0, "Not initialized"); _; } constructor(IERC20 _wozxToken) { require(address(_wozxToken) != address(0), "Unexpected zero address"); wozxToken = _wozxToken; } /// @dev Set pools addresses and start the whole campaign /// @param poolGlobal address of whole campaign pool /// @param pool1Month address of 1 month pool /// @param pool3Months address of 3 months pool /// @param pool6Months address of 6 months pool function init( address payable poolGlobal, address payable pool1Month, address payable pool3Months, address payable pool6Months ) external onlyOwner { require(campaignStart == 0, "Pools are already initialized"); require(Pool(poolGlobal).id() == 0, "Pool 0 id mismatch"); require(Pool(pool1Month).id() == 1, "Pool 1 id mismatch"); require(Pool(pool3Months).id() == 2, "Pool 2 id mismatch"); require(Pool(pool6Months).id() == 3, "Pool 3 id mismatch"); require( address(Pool(poolGlobal).manager()) == address(this), "Pool 0 manager mismatch" ); require( address(Pool(pool1Month).manager()) == address(this), "Pool 1 manager mismatch" ); require( address(Pool(pool3Months).manager()) == address(this), "Pool 2 manager mismatch" ); require( address(Pool(pool6Months).manager()) == address(this), "Pool 3 manager mismatch" ); require( wozxToken.balanceOf(address(this)) >= 13_140_000e18, "Rewards not ready" ); pools[0].addr = poolGlobal; pools[0].totalRewards = 5_256_000; pools[0].rewardPerMinute = 10e18; pools[1].addr = pool1Month; pools[1].totalRewards = 108_000; pools[1].rewardPerMinute = 25e17; pools[2].addr = pool3Months; pools[2].totalRewards = 648_000; pools[2].rewardPerMinute = 5e18; pools[3].addr = pool6Months; pools[3].totalRewards = 1_944_000; pools[3].rewardPerMinute = 75e17; campaignStart = block.timestamp; } /// @notice Deposits WOZX tokens to the given pool. Min deposit is 100 WOZX, max deposit is 200 000 WOZX /// @param poolId Id of the pool /// @param amount Amount to deposit function deposit(uint8 poolId, uint256 amount) external isInitialized { Pool p = Pool(pools[poolId].addr); require(amount >= 100e18, "Minimum deposit = 100 WOZX"); require( p.balanceOf(msg.sender) + amount <= 200_000e18, "Maximum deposit = 200 000 WOZX" ); p.deposit(msg.sender, amount); wozxToken.safeTransferFrom(msg.sender, pools[poolId].addr, amount); emit PoolBalanceChanged(poolId, wozxToken.balanceOf(pools[poolId].addr)); emit UserBalanceChanged(msg.sender, poolId, p.balanceOf(msg.sender)); } /// @notice Withdraws deposited tokens from the given pool + rewards /// @param poolId Id of the pool function withdraw(uint8 poolId) external isInitialized { Pool p = Pool(pools[poolId].addr); require( block.timestamp < p.getStartTime(msg.sender) || block.timestamp > p.getEndTime(msg.sender), "Can't withdraw during the staking" ); claimReward(poolId); p.withdraw(msg.sender); emit PoolBalanceChanged(poolId, wozxToken.balanceOf(pools[poolId].addr)); emit UserBalanceChanged(msg.sender, poolId, p.balanceOf(msg.sender)); } /// @notice Withdraws earned rewards from the pool /// @param poolId Id of the pool function claimReward(uint8 poolId) public isInitialized { Pool p = Pool(pools[poolId].addr); Pool.Deposit[] memory deposits = p.getDeposits(msg.sender); require(deposits.length > 0, "You have no deposits"); uint256 reward = getReward(poolId); pools[poolId].lastRewardsClaim[msg.sender] = Math.min( block.timestamp, p.getEndTime(msg.sender) ); if (reward > 0) { pools[poolId].claimedRewards += reward; wozxToken.safeTransfer(msg.sender, reward); } emit UserBalanceChanged(msg.sender, poolId, p.balanceOf(msg.sender)); } /// @notice Returns how much rewards have been already claimed from the pool /// @param poolId Id of the pool /// @return uint256 function getClaimedRewards(uint8 poolId) external view returns (uint256) { return pools[poolId].claimedRewards; } /// @notice Returns how much time has passed from campaign start (in minutes) /// @return uint256 function getCampaignElapsedMinutes() public view returns (uint256) { return Math.min((block.timestamp - campaignStart), CAMPAIGN_PERIOD) / 60; } /// @notice Returns campaign end /// @return Timestamp (uint256) function getCampaignEnd() public view returns (uint256) { return campaignStart + CAMPAIGN_PERIOD; } /// @notice Returns available rewards in the pool /// @param poolId Id of the pool /// @return uint256 function getAvailableRewards(uint8 poolId) public view returns (uint256) { return (getCampaignElapsedMinutes() * pools[poolId].rewardPerMinute) - pools[poolId].claimedRewards; } /// @notice Returns reward calculated by formula for the given pool and the message sender based on the deposits time /// @param poolId Id of the pool /// @return uint256 function getReward(uint8 poolId) public view returns (uint256) { Pool p = Pool(pools[poolId].addr); Pool.Deposit[] memory deposits = p.getDeposits(msg.sender); if (deposits.length == 0 || block.timestamp <= deposits[0].depositTime) { return 0; } uint256 stakingEnd = Math.min( p.getEndTime(msg.sender), block.timestamp ); uint256 totalDeposits = wozxToken.balanceOf(pools[poolId].addr); uint256 availableRewardPerMinute = getAvailableRewards(poolId) / ((p.id() == 0 ? CAMPAIGN_PERIOD : p.getTimePeriod()) / 60); uint256 reward; for (uint256 i = 0; i < deposits.length; i++) { uint256 depositElapsedMinutes = (stakingEnd - Math.max( deposits[i].depositTime, pools[poolId].lastRewardsClaim[msg.sender] )) / 60; reward += (availableRewardPerMinute * depositElapsedMinutes * deposits[i].amount) / totalDeposits; } return reward; } /// @notice Witdraws remaining rewards, afer 1 year reward claiming period after the campaign end /// @param account Address of recipient function withdrawRemainingRewards(address account) external isInitialized onlyOwner { require( getCampaignEnd() + 365 days < block.timestamp, "Remaining rewards can be withdrawn a year after the campaign end" ); wozxToken.safeTransfer(account, wozxToken.balanceOf(address(this))); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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); } }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using 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"); } } }
// SPDX-License-Identifier: MIT // 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); } } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // 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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "./StakingManager.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; /// @title Efforce farming pool for WOZX token /// @author Ackee Blockchain /// @notice Contract holds information about users deposit amounts and deposit times contract Pool { using SafeERC20 for IERC20; struct Deposit { uint256 amount; uint256 depositTime; } StakingManager public manager; uint8 public immutable id; mapping(address => Deposit[]) public deposits; modifier onlyManager() { require(msg.sender == address(manager), "Unauthorized"); _; } /// @param _id ID of the pool (0 = whole campaign, 1 = 1 month, 2 = 3 months, 3 = 6 months) /// @param _manager Staking manager contract address constructor(uint8 _id, address _manager) { require(_id < 4, "Invalid pool ID"); require( StakingManager(_manager).CONTRACT_TYPE() == keccak256("Efforce Staking Manager"), "Not a Efforce Staking Manager" ); id = _id; manager = StakingManager(_manager); } function getTimePeriod() public view returns (uint256) { if (id == 1) { return 2_592_000; } else if (id == 2) { return 7_776_000; } else if (id == 3) { return 15_552_000; } else { return 0; } } /// @notice Deposits WOZX tokens and save deposit amount and deposit time /// @param account Users's address /// @param amount Amount to deposit function deposit(address account, uint256 amount) external onlyManager { require( block.timestamp < manager.getCampaignEnd(), "Campaign ended, can't deposit" ); uint256 timePeriod = getTimePeriod(); if (deposits[account].length == 0) { // User joining the pool require( block.timestamp + manager.BUFFER_PERIOD() + timePeriod < manager.getCampaignEnd(), "Too late to join this pool" ); deposits[account].push( Deposit(amount, block.timestamp + manager.BUFFER_PERIOD()) ); } else if (block.timestamp < deposits[account][0].depositTime) { // User is in buffering period deposits[account].push( Deposit(amount, deposits[account][0].depositTime) ); } else { // User is staking if (timePeriod != 0) { require( block.timestamp < getStartTime(account) + timePeriod, "Can't deposit after the pool period" ); } deposits[account].push(Deposit(amount, block.timestamp)); } } /// @notice Withdraws deposited tokens from this pool and delete deposit records /// @param account User's address /// @return totalWithdraw sum of the user's all deposit amounts function withdraw(address account) external onlyManager returns (uint256 totalWithdraw) { totalWithdraw = balanceOf(account); delete deposits[account]; manager.wozxToken().safeTransfer(account, totalWithdraw); return totalWithdraw; } /// @notice Returns array of the deposits containing deposit amount and deposit time /// @param account User's address /// @return Array [] of Deposit structures function getDeposits(address account) external view returns (Deposit[] memory) { return deposits[account]; } /// @notice Returns sum of the user's all deposit amounts /// @param account User's address /// @return sum of the user's deposits function balanceOf(address account) public view returns (uint256 sum) { for (uint256 i = 0; i < deposits[account].length; i++) { sum += deposits[account][i].amount; } return sum; } /// @notice Returns time of user's first deposit /// @param account User's address /// @return Timestamp (uint256) function getStartTime(address account) public view returns (uint256) { require(deposits[account].length > 0, "Unknown address"); return deposits[account][0].depositTime; } /// @notice Returns end time of user's staking period /// @param account User's address /// @return Timestamp (uint256) function getEndTime(address account) public view returns (uint256) { require(deposits[account].length > 0, "Unknown address"); return id == 0 ? manager.getCampaignEnd() : (getStartTime(account) + getTimePeriod()); } /// @notice Returns elapsed time of the staking period. If still in buffering period, returns negative number (remaining buffering time) /// @param account User's address /// @return elapsed time of the staking period or negative number if is in buffering period function getElapsedTime(address account) public view returns (int256) { require(deposits[account].length > 0, "Unknown address"); return int256(block.timestamp) - int256(getStartTime(account)); } /// @notice Returns true when user is in buffering period /// @param account User's address /// @return Buffering period bool function isInBufferingPeriod(address account) external view returns (bool) { return getElapsedTime(account) < 0; } /// @notice Returns true when user's staking period is over /// @param account User's address /// @return Staking finished bool function isStakingFinished(address account) external view returns (bool) { return block.timestamp > getEndTime(account); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_wozxToken","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":true,"internalType":"uint8","name":"poolId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"totalPoolAmount","type":"uint256"}],"name":"PoolBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint8","name":"poolId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"totalUserDeposits","type":"uint256"}],"name":"UserBalanceChanged","type":"event"},{"inputs":[],"name":"BUFFER_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CAMPAIGN_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"campaignStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"}],"name":"getAvailableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCampaignElapsedMinutes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCampaignEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"}],"name":"getClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"poolGlobal","type":"address"},{"internalType":"address payable","name":"pool1Month","type":"address"},{"internalType":"address payable","name":"pool3Months","type":"address"},{"internalType":"address payable","name":"pool6Months","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address payable","name":"addr","type":"address"},{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"rewardPerMinute","type":"uint256"},{"internalType":"uint256","name":"claimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"poolId","type":"uint8"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wozxToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620040633803806200406383398181016040528101906200003791906200024f565b620000576200004b6200010560201b60201c565b6200010d60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c190620002e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000304565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200020382620001d6565b9050919050565b60006200021782620001f6565b9050919050565b62000229816200020a565b81146200023557600080fd5b50565b60008151905062000249816200021e565b92915050565b600060208284031215620002685762000267620001d1565b5b6000620002788482850162000238565b91505092915050565b600082825260208201905092915050565b7f556e6578706563746564207a65726f2061646472657373000000000000000000600082015250565b6000620002ca60178362000281565b9150620002d78262000292565b602082019050919050565b60006020820190508181036000830152620002fd81620002bb565b9050919050565b608051613d0b6200035860003960008181610a9a0152818161114f015281816114a701528181611a8601528181611c4201528181611dda01528181611e740152818161220c01526122780152613d0b6000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639a6a327c116100ad578063ca67ba7211610071578063ca67ba72146102e9578063ec0501bc14610307578063ef18652014610337578063f2fde38b14610353578063f4d4c9d71461036f57610121565b80639a6a327c1461022e578063ac4afa381461025e578063b65b29cf14610291578063c6ab5d90146102af578063c8bd617f146102cb57610121565b80634b6a94cc116100f45780634b6a94cc146101ae578063626883ec146101cc578063689f1623146101ea578063715018a6146102065780638da5cb5b1461021057610121565b806306552ff31461012657806314fb071a1461014257806321e50aac14610160578063288ac6bf14610190575b600080fd5b610140600480360381019061013b9190612930565b61038b565b005b61014a610e1d565b60405161015791906129b0565b60405180910390f35b61017a60048036038101906101759190612a04565b610e36565b60405161018791906129b0565b60405180910390f35b610198610e99565b6040516101a591906129b0565b60405180910390f35b6101b6610ea1565b6040516101c39190612a4a565b60405180910390f35b6101d4610ec5565b6040516101e191906129b0565b60405180910390f35b61020460048036038101906101ff9190612a04565b610ecb565b005b61020e611265565b005b6102186112ed565b6040516102259190612a86565b60405180910390f35b61024860048036038101906102439190612a04565b611316565b60405161025591906129b0565b60405180910390f35b61027860048036038101906102739190612acd565b6117b5565b6040516102889493929190612b09565b60405180910390f35b61029961180b565b6040516102a691906129b0565b60405180910390f35b6102c960048036038101906102c49190612a04565b611812565b005b6102d3611c40565b6040516102e09190612bad565b60405180910390f35b6102f1611c64565b6040516102fe91906129b0565b60405180910390f35b610321600480360381019061031c9190612a04565b611c92565b60405161032e91906129b0565b60405180910390f35b610351600480360381019061034c9190612bf4565b611cba565b005b61036d60048036038101906103689190612bf4565b611ebb565b005b61038960048036038101906103849190612c21565b611fb3565b005b610393612433565b73ffffffffffffffffffffffffffffffffffffffff166103b16112ed565b73ffffffffffffffffffffffffffffffffffffffff1614610407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fe90612cbe565b60405180910390fd5b60006015541461044c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044390612d2a565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bd9190612d5f565b60ff1614610500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f790612dd8565b60405180910390fd5b60018373ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190612d5f565b60ff16146105b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ab90612e44565b60405180910390fd5b60028273ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190612d5f565b60ff1614610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90612eb0565b60405180910390fd5b60038173ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d99190612d5f565b60ff161461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071390612f1c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a29190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146107f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ef90612ff3565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb9061305f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a7906130cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612f7a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390613137565b60405180910390fd5b6a0ade80d3cb7046ec8000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610af19190612a86565b602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061316c565b1015610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906131e5565b60405180910390fd5b836001600060048110610b8957610b88613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550625033406001600060048110610be757610be6613205565b5b6005020160010181905550678ac7230489e800006001600060048110610c1057610c0f613205565b5b60050201600201819055508260018060048110610c3057610c2f613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506201a5e060018060048110610c8d57610c8c613205565b5b60050201600101819055506722b1c8c1227a000060018060048110610cb557610cb4613205565b5b6005020160020181905550816001600260048110610cd657610cd5613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506209e3406001600260048110610d3457610d33613205565b5b6005020160010181905550674563918244f400006001600260048110610d5d57610d5c613205565b5b6005020160020181905550806001600360048110610d7e57610d7d613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550621da9c06001600360048110610ddc57610ddb613205565b5b60050201600101819055506768155a43676e00006001600360048110610e0557610e04613205565b5b60050201600201819055504260158190555050505050565b60006301e13380601554610e319190613263565b905090565b600060018260ff1660048110610e4f57610e4e613205565b5b600502016003015460018360ff1660048110610e6e57610e6d613205565b5b6005020160020154610e7e611c64565b610e8891906132b9565b610e929190613313565b9050919050565b6301e1338081565b7fa671abd900028f93f2029fc0b0a60c87f56dc9c4736521cec88957e37761298f81565b60155481565b60006015541415610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890613393565b60405180910390fd5b600060018260ff1660048110610f2a57610f29613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166394f649dd336040518263ffffffff1660e01b8152600401610f8f9190612a86565b600060405180830381865afa158015610fac573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fd59190613561565b9050600081511161101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906135f6565b60405180910390fd5b600061102684611316565b90506110ab428473ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b81526004016110659190612a86565b602060405180830381865afa158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a6919061316c565b61243b565b60018560ff16600481106110c2576110c1613205565b5b6005020160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115611194578060018560ff166004811061112b5761112a613205565b5b6005020160030160008282546111419190613263565b9250508190555061119333827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124549092919063ffffffff16565b5b8360ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016112099190612a86565b602060405180830381865afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a919061316c565b60405161125791906129b0565b60405180910390a350505050565b61126d612433565b73ffffffffffffffffffffffffffffffffffffffff1661128b6112ed565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890612cbe565b60405180910390fd5b6112eb60006124da565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060018360ff16600481106113305761132f613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166394f649dd336040518263ffffffff1660e01b81526004016113959190612a86565b600060405180830381865afa1580156113b2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113db9190613561565b905060008151148061140c5750806000815181106113fc576113fb613205565b5b6020026020010151602001514211155b1561141c576000925050506117b0565b60006114a18373ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b815260040161145a9190612a86565b602060405180830381865afa158015611477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149b919061316c565b4261243b565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a0823160018860ff16600481106114f8576114f7613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161153c9190613637565b602060405180830381865afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157d919061316c565b90506000603c60008673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f49190612d5f565b60ff1614611670578573ffffffffffffffffffffffffffffffffffffffff1663af76dd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b919061316c565b611676565b6301e133805b6116809190613681565b61168988610e36565b6116939190613681565b9050600080600090505b85518110156117a5576000603c61172d8884815181106116c0576116bf613205565b5b60200260200101516020015160018d60ff16600481106116e3576116e2613205565b5b6005020160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461259e565b876117389190613313565b6117429190613681565b90508487838151811061175857611757613205565b5b602002602001015160000151828661177091906132b9565b61177a91906132b9565b6117849190613681565b8361178f9190613263565b925050808061179d906136b2565b91505061169d565b508096505050505050505b919050565b600181600481106117c557600080fd5b600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6203f48081565b60006015541415611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90613393565b60405180910390fd5b600060018260ff166004811061187157611870613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663805e3ec8336040518263ffffffff1660e01b81526004016118d49190612a86565b602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611915919061316c565b42108061199a57508073ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b81526004016119569190612a86565b602060405180830381865afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611997919061316c565b42115b6119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d09061376d565b60405180910390fd5b6119e282610ecb565b8073ffffffffffffffffffffffffffffffffffffffff166351cff8d9336040518263ffffffff1660e01b8152600401611a1b9190612a86565b6020604051808303816000875af1158015611a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5e919061316c565b508160ff167fa067d66907b086a1b4801524770794e25dc4c4821cfec0331216353a22e45b897f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a0823160018660ff1660048110611ad757611ad6613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b1b9190613637565b602060405180830381865afa158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c919061316c565b604051611b6991906129b0565b60405180910390a28160ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611be69190612a86565b602060405180830381865afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c27919061316c565b604051611c3491906129b0565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000603c611c8360155442611c799190613313565b6301e1338061243b565b611c8d9190613681565b905090565b600060018260ff1660048110611cab57611caa613205565b5b60050201600301549050919050565b60006015541415611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790613393565b60405180910390fd5b611d08612433565b73ffffffffffffffffffffffffffffffffffffffff16611d266112ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390612cbe565b60405180910390fd5b426301e13380611d8a610e1d565b611d949190613263565b10611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb906137ff565b60405180910390fd5b611eb8817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e319190612a86565b602060405180830381865afa158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e72919061316c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166124549092919063ffffffff16565b50565b611ec3612433565b73ffffffffffffffffffffffffffffffffffffffff16611ee16112ed565b73ffffffffffffffffffffffffffffffffffffffff1614611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90612cbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90613891565b60405180910390fd5b611fb0816124da565b50565b60006015541415611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613393565b60405180910390fd5b600060018360ff166004811061201257612011613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905068056bc75e2d63100000821015612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f906138fd565b60405180910390fd5b692a5a058fc295ed000000828273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120cd9190612a86565b602060405180830381865afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e919061316c565b6121189190613263565b1115612159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215090613969565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166347e7ef2433846040518363ffffffff1660e01b8152600401612194929190613989565b600060405180830381600087803b1580156121ae57600080fd5b505af11580156121c2573d6000803e3d6000fd5b505050506122513360018560ff16600481106121e1576121e0613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166125b8909392919063ffffffff16565b8260ff167fa067d66907b086a1b4801524770794e25dc4c4821cfec0331216353a22e45b897f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a0823160018760ff16600481106122c9576122c8613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161230d9190613637565b602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e919061316c565b60405161235b91906129b0565b60405180910390a28260ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123d89190612a86565b602060405180830381865afa1580156123f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612419919061316c565b60405161242691906129b0565b60405180910390a3505050565b600033905090565b600081831061244a578161244c565b825b905092915050565b6124d58363a9059cbb60e01b8484604051602401612473929190613989565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612641565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818310156125ae57816125b0565b825b905092915050565b61263b846323b872dd60e01b8585856040516024016125d9939291906139b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612641565b50505050565b60006126a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127089092919063ffffffff16565b905060008151111561270357808060200190518101906126c39190613a21565b612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f990613ac0565b60405180910390fd5b5b505050565b60606127178484600085612720565b90509392505050565b606082471015612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90613b52565b60405180910390fd5b61276e85612834565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613bbe565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127d69190613c58565b60006040518083038185875af1925050503d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5091509150612828828286612857565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612867578290506128b7565b60008351111561287a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae9190613cb3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128fd826128d2565b9050919050565b61290d816128f2565b811461291857600080fd5b50565b60008135905061292a81612904565b92915050565b6000806000806080858703121561294a576129496128c8565b5b60006129588782880161291b565b94505060206129698782880161291b565b935050604061297a8782880161291b565b925050606061298b8782880161291b565b91505092959194509250565b6000819050919050565b6129aa81612997565b82525050565b60006020820190506129c560008301846129a1565b92915050565b600060ff82169050919050565b6129e1816129cb565b81146129ec57600080fd5b50565b6000813590506129fe816129d8565b92915050565b600060208284031215612a1a57612a196128c8565b5b6000612a28848285016129ef565b91505092915050565b6000819050919050565b612a4481612a31565b82525050565b6000602082019050612a5f6000830184612a3b565b92915050565b6000612a70826128d2565b9050919050565b612a8081612a65565b82525050565b6000602082019050612a9b6000830184612a77565b92915050565b612aaa81612997565b8114612ab557600080fd5b50565b600081359050612ac781612aa1565b92915050565b600060208284031215612ae357612ae26128c8565b5b6000612af184828501612ab8565b91505092915050565b612b03816128f2565b82525050565b6000608082019050612b1e6000830187612afa565b612b2b60208301866129a1565b612b3860408301856129a1565b612b4560608301846129a1565b95945050505050565b6000819050919050565b6000612b73612b6e612b69846128d2565b612b4e565b6128d2565b9050919050565b6000612b8582612b58565b9050919050565b6000612b9782612b7a565b9050919050565b612ba781612b8c565b82525050565b6000602082019050612bc26000830184612b9e565b92915050565b612bd181612a65565b8114612bdc57600080fd5b50565b600081359050612bee81612bc8565b92915050565b600060208284031215612c0a57612c096128c8565b5b6000612c1884828501612bdf565b91505092915050565b60008060408385031215612c3857612c376128c8565b5b6000612c46858286016129ef565b9250506020612c5785828601612ab8565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ca8602083612c61565b9150612cb382612c72565b602082019050919050565b60006020820190508181036000830152612cd781612c9b565b9050919050565b7f506f6f6c732061726520616c726561647920696e697469616c697a6564000000600082015250565b6000612d14601d83612c61565b9150612d1f82612cde565b602082019050919050565b60006020820190508181036000830152612d4381612d07565b9050919050565b600081519050612d59816129d8565b92915050565b600060208284031215612d7557612d746128c8565b5b6000612d8384828501612d4a565b91505092915050565b7f506f6f6c2030206964206d69736d617463680000000000000000000000000000600082015250565b6000612dc2601283612c61565b9150612dcd82612d8c565b602082019050919050565b60006020820190508181036000830152612df181612db5565b9050919050565b7f506f6f6c2031206964206d69736d617463680000000000000000000000000000600082015250565b6000612e2e601283612c61565b9150612e3982612df8565b602082019050919050565b60006020820190508181036000830152612e5d81612e21565b9050919050565b7f506f6f6c2032206964206d69736d617463680000000000000000000000000000600082015250565b6000612e9a601283612c61565b9150612ea582612e64565b602082019050919050565b60006020820190508181036000830152612ec981612e8d565b9050919050565b7f506f6f6c2033206964206d69736d617463680000000000000000000000000000600082015250565b6000612f06601283612c61565b9150612f1182612ed0565b602082019050919050565b60006020820190508181036000830152612f3581612ef9565b9050919050565b6000612f4782612a65565b9050919050565b612f5781612f3c565b8114612f6257600080fd5b50565b600081519050612f7481612f4e565b92915050565b600060208284031215612f9057612f8f6128c8565b5b6000612f9e84828501612f65565b91505092915050565b7f506f6f6c2030206d616e61676572206d69736d61746368000000000000000000600082015250565b6000612fdd601783612c61565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f506f6f6c2031206d616e61676572206d69736d61746368000000000000000000600082015250565b6000613049601783612c61565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f506f6f6c2032206d616e61676572206d69736d61746368000000000000000000600082015250565b60006130b5601783612c61565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f506f6f6c2033206d616e61676572206d69736d61746368000000000000000000600082015250565b6000613121601783612c61565b915061312c826130eb565b602082019050919050565b6000602082019050818103600083015261315081613114565b9050919050565b60008151905061316681612aa1565b92915050565b600060208284031215613182576131816128c8565b5b600061319084828501613157565b91505092915050565b7f52657761726473206e6f74207265616479000000000000000000000000000000600082015250565b60006131cf601183612c61565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061326e82612997565b915061327983612997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ae576132ad613234565b5b828201905092915050565b60006132c482612997565b91506132cf83612997565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561330857613307613234565b5b828202905092915050565b600061331e82612997565b915061332983612997565b92508282101561333c5761333b613234565b5b828203905092915050565b7f4e6f7420696e697469616c697a65640000000000000000000000000000000000600082015250565b600061337d600f83612c61565b915061338882613347565b602082019050919050565b600060208201905081810360008301526133ac81613370565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613401826133b8565b810181811067ffffffffffffffff821117156134205761341f6133c9565b5b80604052505050565b60006134336128be565b905061343f82826133f8565b919050565b600067ffffffffffffffff82111561345f5761345e6133c9565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000604082840312156134905761348f613475565b5b61349a6040613429565b905060006134aa84828501613157565b60008301525060206134be84828501613157565b60208301525092915050565b60006134dd6134d884613444565b613429565b90508083825260208201905060408402830185811115613500576134ff613470565b5b835b818110156135295780613515888261347a565b845260208401935050604081019050613502565b5050509392505050565b600082601f830112613548576135476133b3565b5b81516135588482602086016134ca565b91505092915050565b600060208284031215613577576135766128c8565b5b600082015167ffffffffffffffff811115613595576135946128cd565b5b6135a184828501613533565b91505092915050565b7f596f752068617665206e6f206465706f73697473000000000000000000000000600082015250565b60006135e0601483612c61565b91506135eb826135aa565b602082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b600061362182612b7a565b9050919050565b61363181613616565b82525050565b600060208201905061364c6000830184613628565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061368c82612997565b915061369783612997565b9250826136a7576136a6613652565b5b828204905092915050565b60006136bd82612997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136f0576136ef613234565b5b600182019050919050565b7f43616e277420776974686472617720647572696e6720746865207374616b696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613757602183612c61565b9150613762826136fb565b604082019050919050565b600060208201905081810360008301526137868161374a565b9050919050565b7f52656d61696e696e6720726577617264732063616e206265207769746864726160008201527f776e20612079656172206166746572207468652063616d706169676e20656e64602082015250565b60006137e9604083612c61565b91506137f48261378d565b604082019050919050565b60006020820190508181036000830152613818816137dc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061387b602683612c61565b91506138868261381f565b604082019050919050565b600060208201905081810360008301526138aa8161386e565b9050919050565b7f4d696e696d756d206465706f736974203d2031303020574f5a58000000000000600082015250565b60006138e7601a83612c61565b91506138f2826138b1565b602082019050919050565b60006020820190508181036000830152613916816138da565b9050919050565b7f4d6178696d756d206465706f736974203d203230302030303020574f5a580000600082015250565b6000613953601e83612c61565b915061395e8261391d565b602082019050919050565b6000602082019050818103600083015261398281613946565b9050919050565b600060408201905061399e6000830185612a77565b6139ab60208301846129a1565b9392505050565b60006060820190506139c76000830186612a77565b6139d46020830185612a77565b6139e160408301846129a1565b949350505050565b60008115159050919050565b6139fe816139e9565b8114613a0957600080fd5b50565b600081519050613a1b816139f5565b92915050565b600060208284031215613a3757613a366128c8565b5b6000613a4584828501613a0c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613aaa602a83612c61565b9150613ab582613a4e565b604082019050919050565b60006020820190508181036000830152613ad981613a9d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b3c602683612c61565b9150613b4782613ae0565b604082019050919050565b60006020820190508181036000830152613b6b81613b2f565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613ba8601d83612c61565b9150613bb382613b72565b602082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613c12578082015181840152602081019050613bf7565b83811115613c21576000848401525b50505050565b6000613c3282613bde565b613c3c8185613be9565b9350613c4c818560208601613bf4565b80840191505092915050565b6000613c648284613c27565b915081905092915050565b600081519050919050565b6000613c8582613c6f565b613c8f8185612c61565b9350613c9f818560208601613bf4565b613ca8816133b8565b840191505092915050565b60006020820190508181036000830152613ccd8184613c7a565b90509291505056fea2646970667358221220fb942166bb1358aba357164b8ce89923531669dcadc64e57ba3d3763234a687664736f6c634300080b003300000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80639a6a327c116100ad578063ca67ba7211610071578063ca67ba72146102e9578063ec0501bc14610307578063ef18652014610337578063f2fde38b14610353578063f4d4c9d71461036f57610121565b80639a6a327c1461022e578063ac4afa381461025e578063b65b29cf14610291578063c6ab5d90146102af578063c8bd617f146102cb57610121565b80634b6a94cc116100f45780634b6a94cc146101ae578063626883ec146101cc578063689f1623146101ea578063715018a6146102065780638da5cb5b1461021057610121565b806306552ff31461012657806314fb071a1461014257806321e50aac14610160578063288ac6bf14610190575b600080fd5b610140600480360381019061013b9190612930565b61038b565b005b61014a610e1d565b60405161015791906129b0565b60405180910390f35b61017a60048036038101906101759190612a04565b610e36565b60405161018791906129b0565b60405180910390f35b610198610e99565b6040516101a591906129b0565b60405180910390f35b6101b6610ea1565b6040516101c39190612a4a565b60405180910390f35b6101d4610ec5565b6040516101e191906129b0565b60405180910390f35b61020460048036038101906101ff9190612a04565b610ecb565b005b61020e611265565b005b6102186112ed565b6040516102259190612a86565b60405180910390f35b61024860048036038101906102439190612a04565b611316565b60405161025591906129b0565b60405180910390f35b61027860048036038101906102739190612acd565b6117b5565b6040516102889493929190612b09565b60405180910390f35b61029961180b565b6040516102a691906129b0565b60405180910390f35b6102c960048036038101906102c49190612a04565b611812565b005b6102d3611c40565b6040516102e09190612bad565b60405180910390f35b6102f1611c64565b6040516102fe91906129b0565b60405180910390f35b610321600480360381019061031c9190612a04565b611c92565b60405161032e91906129b0565b60405180910390f35b610351600480360381019061034c9190612bf4565b611cba565b005b61036d60048036038101906103689190612bf4565b611ebb565b005b61038960048036038101906103849190612c21565b611fb3565b005b610393612433565b73ffffffffffffffffffffffffffffffffffffffff166103b16112ed565b73ffffffffffffffffffffffffffffffffffffffff1614610407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fe90612cbe565b60405180910390fd5b60006015541461044c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044390612d2a565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bd9190612d5f565b60ff1614610500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f790612dd8565b60405180910390fd5b60018373ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190612d5f565b60ff16146105b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ab90612e44565b60405180910390fd5b60028273ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190612d5f565b60ff1614610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90612eb0565b60405180910390fd5b60038173ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d99190612d5f565b60ff161461071c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071390612f1c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa15801561077e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a29190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146107f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ef90612ff3565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087e9190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb9061305f565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612f7a565b73ffffffffffffffffffffffffffffffffffffffff16146109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a7906130cb565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190612f7a565b73ffffffffffffffffffffffffffffffffffffffff1614610a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8390613137565b60405180910390fd5b6a0ade80d3cb7046ec8000007f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610af19190612a86565b602060405180830381865afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061316c565b1015610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906131e5565b60405180910390fd5b836001600060048110610b8957610b88613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550625033406001600060048110610be757610be6613205565b5b6005020160010181905550678ac7230489e800006001600060048110610c1057610c0f613205565b5b60050201600201819055508260018060048110610c3057610c2f613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506201a5e060018060048110610c8d57610c8c613205565b5b60050201600101819055506722b1c8c1227a000060018060048110610cb557610cb4613205565b5b6005020160020181905550816001600260048110610cd657610cd5613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506209e3406001600260048110610d3457610d33613205565b5b6005020160010181905550674563918244f400006001600260048110610d5d57610d5c613205565b5b6005020160020181905550806001600360048110610d7e57610d7d613205565b5b6005020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550621da9c06001600360048110610ddc57610ddb613205565b5b60050201600101819055506768155a43676e00006001600360048110610e0557610e04613205565b5b60050201600201819055504260158190555050505050565b60006301e13380601554610e319190613263565b905090565b600060018260ff1660048110610e4f57610e4e613205565b5b600502016003015460018360ff1660048110610e6e57610e6d613205565b5b6005020160020154610e7e611c64565b610e8891906132b9565b610e929190613313565b9050919050565b6301e1338081565b7fa671abd900028f93f2029fc0b0a60c87f56dc9c4736521cec88957e37761298f81565b60155481565b60006015541415610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890613393565b60405180910390fd5b600060018260ff1660048110610f2a57610f29613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166394f649dd336040518263ffffffff1660e01b8152600401610f8f9190612a86565b600060405180830381865afa158015610fac573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610fd59190613561565b9050600081511161101b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611012906135f6565b60405180910390fd5b600061102684611316565b90506110ab428473ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b81526004016110659190612a86565b602060405180830381865afa158015611082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a6919061316c565b61243b565b60018560ff16600481106110c2576110c1613205565b5b6005020160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000811115611194578060018560ff166004811061112b5761112a613205565b5b6005020160030160008282546111419190613263565b9250508190555061119333827f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166124549092919063ffffffff16565b5b8360ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016112099190612a86565b602060405180830381865afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a919061316c565b60405161125791906129b0565b60405180910390a350505050565b61126d612433565b73ffffffffffffffffffffffffffffffffffffffff1661128b6112ed565b73ffffffffffffffffffffffffffffffffffffffff16146112e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d890612cbe565b60405180910390fd5b6112eb60006124da565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060018360ff16600481106113305761132f613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166394f649dd336040518263ffffffff1660e01b81526004016113959190612a86565b600060405180830381865afa1580156113b2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113db9190613561565b905060008151148061140c5750806000815181106113fc576113fb613205565b5b6020026020010151602001514211155b1561141c576000925050506117b0565b60006114a18373ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b815260040161145a9190612a86565b602060405180830381865afa158015611477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149b919061316c565b4261243b565b905060007f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166370a0823160018860ff16600481106114f8576114f7613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161153c9190613637565b602060405180830381865afa158015611559573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157d919061316c565b90506000603c60008673ffffffffffffffffffffffffffffffffffffffff1663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f49190612d5f565b60ff1614611670578573ffffffffffffffffffffffffffffffffffffffff1663af76dd1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b919061316c565b611676565b6301e133805b6116809190613681565b61168988610e36565b6116939190613681565b9050600080600090505b85518110156117a5576000603c61172d8884815181106116c0576116bf613205565b5b60200260200101516020015160018d60ff16600481106116e3576116e2613205565b5b6005020160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461259e565b876117389190613313565b6117429190613681565b90508487838151811061175857611757613205565b5b602002602001015160000151828661177091906132b9565b61177a91906132b9565b6117849190613681565b8361178f9190613263565b925050808061179d906136b2565b91505061169d565b508096505050505050505b919050565b600181600481106117c557600080fd5b600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b6203f48081565b60006015541415611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90613393565b60405180910390fd5b600060018260ff166004811061187157611870613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663805e3ec8336040518263ffffffff1660e01b81526004016118d49190612a86565b602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611915919061316c565b42108061199a57508073ffffffffffffffffffffffffffffffffffffffff16631c260b5f336040518263ffffffff1660e01b81526004016119569190612a86565b602060405180830381865afa158015611973573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611997919061316c565b42115b6119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d09061376d565b60405180910390fd5b6119e282610ecb565b8073ffffffffffffffffffffffffffffffffffffffff166351cff8d9336040518263ffffffff1660e01b8152600401611a1b9190612a86565b6020604051808303816000875af1158015611a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5e919061316c565b508160ff167fa067d66907b086a1b4801524770794e25dc4c4821cfec0331216353a22e45b897f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166370a0823160018660ff1660048110611ad757611ad6613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b1b9190613637565b602060405180830381865afa158015611b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5c919061316c565b604051611b6991906129b0565b60405180910390a28160ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611be69190612a86565b602060405180830381865afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c27919061316c565b604051611c3491906129b0565b60405180910390a35050565b7f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f81565b6000603c611c8360155442611c799190613313565b6301e1338061243b565b611c8d9190613681565b905090565b600060018260ff1660048110611cab57611caa613205565b5b60050201600301549050919050565b60006015541415611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790613393565b60405180910390fd5b611d08612433565b73ffffffffffffffffffffffffffffffffffffffff16611d266112ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390612cbe565b60405180910390fd5b426301e13380611d8a610e1d565b611d949190613263565b10611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb906137ff565b60405180910390fd5b611eb8817f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e319190612a86565b602060405180830381865afa158015611e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e72919061316c565b7f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166124549092919063ffffffff16565b50565b611ec3612433565b73ffffffffffffffffffffffffffffffffffffffff16611ee16112ed565b73ffffffffffffffffffffffffffffffffffffffff1614611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90612cbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9e90613891565b60405180910390fd5b611fb0816124da565b50565b60006015541415611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613393565b60405180910390fd5b600060018360ff166004811061201257612011613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905068056bc75e2d63100000821015612088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207f906138fd565b60405180910390fd5b692a5a058fc295ed000000828273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120cd9190612a86565b602060405180830381865afa1580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e919061316c565b6121189190613263565b1115612159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215090613969565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166347e7ef2433846040518363ffffffff1660e01b8152600401612194929190613989565b600060405180830381600087803b1580156121ae57600080fd5b505af11580156121c2573d6000803e3d6000fd5b505050506122513360018560ff16600481106121e1576121e0613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16847f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166125b8909392919063ffffffff16565b8260ff167fa067d66907b086a1b4801524770794e25dc4c4821cfec0331216353a22e45b897f00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f73ffffffffffffffffffffffffffffffffffffffff166370a0823160018760ff16600481106122c9576122c8613205565b5b6005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161230d9190613637565b602060405180830381865afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e919061316c565b60405161235b91906129b0565b60405180910390a28260ff163373ffffffffffffffffffffffffffffffffffffffff167f1748dd5e355d7b244bd163a5b6ce0f01688082ab2b7ad295ce3010255b02c7fa8373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016123d89190612a86565b602060405180830381865afa1580156123f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612419919061316c565b60405161242691906129b0565b60405180910390a3505050565b600033905090565b600081831061244a578161244c565b825b905092915050565b6124d58363a9059cbb60e01b8484604051602401612473929190613989565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612641565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818310156125ae57816125b0565b825b905092915050565b61263b846323b872dd60e01b8585856040516024016125d9939291906139b2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612641565b50505050565b60006126a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127089092919063ffffffff16565b905060008151111561270357808060200190518101906126c39190613a21565b612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f990613ac0565b60405180910390fd5b5b505050565b60606127178484600085612720565b90509392505050565b606082471015612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90613b52565b60405180910390fd5b61276e85612834565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490613bbe565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127d69190613c58565b60006040518083038185875af1925050503d8060008114612813576040519150601f19603f3d011682016040523d82523d6000602084013e612818565b606091505b5091509150612828828286612857565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612867578290506128b7565b60008351111561287a5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae9190613cb3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128fd826128d2565b9050919050565b61290d816128f2565b811461291857600080fd5b50565b60008135905061292a81612904565b92915050565b6000806000806080858703121561294a576129496128c8565b5b60006129588782880161291b565b94505060206129698782880161291b565b935050604061297a8782880161291b565b925050606061298b8782880161291b565b91505092959194509250565b6000819050919050565b6129aa81612997565b82525050565b60006020820190506129c560008301846129a1565b92915050565b600060ff82169050919050565b6129e1816129cb565b81146129ec57600080fd5b50565b6000813590506129fe816129d8565b92915050565b600060208284031215612a1a57612a196128c8565b5b6000612a28848285016129ef565b91505092915050565b6000819050919050565b612a4481612a31565b82525050565b6000602082019050612a5f6000830184612a3b565b92915050565b6000612a70826128d2565b9050919050565b612a8081612a65565b82525050565b6000602082019050612a9b6000830184612a77565b92915050565b612aaa81612997565b8114612ab557600080fd5b50565b600081359050612ac781612aa1565b92915050565b600060208284031215612ae357612ae26128c8565b5b6000612af184828501612ab8565b91505092915050565b612b03816128f2565b82525050565b6000608082019050612b1e6000830187612afa565b612b2b60208301866129a1565b612b3860408301856129a1565b612b4560608301846129a1565b95945050505050565b6000819050919050565b6000612b73612b6e612b69846128d2565b612b4e565b6128d2565b9050919050565b6000612b8582612b58565b9050919050565b6000612b9782612b7a565b9050919050565b612ba781612b8c565b82525050565b6000602082019050612bc26000830184612b9e565b92915050565b612bd181612a65565b8114612bdc57600080fd5b50565b600081359050612bee81612bc8565b92915050565b600060208284031215612c0a57612c096128c8565b5b6000612c1884828501612bdf565b91505092915050565b60008060408385031215612c3857612c376128c8565b5b6000612c46858286016129ef565b9250506020612c5785828601612ab8565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ca8602083612c61565b9150612cb382612c72565b602082019050919050565b60006020820190508181036000830152612cd781612c9b565b9050919050565b7f506f6f6c732061726520616c726561647920696e697469616c697a6564000000600082015250565b6000612d14601d83612c61565b9150612d1f82612cde565b602082019050919050565b60006020820190508181036000830152612d4381612d07565b9050919050565b600081519050612d59816129d8565b92915050565b600060208284031215612d7557612d746128c8565b5b6000612d8384828501612d4a565b91505092915050565b7f506f6f6c2030206964206d69736d617463680000000000000000000000000000600082015250565b6000612dc2601283612c61565b9150612dcd82612d8c565b602082019050919050565b60006020820190508181036000830152612df181612db5565b9050919050565b7f506f6f6c2031206964206d69736d617463680000000000000000000000000000600082015250565b6000612e2e601283612c61565b9150612e3982612df8565b602082019050919050565b60006020820190508181036000830152612e5d81612e21565b9050919050565b7f506f6f6c2032206964206d69736d617463680000000000000000000000000000600082015250565b6000612e9a601283612c61565b9150612ea582612e64565b602082019050919050565b60006020820190508181036000830152612ec981612e8d565b9050919050565b7f506f6f6c2033206964206d69736d617463680000000000000000000000000000600082015250565b6000612f06601283612c61565b9150612f1182612ed0565b602082019050919050565b60006020820190508181036000830152612f3581612ef9565b9050919050565b6000612f4782612a65565b9050919050565b612f5781612f3c565b8114612f6257600080fd5b50565b600081519050612f7481612f4e565b92915050565b600060208284031215612f9057612f8f6128c8565b5b6000612f9e84828501612f65565b91505092915050565b7f506f6f6c2030206d616e61676572206d69736d61746368000000000000000000600082015250565b6000612fdd601783612c61565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f506f6f6c2031206d616e61676572206d69736d61746368000000000000000000600082015250565b6000613049601783612c61565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f506f6f6c2032206d616e61676572206d69736d61746368000000000000000000600082015250565b60006130b5601783612c61565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f506f6f6c2033206d616e61676572206d69736d61746368000000000000000000600082015250565b6000613121601783612c61565b915061312c826130eb565b602082019050919050565b6000602082019050818103600083015261315081613114565b9050919050565b60008151905061316681612aa1565b92915050565b600060208284031215613182576131816128c8565b5b600061319084828501613157565b91505092915050565b7f52657761726473206e6f74207265616479000000000000000000000000000000600082015250565b60006131cf601183612c61565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061326e82612997565b915061327983612997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ae576132ad613234565b5b828201905092915050565b60006132c482612997565b91506132cf83612997565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561330857613307613234565b5b828202905092915050565b600061331e82612997565b915061332983612997565b92508282101561333c5761333b613234565b5b828203905092915050565b7f4e6f7420696e697469616c697a65640000000000000000000000000000000000600082015250565b600061337d600f83612c61565b915061338882613347565b602082019050919050565b600060208201905081810360008301526133ac81613370565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613401826133b8565b810181811067ffffffffffffffff821117156134205761341f6133c9565b5b80604052505050565b60006134336128be565b905061343f82826133f8565b919050565b600067ffffffffffffffff82111561345f5761345e6133c9565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000604082840312156134905761348f613475565b5b61349a6040613429565b905060006134aa84828501613157565b60008301525060206134be84828501613157565b60208301525092915050565b60006134dd6134d884613444565b613429565b90508083825260208201905060408402830185811115613500576134ff613470565b5b835b818110156135295780613515888261347a565b845260208401935050604081019050613502565b5050509392505050565b600082601f830112613548576135476133b3565b5b81516135588482602086016134ca565b91505092915050565b600060208284031215613577576135766128c8565b5b600082015167ffffffffffffffff811115613595576135946128cd565b5b6135a184828501613533565b91505092915050565b7f596f752068617665206e6f206465706f73697473000000000000000000000000600082015250565b60006135e0601483612c61565b91506135eb826135aa565b602082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b600061362182612b7a565b9050919050565b61363181613616565b82525050565b600060208201905061364c6000830184613628565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061368c82612997565b915061369783612997565b9250826136a7576136a6613652565b5b828204905092915050565b60006136bd82612997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136f0576136ef613234565b5b600182019050919050565b7f43616e277420776974686472617720647572696e6720746865207374616b696e60008201527f6700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613757602183612c61565b9150613762826136fb565b604082019050919050565b600060208201905081810360008301526137868161374a565b9050919050565b7f52656d61696e696e6720726577617264732063616e206265207769746864726160008201527f776e20612079656172206166746572207468652063616d706169676e20656e64602082015250565b60006137e9604083612c61565b91506137f48261378d565b604082019050919050565b60006020820190508181036000830152613818816137dc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061387b602683612c61565b91506138868261381f565b604082019050919050565b600060208201905081810360008301526138aa8161386e565b9050919050565b7f4d696e696d756d206465706f736974203d2031303020574f5a58000000000000600082015250565b60006138e7601a83612c61565b91506138f2826138b1565b602082019050919050565b60006020820190508181036000830152613916816138da565b9050919050565b7f4d6178696d756d206465706f736974203d203230302030303020574f5a580000600082015250565b6000613953601e83612c61565b915061395e8261391d565b602082019050919050565b6000602082019050818103600083015261398281613946565b9050919050565b600060408201905061399e6000830185612a77565b6139ab60208301846129a1565b9392505050565b60006060820190506139c76000830186612a77565b6139d46020830185612a77565b6139e160408301846129a1565b949350505050565b60008115159050919050565b6139fe816139e9565b8114613a0957600080fd5b50565b600081519050613a1b816139f5565b92915050565b600060208284031215613a3757613a366128c8565b5b6000613a4584828501613a0c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613aaa602a83612c61565b9150613ab582613a4e565b604082019050919050565b60006020820190508181036000830152613ad981613a9d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b3c602683612c61565b9150613b4782613ae0565b604082019050919050565b60006020820190508181036000830152613b6b81613b2f565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613ba8601d83612c61565b9150613bb382613b72565b602082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613c12578082015181840152602081019050613bf7565b83811115613c21576000848401525b50505050565b6000613c3282613bde565b613c3c8185613be9565b9350613c4c818560208601613bf4565b80840191505092915050565b6000613c648284613c27565b915081905092915050565b600081519050919050565b6000613c8582613c6f565b613c8f8185612c61565b9350613c9f818560208601613bf4565b613ca8816133b8565b840191505092915050565b60006020820190508181036000830152613ccd8184613c7a565b90509291505056fea2646970667358221220fb942166bb1358aba357164b8ce89923531669dcadc64e57ba3d3763234a687664736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f
-----Decoded View---------------
Arg [0] : _wozxToken (address): 0x34950Ff2b487d9E5282c5aB342d08A2f712eb79F
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000034950ff2b487d9e5282c5ab342d08a2f712eb79f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.