Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,753 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21215017 | 12 days ago | IN | 0 ETH | 0.00096501 | ||||
Claim | 21215009 | 12 days ago | IN | 0 ETH | 0.00172049 | ||||
Withdraw | 20978512 | 45 days ago | IN | 0 ETH | 0.00144692 | ||||
Claim | 20978506 | 45 days ago | IN | 0 ETH | 0.00261335 | ||||
Claim | 20970108 | 46 days ago | IN | 0 ETH | 0.00161705 | ||||
Claim | 20970068 | 46 days ago | IN | 0 ETH | 0.00170588 | ||||
Withdraw | 20811901 | 68 days ago | IN | 0 ETH | 0.00137551 | ||||
Claim | 20811898 | 68 days ago | IN | 0 ETH | 0.00269828 | ||||
Withdraw | 20669850 | 88 days ago | IN | 0 ETH | 0.00021122 | ||||
Claim | 20669846 | 88 days ago | IN | 0 ETH | 0.00036942 | ||||
Withdraw | 20661910 | 89 days ago | IN | 0 ETH | 0.00015159 | ||||
Claim | 20661894 | 89 days ago | IN | 0 ETH | 0.00033309 | ||||
Withdraw | 20647551 | 91 days ago | IN | 0 ETH | 0.00011759 | ||||
Claim | 20647547 | 91 days ago | IN | 0 ETH | 0.00026065 | ||||
Withdraw | 20641533 | 92 days ago | IN | 0 ETH | 0.00015428 | ||||
Claim | 20641500 | 92 days ago | IN | 0 ETH | 0.00033652 | ||||
Withdraw | 20641175 | 92 days ago | IN | 0 ETH | 0.00015158 | ||||
Claim | 20641171 | 92 days ago | IN | 0 ETH | 0.00027456 | ||||
Withdraw | 20596666 | 98 days ago | IN | 0 ETH | 0.00012563 | ||||
Claim | 20596664 | 98 days ago | IN | 0 ETH | 0.00020979 | ||||
Withdraw | 20556669 | 104 days ago | IN | 0 ETH | 0.00027466 | ||||
Claim | 20554703 | 104 days ago | IN | 0 ETH | 0.00023991 | ||||
Withdraw | 20533353 | 107 days ago | IN | 0 ETH | 0.00021608 | ||||
Claim | 20533351 | 107 days ago | IN | 0 ETH | 0.00032256 | ||||
Withdraw | 20512108 | 110 days ago | IN | 0 ETH | 0.00025863 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakeSpacePi
Compiler Version
v0.8.18+commit.87f61d96
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.18; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {Relationship} from "./utils/Relationship.sol"; import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract StakeSpacePi is ReentrancyGuard, Relationship { using SafeERC20 for IERC20; struct Pool { uint256 apr; // pool apr uint256 lockSeconds; // pool lock seconds uint256 amount; // pool stake amount } struct UserInfo { uint256 amount; // user deposit amount uint256 accReward; // user accumulate reward uint256 rewardDebt; // user reward debt uint256 enterTime; // user enter timestamp uint256 billedSeconds; // user billed seconds } Pool[] public pools; // stake pools IERC20 public token; // using token uint256 public accDeposit; // accumulate all deposit uint256 public accReward; // accumulate all reward uint256 public constant inviteRewardRate = 10; // invite reward rate mapping(address => mapping(uint256 => UserInfo)) public userInfo; // user info mapping(address => uint256) public inviteReward; // invite reward amount event Deposit(address indexed user, uint256 indexed pid, uint256 indexed amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 indexed amount); event InviterReward(address indexed user, uint256 indexed pid, uint256 indexed amount); event Reward(address indexed user, uint256 indexed pid, uint256 indexed amount); event AddPool(uint256 indexed apr, uint256 indexed locked, uint256 indexed pid); event SetPool(uint256 indexed apr, uint256 indexed locked, uint256 indexed pid); constructor(IERC20 _token,uint256 end)Relationship(end){ token = _token; } modifier onlyUnLock(uint256 pid, address _sender){ Pool memory pool = pools[pid]; UserInfo memory user = userInfo[_sender][pid]; require(block.timestamp >= pool.lockSeconds + user.enterTime, "onlyUnLock: locked"); _; } modifier onlyNotDeposit() { require(accDeposit == 0, "onlyNotDeposit: only not deposit"); _; } modifier onlyInvited(address _sender){ require(getParent(_sender) != address(0), "onlyInvited:only invited"); _; } // @dev add a new stake pool function addPool(uint256 apr,uint256 locked) external onlyOwner{ require(apr > 5, "setPool: apr must > 5"); require(apr < 500, "setPool: apr must < 500"); require(locked > 0, "setPool: locked must > 0"); pools.push(Pool(apr, locked, 0)); emit AddPool(apr, locked, pools.length - 1); } // @dev total pools length function poolLength() external view returns (uint256) { return pools.length; } // @dev modify pool apr and lock time function setPool(uint256 pid, uint256 apr, uint256 locked) external onlyOwner onlyNotDeposit{ require(apr > 5, "setPool: apr must > 5"); require(apr < 500, "setPool: apr must < 500"); require(locked > 0, "setPool: locked must > 0"); pools[pid].apr = apr; pools[pid].lockSeconds = locked; emit SetPool(apr, locked, pid); } // @dev get user pending reward function pending(uint256 pid, address play) public view returns (uint256){ uint256 time = block.timestamp; Pool memory pool = pools[pid]; UserInfo memory user = userInfo[play][pid]; if (user.amount == 0) return 0; // reward formula = (amount * apr * delta elapsed time) + billing unclaimed uint256 perSecond = user.amount * pool.apr * 1e18 / 365 days / 100; if (time >= pool.lockSeconds + user.enterTime) { if (user.billedSeconds >= pool.lockSeconds) return 0; return (perSecond * (pool.lockSeconds - user.billedSeconds) / 1e18)+user.rewardDebt; } return (perSecond*(time- user.enterTime-user.billedSeconds) / 1e18)+user.rewardDebt; } // @dev deposit token can repeat, will settle the previous deposit // @dev only invited can deposit function deposit(uint256 pid, uint256 amount) external nonReentrant onlyInvited(msg.sender) inDuration { require(amount > 0, "deposit: amount must > 0"); Pool storage pool = pools[pid]; UserInfo storage user = userInfo[msg.sender][pid]; token.safeTransferFrom(msg.sender, address(this), amount); uint256 reward = pending(pid, msg.sender); uint256 currentBlock = block.timestamp; // if user first deposit, set enter time if (user.enterTime == 0) { user.enterTime = block.timestamp; } // if lock-up time period is over, reset enter time if (currentBlock > user.enterTime+ pool.lockSeconds) { if (reward > 0) revert("deposit: reward claim first"); user.enterTime = block.timestamp; } // if user has deposit, settle the previous deposit if (user.amount > 0) { if (reward > 0) { user.rewardDebt = reward; user.billedSeconds = block.timestamp - user.enterTime; } } // record user deposit amount pool.amount = pool.amount + amount; user.amount = user.amount + amount; accDeposit = accDeposit + amount; emit Deposit(msg.sender, pid, amount); } // @dev withdraw deposit token whether unlock function withdraw(uint256 pid) external onlyUnLock(pid, msg.sender) { UserInfo storage user = userInfo[msg.sender][pid]; Pool storage pool = pools[pid]; uint256 amount = user.amount; uint256 reward = pending(pid, msg.sender); require(user.amount >= 0, "withdraw: Principal is zero"); // If there is a reward, first receive the reward before receiving the deposit if (reward > 0) claim(pid); // reset record user.amount = 0; user.enterTime = 0; user.billedSeconds = 0; accDeposit = accDeposit - amount; pool.amount = pool.amount - amount; // withdraw deposit amount token.safeTransfer(msg.sender, amount); emit Withdraw(msg.sender, pid, amount); } // @dev claim interest, not locking withdraw // @dev inviter will get setting percent of the interest function claim(uint256 pid) public nonReentrant{ UserInfo storage user = userInfo[msg.sender][pid]; Pool memory pool = pools[pid]; uint256 reward = pending(pid, msg.sender); require(reward > 0, "claim: interest is zero"); // if not enough reward, will claim all remaining reward if (token.balanceOf(address(this)) - accDeposit >= reward) { address inviter = getParent(msg.sender); // calc inviter reward uint256 userInviteReward = reward * inviteRewardRate / 100; // calc user reward uint256 userReward = reward - userInviteReward; // transfer reward token.safeTransfer(inviter, userInviteReward); token.safeTransfer(msg.sender, userReward); user.accReward = user.accReward + userReward; if ((block.timestamp - user.enterTime) >= pool.lockSeconds) { // lock-up time period ends, set to lock seconds user.billedSeconds = pool.lockSeconds; } else { // If not finished, calculate the elapsed time from the start user.billedSeconds = block.timestamp - user.enterTime; } // record info user.rewardDebt = 0; accReward = accReward + reward; inviteReward[inviter] = inviteReward[inviter] + userInviteReward; emit InviterReward(inviter, pid, userInviteReward); emit Reward(msg.sender, pid, userReward); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-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 pragma solidity ^0.8.0; pragma abicoder v2; interface IRelationship { // Invitee is the address of the person being invited struct Invitee { address invitee; uint256 timestamp; } // User is the address of the person who is inviting struct User { Invitee[] inviteeList; address inviter; bytes32 code; mapping(address => uint256) lengths; } function binding(bytes32 c) external; function isInvited(address player) external view returns (bool); function getInviteeList(address player) external view returns (Invitee[] memory); function getParent(address player) external view returns (address); function getInviteCode() external view returns (bytes32); function getPlayerByCode(bytes32 code) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.18; import "@openzeppelin/contracts/access/Ownable.sol"; import "../interfaces/IRelationship.sol"; /* @title Relationship * @author [email protected] * @dev This contract is used to manage the invitation relationship. * * @rules can't invite someone who has already invited you * @rules can't invite someone who has already been invited * @rules maximum of invitees is limited by gas */ contract Relationship is Ownable,IRelationship { // @dev default code bytes32 public constant defaultCode = keccak256("space0"); // @dev start time uint256 public beginsTime; // @dev end time uint256 public endsTime; // User is the address of the person who is invited mapping(address => User) private _relations; // code used to invite mapping(bytes32 => address) public codeUsed; event Binding(address indexed inviter, address indexed invitee, bytes32 code); constructor(uint256 ends) { beginsTime = block.timestamp; endsTime = ends; _relations[msg.sender].code = defaultCode; _relations[msg.sender].inviter = msg.sender; codeUsed[defaultCode] = msg.sender; } modifier inDuration { require(block.timestamp < endsTime, "not in time"); _; } // @param inviter address of the person who is inviting function binding(bytes32 c) external override inDuration { address sender = msg.sender; address inviter = codeUsed[c]; require(inviter != address(0), "code not found"); require(inviter != sender, "Not allow inviter by self"); // invitee address info User storage self = _relations[sender]; // inviter address info User storage parent = _relations[inviter]; require(parent.lengths[sender] == 0, "Can not accept child invitation"); require(self.inviter == address(0), "Already bond invite"); parent.inviteeList.push(Invitee(sender, block.timestamp)); parent.lengths[sender] = self.inviteeList.length; self.inviter = inviter; bytes32 code = _genCode(sender); require(codeUsed[code] == address(0), "please try again"); self.code = code; codeUsed[code] = sender; emit Binding(inviter, sender, code); } // @param player address if not invited function isInvited(address player) public view override returns (bool){ if (_relations[player].inviter != address(0)) return true; return false; } // @param get player address invitee list function getInviteeList(address player) external view override returns (Invitee[] memory){ return _relations[player].inviteeList; } // @param get player address inviter function getParent(address player) public view override returns (address){ return _relations[player].inviter; } // @param get player address invitation code function getInviteCode() external view override returns (bytes32){ return _relations[msg.sender].code; } // @param get player address by invitation code function getPlayerByCode(bytes32 code) external view override returns (address){ return codeUsed[code]; } function _genCode(address player) private view returns (bytes32 hash){ hash = keccak256(abi.encode(player, block.number)); return hash; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locked","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"inviter","type":"address"},{"indexed":true,"internalType":"address","name":"invitee","type":"address"},{"indexed":false,"internalType":"bytes32","name":"code","type":"bytes32"}],"name":"Binding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InviterReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"apr","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locked","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beginsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"c","type":"bytes32"}],"name":"binding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"codeUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultCode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInviteCode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getInviteeList","outputs":[{"components":[{"internalType":"address","name":"invitee","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct IRelationship.Invitee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getParent","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"code","type":"bytes32"}],"name":"getPlayerByCode","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inviteReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inviteRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"isInvited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"play","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"lockSeconds","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"accReward","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"enterTime","type":"uint256"},{"internalType":"uint256","name":"billedSeconds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003b5238038062003b52833981810160405281019062000037919062000399565b80600160008190555062000060620000546200021260201b60201c565b6200021a60201b60201c565b42600281905550806003819055507f74edcc84d271feb0f192f314819144fbf79cf6d87c715ebbd7c11f434ba4936a600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555033600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600560007f74edcc84d271feb0f192f314819144fbf79cf6d87c715ebbd7c11f434ba4936a815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620003e0565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031282620002e5565b9050919050565b6000620003268262000305565b9050919050565b620003388162000319565b81146200034457600080fd5b50565b60008151905062000358816200032d565b92915050565b6000819050919050565b62000373816200035e565b81146200037f57600080fd5b50565b600081519050620003938162000368565b92915050565b60008060408385031215620003b357620003b2620002e0565b5b6000620003c38582860162000347565b9250506020620003d68582860162000382565b9150509250929050565b61376280620003f06000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80637a058522116100f9578063ce4d2e0411610097578063f0884f9f11610071578063f0884f9f146104d8578063f1c8f96414610508578063f2fde38b14610524578063fc0c546a14610540576101a9565b8063ce4d2e041461046e578063e2bbb1581461048c578063e4c75c27146104a8576101a9565b8063a8b67685116100d3578063a8b67685146103be578063a9405923146103dc578063ac4afa381461040c578063c5c6c1fa1461043e576101a9565b80637a058522146103645780638da5cb5b14610382578063a0b5f771146103a0576101a9565b806339c6fe1611610166578063562975cb11610140578063562975cb146103025780636d89dbc514610320578063715018a61461033c578063771a261114610346576101a9565b806339c6fe16146102985780633a49d747146102c85780634cccf7c3146102e4576101a9565b8063050d0adf146101ae578063081e3eda146101de5780631dcbe500146101fc57806321ce919d1461022c5780632e1a7d4d14610260578063379607f51461027c575b600080fd5b6101c860048036038101906101c39190612523565b61055e565b6040516101d59190612656565b60405180910390f35b6101e661065f565b6040516101f39190612687565b60405180910390f35b61021660048036038101906102119190612523565b61066c565b60405161022391906126bd565b60405180910390f35b61024660048036038101906102419190612704565b610716565b604051610257959493929190612744565b60405180910390f35b61027a60048036038101906102759190612797565b610759565b005b61029660048036038101906102919190612797565b610a64565b005b6102b260048036038101906102ad91906127fa565b610e88565b6040516102bf9190612836565b60405180910390f35b6102e260048036038101906102dd91906127fa565b610ebb565b005b6102ec611468565b6040516102f99190612687565b60405180910390f35b61030a61146e565b6040516103179190612687565b60405180910390f35b61033a60048036038101906103359190612851565b611474565b005b6103446115f1565b005b61034e611605565b60405161035b9190612687565b60405180910390f35b61036c61160a565b60405161037991906128a0565b60405180910390f35b61038a611654565b6040516103979190612836565b60405180910390f35b6103a861167e565b6040516103b591906128a0565b60405180910390f35b6103c66116a2565b6040516103d39190612687565b60405180910390f35b6103f660048036038101906103f19190612523565b6116a8565b6040516104039190612836565b60405180910390f35b61042660048036038101906104219190612797565b611714565b604051610435939291906128bb565b60405180910390f35b610458600480360381019061045391906127fa565b61174e565b6040516104659190612836565b60405180910390f35b61047661178b565b6040516104839190612687565b60405180910390f35b6104a660048036038101906104a19190612851565b611791565b005b6104c260048036038101906104bd91906128f2565b611ac6565b6040516104cf9190612687565b60405180910390f35b6104f260048036038101906104ed9190612523565b611ce5565b6040516104ff9190612687565b60405180910390f35b610522600480360381019061051d9190612932565b611cfd565b005b61053e60048036038101906105399190612523565b611e9c565b005b610548611f1f565b60405161055591906129e4565b60405180910390f35b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020016000905b8282101561065457838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906105c2565b505050509050919050565b6000600680549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461070c5760019050610711565b600090505b919050565b600a602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154905085565b8033600060068381548110610771576107706129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060600151826020015161084f9190612a5d565b421015610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890612aee565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002090506000600687815481106108fb576108fa6129ff565b5b9060005260206000209060030201905060008260000154905060006109208933611ac6565b905060008460000154101561096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612b5a565b60405180910390fd5b600081111561097d5761097c89610a64565b5b600084600001819055506000846003018190555060008460040181905550816008546109a99190612b7a565b6008819055508183600201546109bf9190612b7a565b8360020181905550610a143383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b81893373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56860405160405180910390a4505050505050505050565b610a6c611fcb565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050600060068381548110610ad657610ad56129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000610b1b8433611ac6565b905060008111610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790612bfa565b60405180910390fd5b80600854600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bbf9190612836565b602060405180830381865afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190612c2f565b610c0a9190612b7a565b10610e7a576000610c1a336116a8565b905060006064600a84610c2d9190612c5c565b610c379190612ccd565b905060008184610c479190612b7a565b9050610c968383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b610ce33382600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b808660010154610cf39190612a5d565b86600101819055508460200151866003015442610d109190612b7a565b10610d275784602001518660040181905550610d40565b856003015442610d379190612b7a565b86600401819055505b6000866002018190555083600954610d589190612a5d565b60098190555081600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610da99190612a5d565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081878473ffffffffffffffffffffffffffffffffffffffff167f2d7a364ef566bd71c59190058eb49257a90b6f1925d425a6f7792235a6955b3460405160405180910390a480873373ffffffffffffffffffffffffffffffffffffffff167f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e60405160405180910390a45050505b505050610e8561201a565b50565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003544210610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690612d4a565b60405180910390fd5b600033905060006005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290612db6565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612e22565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90612efa565b60405180910390fd5b8060000160405180604001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200142815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505081600001805490508160030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550828260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006112fc85612024565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790612f66565b60405180910390fd5b808360020181905550846005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f37770f69bf7192fde6f690632cb9cb6c03a505ddaae0634b3d27fda0328121908360405161145891906128a0565b60405180910390a3505050505050565b60035481565b60095481565b61147c612056565b600582116114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690612fd2565b60405180910390fd5b6101f48210611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa9061303e565b60405180910390fd5b60008111611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d906130aa565b60405180910390fd5b6006604051806060016040528084815260200183815260200160008152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505060016006805490506115bf9190612b7a565b81837f4d93067d0d628fe42c457623322c0f22ad92f71762a2eebe06e2a0e7d2aa61c760405160405180910390a45050565b6115f9612056565b61160360006120d4565b565b600a81565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f74edcc84d271feb0f192f314819144fbf79cf6d87c715ebbd7c11f434ba4936a81565b60085481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6006818154811061172457600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60025481565b611799611fcb565b33600073ffffffffffffffffffffffffffffffffffffffff166117bb826116a8565b73ffffffffffffffffffffffffffffffffffffffff1603611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613116565b60405180910390fd5b6003544210611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90612d4a565b60405180910390fd5b60008211611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613182565b60405180910390fd5b6000600684815481106118ae576118ad6129ff565b5b906000526020600020906003020190506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000209050611961333086600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661219a909392919063ffffffff16565b600061196d8633611ac6565b90506000429050600083600301540361198a574283600301819055505b8360010154836003015461199e9190612a5d565b8111156119f35760008211156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e0906131ee565b60405180910390fd5b4283600301819055505b600083600001541115611a2c576000821115611a2b57818360020181905550826003015442611a229190612b7a565b83600401819055505b5b858460020154611a3c9190612a5d565b8460020181905550858360000154611a549190612a5d565b836000018190555085600854611a6a9190612a5d565b60088190555085873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1560405160405180910390a45050505050611ac261201a565b5050565b600080429050600060068581548110611ae257611ae16129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816000015103611bc45760009350505050611cdf565b600060646301e13380670de0b6b3a764000085600001518560000151611bea9190612c5c565b611bf49190612c5c565b611bfe9190612ccd565b611c089190612ccd565b905081606001518360200151611c1e9190612a5d565b8410611c8c578260200151826080015110611c40576000945050505050611cdf565b8160400151670de0b6b3a764000083608001518560200151611c629190612b7a565b83611c6d9190612c5c565b611c779190612ccd565b611c819190612a5d565b945050505050611cdf565b8160400151670de0b6b3a76400008360800151846060015187611caf9190612b7a565b611cb99190612b7a565b83611cc49190612c5c565b611cce9190612ccd565b611cd89190612a5d565b9450505050505b92915050565b600b6020528060005260406000206000915090505481565b611d05612056565b600060085414611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d419061325a565b60405180910390fd5b60058211611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490612fd2565b60405180910390fd5b6101f48210611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc89061303e565b60405180910390fd5b60008111611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b906130aa565b60405180910390fd5b8160068481548110611e2957611e286129ff565b5b9060005260206000209060030201600001819055508060068481548110611e5357611e526129ff565b5b9060005260206000209060030201600101819055508281837f17cb2943c2b75826e10c84d8d48b9953b663936eb40867b23dfe8f4930b9868660405160405180910390a4505050565b611ea4612056565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a906132ec565b60405180910390fd5b611f1c816120d4565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fc68363a9059cbb60e01b8484604051602401611f6492919061330c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612223565b505050565b600260005403612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613381565b60405180910390fd5b6002600081905550565b6001600081905550565b6000814360405160200161203992919061330c565b604051602081830303815290604052805190602001209050919050565b61205e6122eb565b73ffffffffffffffffffffffffffffffffffffffff1661207c611654565b73ffffffffffffffffffffffffffffffffffffffff16146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906133ed565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61221d846323b872dd60e01b8585856040516024016121bb9392919061340d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612223565b50505050565b6000612285826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122f39092919063ffffffff16565b90506000815114806122a75750808060200190518101906122a69190613470565b5b6122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd9061350f565b60405180910390fd5b505050565b600033905090565b6060612302848460008561230b565b90509392505050565b606082471015612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906135a1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123799190613632565b60006040518083038185875af1925050503d80600081146123b6576040519150601f19603f3d011682016040523d82523d6000602084013e6123bb565b606091505b50915091506123cc878383876123d8565b92505050949350505050565b6060831561243a576000835103612432576123f28561244d565b612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242890613695565b60405180910390fd5b5b829050612445565b6124448383612470565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124835781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b7919061370a565b60405180910390fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124f0826124c5565b9050919050565b612500816124e5565b811461250b57600080fd5b50565b60008135905061251d816124f7565b92915050565b600060208284031215612539576125386124c0565b5b60006125478482850161250e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612585816124e5565b82525050565b6000819050919050565b61259e8161258b565b82525050565b6040820160008201516125ba600085018261257c565b5060208201516125cd6020850182612595565b50505050565b60006125df83836125a4565b60408301905092915050565b6000602082019050919050565b600061260382612550565b61260d818561255b565b93506126188361256c565b8060005b8381101561264957815161263088826125d3565b975061263b836125eb565b92505060018101905061261c565b5085935050505092915050565b6000602082019050818103600083015261267081846125f8565b905092915050565b6126818161258b565b82525050565b600060208201905061269c6000830184612678565b92915050565b60008115159050919050565b6126b7816126a2565b82525050565b60006020820190506126d260008301846126ae565b92915050565b6126e18161258b565b81146126ec57600080fd5b50565b6000813590506126fe816126d8565b92915050565b6000806040838503121561271b5761271a6124c0565b5b60006127298582860161250e565b925050602061273a858286016126ef565b9150509250929050565b600060a0820190506127596000830188612678565b6127666020830187612678565b6127736040830186612678565b6127806060830185612678565b61278d6080830184612678565b9695505050505050565b6000602082840312156127ad576127ac6124c0565b5b60006127bb848285016126ef565b91505092915050565b6000819050919050565b6127d7816127c4565b81146127e257600080fd5b50565b6000813590506127f4816127ce565b92915050565b6000602082840312156128105761280f6124c0565b5b600061281e848285016127e5565b91505092915050565b612830816124e5565b82525050565b600060208201905061284b6000830184612827565b92915050565b60008060408385031215612868576128676124c0565b5b6000612876858286016126ef565b9250506020612887858286016126ef565b9150509250929050565b61289a816127c4565b82525050565b60006020820190506128b56000830184612891565b92915050565b60006060820190506128d06000830186612678565b6128dd6020830185612678565b6128ea6040830184612678565b949350505050565b60008060408385031215612909576129086124c0565b5b6000612917858286016126ef565b92505060206129288582860161250e565b9150509250929050565b60008060006060848603121561294b5761294a6124c0565b5b6000612959868287016126ef565b935050602061296a868287016126ef565b925050604061297b868287016126ef565b9150509250925092565b6000819050919050565b60006129aa6129a56129a0846124c5565b612985565b6124c5565b9050919050565b60006129bc8261298f565b9050919050565b60006129ce826129b1565b9050919050565b6129de816129c3565b82525050565b60006020820190506129f960008301846129d5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a688261258b565b9150612a738361258b565b9250828201905080821115612a8b57612a8a612a2e565b5b92915050565b600082825260208201905092915050565b7f6f6e6c79556e4c6f636b3a206c6f636b65640000000000000000000000000000600082015250565b6000612ad8601283612a91565b9150612ae382612aa2565b602082019050919050565b60006020820190508181036000830152612b0781612acb565b9050919050565b7f77697468647261773a205072696e636970616c206973207a65726f0000000000600082015250565b6000612b44601b83612a91565b9150612b4f82612b0e565b602082019050919050565b60006020820190508181036000830152612b7381612b37565b9050919050565b6000612b858261258b565b9150612b908361258b565b9250828203905081811115612ba857612ba7612a2e565b5b92915050565b7f636c61696d3a20696e746572657374206973207a65726f000000000000000000600082015250565b6000612be4601783612a91565b9150612bef82612bae565b602082019050919050565b60006020820190508181036000830152612c1381612bd7565b9050919050565b600081519050612c29816126d8565b92915050565b600060208284031215612c4557612c446124c0565b5b6000612c5384828501612c1a565b91505092915050565b6000612c678261258b565b9150612c728361258b565b9250828202612c808161258b565b91508282048414831517612c9757612c96612a2e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cd88261258b565b9150612ce38361258b565b925082612cf357612cf2612c9e565b5b828204905092915050565b7f6e6f7420696e2074696d65000000000000000000000000000000000000000000600082015250565b6000612d34600b83612a91565b9150612d3f82612cfe565b602082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f636f6465206e6f7420666f756e64000000000000000000000000000000000000600082015250565b6000612da0600e83612a91565b9150612dab82612d6a565b602082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b7f4e6f7420616c6c6f7720696e76697465722062792073656c6600000000000000600082015250565b6000612e0c601983612a91565b9150612e1782612dd6565b602082019050919050565b60006020820190508181036000830152612e3b81612dff565b9050919050565b7f43616e206e6f7420616363657074206368696c6420696e7669746174696f6e00600082015250565b6000612e78601f83612a91565b9150612e8382612e42565b602082019050919050565b60006020820190508181036000830152612ea781612e6b565b9050919050565b7f416c726561647920626f6e6420696e7669746500000000000000000000000000600082015250565b6000612ee4601383612a91565b9150612eef82612eae565b602082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f706c656173652074727920616761696e00000000000000000000000000000000600082015250565b6000612f50601083612a91565b9150612f5b82612f1a565b602082019050919050565b60006020820190508181036000830152612f7f81612f43565b9050919050565b7f736574506f6f6c3a20617072206d757374203e20350000000000000000000000600082015250565b6000612fbc601583612a91565b9150612fc782612f86565b602082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f736574506f6f6c3a20617072206d757374203c20353030000000000000000000600082015250565b6000613028601783612a91565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f736574506f6f6c3a206c6f636b6564206d757374203e20300000000000000000600082015250565b6000613094601883612a91565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b9050919050565b7f6f6e6c79496e76697465643a6f6e6c7920696e76697465640000000000000000600082015250565b6000613100601883612a91565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f6465706f7369743a20616d6f756e74206d757374203e20300000000000000000600082015250565b600061316c601883612a91565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f6465706f7369743a2072657761726420636c61696d2066697273740000000000600082015250565b60006131d8601b83612a91565b91506131e3826131a2565b602082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f6f6e6c794e6f744465706f7369743a206f6e6c79206e6f74206465706f736974600082015250565b6000613244602083612a91565b915061324f8261320e565b602082019050919050565b6000602082019050818103600083015261327381613237565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132d6602683612a91565b91506132e18261327a565b604082019050919050565b60006020820190508181036000830152613305816132c9565b9050919050565b60006040820190506133216000830185612827565b61332e6020830184612678565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061336b601f83612a91565b915061337682613335565b602082019050919050565b6000602082019050818103600083015261339a8161335e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d7602083612a91565b91506133e2826133a1565b602082019050919050565b60006020820190508181036000830152613406816133ca565b9050919050565b60006060820190506134226000830186612827565b61342f6020830185612827565b61343c6040830184612678565b949350505050565b61344d816126a2565b811461345857600080fd5b50565b60008151905061346a81613444565b92915050565b600060208284031215613486576134856124c0565b5b60006134948482850161345b565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006134f9602a83612a91565b91506135048261349d565b604082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061358b602683612a91565b91506135968261352f565b604082019050919050565b600060208201905081810360008301526135ba8161357e565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156135f55780820151818401526020810190506135da565b60008484015250505050565b600061360c826135c1565b61361681856135cc565b93506136268185602086016135d7565b80840191505092915050565b600061363e8284613601565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061367f601d83612a91565b915061368a82613649565b602082019050919050565b600060208201905081810360008301526136ae81613672565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006136dc826136b5565b6136e68185612a91565b93506136f68185602086016135d7565b6136ff816136c0565b840191505092915050565b6000602082019050818103600083015261372481846136d1565b90509291505056fea2646970667358221220845c1c874d85ffa4fbdce5e7d4ab23139c001df469967d976a80f736ecff2bbe64736f6c6343000812003300000000000000000000000069b14e8d3cebfdd8196bfe530954a0c226e5008e00000000000000000000000000000000000000000000000000000000667d4da2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80637a058522116100f9578063ce4d2e0411610097578063f0884f9f11610071578063f0884f9f146104d8578063f1c8f96414610508578063f2fde38b14610524578063fc0c546a14610540576101a9565b8063ce4d2e041461046e578063e2bbb1581461048c578063e4c75c27146104a8576101a9565b8063a8b67685116100d3578063a8b67685146103be578063a9405923146103dc578063ac4afa381461040c578063c5c6c1fa1461043e576101a9565b80637a058522146103645780638da5cb5b14610382578063a0b5f771146103a0576101a9565b806339c6fe1611610166578063562975cb11610140578063562975cb146103025780636d89dbc514610320578063715018a61461033c578063771a261114610346576101a9565b806339c6fe16146102985780633a49d747146102c85780634cccf7c3146102e4576101a9565b8063050d0adf146101ae578063081e3eda146101de5780631dcbe500146101fc57806321ce919d1461022c5780632e1a7d4d14610260578063379607f51461027c575b600080fd5b6101c860048036038101906101c39190612523565b61055e565b6040516101d59190612656565b60405180910390f35b6101e661065f565b6040516101f39190612687565b60405180910390f35b61021660048036038101906102119190612523565b61066c565b60405161022391906126bd565b60405180910390f35b61024660048036038101906102419190612704565b610716565b604051610257959493929190612744565b60405180910390f35b61027a60048036038101906102759190612797565b610759565b005b61029660048036038101906102919190612797565b610a64565b005b6102b260048036038101906102ad91906127fa565b610e88565b6040516102bf9190612836565b60405180910390f35b6102e260048036038101906102dd91906127fa565b610ebb565b005b6102ec611468565b6040516102f99190612687565b60405180910390f35b61030a61146e565b6040516103179190612687565b60405180910390f35b61033a60048036038101906103359190612851565b611474565b005b6103446115f1565b005b61034e611605565b60405161035b9190612687565b60405180910390f35b61036c61160a565b60405161037991906128a0565b60405180910390f35b61038a611654565b6040516103979190612836565b60405180910390f35b6103a861167e565b6040516103b591906128a0565b60405180910390f35b6103c66116a2565b6040516103d39190612687565b60405180910390f35b6103f660048036038101906103f19190612523565b6116a8565b6040516104039190612836565b60405180910390f35b61042660048036038101906104219190612797565b611714565b604051610435939291906128bb565b60405180910390f35b610458600480360381019061045391906127fa565b61174e565b6040516104659190612836565b60405180910390f35b61047661178b565b6040516104839190612687565b60405180910390f35b6104a660048036038101906104a19190612851565b611791565b005b6104c260048036038101906104bd91906128f2565b611ac6565b6040516104cf9190612687565b60405180910390f35b6104f260048036038101906104ed9190612523565b611ce5565b6040516104ff9190612687565b60405180910390f35b610522600480360381019061051d9190612932565b611cfd565b005b61053e60048036038101906105399190612523565b611e9c565b005b610548611f1f565b60405161055591906129e4565b60405180910390f35b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020016000905b8282101561065457838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481525050815260200190600101906105c2565b505050509050919050565b6000600680549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461070c5760019050610711565b600090505b919050565b600a602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154905085565b8033600060068381548110610771576107706129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060600151826020015161084f9190612a5d565b421015610891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088890612aee565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002090506000600687815481106108fb576108fa6129ff565b5b9060005260206000209060030201905060008260000154905060006109208933611ac6565b905060008460000154101561096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190612b5a565b60405180910390fd5b600081111561097d5761097c89610a64565b5b600084600001819055506000846003018190555060008460040181905550816008546109a99190612b7a565b6008819055508183600201546109bf9190612b7a565b8360020181905550610a143383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b81893373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56860405160405180910390a4505050505050505050565b610a6c611fcb565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050600060068381548110610ad657610ad56129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000610b1b8433611ac6565b905060008111610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790612bfa565b60405180910390fd5b80600854600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610bbf9190612836565b602060405180830381865afa158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190612c2f565b610c0a9190612b7a565b10610e7a576000610c1a336116a8565b905060006064600a84610c2d9190612c5c565b610c379190612ccd565b905060008184610c479190612b7a565b9050610c968383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b610ce33382600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611f459092919063ffffffff16565b808660010154610cf39190612a5d565b86600101819055508460200151866003015442610d109190612b7a565b10610d275784602001518660040181905550610d40565b856003015442610d379190612b7a565b86600401819055505b6000866002018190555083600954610d589190612a5d565b60098190555081600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610da99190612a5d565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081878473ffffffffffffffffffffffffffffffffffffffff167f2d7a364ef566bd71c59190058eb49257a90b6f1925d425a6f7792235a6955b3460405160405180910390a480873373ffffffffffffffffffffffffffffffffffffffff167f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e60405160405180910390a45050505b505050610e8561201a565b50565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003544210610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690612d4a565b60405180910390fd5b600033905060006005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290612db6565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090612e22565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90612efa565b60405180910390fd5b8060000160405180604001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200142815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505081600001805490508160030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550828260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006112fc85612024565b9050600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139790612f66565b60405180910390fd5b808360020181905550846005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f37770f69bf7192fde6f690632cb9cb6c03a505ddaae0634b3d27fda0328121908360405161145891906128a0565b60405180910390a3505050505050565b60035481565b60095481565b61147c612056565b600582116114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b690612fd2565b60405180910390fd5b6101f48210611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa9061303e565b60405180910390fd5b60008111611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d906130aa565b60405180910390fd5b6006604051806060016040528084815260200183815260200160008152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020155505060016006805490506115bf9190612b7a565b81837f4d93067d0d628fe42c457623322c0f22ad92f71762a2eebe06e2a0e7d2aa61c760405160405180910390a45050565b6115f9612056565b61160360006120d4565b565b600a81565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f74edcc84d271feb0f192f314819144fbf79cf6d87c715ebbd7c11f434ba4936a81565b60085481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6006818154811061172457600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60025481565b611799611fcb565b33600073ffffffffffffffffffffffffffffffffffffffff166117bb826116a8565b73ffffffffffffffffffffffffffffffffffffffff1603611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890613116565b60405180910390fd5b6003544210611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c90612d4a565b60405180910390fd5b60008211611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613182565b60405180910390fd5b6000600684815481106118ae576118ad6129ff565b5b906000526020600020906003020190506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000209050611961333086600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661219a909392919063ffffffff16565b600061196d8633611ac6565b90506000429050600083600301540361198a574283600301819055505b8360010154836003015461199e9190612a5d565b8111156119f35760008211156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e0906131ee565b60405180910390fd5b4283600301819055505b600083600001541115611a2c576000821115611a2b57818360020181905550826003015442611a229190612b7a565b83600401819055505b5b858460020154611a3c9190612a5d565b8460020181905550858360000154611a549190612a5d565b836000018190555085600854611a6a9190612a5d565b60088190555085873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1560405160405180910390a45050505050611ac261201a565b5050565b600080429050600060068581548110611ae257611ae16129ff565b5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090506000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000816000015103611bc45760009350505050611cdf565b600060646301e13380670de0b6b3a764000085600001518560000151611bea9190612c5c565b611bf49190612c5c565b611bfe9190612ccd565b611c089190612ccd565b905081606001518360200151611c1e9190612a5d565b8410611c8c578260200151826080015110611c40576000945050505050611cdf565b8160400151670de0b6b3a764000083608001518560200151611c629190612b7a565b83611c6d9190612c5c565b611c779190612ccd565b611c819190612a5d565b945050505050611cdf565b8160400151670de0b6b3a76400008360800151846060015187611caf9190612b7a565b611cb99190612b7a565b83611cc49190612c5c565b611cce9190612ccd565b611cd89190612a5d565b9450505050505b92915050565b600b6020528060005260406000206000915090505481565b611d05612056565b600060085414611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d419061325a565b60405180910390fd5b60058211611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490612fd2565b60405180910390fd5b6101f48210611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc89061303e565b60405180910390fd5b60008111611e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0b906130aa565b60405180910390fd5b8160068481548110611e2957611e286129ff565b5b9060005260206000209060030201600001819055508060068481548110611e5357611e526129ff565b5b9060005260206000209060030201600101819055508281837f17cb2943c2b75826e10c84d8d48b9953b663936eb40867b23dfe8f4930b9868660405160405180910390a4505050565b611ea4612056565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a906132ec565b60405180910390fd5b611f1c816120d4565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611fc68363a9059cbb60e01b8484604051602401611f6492919061330c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612223565b505050565b600260005403612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613381565b60405180910390fd5b6002600081905550565b6001600081905550565b6000814360405160200161203992919061330c565b604051602081830303815290604052805190602001209050919050565b61205e6122eb565b73ffffffffffffffffffffffffffffffffffffffff1661207c611654565b73ffffffffffffffffffffffffffffffffffffffff16146120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906133ed565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61221d846323b872dd60e01b8585856040516024016121bb9392919061340d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612223565b50505050565b6000612285826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122f39092919063ffffffff16565b90506000815114806122a75750808060200190518101906122a69190613470565b5b6122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd9061350f565b60405180910390fd5b505050565b600033905090565b6060612302848460008561230b565b90509392505050565b606082471015612350576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612347906135a1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123799190613632565b60006040518083038185875af1925050503d80600081146123b6576040519150601f19603f3d011682016040523d82523d6000602084013e6123bb565b606091505b50915091506123cc878383876123d8565b92505050949350505050565b6060831561243a576000835103612432576123f28561244d565b612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242890613695565b60405180910390fd5b5b829050612445565b6124448383612470565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156124835781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b7919061370a565b60405180910390fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124f0826124c5565b9050919050565b612500816124e5565b811461250b57600080fd5b50565b60008135905061251d816124f7565b92915050565b600060208284031215612539576125386124c0565b5b60006125478482850161250e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612585816124e5565b82525050565b6000819050919050565b61259e8161258b565b82525050565b6040820160008201516125ba600085018261257c565b5060208201516125cd6020850182612595565b50505050565b60006125df83836125a4565b60408301905092915050565b6000602082019050919050565b600061260382612550565b61260d818561255b565b93506126188361256c565b8060005b8381101561264957815161263088826125d3565b975061263b836125eb565b92505060018101905061261c565b5085935050505092915050565b6000602082019050818103600083015261267081846125f8565b905092915050565b6126818161258b565b82525050565b600060208201905061269c6000830184612678565b92915050565b60008115159050919050565b6126b7816126a2565b82525050565b60006020820190506126d260008301846126ae565b92915050565b6126e18161258b565b81146126ec57600080fd5b50565b6000813590506126fe816126d8565b92915050565b6000806040838503121561271b5761271a6124c0565b5b60006127298582860161250e565b925050602061273a858286016126ef565b9150509250929050565b600060a0820190506127596000830188612678565b6127666020830187612678565b6127736040830186612678565b6127806060830185612678565b61278d6080830184612678565b9695505050505050565b6000602082840312156127ad576127ac6124c0565b5b60006127bb848285016126ef565b91505092915050565b6000819050919050565b6127d7816127c4565b81146127e257600080fd5b50565b6000813590506127f4816127ce565b92915050565b6000602082840312156128105761280f6124c0565b5b600061281e848285016127e5565b91505092915050565b612830816124e5565b82525050565b600060208201905061284b6000830184612827565b92915050565b60008060408385031215612868576128676124c0565b5b6000612876858286016126ef565b9250506020612887858286016126ef565b9150509250929050565b61289a816127c4565b82525050565b60006020820190506128b56000830184612891565b92915050565b60006060820190506128d06000830186612678565b6128dd6020830185612678565b6128ea6040830184612678565b949350505050565b60008060408385031215612909576129086124c0565b5b6000612917858286016126ef565b92505060206129288582860161250e565b9150509250929050565b60008060006060848603121561294b5761294a6124c0565b5b6000612959868287016126ef565b935050602061296a868287016126ef565b925050604061297b868287016126ef565b9150509250925092565b6000819050919050565b60006129aa6129a56129a0846124c5565b612985565b6124c5565b9050919050565b60006129bc8261298f565b9050919050565b60006129ce826129b1565b9050919050565b6129de816129c3565b82525050565b60006020820190506129f960008301846129d5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a688261258b565b9150612a738361258b565b9250828201905080821115612a8b57612a8a612a2e565b5b92915050565b600082825260208201905092915050565b7f6f6e6c79556e4c6f636b3a206c6f636b65640000000000000000000000000000600082015250565b6000612ad8601283612a91565b9150612ae382612aa2565b602082019050919050565b60006020820190508181036000830152612b0781612acb565b9050919050565b7f77697468647261773a205072696e636970616c206973207a65726f0000000000600082015250565b6000612b44601b83612a91565b9150612b4f82612b0e565b602082019050919050565b60006020820190508181036000830152612b7381612b37565b9050919050565b6000612b858261258b565b9150612b908361258b565b9250828203905081811115612ba857612ba7612a2e565b5b92915050565b7f636c61696d3a20696e746572657374206973207a65726f000000000000000000600082015250565b6000612be4601783612a91565b9150612bef82612bae565b602082019050919050565b60006020820190508181036000830152612c1381612bd7565b9050919050565b600081519050612c29816126d8565b92915050565b600060208284031215612c4557612c446124c0565b5b6000612c5384828501612c1a565b91505092915050565b6000612c678261258b565b9150612c728361258b565b9250828202612c808161258b565b91508282048414831517612c9757612c96612a2e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cd88261258b565b9150612ce38361258b565b925082612cf357612cf2612c9e565b5b828204905092915050565b7f6e6f7420696e2074696d65000000000000000000000000000000000000000000600082015250565b6000612d34600b83612a91565b9150612d3f82612cfe565b602082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f636f6465206e6f7420666f756e64000000000000000000000000000000000000600082015250565b6000612da0600e83612a91565b9150612dab82612d6a565b602082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b7f4e6f7420616c6c6f7720696e76697465722062792073656c6600000000000000600082015250565b6000612e0c601983612a91565b9150612e1782612dd6565b602082019050919050565b60006020820190508181036000830152612e3b81612dff565b9050919050565b7f43616e206e6f7420616363657074206368696c6420696e7669746174696f6e00600082015250565b6000612e78601f83612a91565b9150612e8382612e42565b602082019050919050565b60006020820190508181036000830152612ea781612e6b565b9050919050565b7f416c726561647920626f6e6420696e7669746500000000000000000000000000600082015250565b6000612ee4601383612a91565b9150612eef82612eae565b602082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f706c656173652074727920616761696e00000000000000000000000000000000600082015250565b6000612f50601083612a91565b9150612f5b82612f1a565b602082019050919050565b60006020820190508181036000830152612f7f81612f43565b9050919050565b7f736574506f6f6c3a20617072206d757374203e20350000000000000000000000600082015250565b6000612fbc601583612a91565b9150612fc782612f86565b602082019050919050565b60006020820190508181036000830152612feb81612faf565b9050919050565b7f736574506f6f6c3a20617072206d757374203c20353030000000000000000000600082015250565b6000613028601783612a91565b915061303382612ff2565b602082019050919050565b600060208201905081810360008301526130578161301b565b9050919050565b7f736574506f6f6c3a206c6f636b6564206d757374203e20300000000000000000600082015250565b6000613094601883612a91565b915061309f8261305e565b602082019050919050565b600060208201905081810360008301526130c381613087565b9050919050565b7f6f6e6c79496e76697465643a6f6e6c7920696e76697465640000000000000000600082015250565b6000613100601883612a91565b915061310b826130ca565b602082019050919050565b6000602082019050818103600083015261312f816130f3565b9050919050565b7f6465706f7369743a20616d6f756e74206d757374203e20300000000000000000600082015250565b600061316c601883612a91565b915061317782613136565b602082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f6465706f7369743a2072657761726420636c61696d2066697273740000000000600082015250565b60006131d8601b83612a91565b91506131e3826131a2565b602082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f6f6e6c794e6f744465706f7369743a206f6e6c79206e6f74206465706f736974600082015250565b6000613244602083612a91565b915061324f8261320e565b602082019050919050565b6000602082019050818103600083015261327381613237565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132d6602683612a91565b91506132e18261327a565b604082019050919050565b60006020820190508181036000830152613305816132c9565b9050919050565b60006040820190506133216000830185612827565b61332e6020830184612678565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061336b601f83612a91565b915061337682613335565b602082019050919050565b6000602082019050818103600083015261339a8161335e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d7602083612a91565b91506133e2826133a1565b602082019050919050565b60006020820190508181036000830152613406816133ca565b9050919050565b60006060820190506134226000830186612827565b61342f6020830185612827565b61343c6040830184612678565b949350505050565b61344d816126a2565b811461345857600080fd5b50565b60008151905061346a81613444565b92915050565b600060208284031215613486576134856124c0565b5b60006134948482850161345b565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006134f9602a83612a91565b91506135048261349d565b604082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061358b602683612a91565b91506135968261352f565b604082019050919050565b600060208201905081810360008301526135ba8161357e565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156135f55780820151818401526020810190506135da565b60008484015250505050565b600061360c826135c1565b61361681856135cc565b93506136268185602086016135d7565b80840191505092915050565b600061363e8284613601565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061367f601d83612a91565b915061368a82613649565b602082019050919050565b600060208201905081810360008301526136ae81613672565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b60006136dc826136b5565b6136e68185612a91565b93506136f68185602086016135d7565b6136ff816136c0565b840191505092915050565b6000602082019050818103600083015261372481846136d1565b90509291505056fea2646970667358221220845c1c874d85ffa4fbdce5e7d4ab23139c001df469967d976a80f736ecff2bbe64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000069b14e8d3cebfdd8196bfe530954a0c226e5008e00000000000000000000000000000000000000000000000000000000667d4da2
-----Decoded View---------------
Arg [0] : _token (address): 0x69b14e8D3CEBfDD8196Bfe530954A0C226E5008E
Arg [1] : end (uint256): 1719487906
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000069b14e8d3cebfdd8196bfe530954a0c226e5008e
Arg [1] : 00000000000000000000000000000000000000000000000000000000667d4da2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | <$0.000001 | 24,176,977,632,971.852 | $41,712.03 |
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.