More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 343 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 18244762 | 336 days ago | IN | 0 ETH | 0.00063597 | ||||
Deposit | 18186346 | 344 days ago | IN | 0 ETH | 0.00355718 | ||||
Emergency Withdr... | 17876984 | 388 days ago | IN | 0 ETH | 0.00136208 | ||||
Withdraw | 17794763 | 399 days ago | IN | 0 ETH | 0.00259505 | ||||
Withdraw | 17787938 | 400 days ago | IN | 0 ETH | 0.0024782 | ||||
Emergency Withdr... | 17761337 | 404 days ago | IN | 0 ETH | 0.00137639 | ||||
Emergency Withdr... | 17761335 | 404 days ago | IN | 0 ETH | 0.00146565 | ||||
Emergency Withdr... | 17739335 | 407 days ago | IN | 0 ETH | 0.00135941 | ||||
Withdraw | 17738969 | 407 days ago | IN | 0 ETH | 0.00155982 | ||||
Withdraw | 17730494 | 408 days ago | IN | 0 ETH | 0.0016761 | ||||
Emergency Withdr... | 17730465 | 408 days ago | IN | 0 ETH | 0.00182071 | ||||
Emergency Withdr... | 17730136 | 408 days ago | IN | 0 ETH | 0.00150482 | ||||
Emergency Withdr... | 17730132 | 408 days ago | IN | 0 ETH | 0.00160765 | ||||
Withdraw | 17728582 | 408 days ago | IN | 0 ETH | 0.00296957 | ||||
Emergency Withdr... | 17727963 | 408 days ago | IN | 0 ETH | 0.00286513 | ||||
Emergency Withdr... | 17727961 | 408 days ago | IN | 0 ETH | 0.00285596 | ||||
Emergency Withdr... | 17727697 | 408 days ago | IN | 0 ETH | 0.00450592 | ||||
Emergency Withdr... | 17727432 | 408 days ago | IN | 0 ETH | 0.00209898 | ||||
Emergency Withdr... | 17726853 | 409 days ago | IN | 0 ETH | 0.00120438 | ||||
Emergency Withdr... | 17726450 | 409 days ago | IN | 0 ETH | 0.00143613 | ||||
Emergency Withdr... | 17726243 | 409 days ago | IN | 0 ETH | 0.00134781 | ||||
Withdraw | 17724465 | 409 days ago | IN | 0 ETH | 0.00320545 | ||||
Emergency Withdr... | 17724160 | 409 days ago | IN | 0 ETH | 0.00161266 | ||||
Emergency Withdr... | 17724157 | 409 days ago | IN | 0 ETH | 0.00160045 | ||||
Emergency Withdr... | 17724127 | 409 days ago | IN | 0 ETH | 0.00147763 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CHITCATStaking
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-17 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.16; interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; mapping (address => bool) private _authorized; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); _authorized[_msgSender()] = true; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } modifier onlyAuthorized() { require(_authorized[_msgSender()], "Not authorized"); _; } function setAuthorized(address _address, bool authorized) public onlyOwner { _authorized[_address] = authorized; } function isAuthorized(address _address) public view returns (bool) { return _authorized[_address]; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract CHITCATStaking is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; using Address for address; struct StakeInfo { uint256 amount; uint256 poolId; uint256 depositTime; } struct PoolInfo{ uint256 interest; uint256 apr; uint256 startEpoch; uint256 poolLength; uint256 lockPeriod; uint256 liveStakedAmount; uint256 totalContributed; uint256 emergencyWithdrawFee; uint256 burnFee; bool isOpen; } struct DynamicPoolInfo { uint256 interest; uint256 apr; uint256 lockPeriod; bool isOpen; bool isLive; uint256 endDate; uint256 liveStakedAmount; uint256 rewardDept; } IERC20 public token; PoolInfo[] public poolInfo; mapping(address => StakeInfo[]) public stakeInfo; uint256 private totalRewardDistributed; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event EmergencyWithdrawFee(address indexed user, uint256 amount); constructor() { token = IERC20(0x7cF551258d6871b72EE1bD1624588a6245bF48c4); poolInfo.push(PoolInfo(2000, 240, block.timestamp, 3653 days, 7 days, 0, 0, 1000, 0, true)); poolInfo.push(PoolInfo(5000, 600, block.timestamp, 3653 days, 30 days, 0, 0, 500, 0, false)); poolInfo.push(PoolInfo(10000, 1200, block.timestamp, 3653 days, 60 days, 0, 0, 500, 0, false)); poolInfo.push(PoolInfo(15000, 1800, block.timestamp, 3653 days, 90 days, 0, 0, 500, 0, false)); } function claimStuckTokens(address _token) external onlyOwner { if (_token == address(0x0)) { payable(msg.sender).transfer(address(this).balance); return; } IERC20 erc20Token = IERC20(_token); uint256 balance = erc20Token.balanceOf(address(this)); erc20Token.transfer(msg.sender, balance); } function addPool(PoolInfo memory pool) external onlyOwner{ poolInfo.push(pool); } function setFees(uint256 _poolId, uint emFee) external onlyOwner { PoolInfo storage pool = poolInfo[_poolId]; require(emFee <= 3000, "EmergencyWithdrawFee should be <= 30"); pool.emergencyWithdrawFee = emFee; } function changePoolStatus(uint256 _pid,bool _isOpen) external onlyAuthorized{ PoolInfo storage pool = poolInfo[_pid]; pool.isOpen = _isOpen; } function togglePool(uint256 _pid) external onlyAuthorized{ PoolInfo storage pool = poolInfo[_pid]; pool.isOpen = !pool.isOpen; } function updatePoolLength(uint256 _poolId, uint256 _poolLength) external onlyAuthorized{ PoolInfo storage pool = poolInfo[_poolId]; pool.poolLength = _poolLength; } function extendPoolLength(uint256 _poolId, uint256 _duration) external onlyAuthorized{ PoolInfo storage pool = poolInfo[_poolId]; pool.poolLength += (_duration * 1 days); } function getDynamicPoolInfo(uint256 _poolId) external view returns (DynamicPoolInfo memory) { PoolInfo storage pool = poolInfo[_poolId]; DynamicPoolInfo memory dynamicPoolInfo; dynamicPoolInfo.interest = pool.interest; dynamicPoolInfo.apr = pool.apr; dynamicPoolInfo.lockPeriod = pool.lockPeriod; dynamicPoolInfo.isOpen = pool.isOpen; dynamicPoolInfo.isLive = isLivePool(_poolId); dynamicPoolInfo.endDate = pool.startEpoch + pool.poolLength; dynamicPoolInfo.liveStakedAmount = pool.liveStakedAmount; dynamicPoolInfo.rewardDept = (pool.liveStakedAmount * pool.interest) / 10000; return dynamicPoolInfo; } function pendingReward(uint256 _stakeId, address _user) public view returns (uint256) { StakeInfo memory stake = stakeInfo[_user][_stakeId]; PoolInfo memory pool = poolInfo[stake.poolId]; uint256 lockedTime = block.timestamp > stake.depositTime + pool.lockPeriod ? pool.lockPeriod : block.timestamp - stake.depositTime; uint256 reward = (((stake.amount * pool.interest) * lockedTime) / pool.lockPeriod) / 10_000; return reward; } function canWithdraw(uint256 _stakeId, address _user) public view returns (bool) { return (withdrawCountdown(_stakeId,_user)==0 && stakeInfo[_user][_stakeId].amount > 0); } function withdrawCountdown(uint256 _stakeId, address _user) public view returns (uint256) { StakeInfo storage stake = stakeInfo[_user][_stakeId]; PoolInfo storage pool = poolInfo[stake.poolId]; if ((block.timestamp < stake.depositTime + pool.lockPeriod)){ return stake.depositTime + pool.lockPeriod - block.timestamp; }else{ return 0; } } function userInfo(uint256 stakeId, address _user) public view returns(uint256,uint256,uint256,uint256,uint256) { StakeInfo storage stake = stakeInfo[_user][stakeId]; PoolInfo storage pool = poolInfo[stake.poolId]; return (stake.amount, stake.depositTime, pool.interest, pool.startEpoch, pool.lockPeriod); } function getAllUserInfo(address _user) public view returns(uint256[] memory) { StakeInfo[] storage stake = stakeInfo[_user]; PoolInfo[] storage pool = poolInfo; uint256 lenghtOfStake = 0; for(uint256 i = 0; i < stake.length; ++i) if(stake[i].amount>0) lenghtOfStake+=1; uint256[] memory information = new uint256[](lenghtOfStake*7); uint256 j=0; for(uint256 i = 0; i < stake.length; ++i){ if(stake[i].amount>0){ information[j*7+0]=stake[i].amount; information[j*7+1]=stake[i].depositTime; information[j*7+2]=pool[stake[i].poolId].interest; information[j*7+3]=pool[stake[i].poolId].lockPeriod; information[j*7+4]=i; information[j*7+5]=pendingReward(i,_user); information[j*7+6]=canWithdraw(i,_user)? 1 : 0; j+=1; } } return information; } function getUserTotalStakedAmount(address _user) public view returns(uint256) { StakeInfo[] storage stake = stakeInfo[_user]; uint256 totalStakedAmount; for(uint256 i = 0; i < stake.length; ++i) { totalStakedAmount += stake[i].amount; } return totalStakedAmount; } function getTotalContributors() public view returns(uint256) { PoolInfo[] storage pool = poolInfo; uint256 totalContributors; for(uint256 i = 0; i < pool.length; ++i) { totalContributors += pool[i].totalContributed; } return totalContributors; } function getTotalLiveStakingAmount() public view returns(uint256) { PoolInfo[] storage pool = poolInfo; uint256 totalLiveStakeAmount; for(uint256 i = 0; i < pool.length; ++i) { totalLiveStakeAmount += pool[i].liveStakedAmount; } return totalLiveStakeAmount; } function getTotalRewardDepth() public view returns(uint256) { PoolInfo[] storage pool = poolInfo; uint256 pools = poolInfo.length; uint256 totalRewardDepth; for(uint256 i = 0; i < pools; ++i) { totalRewardDepth += (pool[i].liveStakedAmount * pool[i].interest) / 10_000; } return totalRewardDepth; } function getTotalRewardDistributed() public view returns(uint256) { return totalRewardDistributed; } function getTotals() external view returns(uint256[4] memory) { uint256[4] memory totals; totals[0] = getTotalContributors(); totals[1] = getTotalLiveStakingAmount(); totals[2] = getTotalRewardDepth(); totals[3] = getTotalRewardDistributed(); return totals; } function isLivePool(uint256 _poolId) public view returns(bool) { PoolInfo storage pool = poolInfo[_poolId]; return (pool.isOpen && block.timestamp >= pool.startEpoch && block.timestamp <= pool.startEpoch + pool.poolLength); } function deposit(uint256 _poolId,uint256 _amount) public nonReentrant{ require (_amount > 0, 'amount 0'); PoolInfo storage pool = poolInfo[_poolId]; require(isLivePool(_poolId),'Pool is not live'); require(pool.startEpoch < block.timestamp,'pool has not started yet'); token.safeTransferFrom(address(msg.sender), address(this), _amount); pool.liveStakedAmount += _amount; stakeInfo[msg.sender].push(StakeInfo({ amount: _amount, poolId: _poolId, depositTime: block.timestamp })); if(stakeInfo[msg.sender].length==1){ pool.totalContributed+=1; } emit Deposit(msg.sender, _amount); } function withdraw(uint256 _stakeId) public nonReentrant{ require(canWithdraw(_stakeId,msg.sender),'cannot withdraw yet or already withdrawn'); StakeInfo storage stake = stakeInfo[msg.sender][_stakeId]; PoolInfo storage pool = poolInfo[stake.poolId]; uint256 _amount = stake.amount; pool.liveStakedAmount -= _amount; uint256 _pendingReward = pendingReward(_stakeId, msg.sender); totalRewardDistributed += _pendingReward; _amount += _pendingReward; stake.amount=0; token.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _amount); } function emergencyWithdraw(uint256 _stakeId) public nonReentrant{ require(!canWithdraw(_stakeId,msg.sender),'Use normal withdraw instead of emergency!'); StakeInfo storage stake = stakeInfo[msg.sender][_stakeId]; PoolInfo storage pool = poolInfo[stake.poolId]; uint256 _amount = stake.amount ; pool.liveStakedAmount -= _amount; stake.amount = 0; if(pool.emergencyWithdrawFee>0){ if(pool.burnFee > 0){ uint256 burnFee = (_amount * pool.burnFee) / 10_000; token.safeTransfer(address(0xdead), burnFee); } _amount -= (_amount * pool.emergencyWithdrawFee) / 10_000; emit EmergencyWithdrawFee(address(msg.sender), (_amount * pool.emergencyWithdrawFee) / 10_000); } token.safeTransfer(address(msg.sender), _amount); emit EmergencyWithdraw(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"interest","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"poolLength","type":"uint256"},{"internalType":"uint256","name":"lockPeriod","type":"uint256"},{"internalType":"uint256","name":"liveStakedAmount","type":"uint256"},{"internalType":"uint256","name":"totalContributed","type":"uint256"},{"internalType":"uint256","name":"emergencyWithdrawFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"bool","name":"isOpen","type":"bool"}],"internalType":"struct CHITCATStaking.PoolInfo","name":"pool","type":"tuple"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_isOpen","type":"bool"}],"name":"changePoolStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"extendPoolLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllUserInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getDynamicPoolInfo","outputs":[{"components":[{"internalType":"uint256","name":"interest","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"lockPeriod","type":"uint256"},{"internalType":"bool","name":"isOpen","type":"bool"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"liveStakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardDept","type":"uint256"}],"internalType":"struct CHITCATStaking.DynamicPoolInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalContributors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiveStakingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRewardDepth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRewardDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotals","outputs":[{"internalType":"uint256[4]","name":"","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"isLivePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"interest","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"poolLength","type":"uint256"},{"internalType":"uint256","name":"lockPeriod","type":"uint256"},{"internalType":"uint256","name":"liveStakedAmount","type":"uint256"},{"internalType":"uint256","name":"totalContributed","type":"uint256"},{"internalType":"uint256","name":"emergencyWithdrawFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"bool","name":"isOpen","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"name":"setAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"emFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"depositTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"togglePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_poolLength","type":"uint256"}],"name":"updatePoolLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"withdrawCountdown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a336104a6565b6001806000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600281905550737cf551258d6871b72ee1bd1624588a6245bf48c4600360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060046040518061014001604052806107d0815260200160f081526020014281526020016312cff780815260200162093a80815260200160008152602001600081526020016103e88152602001600081526020016001151581525090806001815401808255809150506001900390600052602060002090600a0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff02191690831515021790555050506004604051806101400160405280611388815260200161025881526020014281526020016312cff780815260200162278d00815260200160008152602001600081526020016101f48152602001600081526020016000151581525090806001815401808255809150506001900390600052602060002090600a0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff0219169083151502179055505050600460405180610140016040528061271081526020016104b081526020014281526020016312cff7808152602001624f1a00815260200160008152602001600081526020016101f48152602001600081526020016000151581525090806001815401808255809150506001900390600052602060002090600a0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff02191690831515021790555050506004604051806101400160405280613a98815260200161070881526020014281526020016312cff78081526020016276a700815260200160008152602001600081526020016101f48152602001600081526020016000151581525090806001815401808255809150506001900390600052602060002090600a0201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff02191690831515021790555050506104f6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6123d2806105056000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063bc9362a2116100a2578063f2fde38b11610071578063f2fde38b146104f2578063f9d0831a14610505578063fc0c546a14610518578063fe9fbb801461052b57600080fd5b8063bc9362a2146104b1578063caa86df7146104c4578063dc58a56c146104d7578063e2bbb158146104df57600080fd5b8063912e1e08116100de578063912e1e081461044857806393f1a40b1461045057806398969e821461048b57806398f64a721461049e57600080fd5b8063715018a6146103f357806382337cf1146103fb57806384e10a901461040e5780638da5cb5b1461042357600080fd5b80632e1a7d4d1161018757806353fcedee1161015657806353fcedee146103a557806359199c6c146103b85780636e7da168146103c0578063711bf9b2146103e057600080fd5b80632e1a7d4d146103495780633ea01b5d1461035c5780634a18bf9d1461037f5780635312ea8e1461039257600080fd5b80630bfd351c116101c35780630bfd351c146102965780631526fe27146102a95780631c43bd7d146103085780631cb197151461033657600080fd5b806303d852ea146101ea5780630a6198861461026b5780630b78f9c014610281575b600080fd5b6101fd6101f8366004611fa1565b610557565b604051610262919060006101008201905082518252602083015160208301526040830151604083015260608301511515606083015260808301511515608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b60405180910390f35b61027361060e565b604051908152602001610262565b61029461028f366004611fba565b610666565b005b6102946102a4366004611ffa565b6106fd565b6102bc6102b7366004611fa1565b610768565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e0840152610100830152151561012082015261014001610262565b61031b610316366004612041565b6107cf565b60408051938452602084019290925290820152606001610262565b610294610344366004611fa1565b610811565b610294610357366004611fa1565b61087c565b61036f61036a36600461206b565b6109fc565b6040519015158152602001610262565b61027361038d366004612097565b610a57565b6102946103a0366004611fa1565b610ac4565b6102946103b3366004611fba565b610ce2565b600654610273565b6103d36103ce366004612097565b610d41565b60405161026291906120b2565b6102946103ee3660046120ea565b6110ca565b6102946110fd565b610294610409366004611fba565b611111565b610416611191565b6040516102629190612116565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610262565b6102736111d2565b61046361045e36600461206b565b611260565b604080519586526020860194909452928401919091526060830152608082015260a001610262565b61027361049936600461206b565b611307565b6102736104ac36600461206b565b61147c565b6102946104bf366004612195565b611530565b61036f6104d2366004611fa1565b6116f9565b610273611760565b6102946104ed366004611fba565b6117b1565b610294610500366004612097565b6119a8565b610294610513366004612097565b611a1e565b600354610430906001600160a01b031681565b61036f610539366004612097565b6001600160a01b031660009081526001602052604090205460ff1690565b61055f611f3a565b6000600483815481106105745761057461221f565b90600052602060002090600a0201905061058c611f3a565b815481526001820154602082015260048201546040820152600982015460ff16151560608201526105bc846116f9565b15156080820152600382015460028301546105d7919061224b565b60a0820152600582015460c082018190528254612710916105f8919061225e565b610602919061227d565b60e08201529392505050565b6000600481805b825481101561065f578281815481106106305761063061221f565b90600052602060002090600a0201600501548261064d919061224b565b91506106588161229f565b9050610615565b5092915050565b61066e611b47565b6000600483815481106106835761068361221f565b90600052602060002090600a02019050610bb88211156106f65760405162461bcd60e51b8152602060048201526024808201527f456d657267656e637957697468647261774665652073686f756c64206265203c60448201526303d2033360e41b60648201526084015b60405180910390fd5b6007015550565b3360009081526001602052604090205460ff1661072c5760405162461bcd60e51b81526004016106ed906122b8565b6000600483815481106107415761074161221f565b60009182526020909120600a90910201600901805460ff1916921515929092179091555050565b6004818154811061077857600080fd5b60009182526020909120600a90910201805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979950959794969395929491939092919060ff168a565b600560205281600052604060002081815481106107eb57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b3360009081526001602052604090205460ff166108405760405162461bcd60e51b81526004016106ed906122b8565b6000600482815481106108555761085561221f565b600091825260209091206009600a9092020101805460ff19811660ff909116151790555050565b610884611ba1565b61088e81336109fc565b6108eb5760405162461bcd60e51b815260206004820152602860248201527f63616e6e6f7420776974686472617720796574206f7220616c7265616479207760448201526734ba34323930bbb760c11b60648201526084016106ed565b33600090815260056020526040812080548390811061090c5761090c61221f565b90600052602060002090600302019050600060048260010154815481106109355761093561221f565b90600052602060002090600a020190506000826000015490508082600501600082825461096291906122e0565b90915550600090506109748533611307565b90508060066000828254610988919061224b565b909155506109989050818361224b565b600085556003549092506109b6906001600160a01b03163384611bf8565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505050506109f96001600255565b50565b6000610a08838361147c565b158015610a4e57506001600160a01b0382166000908152600560205260408120805485908110610a3a57610a3a61221f565b906000526020600020906003020160000154115b90505b92915050565b6001600160a01b038116600090815260056020526040812081805b8254811015610abc57828181548110610a8d57610a8d61221f565b90600052602060002090600302016000015482610aaa919061224b565b9150610ab58161229f565b9050610a72565b509392505050565b610acc611ba1565b610ad681336109fc565b15610b355760405162461bcd60e51b815260206004820152602960248201527f557365206e6f726d616c20776974686472617720696e7374656164206f6620656044820152686d657267656e63792160b81b60648201526084016106ed565b336000908152600560205260408120805483908110610b5657610b5661221f565b9060005260206000209060030201905060006004826001015481548110610b7f57610b7f61221f565b90600052602060002090600a0201905060008260000154905080826005016000828254610bac91906122e0565b909155505060008355600782015415610c8957600882015415610c06576000612710836008015483610bde919061225e565b610be8919061227d565b600354909150610c04906001600160a01b031661dead83611bf8565b505b612710826007015482610c19919061225e565b610c23919061227d565b610c2d90826122e0565b9050336001600160a01b03167ffe6dd73b024a4498c15a18d15c5fa3f79513e67b7263aceec710ab823403125a612710846007015484610c6d919061225e565b610c77919061227d565b60405190815260200160405180910390a25b600354610ca0906001600160a01b03163383611bf8565b60405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a25050506109f96001600255565b3360009081526001602052604090205460ff16610d115760405162461bcd60e51b81526004016106ed906122b8565b600060048381548110610d2657610d2661221f565b600091825260209091206003600a9092020101919091555050565b6001600160a01b0381166000908152600560205260408120606091600490805b8354811015610db4576000848281548110610d7e57610d7e61221f565b9060005260206000209060030201600001541115610da457610da160018361224b565b91505b610dad8161229f565b9050610d61565b506000610dc282600761225e565b67ffffffffffffffff811115610dda57610dda612147565b604051908082528060200260200182016040528015610e03578160200160208202803683370190505b5090506000805b85548110156110be576000868281548110610e2757610e2761221f565b90600052602060002090600302016000015411156110ae57858181548110610e5157610e5161221f565b600091825260209091206003909102015483610e6e84600761225e565b610e7990600061224b565b81518110610e8957610e8961221f565b602002602001018181525050858181548110610ea757610ea761221f565b90600052602060002090600302016002015483836007610ec7919061225e565b610ed290600161224b565b81518110610ee257610ee261221f565b60200260200101818152505084868281548110610f0157610f0161221f565b90600052602060002090600302016001015481548110610f2357610f2361221f565b60009182526020909120600a909102015483610f4084600761225e565b610f4b90600261224b565b81518110610f5b57610f5b61221f565b60200260200101818152505084868281548110610f7a57610f7a61221f565b90600052602060002090600302016001015481548110610f9c57610f9c61221f565b90600052602060002090600a02016004015483836007610fbc919061225e565b610fc790600361224b565b81518110610fd757610fd761221f565b60209081029190910101528083610fef84600761225e565b610ffa90600461224b565b8151811061100a5761100a61221f565b6020026020010181815250506110208189611307565b8361102c84600761225e565b61103790600561224b565b815181106110475761104761221f565b60200260200101818152505061105d81896109fc565b61106857600061106b565b60015b60ff168361107a84600761225e565b61108590600661224b565b815181106110955761109561221f565b60209081029190910101526110ab60018361224b565b91505b6110b78161229f565b9050610e0a565b50909695505050505050565b6110d2611b47565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b611105611b47565b61110f6000611c60565b565b3360009081526001602052604090205460ff166111405760405162461bcd60e51b81526004016106ed906122b8565b6000600483815481106111555761115561221f565b90600052602060002090600a020190508162015180611174919061225e565b816003016000828254611187919061224b565b9091555050505050565b611199611f83565b6111a1611f83565b6111a9611760565b81526111b361060e565b60208201526111c06111d2565b60408201526006546060820152919050565b600480546000919082805b82811015610abc576127108482815481106111fa576111fa61221f565b90600052602060002090600a02016000015485838154811061121e5761121e61221f565b90600052602060002090600a02016005015461123a919061225e565b611244919061227d565b61124e908361224b565b91506112598161229f565b90506111dd565b60008060008060008060056000886001600160a01b03166001600160a01b03168152602001908152602001600020888154811061129f5761129f61221f565b90600052602060002090600302019050600060048260010154815481106112c8576112c861221f565b90600052602060002090600a02019050816000015482600201548260000154836002015484600401549650965096509650965050509295509295909350565b6001600160a01b03811660009081526005602052604081208054829190859081106113345761133461221f565b6000918252602080832060408051606081018252600390940290910180548452600181015492840183905260020154908301526004805492945091811061137d5761137d61221f565b600091825260208083206040805161014081018252600a9094029091018054845260018101549284019290925260028201548382015260038201546060840152600482015460808401819052600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015260099092015460ff1615156101208401528501519193506114129161224b565b421161142c57604083015161142790426122e0565b611432565b81608001515b9050600061271083608001518385600001518760000151611453919061225e565b61145d919061225e565b611467919061227d565b611471919061227d565b979650505050505050565b6001600160a01b03811660009081526005602052604081208054829190859081106114a9576114a961221f565b90600052602060002090600302019050600060048260010154815481106114d2576114d261221f565b90600052602060002090600a02019050806004015482600201546114f6919061224b565b421015611525574281600401548360020154611512919061224b565b61151c91906122e0565b92505050610a51565b600092505050610a51565b611538611b47565b6004805460018101825560009190915281517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600a9092029182015560208201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015560408201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015560608201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e82015560808201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f82015560a08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a082015560c08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a182015560e08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a28201556101008201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a3820155610120909101517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a4909101805460ff1916911515919091179055565b6000806004838154811061170f5761170f61221f565b60009182526020909120600a90910201600981015490915060ff16801561173a575080600201544210155b8015611759575080600301548160020154611755919061224b565b4211155b9392505050565b6000600481805b825481101561065f578281815481106117825761178261221f565b90600052602060002090600a0201600601548261179f919061224b565b91506117aa8161229f565b9050611767565b6117b9611ba1565b600081116117f45760405162461bcd60e51b81526020600482015260086024820152670616d6f756e7420360c41b60448201526064016106ed565b6000600483815481106118095761180961221f565b90600052602060002090600a02019050611822836116f9565b6118615760405162461bcd60e51b815260206004820152601060248201526f506f6f6c206973206e6f74206c69766560801b60448201526064016106ed565b428160020154106118b45760405162461bcd60e51b815260206004820152601860248201527f706f6f6c20686173206e6f74207374617274656420796574000000000000000060448201526064016106ed565b6003546118cc906001600160a01b0316333085611cb0565b818160050160008282546118e0919061224b565b909155505033600081815260056020818152604080842081516060810183528881528084018a81524293820193845282546001818101855584895286892093516003909202909301908155905181830155925160029093019290925594909352529054900361196457600181600601600082825461195e919061224b565b90915550505b60405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506119a46001600255565b5050565b6119b0611b47565b6001600160a01b038116611a155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b6109f981611c60565b611a26611b47565b6001600160a01b038116611a605760405133904780156108fc02916000818181858888f193505050501580156119a4573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acd91906122f3565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b41919061230c565b50505050565b6000546001600160a01b0316331461110f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ed565b6002805403611bf25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ed565b60028055565b6040516001600160a01b038316602482015260448101829052611c5b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ce8565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611b419085906323b872dd60e01b90608401611c24565b6000611d3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611dba9092919063ffffffff16565b805190915015611c5b5780806020019051810190611d5b919061230c565b611c5b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ed565b6060611dc98484600085611dd1565b949350505050565b606082471015611e325760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106ed565b600080866001600160a01b03168587604051611e4e919061234d565b60006040518083038185875af1925050503d8060008114611e8b576040519150601f19603f3d011682016040523d82523d6000602084013e611e90565b606091505b50915091506114718783838760608315611f0b578251600003611f04576001600160a01b0385163b611f045760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ed565b5081611dc9565b611dc98383815115611f205781518083602001fd5b8060405162461bcd60e51b81526004016106ed9190612369565b6040518061010001604052806000815260200160008152602001600081526020016000151581526020016000151581526020016000815260200160008152602001600081525090565b60405180608001604052806004906020820280368337509192915050565b600060208284031215611fb357600080fd5b5035919050565b60008060408385031215611fcd57600080fd5b50508035926020909101359150565b80151581146109f957600080fd5b8035611ff581611fdc565b919050565b6000806040838503121561200d57600080fd5b82359150602083013561201f81611fdc565b809150509250929050565b80356001600160a01b0381168114611ff557600080fd5b6000806040838503121561205457600080fd5b61205d8361202a565b946020939093013593505050565b6000806040838503121561207e57600080fd5b8235915061208e6020840161202a565b90509250929050565b6000602082840312156120a957600080fd5b610a4e8261202a565b6020808252825182820181905260009190848201906040850190845b818110156110be578351835292840192918401916001016120ce565b600080604083850312156120fd57600080fd5b6121068361202a565b9150602083013561201f81611fdc565b60808101818360005b600481101561213e57815183526020928301929091019060010161211f565b50505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff8111828210171561218f57634e487b7160e01b600052604160045260246000fd5b60405290565b600061014082840312156121a857600080fd5b6121b061215d565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e0820152610100808401358183015250610120612214818501611fea565b908201529392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5157610a51612235565b600081600019048311821515161561227857612278612235565b500290565b60008261229a57634e487b7160e01b600052601260045260246000fd5b500490565b6000600182016122b1576122b1612235565b5060010190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b81810381811115610a5157610a51612235565b60006020828403121561230557600080fd5b5051919050565b60006020828403121561231e57600080fd5b815161175981611fdc565b60005b8381101561234457818101518382015260200161232c565b50506000910152565b6000825161235f818460208701612329565b9190910192915050565b6020815260008251806020840152612388816040850160208701612329565b601f01601f1916919091016040019291505056fea2646970667358221220a766afb030129d37e0e9f55603b5b48eb1c7ab16bca203ceca7c6c0b93bcdd0e64736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063bc9362a2116100a2578063f2fde38b11610071578063f2fde38b146104f2578063f9d0831a14610505578063fc0c546a14610518578063fe9fbb801461052b57600080fd5b8063bc9362a2146104b1578063caa86df7146104c4578063dc58a56c146104d7578063e2bbb158146104df57600080fd5b8063912e1e08116100de578063912e1e081461044857806393f1a40b1461045057806398969e821461048b57806398f64a721461049e57600080fd5b8063715018a6146103f357806382337cf1146103fb57806384e10a901461040e5780638da5cb5b1461042357600080fd5b80632e1a7d4d1161018757806353fcedee1161015657806353fcedee146103a557806359199c6c146103b85780636e7da168146103c0578063711bf9b2146103e057600080fd5b80632e1a7d4d146103495780633ea01b5d1461035c5780634a18bf9d1461037f5780635312ea8e1461039257600080fd5b80630bfd351c116101c35780630bfd351c146102965780631526fe27146102a95780631c43bd7d146103085780631cb197151461033657600080fd5b806303d852ea146101ea5780630a6198861461026b5780630b78f9c014610281575b600080fd5b6101fd6101f8366004611fa1565b610557565b604051610262919060006101008201905082518252602083015160208301526040830151604083015260608301511515606083015260808301511515608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b60405180910390f35b61027361060e565b604051908152602001610262565b61029461028f366004611fba565b610666565b005b6102946102a4366004611ffa565b6106fd565b6102bc6102b7366004611fa1565b610768565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e0840152610100830152151561012082015261014001610262565b61031b610316366004612041565b6107cf565b60408051938452602084019290925290820152606001610262565b610294610344366004611fa1565b610811565b610294610357366004611fa1565b61087c565b61036f61036a36600461206b565b6109fc565b6040519015158152602001610262565b61027361038d366004612097565b610a57565b6102946103a0366004611fa1565b610ac4565b6102946103b3366004611fba565b610ce2565b600654610273565b6103d36103ce366004612097565b610d41565b60405161026291906120b2565b6102946103ee3660046120ea565b6110ca565b6102946110fd565b610294610409366004611fba565b611111565b610416611191565b6040516102629190612116565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610262565b6102736111d2565b61046361045e36600461206b565b611260565b604080519586526020860194909452928401919091526060830152608082015260a001610262565b61027361049936600461206b565b611307565b6102736104ac36600461206b565b61147c565b6102946104bf366004612195565b611530565b61036f6104d2366004611fa1565b6116f9565b610273611760565b6102946104ed366004611fba565b6117b1565b610294610500366004612097565b6119a8565b610294610513366004612097565b611a1e565b600354610430906001600160a01b031681565b61036f610539366004612097565b6001600160a01b031660009081526001602052604090205460ff1690565b61055f611f3a565b6000600483815481106105745761057461221f565b90600052602060002090600a0201905061058c611f3a565b815481526001820154602082015260048201546040820152600982015460ff16151560608201526105bc846116f9565b15156080820152600382015460028301546105d7919061224b565b60a0820152600582015460c082018190528254612710916105f8919061225e565b610602919061227d565b60e08201529392505050565b6000600481805b825481101561065f578281815481106106305761063061221f565b90600052602060002090600a0201600501548261064d919061224b565b91506106588161229f565b9050610615565b5092915050565b61066e611b47565b6000600483815481106106835761068361221f565b90600052602060002090600a02019050610bb88211156106f65760405162461bcd60e51b8152602060048201526024808201527f456d657267656e637957697468647261774665652073686f756c64206265203c60448201526303d2033360e41b60648201526084015b60405180910390fd5b6007015550565b3360009081526001602052604090205460ff1661072c5760405162461bcd60e51b81526004016106ed906122b8565b6000600483815481106107415761074161221f565b60009182526020909120600a90910201600901805460ff1916921515929092179091555050565b6004818154811061077857600080fd5b60009182526020909120600a90910201805460018201546002830154600384015460048501546005860154600687015460078801546008890154600990990154979950959794969395929491939092919060ff168a565b600560205281600052604060002081815481106107eb57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b3360009081526001602052604090205460ff166108405760405162461bcd60e51b81526004016106ed906122b8565b6000600482815481106108555761085561221f565b600091825260209091206009600a9092020101805460ff19811660ff909116151790555050565b610884611ba1565b61088e81336109fc565b6108eb5760405162461bcd60e51b815260206004820152602860248201527f63616e6e6f7420776974686472617720796574206f7220616c7265616479207760448201526734ba34323930bbb760c11b60648201526084016106ed565b33600090815260056020526040812080548390811061090c5761090c61221f565b90600052602060002090600302019050600060048260010154815481106109355761093561221f565b90600052602060002090600a020190506000826000015490508082600501600082825461096291906122e0565b90915550600090506109748533611307565b90508060066000828254610988919061224b565b909155506109989050818361224b565b600085556003549092506109b6906001600160a01b03163384611bf8565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505050506109f96001600255565b50565b6000610a08838361147c565b158015610a4e57506001600160a01b0382166000908152600560205260408120805485908110610a3a57610a3a61221f565b906000526020600020906003020160000154115b90505b92915050565b6001600160a01b038116600090815260056020526040812081805b8254811015610abc57828181548110610a8d57610a8d61221f565b90600052602060002090600302016000015482610aaa919061224b565b9150610ab58161229f565b9050610a72565b509392505050565b610acc611ba1565b610ad681336109fc565b15610b355760405162461bcd60e51b815260206004820152602960248201527f557365206e6f726d616c20776974686472617720696e7374656164206f6620656044820152686d657267656e63792160b81b60648201526084016106ed565b336000908152600560205260408120805483908110610b5657610b5661221f565b9060005260206000209060030201905060006004826001015481548110610b7f57610b7f61221f565b90600052602060002090600a0201905060008260000154905080826005016000828254610bac91906122e0565b909155505060008355600782015415610c8957600882015415610c06576000612710836008015483610bde919061225e565b610be8919061227d565b600354909150610c04906001600160a01b031661dead83611bf8565b505b612710826007015482610c19919061225e565b610c23919061227d565b610c2d90826122e0565b9050336001600160a01b03167ffe6dd73b024a4498c15a18d15c5fa3f79513e67b7263aceec710ab823403125a612710846007015484610c6d919061225e565b610c77919061227d565b60405190815260200160405180910390a25b600354610ca0906001600160a01b03163383611bf8565b60405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a25050506109f96001600255565b3360009081526001602052604090205460ff16610d115760405162461bcd60e51b81526004016106ed906122b8565b600060048381548110610d2657610d2661221f565b600091825260209091206003600a9092020101919091555050565b6001600160a01b0381166000908152600560205260408120606091600490805b8354811015610db4576000848281548110610d7e57610d7e61221f565b9060005260206000209060030201600001541115610da457610da160018361224b565b91505b610dad8161229f565b9050610d61565b506000610dc282600761225e565b67ffffffffffffffff811115610dda57610dda612147565b604051908082528060200260200182016040528015610e03578160200160208202803683370190505b5090506000805b85548110156110be576000868281548110610e2757610e2761221f565b90600052602060002090600302016000015411156110ae57858181548110610e5157610e5161221f565b600091825260209091206003909102015483610e6e84600761225e565b610e7990600061224b565b81518110610e8957610e8961221f565b602002602001018181525050858181548110610ea757610ea761221f565b90600052602060002090600302016002015483836007610ec7919061225e565b610ed290600161224b565b81518110610ee257610ee261221f565b60200260200101818152505084868281548110610f0157610f0161221f565b90600052602060002090600302016001015481548110610f2357610f2361221f565b60009182526020909120600a909102015483610f4084600761225e565b610f4b90600261224b565b81518110610f5b57610f5b61221f565b60200260200101818152505084868281548110610f7a57610f7a61221f565b90600052602060002090600302016001015481548110610f9c57610f9c61221f565b90600052602060002090600a02016004015483836007610fbc919061225e565b610fc790600361224b565b81518110610fd757610fd761221f565b60209081029190910101528083610fef84600761225e565b610ffa90600461224b565b8151811061100a5761100a61221f565b6020026020010181815250506110208189611307565b8361102c84600761225e565b61103790600561224b565b815181106110475761104761221f565b60200260200101818152505061105d81896109fc565b61106857600061106b565b60015b60ff168361107a84600761225e565b61108590600661224b565b815181106110955761109561221f565b60209081029190910101526110ab60018361224b565b91505b6110b78161229f565b9050610e0a565b50909695505050505050565b6110d2611b47565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b611105611b47565b61110f6000611c60565b565b3360009081526001602052604090205460ff166111405760405162461bcd60e51b81526004016106ed906122b8565b6000600483815481106111555761115561221f565b90600052602060002090600a020190508162015180611174919061225e565b816003016000828254611187919061224b565b9091555050505050565b611199611f83565b6111a1611f83565b6111a9611760565b81526111b361060e565b60208201526111c06111d2565b60408201526006546060820152919050565b600480546000919082805b82811015610abc576127108482815481106111fa576111fa61221f565b90600052602060002090600a02016000015485838154811061121e5761121e61221f565b90600052602060002090600a02016005015461123a919061225e565b611244919061227d565b61124e908361224b565b91506112598161229f565b90506111dd565b60008060008060008060056000886001600160a01b03166001600160a01b03168152602001908152602001600020888154811061129f5761129f61221f565b90600052602060002090600302019050600060048260010154815481106112c8576112c861221f565b90600052602060002090600a02019050816000015482600201548260000154836002015484600401549650965096509650965050509295509295909350565b6001600160a01b03811660009081526005602052604081208054829190859081106113345761133461221f565b6000918252602080832060408051606081018252600390940290910180548452600181015492840183905260020154908301526004805492945091811061137d5761137d61221f565b600091825260208083206040805161014081018252600a9094029091018054845260018101549284019290925260028201548382015260038201546060840152600482015460808401819052600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015260099092015460ff1615156101208401528501519193506114129161224b565b421161142c57604083015161142790426122e0565b611432565b81608001515b9050600061271083608001518385600001518760000151611453919061225e565b61145d919061225e565b611467919061227d565b611471919061227d565b979650505050505050565b6001600160a01b03811660009081526005602052604081208054829190859081106114a9576114a961221f565b90600052602060002090600302019050600060048260010154815481106114d2576114d261221f565b90600052602060002090600a02019050806004015482600201546114f6919061224b565b421015611525574281600401548360020154611512919061224b565b61151c91906122e0565b92505050610a51565b600092505050610a51565b611538611b47565b6004805460018101825560009190915281517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600a9092029182015560208201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015560408201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015560608201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e82015560808201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f82015560a08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a082015560c08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a182015560e08201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a28201556101008201517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a3820155610120909101517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a4909101805460ff1916911515919091179055565b6000806004838154811061170f5761170f61221f565b60009182526020909120600a90910201600981015490915060ff16801561173a575080600201544210155b8015611759575080600301548160020154611755919061224b565b4211155b9392505050565b6000600481805b825481101561065f578281815481106117825761178261221f565b90600052602060002090600a0201600601548261179f919061224b565b91506117aa8161229f565b9050611767565b6117b9611ba1565b600081116117f45760405162461bcd60e51b81526020600482015260086024820152670616d6f756e7420360c41b60448201526064016106ed565b6000600483815481106118095761180961221f565b90600052602060002090600a02019050611822836116f9565b6118615760405162461bcd60e51b815260206004820152601060248201526f506f6f6c206973206e6f74206c69766560801b60448201526064016106ed565b428160020154106118b45760405162461bcd60e51b815260206004820152601860248201527f706f6f6c20686173206e6f74207374617274656420796574000000000000000060448201526064016106ed565b6003546118cc906001600160a01b0316333085611cb0565b818160050160008282546118e0919061224b565b909155505033600081815260056020818152604080842081516060810183528881528084018a81524293820193845282546001818101855584895286892093516003909202909301908155905181830155925160029093019290925594909352529054900361196457600181600601600082825461195e919061224b565b90915550505b60405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2506119a46001600255565b5050565b6119b0611b47565b6001600160a01b038116611a155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ed565b6109f981611c60565b611a26611b47565b6001600160a01b038116611a605760405133904780156108fc02916000818181858888f193505050501580156119a4573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acd91906122f3565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b41919061230c565b50505050565b6000546001600160a01b0316331461110f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ed565b6002805403611bf25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ed565b60028055565b6040516001600160a01b038316602482015260448101829052611c5b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ce8565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611b419085906323b872dd60e01b90608401611c24565b6000611d3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611dba9092919063ffffffff16565b805190915015611c5b5780806020019051810190611d5b919061230c565b611c5b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ed565b6060611dc98484600085611dd1565b949350505050565b606082471015611e325760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106ed565b600080866001600160a01b03168587604051611e4e919061234d565b60006040518083038185875af1925050503d8060008114611e8b576040519150601f19603f3d011682016040523d82523d6000602084013e611e90565b606091505b50915091506114718783838760608315611f0b578251600003611f04576001600160a01b0385163b611f045760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ed565b5081611dc9565b611dc98383815115611f205781518083602001fd5b8060405162461bcd60e51b81526004016106ed9190612369565b6040518061010001604052806000815260200160008152602001600081526020016000151581526020016000151581526020016000815260200160008152602001600081525090565b60405180608001604052806004906020820280368337509192915050565b600060208284031215611fb357600080fd5b5035919050565b60008060408385031215611fcd57600080fd5b50508035926020909101359150565b80151581146109f957600080fd5b8035611ff581611fdc565b919050565b6000806040838503121561200d57600080fd5b82359150602083013561201f81611fdc565b809150509250929050565b80356001600160a01b0381168114611ff557600080fd5b6000806040838503121561205457600080fd5b61205d8361202a565b946020939093013593505050565b6000806040838503121561207e57600080fd5b8235915061208e6020840161202a565b90509250929050565b6000602082840312156120a957600080fd5b610a4e8261202a565b6020808252825182820181905260009190848201906040850190845b818110156110be578351835292840192918401916001016120ce565b600080604083850312156120fd57600080fd5b6121068361202a565b9150602083013561201f81611fdc565b60808101818360005b600481101561213e57815183526020928301929091019060010161211f565b50505092915050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff8111828210171561218f57634e487b7160e01b600052604160045260246000fd5b60405290565b600061014082840312156121a857600080fd5b6121b061215d565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e0820152610100808401358183015250610120612214818501611fea565b908201529392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5157610a51612235565b600081600019048311821515161561227857612278612235565b500290565b60008261229a57634e487b7160e01b600052601260045260246000fd5b500490565b6000600182016122b1576122b1612235565b5060010190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b81810381811115610a5157610a51612235565b60006020828403121561230557600080fd5b5051919050565b60006020828403121561231e57600080fd5b815161175981611fdc565b60005b8381101561234457818101518382015260200161232c565b50506000910152565b6000825161235f818460208701612329565b9190910192915050565b6020815260008251806020840152612388816040850160208701612329565b601f01601f1916919091016040019291505056fea2646970667358221220a766afb030129d37e0e9f55603b5b48eb1c7ab16bca203ceca7c6c0b93bcdd0e64736f6c63430008100033
Deployed Bytecode Sourcemap
22187:10927:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25404:713;;;;;;:::i;:::-;;:::i;:::-;;;;;;355:4:1;397:3;386:9;382:19;374:27;;434:6;428:13;417:9;410:32;498:4;490:6;486:17;480:24;473:4;462:9;458:20;451:54;561:4;553:6;549:17;543:24;536:4;525:9;521:20;514:54;638:4;630:6;626:17;620:24;613:32;606:40;599:4;588:9;584:20;577:70;717:4;709:6;705:17;699:24;692:32;685:40;678:4;667:9;663:20;656:70;782:4;774:6;770:17;764:24;757:4;746:9;742:20;735:54;845:4;837:6;833:17;827:24;820:4;809:9;805:20;798:54;908:4;900:6;896:17;890:24;883:4;872:9;868:20;861:54;199:722;;;;;25404:713:0;;;;;;;;29283:324;;;:::i;:::-;;;1072:25:1;;;1060:2;1045:18;29283:324:0;926:177:1;24424:242:0;;;;;;:::i;:::-;;:::i;:::-;;24674:165;;;;;;:::i;:::-;;:::i;23037:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;2324:25:1;;;2380:2;2365:18;;2358:34;;;;2408:18;;;2401:34;;;;2466:2;2451:18;;2444:34;;;;2509:3;2494:19;;2487:35;;;;2553:3;2538:19;;2531:35;2597:3;2582:19;;2575:35;2641:3;2626:19;;2619:35;2685:3;2670:19;;2663:35;2742:14;2735:22;2729:3;2714:19;;2707:51;2311:3;2296:19;23037:26:0;1931:833:1;23070:48:0;;;;;;:::i;:::-;;:::i;:::-;;;;3408:25:1;;;3464:2;3449:18;;3442:34;;;;3492:18;;;3485:34;3396:2;3381:18;23070:48:0;3206:319:1;24847:151:0;;;;;;:::i;:::-;;:::i;31473:680::-;;;;;;:::i;:::-;;:::i;26625:186::-;;;;;;:::i;:::-;;:::i;:::-;;;3954:14:1;;3947:22;3929:41;;3917:2;3902:18;26625:186:0;3789:187:1;28628:329:0;;;;;;:::i;:::-;;:::i;32161:950::-;;;;;;:::i;:::-;;:::i;25006:187::-;;;;;;:::i;:::-;;:::i;29995:114::-;30079:22;;29995:114;;27589:1031;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18392:128::-;;;;;;:::i;:::-;;:::i;19371:103::-;;;:::i;25201:195::-;;;;;;:::i;:::-;;:::i;30117:322::-;;;:::i;:::-;;;;;;;:::i;18723:87::-;18769:7;18796:6;-1:-1:-1;;;;;18796:6:0;18723:87;;;-1:-1:-1;;;;;5793:32:1;;;5775:51;;5763:2;5748:18;18723:87:0;5629:203:1;29615:372:0;;;:::i;27243:338::-;;;;;;:::i;:::-;;:::i;:::-;;;;6096:25:1;;;6152:2;6137:18;;6130:34;;;;6180:18;;;6173:34;;;;6238:2;6223:18;;6216:34;6281:3;6266:19;;6259:35;6083:3;6068:19;27243:338:0;5837:463:1;26125:490:0;;;;;;:::i;:::-;;:::i;26819:416::-;;;;;;:::i;:::-;;:::i;24321:95::-;;;;;;:::i;:::-;;:::i;30447:248::-;;;;;;:::i;:::-;;:::i;28965:310::-;;;:::i;30703:762::-;;;;;;:::i;:::-;;:::i;19629:201::-;;;;;;:::i;:::-;;:::i;23947:366::-;;;;;;:::i;:::-;;:::i;23009:19::-;;;;;-1:-1:-1;;;;;23009:19:0;;;18528:114;;;;;;:::i;:::-;-1:-1:-1;;;;;18613:21:0;18589:4;18613:21;;;:11;:21;;;;;;;;;18528:114;25404:713;25472:22;;:::i;:::-;25507:21;25531:8;25540:7;25531:17;;;;;;;;:::i;:::-;;;;;;;;;;;25507:41;;25559:38;;:::i;:::-;25637:13;;25610:40;;25683:8;;;;25661:19;;;:30;25731:15;;;;25702:26;;;:44;25782:11;;;;;;25757:36;;:22;;;:36;25829:19;25840:7;25829:10;:19::i;:::-;25804:44;;:22;;;:44;25905:15;;;;25887;;;;:33;;25905:15;25887:33;:::i;:::-;25861:23;;;:59;25966:21;;;;25931:32;;;:56;;;26052:13;;26069:5;;26028:37;;26052:13;26028:37;:::i;:::-;26027:47;;;;:::i;:::-;25998:26;;;:76;:15;25404:713;-1:-1:-1;;;25404:713:0:o;29283:324::-;29340:7;29386:8;29340:7;;29446:116;29469:11;;29465:15;;29446:116;;;29526:4;29531:1;29526:7;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;29502:48;;;;;:::i;:::-;;-1:-1:-1;29482:3:0;;;:::i;:::-;;;29446:116;;;-1:-1:-1;29579:20:0;29283:324;-1:-1:-1;;29283:324:0:o;24424:242::-;18234:13;:11;:13::i;:::-;24500:21:::1;24524:8;24533:7;24524:17;;;;;;;;:::i;:::-;;;;;;;;;;;24500:41;;24569:4;24560:5;:13;;24552:62;;;::::0;-1:-1:-1;;;24552:62:0;;9057:2:1;24552:62:0::1;::::0;::::1;9039:21:1::0;9096:2;9076:18;;;9069:30;9135:34;9115:18;;;9108:62;-1:-1:-1;;;9186:18:1;;;9179:34;9230:19;;24552:62:0::1;;;;;;;;;24625:25;;:33:::0;-1:-1:-1;24424:242:0:o;24674:165::-;17549:10;18320:25;;;;:11;:25;;;;;;;;18312:52;;;;-1:-1:-1;;;18312:52:0;;;;;;;:::i;:::-;24761:21:::1;24785:8;24794:4;24785:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;24810:11;;:21:::0;;-1:-1:-1;;24810:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;24674:165:0:o;23037:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23037:26:0;;;;;;;;;;;;;;;;;:::o;23070:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23070:48:0;;-1:-1:-1;23070:48:0;:::o;24847:151::-;17549:10;18320:25;;;;:11;:25;;;;;;;;18312:52;;;;-1:-1:-1;;;18312:52:0;;;;;;;:::i;:::-;24915:21:::1;24939:8;24948:4;24939:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;24979:11:::1;24939:14;::::0;;::::1;;24979:11;::::0;;-1:-1:-1;;24964:26:0;::::1;24979:11;::::0;;::::1;24978:12;24964:26;::::0;;-1:-1:-1;;24847:151:0:o;31473:680::-;21590:21;:19;:21::i;:::-;31547:32:::1;31559:8;31568:10;31547:11;:32::i;:::-;31539:84;;;::::0;-1:-1:-1;;;31539:84:0;;9805:2:1;31539:84:0::1;::::0;::::1;9787:21:1::0;9844:2;9824:18;;;9817:30;9883:34;9863:18;;;9856:62;-1:-1:-1;;;9934:18:1;;;9927:38;9982:19;;31539:84:0::1;9603:404:1::0;31539:84:0::1;31670:10;31634:23;31660:21:::0;;;:9:::1;:21;::::0;;;;:31;;31682:8;;31660:31;::::1;;;;;:::i;:::-;;;;;;;;;;;31634:57;;31702:21;31726:8;31735:5;:12;;;31726:22;;;;;;;;:::i;:::-;;;;;;;;;;;31702:46;;31769:15;31787:5;:12;;;31769:30;;31835:7;31810:4;:21;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;31863:22:0::1;::::0;-1:-1:-1;31888:35:0::1;31902:8:::0;31912:10:::1;31888:13;:35::i;:::-;31863:60;;31962:14;31936:22;;:40;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;31987:25:0::1;::::0;-1:-1:-1;31998:14:0;31987:25;::::1;:::i;:::-;32036:1;32023:14:::0;;32050:5:::1;::::0;31987:25;;-1:-1:-1;32050:48:0::1;::::0;-1:-1:-1;;;;;32050:5:0::1;32077:10;31987:25:::0;32050:18:::1;:48::i;:::-;32116:29;::::0;1072:25:1;;;32125:10:0::1;::::0;32116:29:::1;::::0;1060:2:1;1045:18;32116:29:0::1;;;;;;;31528:625;;;;21634:20:::0;21028:1;22150:7;:22;21967:213;21634:20;31473:680;:::o;26625:186::-;26700:4;26725:33;26743:8;26752:5;26725:17;:33::i;:::-;:36;:77;;;;-1:-1:-1;;;;;;26765:16:0;;26801:1;26765:16;;;:9;:16;;;;;:26;;26782:8;;26765:26;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:37;26725:77;26717:86;;26625:186;;;;;:::o;28628:329::-;-1:-1:-1;;;;;28745:16:0;;28697:7;28745:16;;;:9;:16;;;;;28697:7;;28810:105;28833:12;;28829:16;;28810:105;;;28888:5;28894:1;28888:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;28867:36;;;;;:::i;:::-;;-1:-1:-1;28847:3:0;;;:::i;:::-;;;28810:105;;;-1:-1:-1;28932:17:0;28628:329;-1:-1:-1;;;28628:329:0:o;32161:950::-;21590:21;:19;:21::i;:::-;32245:32:::1;32257:8;32266:10;32245:11;:32::i;:::-;32244:33;32236:86;;;::::0;-1:-1:-1;;;32236:86:0;;10347:2:1;32236:86:0::1;::::0;::::1;10329:21:1::0;10386:2;10366:18;;;10359:30;10425:34;10405:18;;;10398:62;-1:-1:-1;;;10476:18:1;;;10469:39;10525:19;;32236:86:0::1;10145:405:1::0;32236:86:0::1;32369:10;32333:23;32359:21:::0;;;:9:::1;:21;::::0;;;;:31;;32381:8;;32359:31;::::1;;;;;:::i;:::-;;;;;;;;;;;32333:57;;32401:21;32425:8;32434:5;:12;;;32425:22;;;;;;;;:::i;:::-;;;;;;;;;;;32401:46;;32468:15;32486:5;:12;;;32468:30;;32537:7;32512:4;:21;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;32570:1:0::1;32555:16:::0;;32587:25:::1;::::0;::::1;::::0;:27;32584:403:::1;;32633:12;::::0;::::1;::::0;:16;32630:161:::1;;32665:15;32710:6;32694:4;:12;;;32684:7;:22;;;;:::i;:::-;32683:33;;;;:::i;:::-;32731:5;::::0;32665:51;;-1:-1:-1;32731:44:0::1;::::0;-1:-1:-1;;;;;32731:5:0::1;32758:6;32665:51:::0;32731:18:::1;:44::i;:::-;32650:141;32630:161;32858:6;32829:4;:25;;;32819:7;:35;;;;:::i;:::-;32818:46;;;;:::i;:::-;32807:57;::::0;;::::1;:::i;:::-;;;32914:10;-1:-1:-1::0;;;;;32885:89:0::1;;32967:6;32938:4;:25;;;32928:7;:35;;;;:::i;:::-;32927:46;;;;:::i;:::-;32885:89;::::0;1072:25:1;;;1060:2;1045:18;32885:89:0::1;;;;;;;32584:403;32999:5;::::0;:48:::1;::::0;-1:-1:-1;;;;;32999:5:0::1;33026:10;33039:7:::0;32999:18:::1;:48::i;:::-;33065:38;::::0;1072:25:1;;;33083:10:0::1;::::0;33065:38:::1;::::0;1060:2:1;1045:18;33065:38:0::1;;;;;;;32225:886;;;21634:20:::0;21028:1;22150:7;:22;21967:213;25006:187;17549:10;18320:25;;;;:11;:25;;;;;;;;18312:52;;;;-1:-1:-1;;;18312:52:0;;;;;;;:::i;:::-;25104:21:::1;25128:8;25137:7;25128:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;25156:15:::1;25128:17;::::0;;::::1;;25156:15;:29:::0;;;;-1:-1:-1;;25006:187:0:o;27589:1031::-;-1:-1:-1;;;;;27705:16:0;;27677:25;27705:16;;;:9;:16;;;;;27648;;27758:8;;27677:25;27814:111;27837:12;;27833:16;;27814:111;;;27889:1;27873:5;27879:1;27873:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;:17;27870:55;;;27909:16;27924:1;27909:16;;:::i;:::-;;;27870:55;27851:3;;;:::i;:::-;;;27814:111;;;-1:-1:-1;27950:28:0;27995:15;:13;28009:1;27995:15;:::i;:::-;27981:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27981:30:0;;27950:61;;28022:9;28048;28044:540;28067:12;;28063:16;;28044:540;;;28119:1;28103:5;28109:1;28103:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;:17;28100:473;;;28159:5;28165:1;28159:8;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:15;28140:11;28152:3;:1;28154;28152:3;:::i;:::-;:5;;28156:1;28152:5;:::i;:::-;28140:18;;;;;;;;:::i;:::-;;;;;;:34;;;;;28212:5;28218:1;28212:8;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;28193:11;28205:1;28207;28205:3;;;;:::i;:::-;:5;;28209:1;28205:5;:::i;:::-;28193:18;;;;;;;;:::i;:::-;;;;;;:39;;;;;28270:4;28275:5;28281:1;28275:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;28270:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:30;28251:11;28263:3;:1;28265;28263:3;:::i;:::-;:5;;28267:1;28263:5;:::i;:::-;28251:18;;;;;;;;:::i;:::-;;;;;;:49;;;;;28338:4;28343:5;28349:1;28343:8;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;28338:21;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;28319:11;28331:1;28333;28331:3;;;;:::i;:::-;:5;;28335:1;28331:5;:::i;:::-;28319:18;;;;;;;;:::i;:::-;;;;;;;;;;:51;28408:1;28389:11;28401:3;:1;28403;28401:3;:::i;:::-;:5;;28405:1;28401:5;:::i;:::-;28389:18;;;;;;;;:::i;:::-;;;;;;:20;;;;;28447:22;28461:1;28463:5;28447:13;:22::i;:::-;28428:11;28440:3;:1;28442;28440:3;:::i;:::-;:5;;28444:1;28440:5;:::i;:::-;28428:18;;;;;;;;:::i;:::-;;;;;;:41;;;;;28507:20;28519:1;28521:5;28507:11;:20::i;:::-;:27;;28533:1;28507:27;;;28529:1;28507:27;28488:46;;:11;28500:3;:1;28502;28500:3;:::i;:::-;:5;;28504:1;28500:5;:::i;:::-;28488:18;;;;;;;;:::i;:::-;;;;;;;;;;:46;28553:4;28556:1;28553:4;;:::i;:::-;;;28100:473;28081:3;;;:::i;:::-;;;28044:540;;;-1:-1:-1;28601:11:0;;27589:1031;-1:-1:-1;;;;;;27589:1031:0:o;18392:128::-;18234:13;:11;:13::i;:::-;-1:-1:-1;;;;;18478:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:34;;-1:-1:-1;;18478:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18392:128::o;19371:103::-;18234:13;:11;:13::i;:::-;19436:30:::1;19463:1;19436:18;:30::i;:::-;19371:103::o:0;25201:195::-;17549:10;18320:25;;;;:11;:25;;;;;;;;18312:52;;;;-1:-1:-1;;;18312:52:0;;;;;;;:::i;:::-;25297:21:::1;25321:8;25330:7;25321:17;;;;;;;;:::i;:::-;;;;;;;;;;;25297:41;;25369:9;25381:6;25369:18;;;;:::i;:::-;25349:4;:15;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;25201:195:0:o;30117:322::-;30160:17;;:::i;:::-;30190:24;;:::i;:::-;30239:22;:20;:22::i;:::-;30227:34;;30284:27;:25;:27::i;:::-;30272:9;;;:39;30334:21;:19;:21::i;:::-;30322:9;;;:33;30079:22;;30366:9;;;:39;:6;30425;-1:-1:-1;30117:322:0:o;29615:372::-;29712:8;29749:15;;29666:7;;29712:8;29666:7;;29810:136;29833:5;29829:1;:9;29810:136;;;29928:6;29908:4;29913:1;29908:7;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;29881:4;29886:1;29881:7;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;:43;;;;:::i;:::-;29880:54;;;;:::i;:::-;29860:74;;;;:::i;:::-;;-1:-1:-1;29840:3:0;;;:::i;:::-;;;29810:136;;27243:338;27313:7;27321;27329;27337;27345;27365:23;27391:9;:16;27401:5;-1:-1:-1;;;;;27391:16:0;-1:-1:-1;;;;;27391:16:0;;;;;;;;;;;;27408:7;27391:25;;;;;;;;:::i;:::-;;;;;;;;;;;27365:51;;27427:21;27451:8;27460:5;:12;;;27451:22;;;;;;;;:::i;:::-;;;;;;;;;;;27427:46;;27492:5;:12;;;27506:5;:17;;;27525:4;:13;;;27540:4;:15;;;27557:4;:15;;;27484:89;;;;;;;;;;;;27243:338;;;;;;;;:::o;26125:490::-;-1:-1:-1;;;;;26247:16:0;;26202:7;26247:16;;;:9;:16;;;;;:26;;26202:7;;26247:16;26264:8;;26247:26;;;;;;:::i;:::-;;;;;;;;;26222:51;;;;;;;;26247:26;;;;;;;26222:51;;;;;;;;;;;;;;;;;;;;;26307:8;:22;;26222:51;;-1:-1:-1;26307:8:0;:22;;;;;;:::i;:::-;;;;;;;;;26284:45;;;;;;;;26307:22;;;;;;;26284:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26389:17;;;26284:45;;-1:-1:-1;26389:35:0;;;:::i;:::-;26371:15;:53;:109;;26463:17;;;;26445:35;;:15;:35;:::i;:::-;26371:109;;;26427:4;:15;;;26371:109;26350:130;;26491:14;26577:6;26558:4;:15;;;26544:10;26526:4;:13;;;26511:5;:12;;;:28;;;;:::i;:::-;26510:44;;;;:::i;:::-;26509:64;;;;:::i;:::-;26508:75;;;;:::i;:::-;26491:92;26125:490;-1:-1:-1;;;;;;;26125:490:0:o;26819:416::-;-1:-1:-1;;;;;26946:16:0;;26900:7;26946:16;;;:9;:16;;;;;:26;;26900:7;;26946:16;26963:8;;26946:26;;;;;;:::i;:::-;;;;;;;;;;;26920:52;;26983:22;27008:8;27017:5;:12;;;27008:22;;;;;;;;:::i;:::-;;;;;;;;;;;26983:47;;27084:4;:15;;;27064:5;:17;;;:35;;;;:::i;:::-;27046:15;:53;27041:187;;;27162:15;27143:4;:15;;;27123:5;:17;;;:35;;;;:::i;:::-;:54;;;;:::i;:::-;27116:61;;;;;;27041:187;27215:1;27208:8;;;;;;24321:95;18234:13;:11;:13::i;:::-;24389:8:::1;:19:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24389:19:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;24389:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24321:95::o;30447:248::-;30504:4;30521:21;30545:8;30554:7;30545:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;30581:11;;;;30545:17;;-1:-1:-1;30581:11:0;;:49;;;;;30615:4;:15;;;30596;:34;;30581:49;:105;;;;;30671:4;:15;;;30653:4;:15;;;:33;;;;:::i;:::-;30634:15;:52;;30581:105;30573:114;30447:248;-1:-1:-1;;;30447:248:0:o;28965:310::-;29017:7;29063:8;29017:7;;29120:113;29143:11;;29139:15;;29120:113;;;29197:4;29202:1;29197:7;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;29176:45;;;;;:::i;:::-;;-1:-1:-1;29156:3:0;;;:::i;:::-;;;29120:113;;30703:762;21590:21;:19;:21::i;:::-;30802:1:::1;30792:7;:11;30783:33;;;::::0;-1:-1:-1;;;30783:33:0;;10757:2:1;30783:33:0::1;::::0;::::1;10739:21:1::0;10796:1;10776:18;;;10769:29;-1:-1:-1;;;10814:18:1;;;10807:38;10862:18;;30783:33:0::1;10555:331:1::0;30783:33:0::1;30827:21;30851:8;30860:7;30851:17;;;;;;;;:::i;:::-;;;;;;;;;;;30827:41;;30889:19;30900:7;30889:10;:19::i;:::-;30881:47;;;::::0;-1:-1:-1;;;30881:47:0;;11093:2:1;30881:47:0::1;::::0;::::1;11075:21:1::0;11132:2;11112:18;;;11105:30;-1:-1:-1;;;11151:18:1;;;11144:46;11207:18;;30881:47:0::1;10891:340:1::0;30881:47:0::1;30965:15;30947:4;:15;;;:33;30939:69;;;::::0;-1:-1:-1;;;30939:69:0;;11438:2:1;30939:69:0::1;::::0;::::1;11420:21:1::0;11477:2;11457:18;;;11450:30;11516:26;11496:18;;;11489:54;11560:18;;30939:69:0::1;11236:348:1::0;30939:69:0::1;31029:5;::::0;:67:::1;::::0;-1:-1:-1;;;;;31029:5:0::1;31060:10;31081:4;31088:7:::0;31029:22:::1;:67::i;:::-;31134:7;31109:4;:21;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;31172:10:0::1;31162:21;::::0;;;:9:::1;:21;::::0;;;;;;;31189:125;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;31287:15:::1;31189:125:::0;;;;;;31162:153;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;31331:21;;;;;:28;;:31;;31328:86:::1;;31401:1;31378:4;:21;;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;31328:86:0::1;31429:28;::::0;1072:25:1;;;31437:10:0::1;::::0;31429:28:::1;::::0;1060:2:1;1045:18;31429:28:0::1;;;;;;;30772:693;21634:20:::0;21028:1;22150:7;:22;21967:213;21634:20;30703:762;;:::o;19629:201::-;18234:13;:11;:13::i;:::-;-1:-1:-1;;;;;19718:22:0;::::1;19710:73;;;::::0;-1:-1:-1;;;19710:73:0;;11791:2:1;19710:73:0::1;::::0;::::1;11773:21:1::0;11830:2;11810:18;;;11803:30;11869:34;11849:18;;;11842:62;-1:-1:-1;;;11920:18:1;;;11913:36;11966:19;;19710:73:0::1;11589:402:1::0;19710:73:0::1;19794:28;19813:8;19794:18;:28::i;23947:366::-:0;18234:13;:11;:13::i;:::-;-1:-1:-1;;;;;24023:22:0;::::1;24019:127;;24062:51;::::0;24070:10:::1;::::0;24091:21:::1;24062:51:::0;::::1;;;::::0;::::1;::::0;;;24091:21;24070:10;24062:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;24019:127;24219:35;::::0;-1:-1:-1;;;24219:35:0;;24248:4:::1;24219:35;::::0;::::1;5775:51:1::0;24183:6:0;;24156:17:::1;::::0;-1:-1:-1;;;;;24219:20:0;::::1;::::0;::::1;::::0;5748:18:1;;24219:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24265:40;::::0;-1:-1:-1;;;24265:40:0;;24285:10:::1;24265:40;::::0;::::1;12359:51:1::0;12426:18;;;12419:34;;;24201:53:0;;-1:-1:-1;;;;;;24265:19:0;::::1;::::0;::::1;::::0;12332:18:1;;24265:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24008:305;;23947:366:::0;:::o;18888:132::-;18769:7;18796:6;-1:-1:-1;;;;;18796:6:0;17549:10;18952:23;18944:68;;;;-1:-1:-1;;;18944:68:0;;12916:2:1;18944:68:0;;;12898:21:1;;;12935:18;;;12928:30;12994:34;12974:18;;;12967:62;13046:18;;18944:68:0;12714:356:1;21670:289:0;21072:1;21800:7;;:19;21792:63;;;;-1:-1:-1;;;21792:63:0;;13277:2:1;21792:63:0;;;13259:21:1;13316:2;13296:18;;;13289:30;13355:33;13335:18;;;13328:61;13406:18;;21792:63:0;13075:355:1;21792:63:0;21072:1;21933:18;;21670:289::o;13646:211::-;13790:58;;-1:-1:-1;;;;;12377:32:1;;13790:58:0;;;12359:51:1;12426:18;;;12419:34;;;13763:86:0;;13783:5;;-1:-1:-1;;;13813:23:0;12332:18:1;;13790:58:0;;;;-1:-1:-1;;13790:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13790:58:0;-1:-1:-1;;;;;;13790:58:0;;;;;;;;;;13763:19;:86::i;:::-;13646:211;;;:::o;19990:191::-;20064:16;20083:6;;-1:-1:-1;;;;;20100:17:0;;;-1:-1:-1;;;;;;20100:17:0;;;;;;20133:40;;20083:6;;;;;;;20133:40;;20064:16;20133:40;20053:128;19990:191;:::o;13865:248::-;14036:68;;-1:-1:-1;;;;;13693:15:1;;;14036:68:0;;;13675:34:1;13745:15;;13725:18;;;13718:43;13777:18;;;13770:34;;;14009:96:0;;14029:5;;-1:-1:-1;;;14059:27:0;13610:18:1;;14036:68:0;13435:375:1;16713:716:0;17137:23;17163:69;17191:4;17163:69;;;;;;;;;;;;;;;;;17171:5;-1:-1:-1;;;;;17163:27:0;;;:69;;;;;:::i;:::-;17247:17;;17137:95;;-1:-1:-1;17247:21:0;17243:179;;17344:10;17333:30;;;;;;;;;;;;:::i;:::-;17325:85;;;;-1:-1:-1;;;17325:85:0;;14017:2:1;17325:85:0;;;13999:21:1;14056:2;14036:18;;;14029:30;14095:34;14075:18;;;14068:62;-1:-1:-1;;;14146:18:1;;;14139:40;14196:19;;17325:85:0;13815:406:1;8149:229:0;8286:12;8318:52;8340:6;8348:4;8354:1;8357:12;8318:21;:52::i;:::-;8311:59;8149:229;-1:-1:-1;;;;8149:229:0:o;9269:455::-;9439:12;9497:5;9472:21;:30;;9464:81;;;;-1:-1:-1;;;9464:81:0;;14428:2:1;9464:81:0;;;14410:21:1;14467:2;14447:18;;;14440:30;14506:34;14486:18;;;14479:62;-1:-1:-1;;;14557:18:1;;;14550:36;14603:19;;9464:81:0;14226:402:1;9464:81:0;9557:12;9571:23;9598:6;-1:-1:-1;;;;;9598:11:0;9617:5;9624:4;9598:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9556:73;;;;9647:69;9674:6;9682:7;9691:10;9703:12;12027;12056:7;12052:427;;;12084:10;:17;12105:1;12084:22;12080:290;;-1:-1:-1;;;;;5687:19:0;;;12294:60;;;;-1:-1:-1;;;12294:60:0;;15382:2:1;12294:60:0;;;15364:21:1;15421:2;15401:18;;;15394:30;15460:31;15440:18;;;15433:59;15509:18;;12294:60:0;15180:353:1;12294:60:0;-1:-1:-1;12391:10:0;12384:17;;12052:427;12434:33;12442:10;12454:12;13189:17;;:21;13185:388;;13421:10;13415:17;13478:15;13465:10;13461:2;13457:19;13450:44;13185:388;13548:12;13541:20;;-1:-1:-1;;;13541:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;1108:248::-;1176:6;1184;1237:2;1225:9;1216:7;1212:23;1208:32;1205:52;;;1253:1;1250;1243:12;1205:52;-1:-1:-1;;1276:23:1;;;1346:2;1331:18;;;1318:32;;-1:-1:-1;1108:248:1:o;1361:118::-;1447:5;1440:13;1433:21;1426:5;1423:32;1413:60;;1469:1;1466;1459:12;1484:128;1549:20;;1578:28;1549:20;1578:28;:::i;:::-;1484:128;;;:::o;1617:309::-;1682:6;1690;1743:2;1731:9;1722:7;1718:23;1714:32;1711:52;;;1759:1;1756;1749:12;1711:52;1795:9;1782:23;1772:33;;1855:2;1844:9;1840:18;1827:32;1868:28;1890:5;1868:28;:::i;:::-;1915:5;1905:15;;;1617:309;;;;;:::o;2769:173::-;2837:20;;-1:-1:-1;;;;;2886:31:1;;2876:42;;2866:70;;2932:1;2929;2922:12;2947:254;3015:6;3023;3076:2;3064:9;3055:7;3051:23;3047:32;3044:52;;;3092:1;3089;3082:12;3044:52;3115:29;3134:9;3115:29;:::i;:::-;3105:39;3191:2;3176:18;;;;3163:32;;-1:-1:-1;;;2947:254:1:o;3530:::-;3598:6;3606;3659:2;3647:9;3638:7;3634:23;3630:32;3627:52;;;3675:1;3672;3665:12;3627:52;3711:9;3698:23;3688:33;;3740:38;3774:2;3763:9;3759:18;3740:38;:::i;:::-;3730:48;;3530:254;;;;;:::o;3981:186::-;4040:6;4093:2;4081:9;4072:7;4068:23;4064:32;4061:52;;;4109:1;4106;4099:12;4061:52;4132:29;4151:9;4132:29;:::i;4172:632::-;4343:2;4395:21;;;4465:13;;4368:18;;;4487:22;;;4314:4;;4343:2;4566:15;;;;4540:2;4525:18;;;4314:4;4609:169;4623:6;4620:1;4617:13;4609:169;;;4684:13;;4672:26;;4753:15;;;;4718:12;;;;4645:1;4638:9;4609:169;;4809:315;4874:6;4882;4935:2;4923:9;4914:7;4910:23;4906:32;4903:52;;;4951:1;4948;4941:12;4903:52;4974:29;4993:9;4974:29;:::i;:::-;4964:39;;5053:2;5042:9;5038:18;5025:32;5066:28;5088:5;5066:28;:::i;5129:495::-;5309:3;5294:19;;5298:9;5390:6;5267:4;5424:194;5438:4;5435:1;5432:11;5424:194;;;5497:13;;5485:26;;5534:4;5558:12;;;;5593:15;;;;5458:1;5451:9;5424:194;;;5428:3;;;5129:495;;;;:::o;6305:127::-;6366:10;6361:3;6357:20;6354:1;6347:31;6397:4;6394:1;6387:15;6421:4;6418:1;6411:15;6437:344;6504:2;6498:9;6546:3;6534:16;;6580:18;6565:34;;6601:22;;;6562:62;6559:185;;;6666:10;6661:3;6657:20;6654:1;6647:31;6701:4;6698:1;6691:15;6729:4;6726:1;6719:15;6559:185;6760:2;6753:22;6437:344;:::o;6786:914::-;6870:6;6923:3;6911:9;6902:7;6898:23;6894:33;6891:53;;;6940:1;6937;6930:12;6891:53;6966:17;;:::i;:::-;7019:9;7006:23;6999:5;6992:38;7090:2;7079:9;7075:18;7062:32;7057:2;7050:5;7046:14;7039:56;7155:2;7144:9;7140:18;7127:32;7122:2;7115:5;7111:14;7104:56;7220:2;7209:9;7205:18;7192:32;7187:2;7180:5;7176:14;7169:56;7286:3;7275:9;7271:19;7258:33;7252:3;7245:5;7241:15;7234:58;7353:3;7342:9;7338:19;7325:33;7319:3;7312:5;7308:15;7301:58;7420:3;7409:9;7405:19;7392:33;7386:3;7379:5;7375:15;7368:58;7487:3;7476:9;7472:19;7459:33;7453:3;7446:5;7442:15;7435:58;7512:3;7575:2;7564:9;7560:18;7547:32;7542:2;7535:5;7531:14;7524:56;;7599:3;7634:35;7665:2;7654:9;7650:18;7634:35;:::i;:::-;7618:14;;;7611:59;7622:5;6786:914;-1:-1:-1;;;6786:914:1:o;7926:127::-;7987:10;7982:3;7978:20;7975:1;7968:31;8018:4;8015:1;8008:15;8042:4;8039:1;8032:15;8058:127;8119:10;8114:3;8110:20;8107:1;8100:31;8150:4;8147:1;8140:15;8174:4;8171:1;8164:15;8190:125;8255:9;;;8276:10;;;8273:36;;;8289:18;;:::i;8320:168::-;8360:7;8426:1;8422;8418:6;8414:14;8411:1;8408:21;8403:1;8396:9;8389:17;8385:45;8382:71;;;8433:18;;:::i;:::-;-1:-1:-1;8473:9:1;;8320:168::o;8493:217::-;8533:1;8559;8549:132;;8603:10;8598:3;8594:20;8591:1;8584:31;8638:4;8635:1;8628:15;8666:4;8663:1;8656:15;8549:132;-1:-1:-1;8695:9:1;;8493:217::o;8715:135::-;8754:3;8775:17;;;8772:43;;8795:18;;:::i;:::-;-1:-1:-1;8842:1:1;8831:13;;8715:135::o;9260:338::-;9462:2;9444:21;;;9501:2;9481:18;;;9474:30;-1:-1:-1;;;9535:2:1;9520:18;;9513:44;9589:2;9574:18;;9260:338::o;10012:128::-;10079:9;;;10100:11;;;10097:37;;;10114:18;;:::i;11996:184::-;12066:6;12119:2;12107:9;12098:7;12094:23;12090:32;12087:52;;;12135:1;12132;12125:12;12087:52;-1:-1:-1;12158:16:1;;11996:184;-1:-1:-1;11996:184:1:o;12464:245::-;12531:6;12584:2;12572:9;12563:7;12559:23;12555:32;12552:52;;;12600:1;12597;12590:12;12552:52;12632:9;12626:16;12651:28;12673:5;12651:28;:::i;14633:250::-;14718:1;14728:113;14742:6;14739:1;14736:13;14728:113;;;14818:11;;;14812:18;14799:11;;;14792:39;14764:2;14757:10;14728:113;;;-1:-1:-1;;14875:1:1;14857:16;;14850:27;14633:250::o;14888:287::-;15017:3;15055:6;15049:13;15071:66;15130:6;15125:3;15118:4;15110:6;15106:17;15071:66;:::i;:::-;15153:16;;;;;14888:287;-1:-1:-1;;14888:287:1:o;15538:396::-;15687:2;15676:9;15669:21;15650:4;15719:6;15713:13;15762:6;15757:2;15746:9;15742:18;15735:34;15778:79;15850:6;15845:2;15834:9;15830:18;15825:2;15817:6;15813:15;15778:79;:::i;:::-;15918:2;15897:15;-1:-1:-1;;15893:29:1;15878:45;;;;15925:2;15874:54;;15538:396;-1:-1:-1;;15538:396:1:o
Swarm Source
ipfs://a766afb030129d37e0e9f55603b5b48eb1c7ab16bca203ceca7c6c0b93bcdd0e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.001651 | 154,239.901 | $254.71 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.