Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingContractV1
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./StakingRecord.sol"; import "./StakingRateInfo.sol"; import "./StakingPeriod.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; contract StakingContractV1 is OwnableUpgradeable, ReentrancyGuardUpgradeable { uint public constant DAY = 3600 * 24; // uint public constant DAY = 1; // For test address public upcAddress; mapping (uint => StakingRateInfo) public stakingInfos; mapping (address => bool) public staked; StakingRecord[] public records; uint public stakingAmountLimit; uint public totalStakingAmount; mapping (string=>address) public referralCodes; uint public referralFee; //20% event SetUPCAddress(address upcAddress); event Stake(uint id, address staker, uint amount, uint stakedAt, uint stakingInfoID, string referralCode, uint reward, uint referralReward); event Claim(uint id, address staker, uint claimAmount); event ClaimReferralFee(uint id, address referrer, uint claimAmount); event Deposit(uint amount); event GenerateReferralCode(address staker, string code); event SetStakingPeriod(uint id, StakingPeriod[] periods); function initialvalue(address owner) initializer external { stakingInfos[1].day = 180; stakingInfos[1].apy = 100; stakingInfos[2].day = 90; stakingInfos[2].apy = 50; stakingInfos[3].day = 30; stakingInfos[3].apy = 20; // upcAddress = 0xCADC40cE57164b3193cCAAf0E5C498F8180DEF5f; //testnet upcAddress = 0x487d62468282Bd04ddf976631C23128A425555EE; //mainnet stakingAmountLimit = 10 ** 6 * 10 ** 5; referralFee = 20; __Ownable_init(owner); __ReentrancyGuard_init(); } function stake(uint amount, uint stakingInfoID, string memory referralCode) public nonReentrant { require(amount >= 0, "It's not able to stake 0 UPC."); require(isStakablePeriod(stakingInfoID), "Out of staking period."); require(totalStakingAmount + amount <= stakingAmountLimit, "Staking amount limit exceeds."); if (bytes(referralCode).length != 0) { require(referralCodes[referralCode] != msg.sender, "Not able to use own referral code."); } require(IERC20(upcAddress).allowance(msg.sender, address(this)) >= amount, "UPC token is not allowed."); require(IERC20(upcAddress).balanceOf(msg.sender) >= amount, "UPC token balance is not enough."); require(IERC20(upcAddress).transferFrom(msg.sender, address(this), amount), "UPC token transfer failed."); records.push(StakingRecord(msg.sender, amount, block.timestamp, false, stakingInfoID, referralCode, false)); totalStakingAmount += amount; staked[msg.sender] = true; emit Stake(records.length - 1, msg.sender, amount, block.timestamp, stakingInfoID, referralCode, finalClaimableAmount(records.length - 1), referralAmount(records.length - 1)); } function isStakablePeriod(uint id) public view returns(bool) { for (uint i = 0; i < stakingInfos[id].periods.length; i++) { if (block.timestamp >= stakingInfos[id].periods[i].from && block.timestamp <= stakingInfos[id].periods[i].to) { return true; } } return false; } function isClaimable(uint id) public view returns(bool) { if (records[id].claimed) { return false; } if (block.timestamp - records[id].stakedAt < DAY * stakingInfos[records[id].stakingRateInfoID].day) { return false; } return true; } function referralAmount(uint id) public view returns(uint) { if (records[id].claimedReferralFee) { return 0; } if (bytes(records[id].referralCode).length == 0) { return 0; } if (referralCodes[records[id].referralCode] == address(0)) { return 0; } return (records[id].amount * stakingInfos[records[id].stakingRateInfoID].apy * (DAY * stakingInfos[records[id].stakingRateInfoID].day) / 100 / 365 / DAY) * referralFee / 100; } function finalClaimableAmount(uint id) public view returns(uint) { if (records[id].claimed) { return 0; } return records[id].amount * stakingInfos[records[id].stakingRateInfoID].apy * (DAY * stakingInfos[records[id].stakingRateInfoID].day) / 100 / 365 / DAY; } function claim(uint id) public { require(msg.sender == records[id].staker, "Only owner can claim."); require(isClaimable(id), "This staking record is not able to claim."); uint amount = finalClaimableAmount(id); require(IERC20(upcAddress).transfer(msg.sender, records[id].amount + amount), "Claim failed."); records[id].claimed = true; emit Claim(id, msg.sender, amount); } function claimReferralFee(uint id) public { require(msg.sender == referralCodes[records[id].referralCode], "Only referer can claim the referral fee."); require(block.timestamp - records[id].stakedAt >= DAY * stakingInfos[records[id].stakingRateInfoID].day, "It is not able to claim, yet"); require(!records[id].claimedReferralFee, "Alreay claimed."); uint amount = referralAmount(id); require(IERC20(upcAddress).transfer(msg.sender, amount), "Claim failed."); records[id].claimedReferralFee = true; emit ClaimReferralFee(id, msg.sender, amount); } function generateReferralCode() public { require(staked[msg.sender] == true, "You should have at least one staking record."); string memory code = randomString(6); referralCodes[code] = msg.sender; emit GenerateReferralCode(msg.sender, code); } function deposit(uint amount) public onlyOwner { require(IERC20(upcAddress).allowance(msg.sender, address(this)) >= amount, "UPC token is not allowed."); require(IERC20(upcAddress).transferFrom(msg.sender, address(this), amount), "Deposit failed."); emit Deposit(amount); } function shouldDeposit() public view returns(uint){ uint neccessaryAmount = neccessaryUPC(); if (neccessaryAmount < IERC20(upcAddress).balanceOf(address(this))) { return 0; } return neccessaryAmount - IERC20(upcAddress).balanceOf(address(this)); } function Withdrawable() public view returns(uint) { uint neccessaryAmount = neccessaryUPC(); if (neccessaryAmount >= IERC20(upcAddress).balanceOf(address(this))) { return 0; } return IERC20(upcAddress).balanceOf(address(this)) - neccessaryAmount; } function neccessaryUPC() private view returns(uint) { uint ret = 0; for (uint i = 0; i < records.length; i++) { ret += finalClaimableAmount(i) + referralAmount(i); if (!records[i].claimed) { ret += records[i].amount; } } return ret; } function withdraw(uint amount) public onlyOwner { // bool isPeriodOver = true; // for (uint id = 1; id <= 3; id++) { // for (uint i = 0; i < stakingInfos[id].periods.length; i++) { // if (block.timestamp < stakingInfos[id].periods[i].to) { // isPeriodOver = false; // break; // } // } // } // require(isPeriodOver, "It's able to stake now."); require(IERC20(upcAddress).transfer(msg.sender, amount), "Withdraw failed."); } function setUPCAddress(address addr) public onlyOwner { upcAddress = addr; stakingAmountLimit = 10 ** 6 * 10 ** 5; emit SetUPCAddress(addr); } function setStakingPeriod(uint id, StakingPeriod[] memory periods) public onlyOwner { for (uint i = 0; i < stakingInfos[id].periods.length; i++) { stakingInfos[id].periods.pop(); } for (uint i = 0; i < periods.length; i++) { stakingInfos[id].periods.push(periods[i]); } emit SetStakingPeriod(id, periods); } function setStakingLimit(uint limit) public onlyOwner { stakingAmountLimit = limit; } function setReferralFee(uint fee) public onlyOwner { require(fee <= 100, "Referral Fee should be less than 100%."); referralFee = fee; } function randomString(uint size) private view returns(string memory){ bytes memory randomWord = new bytes(size); // since we have 26 letters bytes memory chars = new bytes(26); chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (uint i = 0; i < size; i++) { uint randomNumber=random(26, i); // Index access for string is not possible randomWord[i] = chars[randomNumber]; } return string(randomWord); } function random(uint number, uint randomIndex) public view returns(uint){ return uint(keccak256(abi.encodePacked(block.timestamp,block.prevrandao, msg.sender,randomIndex))) % number; } function pushRecord(address staker, uint amount, uint stakedAt, uint stakingInfoID, string memory referralCode, bool claimed, bool claimedReferralFee) public onlyOwner { records.push(StakingRecord(staker, amount, stakedAt, claimed, stakingInfoID, referralCode, claimedReferralFee)); totalStakingAmount += amount; staked[staker] = true; } function pushReferralCodes(address staker, string memory code) public onlyOwner { referralCodes[code] = staker; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.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. * * The initial owner is set to the address provided by the deployer. 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 OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard struct ReentrancyGuardStorage { uint256 _status; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) { assembly { $.slot := ReentrancyGuardStorageLocation } } /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); $._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 { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // On the first call to nonReentrant, _status will be NOT_ENTERED if ($._status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail $._status = ENTERED; } function _nonReentrantAfter() private { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // 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) { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); return $._status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; struct StakingPeriod { uint from; uint to; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; import "./StakingPeriod.sol"; struct StakingRateInfo { uint day; uint apy; StakingPeriod[] periods; }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; struct StakingRecord { address staker; uint amount; uint stakedAt; bool claimed; uint stakingRateInfoID; string referralCode; bool claimedReferralFee; }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"ClaimReferralFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"string","name":"code","type":"string"}],"name":"GenerateReferralCode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","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":false,"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"indexed":false,"internalType":"struct StakingPeriod[]","name":"periods","type":"tuple[]"}],"name":"SetStakingPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"upcAddress","type":"address"}],"name":"SetUPCAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingInfoID","type":"uint256"},{"indexed":false,"internalType":"string","name":"referralCode","type":"string"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralReward","type":"uint256"}],"name":"Stake","type":"event"},{"inputs":[],"name":"DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Withdrawable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimReferralFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"finalClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateReferralCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"initialvalue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isStakablePeriod","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":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"uint256","name":"stakingInfoID","type":"uint256"},{"internalType":"string","name":"referralCode","type":"string"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"claimedReferralFee","type":"bool"}],"name":"pushRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"string","name":"code","type":"string"}],"name":"pushReferralCodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"randomIndex","type":"uint256"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"records","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"uint256","name":"stakingRateInfoID","type":"uint256"},{"internalType":"string","name":"referralCode","type":"string"},{"internalType":"bool","name":"claimedReferralFee","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"referralAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"referralCodes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setReferralFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setStakingLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"internalType":"struct StakingPeriod[]","name":"periods","type":"tuple[]"}],"name":"setStakingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setUPCAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"stakingInfoID","type":"uint256"},{"internalType":"string","name":"referralCode","type":"string"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"staked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingAmountLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingInfos","outputs":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"apy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061481f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806384ae2bc61161010f578063b2783535116100a2578063d201114a11610071578063d201114a14610595578063ea88aeba146105b3578063f2fde38b146105cf578063f996f5c4146105eb576101f0565b8063b27835351461050f578063b6b55f251461052b578063bca85e6414610547578063c852013114610577576101f0565b8063a9dd1225116100de578063a9dd122514610489578063af12d69c146104b9578063afa4da17146104d5578063b0a2fc1b14610505576101f0565b806384ae2bc6146103ed57806389610a091461040b5780638da5cb5b1461043b57806398807d8414610459576101f0565b8063379607f511610187578063713494d711610156578063713494d714610379578063715018a614610395578063743957fa1461039f578063766fa87c146103bd576101f0565b8063379607f5146103095780633e8b588d146103255780635be4b527146103415780636cb455b71461035d576101f0565b80632655e840116101c35780632655e8401461026957806327cfe856146102995780632e1a7d4d146102b757806334461067146102d3576101f0565b806301d1a559146101f55780631c504fda146102135780631c914803146102315780631e34a9721461024d575b600080fd5b6101fd61061c565b60405161020a9190612e5f565b60405180910390f35b61021b610622565b6040516102289190612ebb565b60405180910390f35b61024b60048036038101906102469190612f16565b610646565b005b61026760048036038101906102629190612f16565b6108f3565b005b610283600480360381019061027e9190613089565b610981565b6040516102909190612ebb565b60405180910390f35b6102a16109ca565b6040516102ae9190612e5f565b60405180910390f35b6102d160048036038101906102cc91906130fe565b6109d1565b005b6102ed60048036038101906102e891906130fe565b610ab9565b60405161030097969594939291906131c5565b60405180910390f35b610323600480360381019061031e91906130fe565b610bcd565b005b61033f600480360381019061033a919061323b565b610e5f565b005b61035b600480360381019061035691906132aa565b6114d1565b005b610377600480360381019061037291906130fe565b61153a565b005b610393600480360381019061038e91906130fe565b61154c565b005b61039d6115a2565b005b6103a76115b6565b6040516103b49190612e5f565b60405180910390f35b6103d760048036038101906103d291906130fe565b61171a565b6040516103e49190612e5f565b60405180910390f35b6103f5611946565b6040516104029190612e5f565b60405180910390f35b610425600480360381019061042091906130fe565b61194c565b6040516104329190613306565b60405180910390f35b610443611a23565b6040516104509190612ebb565b60405180910390f35b610473600480360381019061046e9190612f16565b611a5b565b6040516104809190613306565b60405180910390f35b6104a3600480360381019061049e9190613321565b611a7b565b6040516104b09190612e5f565b60405180910390f35b6104d360048036038101906104ce91906130fe565b611ac0565b005b6104ef60048036038101906104ea91906130fe565b611e26565b6040516104fc9190612e5f565b60405180910390f35b61050d611f58565b005b6105296004803603810190610524919061338d565b612092565b005b610545600480360381019061054091906130fe565b612249565b005b610561600480360381019061055c91906130fe565b612448565b60405161056e9190613306565b60405180910390f35b61057f612520565b60405161058c9190612e5f565b60405180910390f35b61059d612683565b6040516105aa9190612e5f565b60405180910390f35b6105cd60048036038101906105c89190613568565b612689565b005b6105e960048036038101906105e49190612f16565b6127e5565b005b610605600480360381019061060091906130fe565b61286b565b6040516106139291906135c4565b60405180910390f35b60045481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061065061288f565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff1614801561069e5750825b9050600060018367ffffffffffffffff161480156106d3575060003073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156106e1575080155b15610718576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156107685760018560000160086101000a81548160ff0219169083151502179055505b60b46001600060018152602001908152602001600020600001819055506064600160006001815260200190815260200160002060010181905550605a6001600060028152602001908152602001600020600001819055506032600160006002815260200190815260200160002060010181905550601e600160006003815260200190815260200160002060000181905550601460016000600381526020019081526020016000206001018190555073487d62468282bd04ddf976631c23128a425555ee6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064174876e8006004819055506014600781905550610887866128b7565b61088f6128cb565b83156108eb5760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516108e29190613646565b60405180910390a15b505050505050565b6108fb6128dd565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064174876e8006004819055507fd355795ae95528075010c124994c8125c29fd3b271ff2874fc56fa22ece99771816040516109769190612ebb565b60405180910390a150565b6006818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6201518081565b6109d96128dd565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a34929190613661565b6020604051808303816000875af1158015610a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a77919061369f565b610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90613718565b60405180910390fd5b50565b60038181548110610ac957600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff1690806004015490806005018054610b3790613767565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613767565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b60038181548110610be157610be0613798565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613813565b60405180910390fd5b610c898161194c565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf906138a5565b60405180910390fd5b6000610cd382611e26565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338360038681548110610d2757610d26613798565b5b906000526020600020906007020160010154610d4391906138f4565b6040518363ffffffff1660e01b8152600401610d60929190613661565b6020604051808303816000875af1158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da3919061369f565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613974565b60405180910390fd5b600160038381548110610df857610df7613798565b5b906000526020600020906007020160030160006101000a81548160ff0219169083151502179055507f3ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f303823383604051610e5393929190613994565b60405180910390a15050565b610e67612964565b6000831015610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613a17565b60405180910390fd5b610eb482612448565b610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613a83565b60405180910390fd5b60045483600554610f0491906138f4565b1115610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90613aef565b60405180910390fd5b6000815114610ffb573373ffffffffffffffffffffffffffffffffffffffff16600682604051610f759190613b4b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613bd4565b60405180910390fd5b5b8260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611057929190613bf4565b602060405180830381865afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110989190613c32565b10156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cab565b60405180910390fd5b8260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016111339190612ebb565b602060405180830381865afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c32565b10156111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613d17565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161121293929190613d37565b6020604051808303816000875af1158015611231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611255919061369f565b611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90613dba565b60405180910390fd5b60036040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200142815260200160001515815260200184815260200183815260200160001515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050190816113a89190613f7c565b5060c08201518160060160006101000a81548160ff021916908315150217905550505082600560008282546113dd91906138f4565b925050819055506001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe8c82e2e2f1405ba419995e957426f4ad806c4cb8ff7c620f573ac34b88cd597600160038054905061146f919061404e565b338542868661148e6001600380549050611489919061404e565b611e26565b6114a860016003805490506114a3919061404e565b61171a565b6040516114bc989796959493929190614082565b60405180910390a16114cc6129bb565b505050565b6114d96128dd565b816006826040516114ea9190613b4b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6115426128dd565b8060048190555050565b6115546128dd565b6064811115611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614179565b60405180910390fd5b8060078190555050565b6115aa6128dd565b6115b460006129d4565b565b6000806115c1612aab565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161161c9190612ebb565b602060405180830381865afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190613c32565b81101561166e576000915050611717565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116c79190612ebb565b602060405180830381865afa1580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117089190613c32565b81611713919061404e565b9150505b90565b6000600382815481106117305761172f613798565b5b906000526020600020906007020160060160009054906101000a900460ff161561175d5760009050611941565b60006003838154811061177357611772613798565b5b9060005260206000209060070201600501805461178f90613767565b90500361179f5760009050611941565b600073ffffffffffffffffffffffffffffffffffffffff166006600384815481106117cd576117cc613798565b5b90600052602060002090600702016005016040516117eb919061421c565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361183e5760009050611941565b60646007546201518061016d6064600160006003898154811061186457611863613798565b5b906000526020600020906007020160040154815260200190815260200160002060000154620151806118969190614233565b6001600060038a815481106118ae576118ad613798565b5b906000526020600020906007020160040154815260200190815260200160002060010154600389815481106118e6576118e5613798565b5b9060005260206000209060070201600101546119029190614233565b61190c9190614233565b61191691906142a4565b61192091906142a4565b61192a91906142a4565b6119349190614233565b61193e91906142a4565b90505b919050565b60075481565b60006003828154811061196257611961613798565b5b906000526020600020906007020160030160009054906101000a900460ff161561198f5760009050611a1e565b60016000600384815481106119a7576119a6613798565b5b906000526020600020906007020160040154815260200190815260200160002060000154620151806119d99190614233565b600383815481106119ed576119ec613798565b5b90600052602060002090600702016002015442611a0a919061404e565b1015611a195760009050611a1e565b600190505b919050565b600080611a2e612b71565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60026020528060005260406000206000915054906101000a900460ff1681565b60008242443385604051602001611a95949392919061433e565b6040516020818303038152906040528051906020012060001c611ab8919061438c565b905092915050565b600660038281548110611ad657611ad5613798565b5b9060005260206000209060070201600501604051611af4919061421c565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b879061442f565b60405180910390fd5b6001600060038381548110611ba857611ba7613798565b5b90600052602060002090600702016004015481526020019081526020016000206000015462015180611bda9190614233565b60038281548110611bee57611bed613798565b5b90600052602060002090600702016002015442611c0b919061404e565b1015611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c439061449b565b60405180910390fd5b60038181548110611c6057611c5f613798565b5b906000526020600020906007020160060160009054906101000a900460ff1615611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614507565b60405180910390fd5b6000611cca8261171a565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d27929190613661565b6020604051808303816000875af1158015611d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6a919061369f565b611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090613974565b60405180910390fd5b600160038381548110611dbf57611dbe613798565b5b906000526020600020906007020160060160006101000a81548160ff0219169083151502179055507f2f7aa84e5a1e1542b882ba36146711c358ee46ad291acda608e2b6cf05ca33df823383604051611e1a93929190613994565b60405180910390a15050565b600060038281548110611e3c57611e3b613798565b5b906000526020600020906007020160030160009054906101000a900460ff1615611e695760009050611f53565b6201518061016d60646001600060038781548110611e8a57611e89613798565b5b90600052602060002090600702016004015481526020019081526020016000206000015462015180611ebc9190614233565b6001600060038881548110611ed457611ed3613798565b5b90600052602060002090600702016004015481526020019081526020016000206001015460038781548110611f0c57611f0b613798565b5b906000526020600020906007020160010154611f289190614233565b611f329190614233565b611f3c91906142a4565b611f4691906142a4565b611f5091906142a4565b90505b919050565b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614599565b60405180910390fd5b6000611ff76006612b99565b90503360068260405161200a9190613b4b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4403782ab3ea77c589db0c2e2e3451ff9352945fb049c9591fe7708047e3d29533826040516120879291906145b9565b60405180910390a150565b61209a6128dd565b60036040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018415158152602001868152602001858152602001831515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050190816121ac9190613f7c565b5060c08201518160060160006101000a81548160ff021916908315150217905550505085600560008282546121e191906138f4565b925050819055506001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050505050565b6122516128dd565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016122ad929190613bf4565b602060405180830381865afa1580156122ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ee9190613c32565b101561232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690613cab565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161238c93929190613d37565b6020604051808303816000875af11580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf919061369f565b61240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614635565b60405180910390fd5b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384268160405161243d9190612e5f565b60405180910390a150565b600080600090505b60016000848152602001908152602001600020600201805490508110156125155760016000848152602001908152602001600020600201818154811061249957612498613798565b5b90600052602060002090600202016000015442101580156124f357506001600084815260200190815260200160002060020181815481106124dd576124dc613798565b5b9060005260206000209060020201600101544211155b1561250257600191505061251b565b808061250d90614655565b915050612450565b50600090505b919050565b60008061252b612aab565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125869190612ebb565b602060405180830381865afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190613c32565b81106125d7576000915050612680565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126319190612ebb565b602060405180830381865afa15801561264e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126729190613c32565b61267c919061404e565b9150505b90565b60055481565b6126916128dd565b60005b600160008481526020019081526020016000206002018054905081101561271757600160008481526020019081526020016000206002018054806126db576126da61469d565b5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055808061270f90614655565b915050612694565b5060005b81518110156127a7576001600084815260200190815260200160002060020182828151811061274d5761274c613798565b5b6020026020010151908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050808061279f90614655565b91505061271b565b507fe250ae701c4dd28188ffca44dffb51154fe04268273c6db802cc1883226d6e8782826040516127d99291906147b9565b60405180910390a15050565b6127ed6128dd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361285f5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016128569190612ebb565b60405180910390fd5b612868816129d4565b50565b60016020528060005260406000206000915090508060000154908060010154905082565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6128bf612d0f565b6128c881612d4f565b50565b6128d3612d0f565b6128db612dd5565b565b6128e5612df6565b73ffffffffffffffffffffffffffffffffffffffff16612903611a23565b73ffffffffffffffffffffffffffffffffffffffff161461296257612926612df6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016129599190612ebb565b60405180910390fd5b565b600061296e612dfe565b905060028160000154036129ae576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816000018190555050565b60006129c5612dfe565b90506001816000018190555050565b60006129de612b71565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000806000905060005b600380549050811015612b6957612acb8161171a565b612ad482611e26565b612ade91906138f4565b82612ae991906138f4565b915060038181548110612aff57612afe613798565b5b906000526020600020906007020160030160009054906101000a900460ff16612b565760038181548110612b3657612b35613798565b5b90600052602060002090600702016001015482612b5391906138f4565b91505b8080612b6190614655565b915050612ab5565b508091505090565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b606060008267ffffffffffffffff811115612bb757612bb6612f5e565b5b6040519080825280601f01601f191660200182016040528015612be95781602001600182028036833780820191505090505b5090506000601a67ffffffffffffffff811115612c0957612c08612f5e565b5b6040519080825280601f01601f191660200182016040528015612c3b5781602001600182028036833780820191505090505b5090506040518060400160405280601a81526020017f4142434445464748494a4b4c4d4e4f505152535455565758595a000000000000815250905060005b84811015612d04576000612c8e601a83611a7b565b9050828181518110612ca357612ca2613798565b5b602001015160f81c60f81b848381518110612cc157612cc0613798565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080612cfc90614655565b915050612c79565b508192505050919050565b612d17612e26565b612d4d576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612d57612d0f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dc95760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612dc09190612ebb565b60405180910390fd5b612dd2816129d4565b50565b612ddd612d0f565b6000612de7612dfe565b90506001816000018190555050565b600033905090565b60007f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00905090565b6000612e3061288f565b60000160089054906101000a900460ff16905090565b6000819050919050565b612e5981612e46565b82525050565b6000602082019050612e746000830184612e50565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea582612e7a565b9050919050565b612eb581612e9a565b82525050565b6000602082019050612ed06000830184612eac565b92915050565b6000604051905090565b600080fd5b600080fd5b612ef381612e9a565b8114612efe57600080fd5b50565b600081359050612f1081612eea565b92915050565b600060208284031215612f2c57612f2b612ee0565b5b6000612f3a84828501612f01565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9682612f4d565b810181811067ffffffffffffffff82111715612fb557612fb4612f5e565b5b80604052505050565b6000612fc8612ed6565b9050612fd48282612f8d565b919050565b600067ffffffffffffffff821115612ff457612ff3612f5e565b5b612ffd82612f4d565b9050602081019050919050565b82818337600083830152505050565b600061302c61302784612fd9565b612fbe565b90508281526020810184848401111561304857613047612f48565b5b61305384828561300a565b509392505050565b600082601f8301126130705761306f612f43565b5b8135613080848260208601613019565b91505092915050565b60006020828403121561309f5761309e612ee0565b5b600082013567ffffffffffffffff8111156130bd576130bc612ee5565b5b6130c98482850161305b565b91505092915050565b6130db81612e46565b81146130e657600080fd5b50565b6000813590506130f8816130d2565b92915050565b60006020828403121561311457613113612ee0565b5b6000613122848285016130e9565b91505092915050565b60008115159050919050565b6131408161312b565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613180578082015181840152602081019050613165565b60008484015250505050565b600061319782613146565b6131a18185613151565b93506131b1818560208601613162565b6131ba81612f4d565b840191505092915050565b600060e0820190506131da600083018a612eac565b6131e76020830189612e50565b6131f46040830188612e50565b6132016060830187613137565b61320e6080830186612e50565b81810360a0830152613220818561318c565b905061322f60c0830184613137565b98975050505050505050565b60008060006060848603121561325457613253612ee0565b5b6000613262868287016130e9565b9350506020613273868287016130e9565b925050604084013567ffffffffffffffff81111561329457613293612ee5565b5b6132a08682870161305b565b9150509250925092565b600080604083850312156132c1576132c0612ee0565b5b60006132cf85828601612f01565b925050602083013567ffffffffffffffff8111156132f0576132ef612ee5565b5b6132fc8582860161305b565b9150509250929050565b600060208201905061331b6000830184613137565b92915050565b6000806040838503121561333857613337612ee0565b5b6000613346858286016130e9565b9250506020613357858286016130e9565b9150509250929050565b61336a8161312b565b811461337557600080fd5b50565b60008135905061338781613361565b92915050565b600080600080600080600060e0888a0312156133ac576133ab612ee0565b5b60006133ba8a828b01612f01565b97505060206133cb8a828b016130e9565b96505060406133dc8a828b016130e9565b95505060606133ed8a828b016130e9565b945050608088013567ffffffffffffffff81111561340e5761340d612ee5565b5b61341a8a828b0161305b565b93505060a061342b8a828b01613378565b92505060c061343c8a828b01613378565b91505092959891949750929550565b600067ffffffffffffffff82111561346657613465612f5e565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000604082840312156134975761349661347c565b5b6134a16040612fbe565b905060006134b1848285016130e9565b60008301525060206134c5848285016130e9565b60208301525092915050565b60006134e46134df8461344b565b612fbe565b9050808382526020820190506040840283018581111561350757613506613477565b5b835b81811015613530578061351c8882613481565b845260208401935050604081019050613509565b5050509392505050565b600082601f83011261354f5761354e612f43565b5b813561355f8482602086016134d1565b91505092915050565b6000806040838503121561357f5761357e612ee0565b5b600061358d858286016130e9565b925050602083013567ffffffffffffffff8111156135ae576135ad612ee5565b5b6135ba8582860161353a565b9150509250929050565b60006040820190506135d96000830185612e50565b6135e66020830184612e50565b9392505050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b600061363061362b613626846135ed565b61360b565b6135f7565b9050919050565b61364081613615565b82525050565b600060208201905061365b6000830184613637565b92915050565b60006040820190506136766000830185612eac565b6136836020830184612e50565b9392505050565b60008151905061369981613361565b92915050565b6000602082840312156136b5576136b4612ee0565b5b60006136c38482850161368a565b91505092915050565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b6000613702601083613151565b915061370d826136cc565b602082019050919050565b60006020820190508181036000830152613731816136f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061377f57607f821691505b60208210810361379257613791613738565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f6e6c79206f776e65722063616e20636c61696d2e0000000000000000000000600082015250565b60006137fd601583613151565b9150613808826137c7565b602082019050919050565b6000602082019050818103600083015261382c816137f0565b9050919050565b7f54686973207374616b696e67207265636f7264206973206e6f742061626c652060008201527f746f20636c61696d2e0000000000000000000000000000000000000000000000602082015250565b600061388f602983613151565b915061389a82613833565b604082019050919050565b600060208201905081810360008301526138be81613882565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138ff82612e46565b915061390a83612e46565b9250828201905080821115613922576139216138c5565b5b92915050565b7f436c61696d206661696c65642e00000000000000000000000000000000000000600082015250565b600061395e600d83613151565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b60006060820190506139a96000830186612e50565b6139b66020830185612eac565b6139c36040830184612e50565b949350505050565b7f49742773206e6f742061626c6520746f207374616b652030205550432e000000600082015250565b6000613a01601d83613151565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4f7574206f66207374616b696e6720706572696f642e00000000000000000000600082015250565b6000613a6d601683613151565b9150613a7882613a37565b602082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b7f5374616b696e6720616d6f756e74206c696d697420657863656564732e000000600082015250565b6000613ad9601d83613151565b9150613ae482613aa3565b602082019050919050565b60006020820190508181036000830152613b0881613acc565b9050919050565b600081905092915050565b6000613b2582613146565b613b2f8185613b0f565b9350613b3f818560208601613162565b80840191505092915050565b6000613b578284613b1a565b915081905092915050565b7f4e6f742061626c6520746f20757365206f776e20726566657272616c20636f6460008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bbe602283613151565b9150613bc982613b62565b604082019050919050565b60006020820190508181036000830152613bed81613bb1565b9050919050565b6000604082019050613c096000830185612eac565b613c166020830184612eac565b9392505050565b600081519050613c2c816130d2565b92915050565b600060208284031215613c4857613c47612ee0565b5b6000613c5684828501613c1d565b91505092915050565b7f55504320746f6b656e206973206e6f7420616c6c6f7765642e00000000000000600082015250565b6000613c95601983613151565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f55504320746f6b656e2062616c616e6365206973206e6f7420656e6f7567682e600082015250565b6000613d01602083613151565b9150613d0c82613ccb565b602082019050919050565b60006020820190508181036000830152613d3081613cf4565b9050919050565b6000606082019050613d4c6000830186612eac565b613d596020830185612eac565b613d666040830184612e50565b949350505050565b7f55504320746f6b656e207472616e73666572206661696c65642e000000000000600082015250565b6000613da4601a83613151565b9150613daf82613d6e565b602082019050919050565b60006020820190508181036000830152613dd381613d97565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e3c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dff565b613e468683613dff565b95508019841693508086168417925050509392505050565b6000613e79613e74613e6f84612e46565b61360b565b612e46565b9050919050565b6000819050919050565b613e9383613e5e565b613ea7613e9f82613e80565b848454613e0c565b825550505050565b600090565b613ebc613eaf565b613ec7818484613e8a565b505050565b5b81811015613eeb57613ee0600082613eb4565b600181019050613ecd565b5050565b601f821115613f3057613f0181613dda565b613f0a84613def565b81016020851015613f19578190505b613f2d613f2585613def565b830182613ecc565b50505b505050565b600082821c905092915050565b6000613f5360001984600802613f35565b1980831691505092915050565b6000613f6c8383613f42565b9150826002028217905092915050565b613f8582613146565b67ffffffffffffffff811115613f9e57613f9d612f5e565b5b613fa88254613767565b613fb3828285613eef565b600060209050601f831160018114613fe65760008415613fd4578287015190505b613fde8582613f60565b865550614046565b601f198416613ff486613dda565b60005b8281101561401c57848901518255600182019150602085019450602081019050613ff7565b868310156140395784890151614035601f891682613f42565b8355505b6001600288020188555050505b505050505050565b600061405982612e46565b915061406483612e46565b925082820390508181111561407c5761407b6138c5565b5b92915050565b600061010082019050614098600083018b612e50565b6140a5602083018a612eac565b6140b26040830189612e50565b6140bf6060830188612e50565b6140cc6080830187612e50565b81810360a08301526140de818661318c565b90506140ed60c0830185612e50565b6140fa60e0830184612e50565b9998505050505050505050565b7f526566657272616c204665652073686f756c64206265206c657373207468616e60008201527f20313030252e0000000000000000000000000000000000000000000000000000602082015250565b6000614163602683613151565b915061416e82614107565b604082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b600081546141a681613767565b6141b08186613b0f565b945060018216600081146141cb57600181146141e057614213565b60ff1983168652811515820286019350614213565b6141e985613dda565b60005b8381101561420b578154818901526001820191506020810190506141ec565b838801955050505b50505092915050565b60006142288284614199565b915081905092915050565b600061423e82612e46565b915061424983612e46565b925082820261425781612e46565b9150828204841483151761426e5761426d6138c5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142af82612e46565b91506142ba83612e46565b9250826142ca576142c9614275565b5b828204905092915050565b6000819050919050565b6142f06142eb82612e46565b6142d5565b82525050565b60008160601b9050919050565b600061430e826142f6565b9050919050565b600061432082614303565b9050919050565b61433861433382612e9a565b614315565b82525050565b600061434a82876142df565b60208201915061435a82866142df565b60208201915061436a8285614327565b60148201915061437a82846142df565b60208201915081905095945050505050565b600061439782612e46565b91506143a283612e46565b9250826143b2576143b1614275565b5b828206905092915050565b7f4f6e6c7920726566657265722063616e20636c61696d2074686520726566657260008201527f72616c206665652e000000000000000000000000000000000000000000000000602082015250565b6000614419602883613151565b9150614424826143bd565b604082019050919050565b600060208201905081810360008301526144488161440c565b9050919050565b7f4974206973206e6f742061626c6520746f20636c61696d2c2079657400000000600082015250565b6000614485601c83613151565b91506144908261444f565b602082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b7f416c7265617920636c61696d65642e0000000000000000000000000000000000600082015250565b60006144f1600f83613151565b91506144fc826144bb565b602082019050919050565b60006020820190508181036000830152614520816144e4565b9050919050565b7f596f752073686f756c642068617665206174206c65617374206f6e652073746160008201527f6b696e67207265636f72642e0000000000000000000000000000000000000000602082015250565b6000614583602c83613151565b915061458e82614527565b604082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b60006040820190506145ce6000830185612eac565b81810360208301526145e0818461318c565b90509392505050565b7f4465706f736974206661696c65642e0000000000000000000000000000000000600082015250565b600061461f600f83613151565b915061462a826145e9565b602082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600061466082612e46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614692576146916138c5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470181612e46565b82525050565b60408201600082015161471d60008501826146f8565b50602082015161473060208501826146f8565b50505050565b60006147428383614707565b60408301905092915050565b6000602082019050919050565b6000614766826146cc565b61477081856146d7565b935061477b836146e8565b8060005b838110156147ac5781516147938882614736565b975061479e8361474e565b92505060018101905061477f565b5085935050505092915050565b60006040820190506147ce6000830185612e50565b81810360208301526147e0818461475b565b9050939250505056fea2646970667358221220c557a794d3574b064ead4b67670da057169ea89478c3dc5d2b9eef40f2ab947164736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806384ae2bc61161010f578063b2783535116100a2578063d201114a11610071578063d201114a14610595578063ea88aeba146105b3578063f2fde38b146105cf578063f996f5c4146105eb576101f0565b8063b27835351461050f578063b6b55f251461052b578063bca85e6414610547578063c852013114610577576101f0565b8063a9dd1225116100de578063a9dd122514610489578063af12d69c146104b9578063afa4da17146104d5578063b0a2fc1b14610505576101f0565b806384ae2bc6146103ed57806389610a091461040b5780638da5cb5b1461043b57806398807d8414610459576101f0565b8063379607f511610187578063713494d711610156578063713494d714610379578063715018a614610395578063743957fa1461039f578063766fa87c146103bd576101f0565b8063379607f5146103095780633e8b588d146103255780635be4b527146103415780636cb455b71461035d576101f0565b80632655e840116101c35780632655e8401461026957806327cfe856146102995780632e1a7d4d146102b757806334461067146102d3576101f0565b806301d1a559146101f55780631c504fda146102135780631c914803146102315780631e34a9721461024d575b600080fd5b6101fd61061c565b60405161020a9190612e5f565b60405180910390f35b61021b610622565b6040516102289190612ebb565b60405180910390f35b61024b60048036038101906102469190612f16565b610646565b005b61026760048036038101906102629190612f16565b6108f3565b005b610283600480360381019061027e9190613089565b610981565b6040516102909190612ebb565b60405180910390f35b6102a16109ca565b6040516102ae9190612e5f565b60405180910390f35b6102d160048036038101906102cc91906130fe565b6109d1565b005b6102ed60048036038101906102e891906130fe565b610ab9565b60405161030097969594939291906131c5565b60405180910390f35b610323600480360381019061031e91906130fe565b610bcd565b005b61033f600480360381019061033a919061323b565b610e5f565b005b61035b600480360381019061035691906132aa565b6114d1565b005b610377600480360381019061037291906130fe565b61153a565b005b610393600480360381019061038e91906130fe565b61154c565b005b61039d6115a2565b005b6103a76115b6565b6040516103b49190612e5f565b60405180910390f35b6103d760048036038101906103d291906130fe565b61171a565b6040516103e49190612e5f565b60405180910390f35b6103f5611946565b6040516104029190612e5f565b60405180910390f35b610425600480360381019061042091906130fe565b61194c565b6040516104329190613306565b60405180910390f35b610443611a23565b6040516104509190612ebb565b60405180910390f35b610473600480360381019061046e9190612f16565b611a5b565b6040516104809190613306565b60405180910390f35b6104a3600480360381019061049e9190613321565b611a7b565b6040516104b09190612e5f565b60405180910390f35b6104d360048036038101906104ce91906130fe565b611ac0565b005b6104ef60048036038101906104ea91906130fe565b611e26565b6040516104fc9190612e5f565b60405180910390f35b61050d611f58565b005b6105296004803603810190610524919061338d565b612092565b005b610545600480360381019061054091906130fe565b612249565b005b610561600480360381019061055c91906130fe565b612448565b60405161056e9190613306565b60405180910390f35b61057f612520565b60405161058c9190612e5f565b60405180910390f35b61059d612683565b6040516105aa9190612e5f565b60405180910390f35b6105cd60048036038101906105c89190613568565b612689565b005b6105e960048036038101906105e49190612f16565b6127e5565b005b610605600480360381019061060091906130fe565b61286b565b6040516106139291906135c4565b60405180910390f35b60045481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061065061288f565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff1614801561069e5750825b9050600060018367ffffffffffffffff161480156106d3575060003073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156106e1575080155b15610718576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156107685760018560000160086101000a81548160ff0219169083151502179055505b60b46001600060018152602001908152602001600020600001819055506064600160006001815260200190815260200160002060010181905550605a6001600060028152602001908152602001600020600001819055506032600160006002815260200190815260200160002060010181905550601e600160006003815260200190815260200160002060000181905550601460016000600381526020019081526020016000206001018190555073487d62468282bd04ddf976631c23128a425555ee6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064174876e8006004819055506014600781905550610887866128b7565b61088f6128cb565b83156108eb5760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516108e29190613646565b60405180910390a15b505050505050565b6108fb6128dd565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555064174876e8006004819055507fd355795ae95528075010c124994c8125c29fd3b271ff2874fc56fa22ece99771816040516109769190612ebb565b60405180910390a150565b6006818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6201518081565b6109d96128dd565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a34929190613661565b6020604051808303816000875af1158015610a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a77919061369f565b610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad90613718565b60405180910390fd5b50565b60038181548110610ac957600080fd5b90600052602060002090600702016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff1690806004015490806005018054610b3790613767565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613767565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b60038181548110610be157610be0613798565b5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790613813565b60405180910390fd5b610c898161194c565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf906138a5565b60405180910390fd5b6000610cd382611e26565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338360038681548110610d2757610d26613798565b5b906000526020600020906007020160010154610d4391906138f4565b6040518363ffffffff1660e01b8152600401610d60929190613661565b6020604051808303816000875af1158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da3919061369f565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613974565b60405180910390fd5b600160038381548110610df857610df7613798565b5b906000526020600020906007020160030160006101000a81548160ff0219169083151502179055507f3ed1528b0fdc7c5207c1bf935e34a667e13656b9ed165260c522be0bc544f303823383604051610e5393929190613994565b60405180910390a15050565b610e67612964565b6000831015610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290613a17565b60405180910390fd5b610eb482612448565b610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90613a83565b60405180910390fd5b60045483600554610f0491906138f4565b1115610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90613aef565b60405180910390fd5b6000815114610ffb573373ffffffffffffffffffffffffffffffffffffffff16600682604051610f759190613b4b565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613bd4565b60405180910390fd5b5b8260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401611057929190613bf4565b602060405180830381865afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110989190613c32565b10156110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d090613cab565b60405180910390fd5b8260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016111339190612ebb565b602060405180830381865afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190613c32565b10156111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613d17565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161121293929190613d37565b6020604051808303816000875af1158015611231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611255919061369f565b611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90613dba565b60405180910390fd5b60036040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200142815260200160001515815260200184815260200183815260200160001515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050190816113a89190613f7c565b5060c08201518160060160006101000a81548160ff021916908315150217905550505082600560008282546113dd91906138f4565b925050819055506001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe8c82e2e2f1405ba419995e957426f4ad806c4cb8ff7c620f573ac34b88cd597600160038054905061146f919061404e565b338542868661148e6001600380549050611489919061404e565b611e26565b6114a860016003805490506114a3919061404e565b61171a565b6040516114bc989796959493929190614082565b60405180910390a16114cc6129bb565b505050565b6114d96128dd565b816006826040516114ea9190613b4b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6115426128dd565b8060048190555050565b6115546128dd565b6064811115611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614179565b60405180910390fd5b8060078190555050565b6115aa6128dd565b6115b460006129d4565b565b6000806115c1612aab565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161161c9190612ebb565b602060405180830381865afa158015611639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165d9190613c32565b81101561166e576000915050611717565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116c79190612ebb565b602060405180830381865afa1580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117089190613c32565b81611713919061404e565b9150505b90565b6000600382815481106117305761172f613798565b5b906000526020600020906007020160060160009054906101000a900460ff161561175d5760009050611941565b60006003838154811061177357611772613798565b5b9060005260206000209060070201600501805461178f90613767565b90500361179f5760009050611941565b600073ffffffffffffffffffffffffffffffffffffffff166006600384815481106117cd576117cc613798565b5b90600052602060002090600702016005016040516117eb919061421c565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361183e5760009050611941565b60646007546201518061016d6064600160006003898154811061186457611863613798565b5b906000526020600020906007020160040154815260200190815260200160002060000154620151806118969190614233565b6001600060038a815481106118ae576118ad613798565b5b906000526020600020906007020160040154815260200190815260200160002060010154600389815481106118e6576118e5613798565b5b9060005260206000209060070201600101546119029190614233565b61190c9190614233565b61191691906142a4565b61192091906142a4565b61192a91906142a4565b6119349190614233565b61193e91906142a4565b90505b919050565b60075481565b60006003828154811061196257611961613798565b5b906000526020600020906007020160030160009054906101000a900460ff161561198f5760009050611a1e565b60016000600384815481106119a7576119a6613798565b5b906000526020600020906007020160040154815260200190815260200160002060000154620151806119d99190614233565b600383815481106119ed576119ec613798565b5b90600052602060002090600702016002015442611a0a919061404e565b1015611a195760009050611a1e565b600190505b919050565b600080611a2e612b71565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60026020528060005260406000206000915054906101000a900460ff1681565b60008242443385604051602001611a95949392919061433e565b6040516020818303038152906040528051906020012060001c611ab8919061438c565b905092915050565b600660038281548110611ad657611ad5613798565b5b9060005260206000209060070201600501604051611af4919061421c565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b879061442f565b60405180910390fd5b6001600060038381548110611ba857611ba7613798565b5b90600052602060002090600702016004015481526020019081526020016000206000015462015180611bda9190614233565b60038281548110611bee57611bed613798565b5b90600052602060002090600702016002015442611c0b919061404e565b1015611c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c439061449b565b60405180910390fd5b60038181548110611c6057611c5f613798565b5b906000526020600020906007020160060160009054906101000a900460ff1615611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690614507565b60405180910390fd5b6000611cca8261171a565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d27929190613661565b6020604051808303816000875af1158015611d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6a919061369f565b611da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da090613974565b60405180910390fd5b600160038381548110611dbf57611dbe613798565b5b906000526020600020906007020160060160006101000a81548160ff0219169083151502179055507f2f7aa84e5a1e1542b882ba36146711c358ee46ad291acda608e2b6cf05ca33df823383604051611e1a93929190613994565b60405180910390a15050565b600060038281548110611e3c57611e3b613798565b5b906000526020600020906007020160030160009054906101000a900460ff1615611e695760009050611f53565b6201518061016d60646001600060038781548110611e8a57611e89613798565b5b90600052602060002090600702016004015481526020019081526020016000206000015462015180611ebc9190614233565b6001600060038881548110611ed457611ed3613798565b5b90600052602060002090600702016004015481526020019081526020016000206001015460038781548110611f0c57611f0b613798565b5b906000526020600020906007020160010154611f289190614233565b611f329190614233565b611f3c91906142a4565b611f4691906142a4565b611f5091906142a4565b90505b919050565b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614599565b60405180910390fd5b6000611ff76006612b99565b90503360068260405161200a9190613b4b565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4403782ab3ea77c589db0c2e2e3451ff9352945fb049c9591fe7708047e3d29533826040516120879291906145b9565b60405180910390a150565b61209a6128dd565b60036040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018415158152602001868152602001858152602001831515815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050190816121ac9190613f7c565b5060c08201518160060160006101000a81548160ff021916908315150217905550505085600560008282546121e191906138f4565b925050819055506001600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050505050565b6122516128dd565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016122ad929190613bf4565b602060405180830381865afa1580156122ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ee9190613c32565b101561232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690613cab565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161238c93929190613d37565b6020604051808303816000875af11580156123ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123cf919061369f565b61240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614635565b60405180910390fd5b7f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384268160405161243d9190612e5f565b60405180910390a150565b600080600090505b60016000848152602001908152602001600020600201805490508110156125155760016000848152602001908152602001600020600201818154811061249957612498613798565b5b90600052602060002090600202016000015442101580156124f357506001600084815260200190815260200160002060020181815481106124dd576124dc613798565b5b9060005260206000209060020201600101544211155b1561250257600191505061251b565b808061250d90614655565b915050612450565b50600090505b919050565b60008061252b612aab565b905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125869190612ebb565b602060405180830381865afa1580156125a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c79190613c32565b81106125d7576000915050612680565b8060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016126319190612ebb565b602060405180830381865afa15801561264e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126729190613c32565b61267c919061404e565b9150505b90565b60055481565b6126916128dd565b60005b600160008481526020019081526020016000206002018054905081101561271757600160008481526020019081526020016000206002018054806126db576126da61469d565b5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055808061270f90614655565b915050612694565b5060005b81518110156127a7576001600084815260200190815260200160002060020182828151811061274d5761274c613798565b5b6020026020010151908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050808061279f90614655565b91505061271b565b507fe250ae701c4dd28188ffca44dffb51154fe04268273c6db802cc1883226d6e8782826040516127d99291906147b9565b60405180910390a15050565b6127ed6128dd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361285f5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016128569190612ebb565b60405180910390fd5b612868816129d4565b50565b60016020528060005260406000206000915090508060000154908060010154905082565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6128bf612d0f565b6128c881612d4f565b50565b6128d3612d0f565b6128db612dd5565b565b6128e5612df6565b73ffffffffffffffffffffffffffffffffffffffff16612903611a23565b73ffffffffffffffffffffffffffffffffffffffff161461296257612926612df6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016129599190612ebb565b60405180910390fd5b565b600061296e612dfe565b905060028160000154036129ae576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816000018190555050565b60006129c5612dfe565b90506001816000018190555050565b60006129de612b71565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6000806000905060005b600380549050811015612b6957612acb8161171a565b612ad482611e26565b612ade91906138f4565b82612ae991906138f4565b915060038181548110612aff57612afe613798565b5b906000526020600020906007020160030160009054906101000a900460ff16612b565760038181548110612b3657612b35613798565b5b90600052602060002090600702016001015482612b5391906138f4565b91505b8080612b6190614655565b915050612ab5565b508091505090565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b606060008267ffffffffffffffff811115612bb757612bb6612f5e565b5b6040519080825280601f01601f191660200182016040528015612be95781602001600182028036833780820191505090505b5090506000601a67ffffffffffffffff811115612c0957612c08612f5e565b5b6040519080825280601f01601f191660200182016040528015612c3b5781602001600182028036833780820191505090505b5090506040518060400160405280601a81526020017f4142434445464748494a4b4c4d4e4f505152535455565758595a000000000000815250905060005b84811015612d04576000612c8e601a83611a7b565b9050828181518110612ca357612ca2613798565b5b602001015160f81c60f81b848381518110612cc157612cc0613798565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080612cfc90614655565b915050612c79565b508192505050919050565b612d17612e26565b612d4d576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b612d57612d0f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612dc95760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612dc09190612ebb565b60405180910390fd5b612dd2816129d4565b50565b612ddd612d0f565b6000612de7612dfe565b90506001816000018190555050565b600033905090565b60007f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00905090565b6000612e3061288f565b60000160089054906101000a900460ff16905090565b6000819050919050565b612e5981612e46565b82525050565b6000602082019050612e746000830184612e50565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea582612e7a565b9050919050565b612eb581612e9a565b82525050565b6000602082019050612ed06000830184612eac565b92915050565b6000604051905090565b600080fd5b600080fd5b612ef381612e9a565b8114612efe57600080fd5b50565b600081359050612f1081612eea565b92915050565b600060208284031215612f2c57612f2b612ee0565b5b6000612f3a84828501612f01565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f9682612f4d565b810181811067ffffffffffffffff82111715612fb557612fb4612f5e565b5b80604052505050565b6000612fc8612ed6565b9050612fd48282612f8d565b919050565b600067ffffffffffffffff821115612ff457612ff3612f5e565b5b612ffd82612f4d565b9050602081019050919050565b82818337600083830152505050565b600061302c61302784612fd9565b612fbe565b90508281526020810184848401111561304857613047612f48565b5b61305384828561300a565b509392505050565b600082601f8301126130705761306f612f43565b5b8135613080848260208601613019565b91505092915050565b60006020828403121561309f5761309e612ee0565b5b600082013567ffffffffffffffff8111156130bd576130bc612ee5565b5b6130c98482850161305b565b91505092915050565b6130db81612e46565b81146130e657600080fd5b50565b6000813590506130f8816130d2565b92915050565b60006020828403121561311457613113612ee0565b5b6000613122848285016130e9565b91505092915050565b60008115159050919050565b6131408161312b565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613180578082015181840152602081019050613165565b60008484015250505050565b600061319782613146565b6131a18185613151565b93506131b1818560208601613162565b6131ba81612f4d565b840191505092915050565b600060e0820190506131da600083018a612eac565b6131e76020830189612e50565b6131f46040830188612e50565b6132016060830187613137565b61320e6080830186612e50565b81810360a0830152613220818561318c565b905061322f60c0830184613137565b98975050505050505050565b60008060006060848603121561325457613253612ee0565b5b6000613262868287016130e9565b9350506020613273868287016130e9565b925050604084013567ffffffffffffffff81111561329457613293612ee5565b5b6132a08682870161305b565b9150509250925092565b600080604083850312156132c1576132c0612ee0565b5b60006132cf85828601612f01565b925050602083013567ffffffffffffffff8111156132f0576132ef612ee5565b5b6132fc8582860161305b565b9150509250929050565b600060208201905061331b6000830184613137565b92915050565b6000806040838503121561333857613337612ee0565b5b6000613346858286016130e9565b9250506020613357858286016130e9565b9150509250929050565b61336a8161312b565b811461337557600080fd5b50565b60008135905061338781613361565b92915050565b600080600080600080600060e0888a0312156133ac576133ab612ee0565b5b60006133ba8a828b01612f01565b97505060206133cb8a828b016130e9565b96505060406133dc8a828b016130e9565b95505060606133ed8a828b016130e9565b945050608088013567ffffffffffffffff81111561340e5761340d612ee5565b5b61341a8a828b0161305b565b93505060a061342b8a828b01613378565b92505060c061343c8a828b01613378565b91505092959891949750929550565b600067ffffffffffffffff82111561346657613465612f5e565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000604082840312156134975761349661347c565b5b6134a16040612fbe565b905060006134b1848285016130e9565b60008301525060206134c5848285016130e9565b60208301525092915050565b60006134e46134df8461344b565b612fbe565b9050808382526020820190506040840283018581111561350757613506613477565b5b835b81811015613530578061351c8882613481565b845260208401935050604081019050613509565b5050509392505050565b600082601f83011261354f5761354e612f43565b5b813561355f8482602086016134d1565b91505092915050565b6000806040838503121561357f5761357e612ee0565b5b600061358d858286016130e9565b925050602083013567ffffffffffffffff8111156135ae576135ad612ee5565b5b6135ba8582860161353a565b9150509250929050565b60006040820190506135d96000830185612e50565b6135e66020830184612e50565b9392505050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b600061363061362b613626846135ed565b61360b565b6135f7565b9050919050565b61364081613615565b82525050565b600060208201905061365b6000830184613637565b92915050565b60006040820190506136766000830185612eac565b6136836020830184612e50565b9392505050565b60008151905061369981613361565b92915050565b6000602082840312156136b5576136b4612ee0565b5b60006136c38482850161368a565b91505092915050565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b6000613702601083613151565b915061370d826136cc565b602082019050919050565b60006020820190508181036000830152613731816136f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061377f57607f821691505b60208210810361379257613791613738565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f6e6c79206f776e65722063616e20636c61696d2e0000000000000000000000600082015250565b60006137fd601583613151565b9150613808826137c7565b602082019050919050565b6000602082019050818103600083015261382c816137f0565b9050919050565b7f54686973207374616b696e67207265636f7264206973206e6f742061626c652060008201527f746f20636c61696d2e0000000000000000000000000000000000000000000000602082015250565b600061388f602983613151565b915061389a82613833565b604082019050919050565b600060208201905081810360008301526138be81613882565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138ff82612e46565b915061390a83612e46565b9250828201905080821115613922576139216138c5565b5b92915050565b7f436c61696d206661696c65642e00000000000000000000000000000000000000600082015250565b600061395e600d83613151565b915061396982613928565b602082019050919050565b6000602082019050818103600083015261398d81613951565b9050919050565b60006060820190506139a96000830186612e50565b6139b66020830185612eac565b6139c36040830184612e50565b949350505050565b7f49742773206e6f742061626c6520746f207374616b652030205550432e000000600082015250565b6000613a01601d83613151565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4f7574206f66207374616b696e6720706572696f642e00000000000000000000600082015250565b6000613a6d601683613151565b9150613a7882613a37565b602082019050919050565b60006020820190508181036000830152613a9c81613a60565b9050919050565b7f5374616b696e6720616d6f756e74206c696d697420657863656564732e000000600082015250565b6000613ad9601d83613151565b9150613ae482613aa3565b602082019050919050565b60006020820190508181036000830152613b0881613acc565b9050919050565b600081905092915050565b6000613b2582613146565b613b2f8185613b0f565b9350613b3f818560208601613162565b80840191505092915050565b6000613b578284613b1a565b915081905092915050565b7f4e6f742061626c6520746f20757365206f776e20726566657272616c20636f6460008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bbe602283613151565b9150613bc982613b62565b604082019050919050565b60006020820190508181036000830152613bed81613bb1565b9050919050565b6000604082019050613c096000830185612eac565b613c166020830184612eac565b9392505050565b600081519050613c2c816130d2565b92915050565b600060208284031215613c4857613c47612ee0565b5b6000613c5684828501613c1d565b91505092915050565b7f55504320746f6b656e206973206e6f7420616c6c6f7765642e00000000000000600082015250565b6000613c95601983613151565b9150613ca082613c5f565b602082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f55504320746f6b656e2062616c616e6365206973206e6f7420656e6f7567682e600082015250565b6000613d01602083613151565b9150613d0c82613ccb565b602082019050919050565b60006020820190508181036000830152613d3081613cf4565b9050919050565b6000606082019050613d4c6000830186612eac565b613d596020830185612eac565b613d666040830184612e50565b949350505050565b7f55504320746f6b656e207472616e73666572206661696c65642e000000000000600082015250565b6000613da4601a83613151565b9150613daf82613d6e565b602082019050919050565b60006020820190508181036000830152613dd381613d97565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e3c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dff565b613e468683613dff565b95508019841693508086168417925050509392505050565b6000613e79613e74613e6f84612e46565b61360b565b612e46565b9050919050565b6000819050919050565b613e9383613e5e565b613ea7613e9f82613e80565b848454613e0c565b825550505050565b600090565b613ebc613eaf565b613ec7818484613e8a565b505050565b5b81811015613eeb57613ee0600082613eb4565b600181019050613ecd565b5050565b601f821115613f3057613f0181613dda565b613f0a84613def565b81016020851015613f19578190505b613f2d613f2585613def565b830182613ecc565b50505b505050565b600082821c905092915050565b6000613f5360001984600802613f35565b1980831691505092915050565b6000613f6c8383613f42565b9150826002028217905092915050565b613f8582613146565b67ffffffffffffffff811115613f9e57613f9d612f5e565b5b613fa88254613767565b613fb3828285613eef565b600060209050601f831160018114613fe65760008415613fd4578287015190505b613fde8582613f60565b865550614046565b601f198416613ff486613dda565b60005b8281101561401c57848901518255600182019150602085019450602081019050613ff7565b868310156140395784890151614035601f891682613f42565b8355505b6001600288020188555050505b505050505050565b600061405982612e46565b915061406483612e46565b925082820390508181111561407c5761407b6138c5565b5b92915050565b600061010082019050614098600083018b612e50565b6140a5602083018a612eac565b6140b26040830189612e50565b6140bf6060830188612e50565b6140cc6080830187612e50565b81810360a08301526140de818661318c565b90506140ed60c0830185612e50565b6140fa60e0830184612e50565b9998505050505050505050565b7f526566657272616c204665652073686f756c64206265206c657373207468616e60008201527f20313030252e0000000000000000000000000000000000000000000000000000602082015250565b6000614163602683613151565b915061416e82614107565b604082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b600081546141a681613767565b6141b08186613b0f565b945060018216600081146141cb57600181146141e057614213565b60ff1983168652811515820286019350614213565b6141e985613dda565b60005b8381101561420b578154818901526001820191506020810190506141ec565b838801955050505b50505092915050565b60006142288284614199565b915081905092915050565b600061423e82612e46565b915061424983612e46565b925082820261425781612e46565b9150828204841483151761426e5761426d6138c5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142af82612e46565b91506142ba83612e46565b9250826142ca576142c9614275565b5b828204905092915050565b6000819050919050565b6142f06142eb82612e46565b6142d5565b82525050565b60008160601b9050919050565b600061430e826142f6565b9050919050565b600061432082614303565b9050919050565b61433861433382612e9a565b614315565b82525050565b600061434a82876142df565b60208201915061435a82866142df565b60208201915061436a8285614327565b60148201915061437a82846142df565b60208201915081905095945050505050565b600061439782612e46565b91506143a283612e46565b9250826143b2576143b1614275565b5b828206905092915050565b7f4f6e6c7920726566657265722063616e20636c61696d2074686520726566657260008201527f72616c206665652e000000000000000000000000000000000000000000000000602082015250565b6000614419602883613151565b9150614424826143bd565b604082019050919050565b600060208201905081810360008301526144488161440c565b9050919050565b7f4974206973206e6f742061626c6520746f20636c61696d2c2079657400000000600082015250565b6000614485601c83613151565b91506144908261444f565b602082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b7f416c7265617920636c61696d65642e0000000000000000000000000000000000600082015250565b60006144f1600f83613151565b91506144fc826144bb565b602082019050919050565b60006020820190508181036000830152614520816144e4565b9050919050565b7f596f752073686f756c642068617665206174206c65617374206f6e652073746160008201527f6b696e67207265636f72642e0000000000000000000000000000000000000000602082015250565b6000614583602c83613151565b915061458e82614527565b604082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b60006040820190506145ce6000830185612eac565b81810360208301526145e0818461318c565b90509392505050565b7f4465706f736974206661696c65642e0000000000000000000000000000000000600082015250565b600061461f600f83613151565b915061462a826145e9565b602082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600061466082612e46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614692576146916138c5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61470181612e46565b82525050565b60408201600082015161471d60008501826146f8565b50602082015161473060208501826146f8565b50505050565b60006147428383614707565b60408301905092915050565b6000602082019050919050565b6000614766826146cc565b61477081856146d7565b935061477b836146e8565b8060005b838110156147ac5781516147938882614736565b975061479e8361474e565b92505060018101905061477f565b5085935050505092915050565b60006040820190506147ce6000830185612e50565b81810360208301526147e0818461475b565b9050939250505056fea2646970667358221220c557a794d3574b064ead4b67670da057169ea89478c3dc5d2b9eef40f2ab947164736f6c63430008140033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.