Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multi Pre Stake | 5960196 | 363 days ago | IN | 0 ETH | 0.07064807 | ||||
Multi Pre Stake | 5960157 | 363 days ago | IN | 0 ETH | 0.0353641 | ||||
Pre Deposit | 5960084 | 363 days ago | IN | 0 ETH | 0.01335428 | ||||
Deposit | 5959929 | 363 days ago | IN | 0 ETH | 0.00016921 | ||||
Claim | 5959921 | 363 days ago | IN | 0 ETH | 0.00027092 | ||||
Claim | 5959915 | 363 days ago | IN | 0 ETH | 0.00017932 | ||||
Stake | 5959794 | 363 days ago | IN | 0 ETH | 0.00061241 | ||||
Deposit | 5959728 | 363 days ago | IN | 0 ETH | 0.00029214 | ||||
Stake | 5959723 | 363 days ago | IN | 0 ETH | 0.00036686 | ||||
Stake | 5959717 | 363 days ago | IN | 0 ETH | 0.00046156 | ||||
Stake | 5959711 | 363 days ago | IN | 0 ETH | 0.00087091 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 0 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; // Stake DLICom tokens and earn USDC tokens contract Staking is Ownable { address public immutable USDTToken; address public immutable DLIComToken; uint256[] public lockingPeriod; uint256[] public poolMultiplier; mapping (string => StakingInfo[]) public userToStakingInfo; string[] public stakers; mapping (uint256 => uint256) public hourlyUSDTReward; uint256[] public changingHourOfUSDTReward; uint256 public burnPercentage; uint256 public poolMultiplierDivider; uint256 public totalStakedAmount = 0; mapping (uint256 => uint256) hourlyTotalStakedAmount; uint256 public totalUSDTAmount = 0; uint256 public immutable deployTimestamp; mapping (uint256 => uint256) public hourToTotalEffectMap; mapping (uint256 => uint256) public hourUnstakingTotalEffectMap; uint256 public lastChangingHour = 0; uint256[] public changingHourOfTotalEffect; uint256 firstStakeHour = 0; uint256 firstDepositHour = 0; uint256 lastTotalUSDTAmount = 0; struct StakingInfo { string stakerName; uint256 stakingTime; uint256 lastClaimedTime; uint256 stakingPeriod; uint256 stakedAmount; uint256 unstakedAmount; uint256 unstakedTime; bool isClaimed; uint256 lockingPeriodIndex; } struct claimInfo { uint256 claimTime; uint256 claimAmount; uint256 totalStakedAmount; uint256 hourlyUSDTReward; } event Deposit(uint256 amount); event Prestake(string indexed user, uint256 amount); event SetWalletAddress(address indexed user, address walletAddress); event Stake(address indexed user, uint256 amount); event Unstake(address indexed user, uint256 amount); event Claim(address indexed user, uint256 amount); constructor(address _USDTToken, address _DLIComToken, uint256[] memory _lockingPeriod, uint256[] memory _poolMultiplier, uint256 _poolMultiplierDivider, uint256 _burnPercentage) { require(_USDTToken != address(0), "Staking::constructor:: Invalid USDT token address"); require(_DLIComToken != address(0), "Staking::constructor:: Invalid DLICom token address"); require(_lockingPeriod.length == _poolMultiplier.length, "Staking::constructor:: Invalid input length"); USDTToken = _USDTToken; DLIComToken = _DLIComToken; lockingPeriod = _lockingPeriod; poolMultiplier = _poolMultiplier; poolMultiplierDivider = _poolMultiplierDivider; burnPercentage = _burnPercentage; deployTimestamp = block.timestamp; } /* Public methods */ function deposit(uint256 amount) public onlyOwner { require(amount > 0, "Staking::deposit:: Invalid amount"); bool success = IERC20(USDTToken).transferFrom(msg.sender, address(this), amount); require(success, "Staking::deposit:: Transfer failed"); uint256 lastUSDTChangeHour = changingHourOfUSDTReward.length > 0 ? changingHourOfUSDTReward[changingHourOfUSDTReward.length - 1] : 0; uint256 hour = block.timestamp/(60 * 60); uint256 lastHourlyUSDTRewardAmount = lastUSDTChangeHour == 0 ? 0 : hourlyUSDTReward[lastUSDTChangeHour]; uint256 leftUSDTAmount = lastTotalUSDTAmount - ((hour - lastUSDTChangeHour)*lastHourlyUSDTRewardAmount); lastTotalUSDTAmount = leftUSDTAmount + amount; totalUSDTAmount += amount; hourlyUSDTReward[hour] = lastTotalUSDTAmount / 1500; changingHourOfUSDTReward.push(hour); if(firstDepositHour == 0){ firstDepositHour = hour; } emit Deposit(amount); } function preDeposit(uint256[] memory hourlyUSDTRate, uint256[] memory changingHour) public onlyOwner { require(hourlyUSDTRate.length == changingHour.length, "Staking::preDeposit:: Invalid input length"); for (uint i = 0; i < hourlyUSDTRate.length; i++) { hourlyUSDTReward[changingHour[i]] = hourlyUSDTRate[i]; changingHourOfUSDTReward.push(changingHour[i]); } } function multiPreStake(uint256[] memory amount, uint256[] memory lockingPeriodIndex, uint256[] memory stakingTimestamp, string[] memory stakerName, address[] memory walletAddress) public onlyOwner { require(amount.length == lockingPeriodIndex.length && amount.length == stakingTimestamp.length && amount.length == stakerName.length && amount.length == walletAddress.length, "Staking::multiPreStake:: Invalid input length"); if(lastChangingHour == 0){ lastChangingHour = stakingTimestamp[0]/(60 * 60) -1; } for (uint i = 0; i < amount.length; i++) { prestake(amount[i], lockingPeriodIndex[i], stakingTimestamp[i], stakerName[i], walletAddress[i]); } } function prestake(uint256 amount, uint256 lockingPeriodIndex, uint256 stakingTimestamp, string memory stakerName, address walletAddress) internal { require(amount > 0, "Staking::prestake:: Invalid amount"); require(stakingTimestamp <= deployTimestamp, "Staking::prestake:: Invalid timestamp"); bool success = IERC20(DLIComToken).transferFrom(owner(), address(this), amount); require(success, "Staking::stake:: Transfer failed"); if( walletAddress != address(0) && userToStakingInfo[Strings.toHexString(walletAddress)].length == 0 ){ stakers.push(Strings.toHexString(walletAddress)); } else if(walletAddress == address(0) && userToStakingInfo[stakerName].length == 0){ stakers.push(stakerName); } if(walletAddress != address(0)){ stakerName = Strings.toHexString(walletAddress); } userToStakingInfo[stakerName].push(StakingInfo({ stakerName: stakerName, stakingTime: stakingTimestamp, lastClaimedTime: stakingTimestamp, stakingPeriod:lockingPeriod[lockingPeriodIndex], stakedAmount: amount, unstakedAmount: 0, unstakedTime: 0, isClaimed: false, lockingPeriodIndex: lockingPeriodIndex })); uint256 hour = stakingTimestamp/(60 * 60); hourToTotalEffectMap[hour] = hourToTotalEffectMap[lastChangingHour] + ((amount * poolMultiplier[lockingPeriodIndex])/poolMultiplierDivider) - hourUnstakingTotalEffectMap[hour]; if(hour > lastChangingHour){ for(uint256 i = lastChangingHour + 1; i < hour; i++){ if(hourUnstakingTotalEffectMap[i]!=0){ hourToTotalEffectMap[i] = hourToTotalEffectMap[lastChangingHour] - hourUnstakingTotalEffectMap[i]; changingHourOfTotalEffect.push(i); } } } if(hour != lastChangingHour){ changingHourOfTotalEffect.push(hour); } lastChangingHour = hour; if(lockingPeriodIndex != 0){ uint256 unstakeHour = (stakingTimestamp + lockingPeriod[lockingPeriodIndex])/(60 * 60); hourUnstakingTotalEffectMap[unstakeHour] += ((amount * poolMultiplier[lockingPeriodIndex])/poolMultiplierDivider); } if(firstStakeHour == 0){ firstStakeHour = hour; } totalStakedAmount += amount; hourlyTotalStakedAmount[hour] = totalStakedAmount; emit Prestake(stakerName, amount); } function setWalletAddress(string memory stakerName, address walletAddress) public onlyOwner { require(userToStakingInfo[stakerName].length > 0, "Staking::setWalletAddress:: No staking info"); for (uint i = 0; i < userToStakingInfo[stakerName].length; i++) { userToStakingInfo[Strings.toHexString(walletAddress)].push(userToStakingInfo[stakerName][i]); } delete userToStakingInfo[stakerName]; emit SetWalletAddress(msg.sender, walletAddress); } function stake(uint256 amount, uint256 lockingPeriodIndex) public { require(amount > 0, "Staking::stake:: Invalid amount"); bool success = IERC20(DLIComToken).transferFrom(msg.sender, address(this), amount); require(success, "Staking::stake:: Transfer failed"); string memory walletAddressStr = Strings.toHexString(msg.sender); if(userToStakingInfo[walletAddressStr].length == 0 ){ stakers.push(Strings.toHexString(msg.sender)); } if(lastChangingHour == 0){ lastChangingHour = deployTimestamp/(60 * 60) -1; } userToStakingInfo[walletAddressStr].push(StakingInfo({ stakerName: walletAddressStr, stakingTime: block.timestamp, lastClaimedTime: block.timestamp, stakingPeriod:lockingPeriod[lockingPeriodIndex], stakedAmount: amount, unstakedAmount: 0, unstakedTime: 0, isClaimed: false, lockingPeriodIndex: lockingPeriodIndex })); uint256 hour = block.timestamp/(60 * 60); hourToTotalEffectMap[hour] = hourToTotalEffectMap[lastChangingHour] + ((amount * poolMultiplier[lockingPeriodIndex])/poolMultiplierDivider) - hourUnstakingTotalEffectMap[hour]; if(hour > lastChangingHour){ for(uint256 i = lastChangingHour + 1; i < hour; i++){ if(hourUnstakingTotalEffectMap[i]!=0){ hourToTotalEffectMap[i] = hourToTotalEffectMap[lastChangingHour] - hourUnstakingTotalEffectMap[i]; changingHourOfTotalEffect.push(i); } } } if(hour != lastChangingHour){ changingHourOfTotalEffect.push(hour); } lastChangingHour = hour; if(lockingPeriodIndex != 0){ uint256 unstakeHour = (block.timestamp + lockingPeriod[lockingPeriodIndex])/(60 * 60); hourUnstakingTotalEffectMap[unstakeHour] += ((amount * poolMultiplier[lockingPeriodIndex])/poolMultiplierDivider); } if(firstStakeHour == 0){ firstStakeHour = hour; } totalStakedAmount += amount; hourlyTotalStakedAmount[hour] = totalStakedAmount; emit Stake(msg.sender, amount); } function unstake(uint256 index) public { StakingInfo[] storage stakingInfo = userToStakingInfo[Strings.toHexString(msg.sender)]; require(index < stakingInfo.length, "Staking::unstake:: Invalid amount"); require(stakingInfo[index].unstakedAmount == 0, "Staking::unstake:: Already unstaked"); require(stakingInfo[index].stakingTime + stakingInfo[index].stakingPeriod < block.timestamp, "Staking::unstake:: Staking period not completed"); stakingInfo[index].unstakedAmount = stakingInfo[index].stakedAmount; stakingInfo[index].unstakedTime = block.timestamp; bool success = IERC20(DLIComToken).transfer(msg.sender, stakingInfo[index].unstakedAmount); require(success, "Staking::unstake:: Transfer failed"); totalStakedAmount -= stakingInfo[index].unstakedAmount; uint256 hour = block.timestamp/(60 * 60); hourlyTotalStakedAmount[hour] = totalStakedAmount; if(stakingInfo[index].lockingPeriodIndex == 0){ hourToTotalEffectMap[hour] = hourToTotalEffectMap[lastChangingHour] - ((stakingInfo[index].stakedAmount * poolMultiplier[stakingInfo[index].lockingPeriodIndex])/poolMultiplierDivider); changingHourOfTotalEffect.push(hour); lastChangingHour = hour; } emit Unstake(msg.sender, stakingInfo[index].unstakedAmount); } function claim() public { uint256 currentTimestamp = block.timestamp; uint256 claimableAmount = getClaimAmount(msg.sender, currentTimestamp); StakingInfo[] storage stakingInfo = userToStakingInfo[Strings.toHexString(msg.sender)]; require(stakingInfo.length > 0, "Staking::claim:: No staking info"); for (uint i = 0; i < stakingInfo.length; i++) { if((stakingInfo[i].lockingPeriodIndex == 0 && stakingInfo[i].unstakedTime < currentTimestamp ) || (!stakingInfo[i].isClaimed && stakingInfo[i].lastClaimedTime < stakingInfo[i].stakingTime + stakingInfo[i].stakingPeriod)){ stakingInfo[i].lastClaimedTime = currentTimestamp; } else{ stakingInfo[i].isClaimed = true; } } require(claimableAmount > 0, "Staking::claim:: No claimable amount"); bool success = IERC20(USDTToken).transfer(msg.sender, claimableAmount); require(success, "Staking::claim:: Transfer failed"); totalUSDTAmount -= claimableAmount; emit Claim(msg.sender, claimableAmount); } function getClaimAmount(address staker, uint256 timestamp) public view returns (uint256) { uint256 newClaimableAmount = 0; StakingInfo[] storage stakingInfo = userToStakingInfo[Strings.toHexString(staker)]; require(stakingInfo.length > 0, "Staking::getClaimAmount:: No staking info"); for (uint256 k = 0; k < stakingInfo.length; k++) { if(stakingInfo[k].isClaimed){ continue; } uint256 startingHour = stakingInfo[k].lastClaimedTime/(60 * 60); uint256 endStakingHour = stakingInfo[k].unstakedTime > stakingInfo[k].stakingTime ? Math.min((stakingInfo[k].stakingTime + stakingInfo[k].stakingPeriod)/(60 * 60),(stakingInfo[k].unstakedTime)/(60 * 60)): (stakingInfo[k].stakingTime + stakingInfo[k].stakingPeriod)/(60 * 60); uint256 timestampHour = timestamp/(60 * 60); uint256 endingHour = (stakingInfo[k].lockingPeriodIndex == 0 && stakingInfo[k].unstakedTime < stakingInfo[k].stakingTime) ? timestampHour : (endStakingHour < timestampHour) ? endStakingHour : timestampHour; uint256 curHourlyUSDTReward = 0; uint256 curTotalEffect = 0; uint256 nextTotalEffectChangingHour = 0; uint256 nextUSDTRewardChangingHour = 0; uint256 curTotalUnstakeEffect = 0; (curTotalEffect, nextTotalEffectChangingHour) = binarySearchTotalEffect(startingHour); (curHourlyUSDTReward, nextUSDTRewardChangingHour) = binarySearchUSDTReward(startingHour); for(uint256 i = startingHour; i < endingHour;){ if(hourlyUSDTReward[i] != 0){ curHourlyUSDTReward = hourlyUSDTReward[i]; } if(hourToTotalEffectMap[i] != 0){ curTotalEffect = hourToTotalEffectMap[i]; } if(hourUnstakingTotalEffectMap[i] != 0 ){ curTotalUnstakeEffect += hourUnstakingTotalEffectMap[i]; } uint256 nextPointer; if(nextTotalEffectChangingHour >= changingHourOfTotalEffect.length && nextUSDTRewardChangingHour >= changingHourOfUSDTReward.length){ nextPointer = endingHour; } else if(nextTotalEffectChangingHour >= changingHourOfTotalEffect.length){ nextPointer = changingHourOfUSDTReward[nextUSDTRewardChangingHour]; } else if(nextUSDTRewardChangingHour >= changingHourOfUSDTReward.length){ nextPointer = changingHourOfTotalEffect[nextTotalEffectChangingHour]; } else{ nextPointer = Math.min(changingHourOfTotalEffect[nextTotalEffectChangingHour], changingHourOfUSDTReward[nextUSDTRewardChangingHour]); } if(curTotalEffect - curTotalUnstakeEffect <= 0){ i = nextPointer; nextTotalEffectChangingHour++; nextUSDTRewardChangingHour++; continue; } if(nextPointer > i ){ newClaimableAmount += ((nextPointer - i) * (stakingInfo[k].stakedAmount * poolMultiplier[stakingInfo[k].lockingPeriodIndex] * curHourlyUSDTReward) / ((curTotalEffect - curTotalUnstakeEffect) * poolMultiplierDivider)); i = nextPointer; nextTotalEffectChangingHour++; nextUSDTRewardChangingHour++; } else{ newClaimableAmount += ((endingHour - i) * (stakingInfo[k].stakedAmount * poolMultiplier[stakingInfo[k].lockingPeriodIndex] * curHourlyUSDTReward) / ((curTotalEffect - curTotalUnstakeEffect) * poolMultiplierDivider)); i = endingHour; } } } return newClaimableAmount; } // Binary search to find the total effect of the stakers for a given hour // Returns the total effect and the next index of the hour in the changingHourOfTotalEffect array function binarySearchTotalEffect(uint256 startingHour) public view returns (uint256, uint256) { uint256 low = 0; uint256 high = changingHourOfTotalEffect.length - 1; uint256 mid = 0; while(low <= high){ mid = (low + high) / 2; if(mid == 0 && changingHourOfTotalEffect[mid] > startingHour){ return (0,1); } else if(mid == 0 && changingHourOfTotalEffect[mid]<= startingHour){ return (hourToTotalEffectMap[changingHourOfTotalEffect[mid]],mid+1); } if(changingHourOfTotalEffect[mid] == startingHour){ if(mid + 1 < changingHourOfTotalEffect.length) return (hourToTotalEffectMap[changingHourOfTotalEffect[mid]], mid+1); else return (hourToTotalEffectMap[changingHourOfTotalEffect[mid]], mid+1); } else if(mid > 0 && changingHourOfTotalEffect[mid] > startingHour && changingHourOfTotalEffect[mid - 1] < startingHour){ return (hourToTotalEffectMap[changingHourOfTotalEffect[mid-1]], mid); } else if(changingHourOfTotalEffect[mid] < startingHour){ low = mid + 1; } else{ high = mid - 1; } } return (hourToTotalEffectMap[changingHourOfTotalEffect[mid]],mid+1); } function binarySearchUSDTReward(uint256 hour) public view returns (uint256 , uint256){ uint256 low = 0; uint256 high = changingHourOfUSDTReward.length-1; uint256 mid = 0; while(low <= high){ mid = (low + high) / 2; if(mid == 0 && changingHourOfUSDTReward[mid] > hour){ return (0,1); } else if(mid == 0 && changingHourOfUSDTReward[mid]<= hour){ return (hourlyUSDTReward[changingHourOfUSDTReward[mid]],mid+1); } if(changingHourOfUSDTReward[mid] == hour){ if(mid + 1 < changingHourOfUSDTReward.length) return (hourlyUSDTReward[changingHourOfUSDTReward[mid]], mid+1); else return (hourlyUSDTReward[changingHourOfUSDTReward[mid]], mid+1); } else if(mid > 0 && changingHourOfUSDTReward[mid] > hour && changingHourOfUSDTReward[mid - 1] < hour){ return (hourlyUSDTReward[changingHourOfUSDTReward[mid-1]], mid); } else if(changingHourOfUSDTReward[mid] < hour){ low = mid + 1; } else{ high = mid - 1; } } return (hourlyUSDTReward[changingHourOfUSDTReward[mid]],mid+1); } function binarySearchTotalStakedAmount(uint256 hour) public view returns (uint256 , uint256){ uint256 low = 0; uint256 high = changingHourOfTotalEffect.length-1; uint256 mid = 0; while(low <= high){ mid = (low + high) / 2; if(mid == 0 && changingHourOfTotalEffect[mid] > hour){ return (0,1); } else if(mid == 0 && changingHourOfTotalEffect[mid]<= hour){ return (hourlyTotalStakedAmount[changingHourOfTotalEffect[mid]],mid+1); } if(changingHourOfTotalEffect[mid] == hour){ if(mid + 1 < changingHourOfTotalEffect.length) return (hourlyTotalStakedAmount[changingHourOfTotalEffect[mid]], mid+1); else return (hourlyTotalStakedAmount[changingHourOfTotalEffect[mid]], mid+1); } else if(mid > 0 && changingHourOfTotalEffect[mid] > hour && changingHourOfTotalEffect[mid - 1] < hour){ return (hourlyTotalStakedAmount[changingHourOfTotalEffect[mid-1]], mid); } else if(changingHourOfTotalEffect[mid] < hour){ low = mid + 1; } else{ high = mid - 1; } } return (0,1); } function getClaimAmountHistory(address staker, uint256 startTimestamp, uint256 endTimestamp) public view returns (claimInfo[] memory) { require(startTimestamp < endTimestamp, "Staking::getClaimAmountHistory:: Invalid timestamp"); StakingInfo[] storage stakingInfo = userToStakingInfo[Strings.toHexString(staker)]; uint256 startingHour = startTimestamp/(60 * 60); uint256 endingHour = endTimestamp/(60 * 60); require(stakingInfo.length > 0, "Staking::getClaimAmountHistory:: No staking info"); claimInfo[] memory claimInfoArray = new claimInfo[](endingHour - startingHour + 1); // uint256 curHourlyUSDTReward = 0; (uint256 curHourlyUSDTReward, ) = binarySearchUSDTReward(startingHour); (uint256 curTotalEffect, ) = binarySearchTotalEffect(startingHour); // uint256 curTotalEffect = 0; uint256 curTotalStakedAmount = 0; uint256 curTotalUnstakeEffect = 0; for(uint256 i = startingHour; i < endingHour; i++){ uint256 claimableAmount = 0; if(hourlyUSDTReward[i] != 0){ curHourlyUSDTReward = hourlyUSDTReward[i]; } if(hourToTotalEffectMap[i] != 0){ curTotalEffect = hourToTotalEffectMap[i]; } if(hourlyTotalStakedAmount[i]!=0){ curTotalStakedAmount = hourlyTotalStakedAmount[i]; } if(i > lastChangingHour && hourlyTotalStakedAmount[i] != 0){ curTotalUnstakeEffect += hourlyTotalStakedAmount[i]; } if(curHourlyUSDTReward == 0 || curTotalEffect == 0){ continue; } for (uint k = 0; k < stakingInfo.length; k++) { if(stakingInfo[k].isClaimed){ continue; } if( stakingInfo[k].unstakedTime > 0 && stakingInfo[k].unstakedTime/(60*60) <= i){ continue; } if(curTotalEffect != 0 && curTotalEffect-curTotalUnstakeEffect !=0 && (stakingInfo[k].stakingTime/(60*60) <= i && (stakingInfo[k].stakingTime + stakingInfo[k].stakingPeriod)/(60*60) > i)){ claimableAmount += (stakingInfo[k].stakedAmount * poolMultiplier[stakingInfo[k].lockingPeriodIndex] * curHourlyUSDTReward) / ((curTotalEffect-curTotalUnstakeEffect) * poolMultiplierDivider); } else if(curTotalEffect != 0 && curTotalEffect-curTotalUnstakeEffect !=0 && stakingInfo[k].stakingTime/(60*60) <= i && stakingInfo[k].lockingPeriodIndex == 0 ){ claimableAmount += (stakingInfo[k].stakedAmount * poolMultiplier[stakingInfo[k].lockingPeriodIndex] * curHourlyUSDTReward) / ((curTotalEffect-curTotalUnstakeEffect) * poolMultiplierDivider); } } claimInfoArray[i - startingHour] = claimInfo({ claimTime: (i + 1) * (60 * 60), claimAmount: claimableAmount, totalStakedAmount: curTotalStakedAmount, hourlyUSDTReward: curHourlyUSDTReward }); } return claimInfoArray; } function getStakerInfo(address staker) public view returns (StakingInfo[] memory) { return userToStakingInfo[Strings.toHexString(staker)]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
{ "optimizer": { "enabled": true, "runs": 0 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_USDTToken","type":"address"},{"internalType":"address","name":"_DLIComToken","type":"address"},{"internalType":"uint256[]","name":"_lockingPeriod","type":"uint256[]"},{"internalType":"uint256[]","name":"_poolMultiplier","type":"uint256[]"},{"internalType":"uint256","name":"_poolMultiplierDivider","type":"uint256"},{"internalType":"uint256","name":"_burnPercentage","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","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":"string","name":"user","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Prestake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"walletAddress","type":"address"}],"name":"SetWalletAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[],"name":"DLIComToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDTToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingHour","type":"uint256"}],"name":"binarySearchTotalEffect","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"hour","type":"uint256"}],"name":"binarySearchTotalStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"hour","type":"uint256"}],"name":"binarySearchUSDTReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"changingHourOfTotalEffect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"changingHourOfUSDTReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"}],"name":"getClaimAmountHistory","outputs":[{"components":[{"internalType":"uint256","name":"claimTime","type":"uint256"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"totalStakedAmount","type":"uint256"},{"internalType":"uint256","name":"hourlyUSDTReward","type":"uint256"}],"internalType":"struct Staking.claimInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakerInfo","outputs":[{"components":[{"internalType":"string","name":"stakerName","type":"string"},{"internalType":"uint256","name":"stakingTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimedTime","type":"uint256"},{"internalType":"uint256","name":"stakingPeriod","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"unstakedAmount","type":"uint256"},{"internalType":"uint256","name":"unstakedTime","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"lockingPeriodIndex","type":"uint256"}],"internalType":"struct Staking.StakingInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hourToTotalEffectMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hourUnstakingTotalEffectMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hourlyUSDTReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastChangingHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"uint256[]","name":"lockingPeriodIndex","type":"uint256[]"},{"internalType":"uint256[]","name":"stakingTimestamp","type":"uint256[]"},{"internalType":"string[]","name":"stakerName","type":"string[]"},{"internalType":"address[]","name":"walletAddress","type":"address[]"}],"name":"multiPreStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolMultiplierDivider","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"hourlyUSDTRate","type":"uint256[]"},{"internalType":"uint256[]","name":"changingHour","type":"uint256[]"}],"name":"preDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"stakerName","type":"string"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"setWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockingPeriodIndex","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakers","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUSDTAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userToStakingInfo","outputs":[{"internalType":"string","name":"stakerName","type":"string"},{"internalType":"uint256","name":"stakingTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimedTime","type":"uint256"},{"internalType":"uint256","name":"stakingPeriod","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"unstakedAmount","type":"uint256"},{"internalType":"uint256","name":"unstakedTime","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"lockingPeriodIndex","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e060405260006009556000600b556000600e556000601055600060115560006012553480156200002f57600080fd5b50604051620049583803806200495883398101604081905262000052916200039d565b6200005d336200020f565b6001600160a01b038616620000d35760405162461bcd60e51b815260206004820152603160248201527f5374616b696e673a3a636f6e7374727563746f723a3a20496e76616c6964205560448201527053445420746f6b656e206164647265737360781b60648201526084015b60405180910390fd5b6001600160a01b038516620001515760405162461bcd60e51b815260206004820152603360248201527f5374616b696e673a3a636f6e7374727563746f723a3a20496e76616c6964204460448201527f4c49436f6d20746f6b656e2061646472657373000000000000000000000000006064820152608401620000ca565b8251845114620001b85760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e673a3a636f6e7374727563746f723a3a20496e76616c6964206960448201526a0dce0eae840d8cadccee8d60ab1b6064820152608401620000ca565b6001600160a01b03808716608052851660a0528351620001e09060019060208701906200025f565b508251620001f69060029060208601906200025f565b5060089190915560075550504260c052506200043f9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280548282559060005260206000209081019282156200029d579160200282015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b80516001600160a01b0381168114620002de57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200030b57600080fd5b815160206001600160401b03808311156200032a576200032a620002e3565b8260051b604051601f19603f83011681018181108482111715620003525762000352620002e3565b6040529384528581018301938381019250878511156200037157600080fd5b83870191505b84821015620003925781518352918301919083019062000377565b979650505050505050565b60008060008060008060c08789031215620003b757600080fd5b620003c287620002c6565b9550620003d260208801620002c6565b60408801519095506001600160401b0380821115620003f057600080fd5b620003fe8a838b01620002f9565b955060608901519150808211156200041557600080fd5b506200042489828a01620002f9565b9350506080870151915060a087015190509295509295509295565b60805160a05160c0516144b8620004a0600039600081816102e401528181611ecd015261315101526000818161029d01528181610ac601528181611dbd01526131d10152600081816103c70152818161123901526126e401526144b86000f3fe608060405234801561001057600080fd5b506004361061018b5760003560e01c80630484ee511461019057806308dd1988146101b65780631abc354f146101cb57806321daf7db146101f35780632e17de78146102065780633779445a146102195780633a08a011146102395780634a2789f8146102615780634e71d92d146102745780635454a2361461027c578063567e98f91461028f5780635cc423a314610298578063606d6a94146102cc578063607ad0d7146102df5780636459b25014610306578063687a776714610319578063715018a614610339578063733bdef0146103415780637b0472f01461036157806382989a29146103745780638da5cb5b146103875780638fcdfd881461038f57806398c220cf146103a2578063ac4b457a146103c2578063af514a9b146103e9578063b6b55f25146103f2578063c84e4db314610405578063e077a9d01461040e578063f01f20df14610417578063f2fde38b14610420578063facdc67914610433578063fd5e6dd114610446578063fff6818914610466575b600080fd5b6101a361019e366004613a03565b610486565b6040519081526020015b60405180910390f35b6101c96101c4366004613c5c565b6104a7565b005b6101de6101d9366004613a03565b610634565b604080519283526020830191909152016101ad565b6101a3610201366004613a03565b610882565b6101c9610214366004613a03565b610892565b6101a3610227366004613a03565b60056020526000908152604090205481565b61024c610247366004613d2d565b610d98565b6040516101ad99989796959493929190613dc1565b6101c961026f366004613e17565b610ea2565b6101c9610fae565b6101c961028a366004613e7a565b61134b565b6101a360095481565b6102bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101ad9190613ec7565b6101a36102da366004613a03565b611566565b6101a37f000000000000000000000000000000000000000000000000000000000000000081565b6101a3610314366004613edb565b611576565b6101a3610327366004613a03565b600c6020526000908152604090205481565b6101c9611bcb565b61035461034f366004613f05565b611bdf565b6040516101ad9190613f20565b6101c961036f366004613fe1565b611d53565b6101de610382366004613a03565b612282565b6102bf612466565b6101de61039d366004613a03565b612475565b6101a36103b0366004613a03565b600d6020526000908152604090205481565b6102bf7f000000000000000000000000000000000000000000000000000000000000000081565b6101a360085481565b6101c9610400366004613a03565b612668565b6101a3600b5481565b6101a3600e5481565b6101a360075481565b6101c961042e366004613f05565b612915565b6101a3610441366004613a03565b61298e565b610459610454366004613a03565b61299e565b6040516101ad9190614003565b610479610474366004614016565b612a4a565b6040516101ad9190614049565b6001818154811061049657600080fd5b600091825260209091200154905081565b6104af613095565b835185511480156104c1575082518551145b80156104ce575081518551145b80156104db575080518551145b6105425760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e673a3a6d756c74695072655374616b653a3a20496e76616c696460448201526c040d2dce0eae840d8cadccee8d609b1b60648201526084015b60405180910390fd5b600e54600003610584576001610e1084600081518110610564576105646140ad565b602002602001015161057691906140d9565b61058091906140fb565b600e555b60005b855181101561062c5761061a8682815181106105a5576105a56140ad565b60200260200101518683815181106105bf576105bf6140ad565b60200260200101518684815181106105d9576105d96140ad565b60200260200101518685815181106105f3576105f36140ad565b602002602001015186868151811061060d5761060d6140ad565b60200260200101516130f4565b806106248161410e565b915050610587565b505050505050565b6000806000806001600f8054905061064c91906140fb565b905060005b8183116107775760026106648385614127565b61066e91906140d9565b90508015801561069a575085600f828154811061068d5761068d6140ad565b9060005260206000200154115b156106ae5750600095600195509350505050565b801580156106d9575085600f82815481106106cb576106cb6140ad565b906000526020600020015411155b1561072857600c6000600f83815481106106f5576106f56140ad565b906000526020600020015481526020019081526020016000205481600161071c9190614127565b94509450505050915091565b85600f828154811061073c5761073c6140ad565b90600052602060002001540361078e57600f5461075a826001614127565b101561077757600c6000600f83815481106106f5576106f56140ad565b600c6000600f83815481106106f5576106f56140ad565b6000811180156107ba575085600f82815481106107ad576107ad6140ad565b9060005260206000200154115b80156107ec575085600f6107cf6001846140fb565b815481106107df576107df6140ad565b9060005260206000200154105b1561083957600c6000600f6108026001856140fb565b81548110610812576108126140ad565b90600052602060002001548152602001908152602001600020548194509450505050915091565b85600f828154811061084d5761084d6140ad565b9060005260206000200154101561087057610869816001614127565b9250610651565b61087b6001826140fb565b9150610651565b6006818154811061049657600080fd5b6000600361089f33613725565b6040516108ac919061413a565b908152604051908190036020019020805490915082106109185760405162461bcd60e51b815260206004820152602160248201527f5374616b696e673a3a756e7374616b653a3a20496e76616c696420616d6f756e6044820152601d60fa1b6064820152608401610539565b80828154811061092a5761092a6140ad565b9060005260206000209060090201600501546000146109975760405162461bcd60e51b815260206004820152602360248201527f5374616b696e673a3a756e7374616b653a3a20416c726561647920756e7374616044820152621ad95960ea1b6064820152608401610539565b428183815481106109aa576109aa6140ad565b9060005260206000209060090201600301548284815481106109ce576109ce6140ad565b9060005260206000209060090201600101546109ea9190614127565b10610a4f5760405162461bcd60e51b815260206004820152602f60248201527f5374616b696e673a3a756e7374616b653a3a205374616b696e6720706572696f60448201526e19081b9bdd0818dbdb5c1b195d1959608a1b6064820152608401610539565b808281548110610a6157610a616140ad565b906000526020600020906009020160040154818381548110610a8557610a856140ad565b90600052602060002090600902016005018190555042818381548110610aad57610aad6140ad565b90600052602060002090600902016006018190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb33848681548110610b0657610b066140ad565b9060005260206000209060090201600501546040518363ffffffff1660e01b8152600401610b35929190614156565b6020604051808303816000875af1158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b78919061416f565b905080610bd25760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a756e7374616b653a3a205472616e73666572206661696c604482015261195960f21b6064820152608401610539565b818381548110610be457610be46140ad565b90600052602060002090600902016005015460096000828254610c0791906140fb565b9091555060009050610c1b610e10426140d9565b6009546000828152600a60205260409020558354909150839085908110610c4457610c446140ad565b906000526020600020906009020160080154600003610d2c576008546002848681548110610c7457610c746140ad565b90600052602060002090600902016008015481548110610c9657610c966140ad565b9060005260206000200154848681548110610cb357610cb36140ad565b906000526020600020906009020160040154610ccf9190614191565b610cd991906140d9565b600e546000908152600c6020526040902054610cf591906140fb565b6000828152600c6020526040812091909155600f8054600181018255915260008051602061446383398151915201819055600e8190555b336001600160a01b03167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd848681548110610d6957610d696140ad565b906000526020600020906009020160050154604051610d8a91815260200190565b60405180910390a250505050565b81516020818401810180516003825292820191850191909120919052805482908110610dc357600080fd5b906000526020600020906009020160009150915050806000018054610de7906141b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e13906141b0565b8015610e605780601f10610e3557610100808354040283529160200191610e60565b820191906000526020600020905b815481529060010190602001808311610e4357829003601f168201915b505050506001830154600284015460038501546004860154600587015460068801546007890154600890990154979895979496509294919390929160ff169089565b610eaa613095565b8051825114610f0e5760405162461bcd60e51b815260206004820152602a60248201527f5374616b696e673a3a7072654465706f7369743a3a20496e76616c696420696e6044820152690e0eae840d8cadccee8d60b31b6064820152608401610539565b60005b8251811015610fa957828181518110610f2c57610f2c6140ad565b602002602001015160056000848481518110610f4a57610f4a6140ad565b60200260200101518152602001908152602001600020819055506006828281518110610f7857610f786140ad565b6020908102919091018101518254600181018455600093845291909220015580610fa18161410e565b915050610f11565b505050565b426000610fbb3383611576565b905060006003610fca33613725565b604051610fd7919061413a565b90815260405190819003602001902080549091506110375760405162461bcd60e51b815260206004820181905260248201527f5374616b696e673a3a636c61696d3a3a204e6f207374616b696e6720696e666f6044820152606401610539565b60005b81548110156111c257818181548110611055576110556140ad565b9060005260206000209060090201600801546000148015611098575083828281548110611084576110846140ad565b906000526020600020906009020160060154105b8061114757508181815481106110b0576110b06140ad565b600091825260209091206007600990920201015460ff1615801561114757508181815481106110e1576110e16140ad565b906000526020600020906009020160030154828281548110611105576111056140ad565b9060005260206000209060090201600101546111219190614127565b828281548110611133576111336140ad565b906000526020600020906009020160020154105b15611179578382828154811061115f5761115f6140ad565b9060005260206000209060090201600201819055506111b0565b600182828154811061118d5761118d6140ad565b60009182526020909120600990910201600701805460ff19169115159190911790555b806111ba8161410e565b91505061103a565b506000821161121f5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e673a3a636c61696d3a3a204e6f20636c61696d61626c6520616d6044820152631bdd5b9d60e21b6064820152608401610539565b60405163a9059cbb60e01b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906112709033908790600401614156565b6020604051808303816000875af115801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b3919061416f565b9050806113025760405162461bcd60e51b815260206004820181905260248201527f5374616b696e673a3a636c61696d3a3a205472616e73666572206661696c65646044820152606401610539565b82600b600082825461131491906140fb565b909155505060405183815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490602001610d8a565b611353613095565b6000600383604051611365919061413a565b90815260405190819003602001902054116113d65760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e673a3a73657457616c6c6574416464726573733a3a204e6f207360448201526a74616b696e6720696e666f60a81b6064820152608401610539565b60005b6003836040516113e9919061413a565b908152604051908190036020019020548110156114f657600361140b83613725565b604051611418919061413a565b9081526020016040518091039020600384604051611436919061413a565b90815260200160405180910390208281548110611455576114556140ad565b60009182526020808320845460018101865594845292206009918202909201920201806114828382614245565b50600182810154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560068083015490820155600780830154908201805460ff191660ff9092161515919091179055600891820154910155806114ee8161410e565b9150506113d9565b50600382604051611507919061413a565b90815260200160405180910390206000611521919061393e565b336001600160a01b03167f2629135685361a12b8336cd760f20c013116ea0ee04812a556657a173bffd10d8260405161155a9190613ec7565b60405180910390a25050565b600f818154811061049657600080fd5b60008080600361158586613725565b604051611592919061413a565b90815260405190819003602001902080549091506116045760405162461bcd60e51b815260206004820152602960248201527f5374616b696e673a3a676574436c61696d416d6f756e743a3a204e6f207374616044820152686b696e6720696e666f60b81b6064820152608401610539565b60005b8154811015611bbf57818181548110611622576116226140ad565b600091825260209091206007600990920201015460ff16611bad576000610e10838381548110611654576116546140ad565b90600052602060002090600902016002015461167091906140d9565b90506000838381548110611686576116866140ad565b9060005260206000209060090201600101548484815481106116aa576116aa6140ad565b9060005260206000209060090201600601541161172557610e108484815481106116d6576116d66140ad565b9060005260206000209060090201600301548585815481106116fa576116fa6140ad565b9060005260206000209060090201600101546117169190614127565b61172091906140d9565b6117bd565b6117bd610e1085858154811061173d5761173d6140ad565b906000526020600020906009020160030154868681548110611761576117616140ad565b90600052602060002090600902016001015461177d9190614127565b61178791906140d9565b610e1086868154811061179c5761179c6140ad565b9060005260206000209060090201600601546117b891906140d9565b61373b565b905060006117cd610e10896140d9565b905060008585815481106117e3576117e36140ad565b90600052602060002090600902016008015460001480156118495750858581548110611811576118116140ad565b906000526020600020906009020160010154868681548110611835576118356140ad565b906000526020600020906009020160060154105b6118605781831061185a5781611862565b82611862565b815b9050600080600080600061187589610634565b909450925061188389612282565b9095509150885b86811015611ba257600081815260056020526040902054156118b85760008181526005602052604090205495505b6000818152600c6020526040902054156118de576000818152600c602052604090205494505b6000818152600d60205260409020541561190e576000818152600d602052604090205461190b9083614127565b91505b600f54600090851080159061192557506006548410155b156119315750866119c2565b600f54851061195f576006848154811061194d5761194d6140ad565b906000526020600020015490506119c2565b600654841061197b57600f858154811061194d5761194d6140ad565b6119bf600f8681548110611991576119916140ad565b9060005260206000200154600686815481106119af576119af6140ad565b906000526020600020015461373b565b90505b60006119ce84886140fb565b116119f757905080846119e08161410e565b95505083806119ee9061410e565b9450505061188a565b81811115611add57600854611a0c84886140fb565b611a169190614191565b8760028f8f81548110611a2b57611a2b6140ad565b90600052602060002090600902016008015481548110611a4d57611a4d6140ad565b90600052602060002001548f8f81548110611a6a57611a6a6140ad565b906000526020600020906009020160040154611a869190614191565b611a909190614191565b611a9a84846140fb565b611aa49190614191565b611aae91906140d9565b611ab8908f614127565b9d5090508084611ac78161410e565b9550508380611ad59061410e565b945050611b9c565b600854611aea84886140fb565b611af49190614191565b8760028f8f81548110611b0957611b096140ad565b90600052602060002090600902016008015481548110611b2b57611b2b6140ad565b90600052602060002001548f8f81548110611b4857611b486140ad565b906000526020600020906009020160040154611b649190614191565b611b6e9190614191565b611b78848b6140fb565b611b829190614191565b611b8c91906140d9565b611b96908f614127565b9d508791505b5061188a565b505050505050505050505b80611bb78161410e565b915050611607565b50909150505b92915050565b611bd3613095565b611bdd6000613753565b565b60606003611bec83613725565b604051611bf9919061413a565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015611d48578382906000526020600020906009020160405180610120016040529081600082018054611c5b906141b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906141b0565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b5050509183525050600182810154602080840191909152600284015460408401526003840154606084015260048401546080840152600584015460a0840152600684015460c0840152600784015460ff16151560e08401526008909301546101009092019190915291835292019101611c27565b505050509050919050565b60008211611da35760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e673a3a7374616b653a3a20496e76616c696420616d6f756e74006044820152606401610539565b6040516323b872dd60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90611df69033903090889060040161431f565b6020604051808303816000875af1158015611e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e39919061416f565b905080611e585760405162461bcd60e51b815260040161053990614343565b6000611e6333613725565b9050600381604051611e75919061413a565b90815260405190819003602001902054600003611eb9576004611e9733613725565b81546001810183556000928352602090922090910190611eb79082614378565b505b600e54600003611eff576001611ef1610e107f00000000000000000000000000000000000000000000000000000000000000006140d9565b611efb91906140fb565b600e555b600381604051611f0f919061413a565b908152602001604051809103902060405180610120016040528083815260200142815260200142815260200160018681548110611f4e57611f4e6140ad565b6000918252602080832090910154835282810189905260408301829052606083018290526080830182905260a09092018790528354600181018555938152208151919260090201908190611fa29082614378565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201805460ff1916911515919091179055610100909101516008909101556000612012610e10426140d9565b9050600d6000828152602001908152602001600020546008546002868154811061203e5761203e6140ad565b9060005260206000200154876120549190614191565b61205e91906140d9565b600e546000908152600c602052604090205461207a9190614127565b61208491906140fb565b6000828152600c6020526040902055600e5481111561213d576000600e5460016120ae9190614127565b90505b8181101561213b576000818152600d602052604090205415612129576000818152600d6020908152604080832054600e548452600c909252909120546120f791906140fb565b6000828152600c6020526040812091909155600f80546001810182559152600080516020614463833981519152018190555b806121338161410e565b9150506120b1565b505b600e54811461216a57600f8054600181018255600091909152600080516020614463833981519152018190555b600e819055831561220a576000610e106001868154811061218d5761218d6140ad565b9060005260206000200154426121a39190614127565b6121ad91906140d9565b9050600854600286815481106121c5576121c56140ad565b9060005260206000200154876121db9190614191565b6121e591906140d9565b6000828152600d602052604081208054909190612203908490614127565b9091555050505b60105460000361221a5760108190555b846009600082825461222c9190614127565b90915550506009546000828152600a6020908152604091829020929092555186815233917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a25050505050565b600080600080600160068054905061229a91906140fb565b905060005b8183116123925760026122b28385614127565b6122bc91906140d9565b9050801580156122e8575085600682815481106122db576122db6140ad565b9060005260206000200154115b156122fc5750600095600195509350505050565b8015801561232757508560068281548110612319576123196140ad565b906000526020600020015411155b156123435760056000600683815481106106f5576106f56140ad565b8560068281548110612357576123576140ad565b9060005260206000200154036123a957600654612375826001614127565b10156123925760056000600683815481106106f5576106f56140ad565b60056000600683815481106106f5576106f56140ad565b6000811180156123d5575085600682815481106123c8576123c86140ad565b9060005260206000200154115b801561240757508560066123ea6001846140fb565b815481106123fa576123fa6140ad565b9060005260206000200154105b1561241d576005600060066108026001856140fb565b8560068281548110612431576124316140ad565b906000526020600020015410156124545761244d816001614127565b925061229f565b61245f6001826140fb565b915061229f565b6000546001600160a01b031690565b6000806000806001600f8054905061248d91906140fb565b905060005b8183116126595760026124a58385614127565b6124af91906140d9565b9050801580156124db575085600f82815481106124ce576124ce6140ad565b9060005260206000200154115b156124ef5750600095600195509350505050565b8015801561251a575085600f828154811061250c5761250c6140ad565b906000526020600020015411155b1561253657600a6000600f83815481106106f5576106f56140ad565b85600f828154811061254a5761254a6140ad565b90600052602060002001540361259c57600f54612568826001614127565b101561258557600a6000600f83815481106106f5576106f56140ad565b600a6000600f83815481106106f5576106f56140ad565b6000811180156125c8575085600f82815481106125bb576125bb6140ad565b9060005260206000200154115b80156125fa575085600f6125dd6001846140fb565b815481106125ed576125ed6140ad565b9060005260206000200154105b1561261057600a6000600f6108026001856140fb565b85600f8281548110612624576126246140ad565b9060005260206000200154101561264757612640816001614127565b9250612492565b6126526001826140fb565b9150612492565b50600095600195509350505050565b612670613095565b600081116126ca5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e673a3a6465706f7369743a3a20496e76616c696420616d6f756e6044820152601d60fa1b6064820152608401610539565b6040516323b872dd60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061271d9033903090879060040161431f565b6020604051808303816000875af115801561273c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612760919061416f565b9050806127ba5760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a6465706f7369743a3a205472616e73666572206661696c604482015261195960f21b6064820152608401610539565b6006546000906127cb5760006127f7565b600680546127db906001906140fb565b815481106127eb576127eb6140ad565b90600052602060002001545b90506000612807610e10426140d9565b90506000821561282557600083815260056020526040902054612828565b60005b905060008161283785856140fb565b6128419190614191565b60125461284e91906140fb565b905061285a8682614127565b60128190555085600b60008282546128729190614127565b9091555050601254612887906105dc906140d9565b600084815260056020526040812091909155600680546001810182559082527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0184905560115490036128da5760118390555b6040518681527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1505050505050565b61291d613095565b6001600160a01b0381166129825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610539565b61298b81613753565b50565b6002818154811061049657600080fd5b600481815481106129ae57600080fd5b9060005260206000200160009150905080546129c9906141b0565b80601f01602080910402602001604051908101604052809291908181526020018280546129f5906141b0565b8015612a425780601f10612a1757610100808354040283529160200191612a42565b820191906000526020600020905b815481529060010190602001808311612a2557829003601f168201915b505050505081565b6060818310612aa45760405162461bcd60e51b81526020600482015260326024820152600080516020614443833981519152604482015271020496e76616c69642074696d657374616d760741b6064820152608401610539565b60006003612ab186613725565b604051612abe919061413a565b90815260405190819003602001902090506000612add610e10866140d9565b90506000612aed610e10866140d9565b8354909150612b455760405162461bcd60e51b8152602060048201526030602482015260008051602061444383398151915260448201526f204e6f207374616b696e6720696e666f60801b6064820152608401610539565b6000612b5183836140fb565b612b5c906001614127565b6001600160401b03811115612b7357612b73613a1c565b604051908082528060200260200182016040528015612bcf57816020015b612bbc6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081612b915790505b5090506000612bdd84612282565b5090506000612beb85610634565b509050600080865b868110156130845760008181526005602052604081205415612c215760008281526005602052604090205495505b6000828152600c602052604090205415612c47576000828152600c602052604090205494505b6000828152600a602052604090205415612c6d576000828152600a602052604090205493505b600e5482118015612c8b57506000828152600a602052604090205415155b15612cac576000828152600a6020526040902054612ca99084614127565b92505b851580612cb7575084155b15612cc25750613072565b60005b8a5481101561300f578a8181548110612ce057612ce06140ad565b600091825260209091206007600990920201015460ff16612ffd5760008b8281548110612d0f57612d0f6140ad565b906000526020600020906009020160060154118015612d5e575082610e108c8381548110612d3f57612d3f6140ad565b906000526020600020906009020160060154612d5b91906140d9565b11155b612ffd578515801590612d795750612d7684876140fb565b15155b8015612e1d575082610e108c8381548110612d9657612d966140ad565b906000526020600020906009020160010154612db291906140d9565b11158015612e1d575082610e108c8381548110612dd157612dd16140ad565b9060005260206000209060090201600301548d8481548110612df557612df56140ad565b906000526020600020906009020160010154612e119190614127565b612e1b91906140d9565b115b15612ece57600854612e2f85886140fb565b612e399190614191565b8760028d8481548110612e4e57612e4e6140ad565b90600052602060002090600902016008015481548110612e7057612e706140ad565b90600052602060002001548d8481548110612e8d57612e8d6140ad565b906000526020600020906009020160040154612ea99190614191565b612eb39190614191565b612ebd91906140d9565b612ec79083614127565b9150612ffd565b8515801590612ee55750612ee284876140fb565b15155b8015612f21575082610e108c8381548110612f0257612f026140ad565b906000526020600020906009020160010154612f1e91906140d9565b11155b8015612f5057508a8181548110612f3a57612f3a6140ad565b9060005260206000209060090201600801546000145b15612ffd57600854612f6285886140fb565b612f6c9190614191565b8760028d8481548110612f8157612f816140ad565b90600052602060002090600902016008015481548110612fa357612fa36140ad565b90600052602060002001548d8481548110612fc057612fc06140ad565b906000526020600020906009020160040154612fdc9190614191565b612fe69190614191565b612ff091906140d9565b612ffa9083614127565b91505b806130078161410e565b915050612cc5565b5060405180608001604052808360016130289190614127565b61303490610e10614191565b81526020810183905260408101869052606001879052876130558b856140fb565b81518110613065576130656140ad565b6020026020010181905250505b8061307c8161410e565b915050612bf3565b50939b9a5050505050505050505050565b3361309e612466565b6001600160a01b031614611bdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610539565b6000851161314f5760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a7072657374616b653a3a20496e76616c696420616d6f756044820152611b9d60f21b6064820152608401610539565b7f00000000000000000000000000000000000000000000000000000000000000008311156131cd5760405162461bcd60e51b815260206004820152602560248201527f5374616b696e673a3a7072657374616b653a3a20496e76616c69642074696d6560448201526407374616d760dc1b6064820152608401610539565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd613206612466565b30896040518463ffffffff1660e01b81526004016132269392919061431f565b6020604051808303816000875af1158015613245573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613269919061416f565b9050806132885760405162461bcd60e51b815260040161053990614343565b6001600160a01b038216158015906132c5575060036132a683613725565b6040516132b3919061413a565b90815260405190819003602001902054155b156132fb5760046132d583613725565b815460018101835560009283526020909220909101906132f59082614378565b50613372565b6001600160a01b03821615801561332f575060038360405161331d919061413a565b90815260405190819003602001902054155b1561337257600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016133708482614378565b505b6001600160a01b0382161561338d5761338a82613725565b92505b60038360405161339d919061413a565b9081526020016040518091039020604051806101200160405280858152602001868152602001868152602001600188815481106133dc576133dc6140ad565b600091825260208083209091015483528281018b905260408301829052606083018290526080830182905260a090920189905283546001810185559381522081519192600902019081906134309082614378565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201805460ff19169115159190911790556101009091015160089091015560006134a0610e10866140d9565b9050600d600082815260200190815260200160002054600854600288815481106134cc576134cc6140ad565b9060005260206000200154896134e29190614191565b6134ec91906140d9565b600e546000908152600c60205260409020546135089190614127565b61351291906140fb565b6000828152600c6020526040902055600e548111156135cb576000600e54600161353c9190614127565b90505b818110156135c9576000818152600d6020526040902054156135b7576000818152600d6020908152604080832054600e548452600c9092529091205461358591906140fb565b6000828152600c6020526040812091909155600f80546001810182559152600080516020614463833981519152018190555b806135c18161410e565b91505061353f565b505b600e5481146135f857600f8054600181018255600091909152600080516020614463833981519152018190555b600e8190558515613698576000610e106001888154811061361b5761361b6140ad565b9060005260206000200154876136319190614127565b61363b91906140d9565b905060085460028881548110613653576136536140ad565b9060005260206000200154896136699190614191565b61367391906140d9565b6000828152600d602052604081208054909190613691908490614127565b9091555050505b6010546000036136a85760108190555b86600960008282546136ba9190614127565b90915550506009546000828152600a60205260409081902091909155516136e290859061413a565b604051908190038120888252907fcc05d0d8e455b2febc74adf64a3ee8e308af4335fe7febfa09864afc7b276e3e9060200160405180910390a250505050505050565b6060611bc56001600160a01b03831660146137a3565b600081831061374a578161374c565b825b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006137b2836002614191565b6137bd906002614127565b6001600160401b038111156137d4576137d4613a1c565b6040519080825280601f01601f1916602001820160405280156137fe576020820181803683370190505b509050600360fc1b81600081518110613819576138196140ad565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613848576138486140ad565b60200101906001600160f81b031916908160001a905350600061386c846002614191565b613877906001614127565b90505b60018111156138ef576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138ab576138ab6140ad565b1a60f81b8282815181106138c1576138c16140ad565b60200101906001600160f81b031916908160001a90535060049490941c936138e88161442b565b905061387a565b50831561374c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610539565b508054600082556009029060005260206000209081019061298b91905b808211156139b557600061396f82826139b9565b50600060018201819055600282018190556003820181905560048201819055600582018190556006820181905560078201805460ff19169055600882015560090161395b565b5090565b5080546139c5906141b0565b6000825580601f106139d5575050565b601f01602090049060005260206000209081019061298b91905b808211156139b557600081556001016139ef565b600060208284031215613a1557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613a5a57613a5a613a1c565b604052919050565b60006001600160401b03821115613a7b57613a7b613a1c565b5060051b60200190565b600082601f830112613a9657600080fd5b81356020613aab613aa683613a62565b613a32565b82815260059290921b84018101918181019086841115613aca57600080fd5b8286015b84811015613ae55780358352918301918301613ace565b509695505050505050565b600082601f830112613b0157600080fd5b81356001600160401b03811115613b1a57613b1a613a1c565b613b2d601f8201601f1916602001613a32565b818152846020838601011115613b4257600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112613b7057600080fd5b81356020613b80613aa683613a62565b82815260059290921b84018101918181019086841115613b9f57600080fd5b8286015b84811015613ae55780356001600160401b03811115613bc25760008081fd5b613bd08986838b0101613af0565b845250918301918301613ba3565b80356001600160a01b0381168114613bf557600080fd5b919050565b600082601f830112613c0b57600080fd5b81356020613c1b613aa683613a62565b82815260059290921b84018101918181019086841115613c3a57600080fd5b8286015b84811015613ae557613c4f81613bde565b8352918301918301613c3e565b600080600080600060a08688031215613c7457600080fd5b85356001600160401b0380821115613c8b57600080fd5b613c9789838a01613a85565b96506020880135915080821115613cad57600080fd5b613cb989838a01613a85565b95506040880135915080821115613ccf57600080fd5b613cdb89838a01613a85565b94506060880135915080821115613cf157600080fd5b613cfd89838a01613b5f565b93506080880135915080821115613d1357600080fd5b50613d2088828901613bfa565b9150509295509295909350565b60008060408385031215613d4057600080fd5b82356001600160401b03811115613d5657600080fd5b613d6285828601613af0565b95602094909401359450505050565b60005b83811015613d8c578181015183820152602001613d74565b50506000910152565b60008151808452613dad816020860160208601613d71565b601f01601f19169290920160200192915050565b6000610120808352613dd58184018d613d95565b602084019b909b52505060408101979097526060870195909552608086019390935260a085019190915260c0840152151560e083015261010090910152919050565b60008060408385031215613e2a57600080fd5b82356001600160401b0380821115613e4157600080fd5b613e4d86838701613a85565b93506020850135915080821115613e6357600080fd5b50613e7085828601613a85565b9150509250929050565b60008060408385031215613e8d57600080fd5b82356001600160401b03811115613ea357600080fd5b613eaf85828601613af0565b925050613ebe60208401613bde565b90509250929050565b6001600160a01b0391909116815260200190565b60008060408385031215613eee57600080fd5b613ef783613bde565b946020939093013593505050565b600060208284031215613f1757600080fd5b61374c82613bde565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015613fd357603f1989840301855281516101208151818652613f6e82870182613d95565b838b0151878c0152898401518a880152606080850151908801526080808501519088015260a0808501519088015260c0808501519088015260e08085015115159088015261010093840151939096019290925250509386019390860190600101613f47565b509098975050505050505050565b60008060408385031215613ff457600080fd5b50508035926020909101359150565b60208152600061374c6020830184613d95565b60008060006060848603121561402b57600080fd5b61403484613bde565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156140a057815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101614066565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000826140f657634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115611bc557611bc56140c3565b600060018201614120576141206140c3565b5060010190565b80820180821115611bc557611bc56140c3565b6000825161414c818460208701613d71565b9190910192915050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561418157600080fd5b8151801515811461374c57600080fd5b60008160001904831182151516156141ab576141ab6140c3565b500290565b600181811c908216806141c457607f821691505b6020821081036141e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610fa957600081815260208120601f850160051c810160208610156142115750805b601f850160051c820191505b8181101561062c5782815560010161421d565b600019600383901b1c191660019190911b1790565b818103614250575050565b61425a82546141b0565b6001600160401b0381111561427157614271613a1c565b6142858161427f84546141b0565b846141ea565b6000601f8211600181146142b357600083156142a15750848201545b6142ab8482614230565b855550614318565b600085815260209020601f19841690600086815260209020845b838110156142ed57828601548255600195860195909101906020016142cd565b508583101561430b5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252818101527f5374616b696e673a3a7374616b653a3a205472616e73666572206661696c6564604082015260600190565b81516001600160401b0381111561439157614391613a1c565b61439f8161427f84546141b0565b602080601f8311600181146143ce57600084156143bc5750858301515b6143c68582614230565b86555061062c565b600085815260208120601f198616915b828110156143fd578886015182559484019460019091019084016143de565b508582101561441b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008161443a5761443a6140c3565b50600019019056fe5374616b696e673a3a676574436c61696d416d6f756e74486973746f72793a3a8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c8a4342914a1ac846963a5364814ac14f3b318399418a7dbbcf5130027ffb05364736f6c63430008100033000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d800000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c3600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a800000000000000000000000000000000000000000000000000000000000278d00000000000000000000000000000000000000000000000000000000000076a7000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000005a39a8000000000000000000000000000000000000000000000000000000000096601800000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c8
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018b5760003560e01c80630484ee511461019057806308dd1988146101b65780631abc354f146101cb57806321daf7db146101f35780632e17de78146102065780633779445a146102195780633a08a011146102395780634a2789f8146102615780634e71d92d146102745780635454a2361461027c578063567e98f91461028f5780635cc423a314610298578063606d6a94146102cc578063607ad0d7146102df5780636459b25014610306578063687a776714610319578063715018a614610339578063733bdef0146103415780637b0472f01461036157806382989a29146103745780638da5cb5b146103875780638fcdfd881461038f57806398c220cf146103a2578063ac4b457a146103c2578063af514a9b146103e9578063b6b55f25146103f2578063c84e4db314610405578063e077a9d01461040e578063f01f20df14610417578063f2fde38b14610420578063facdc67914610433578063fd5e6dd114610446578063fff6818914610466575b600080fd5b6101a361019e366004613a03565b610486565b6040519081526020015b60405180910390f35b6101c96101c4366004613c5c565b6104a7565b005b6101de6101d9366004613a03565b610634565b604080519283526020830191909152016101ad565b6101a3610201366004613a03565b610882565b6101c9610214366004613a03565b610892565b6101a3610227366004613a03565b60056020526000908152604090205481565b61024c610247366004613d2d565b610d98565b6040516101ad99989796959493929190613dc1565b6101c961026f366004613e17565b610ea2565b6101c9610fae565b6101c961028a366004613e7a565b61134b565b6101a360095481565b6102bf7f00000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c3681565b6040516101ad9190613ec7565b6101a36102da366004613a03565b611566565b6101a37f00000000000000000000000000000000000000000000000000000000664edf8c81565b6101a3610314366004613edb565b611576565b6101a3610327366004613a03565b600c6020526000908152604090205481565b6101c9611bcb565b61035461034f366004613f05565b611bdf565b6040516101ad9190613f20565b6101c961036f366004613fe1565b611d53565b6101de610382366004613a03565b612282565b6102bf612466565b6101de61039d366004613a03565b612475565b6101a36103b0366004613a03565b600d6020526000908152604090205481565b6102bf7f000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d881565b6101a360085481565b6101c9610400366004613a03565b612668565b6101a3600b5481565b6101a3600e5481565b6101a360075481565b6101c961042e366004613f05565b612915565b6101a3610441366004613a03565b61298e565b610459610454366004613a03565b61299e565b6040516101ad9190614003565b610479610474366004614016565b612a4a565b6040516101ad9190614049565b6001818154811061049657600080fd5b600091825260209091200154905081565b6104af613095565b835185511480156104c1575082518551145b80156104ce575081518551145b80156104db575080518551145b6105425760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e673a3a6d756c74695072655374616b653a3a20496e76616c696460448201526c040d2dce0eae840d8cadccee8d609b1b60648201526084015b60405180910390fd5b600e54600003610584576001610e1084600081518110610564576105646140ad565b602002602001015161057691906140d9565b61058091906140fb565b600e555b60005b855181101561062c5761061a8682815181106105a5576105a56140ad565b60200260200101518683815181106105bf576105bf6140ad565b60200260200101518684815181106105d9576105d96140ad565b60200260200101518685815181106105f3576105f36140ad565b602002602001015186868151811061060d5761060d6140ad565b60200260200101516130f4565b806106248161410e565b915050610587565b505050505050565b6000806000806001600f8054905061064c91906140fb565b905060005b8183116107775760026106648385614127565b61066e91906140d9565b90508015801561069a575085600f828154811061068d5761068d6140ad565b9060005260206000200154115b156106ae5750600095600195509350505050565b801580156106d9575085600f82815481106106cb576106cb6140ad565b906000526020600020015411155b1561072857600c6000600f83815481106106f5576106f56140ad565b906000526020600020015481526020019081526020016000205481600161071c9190614127565b94509450505050915091565b85600f828154811061073c5761073c6140ad565b90600052602060002001540361078e57600f5461075a826001614127565b101561077757600c6000600f83815481106106f5576106f56140ad565b600c6000600f83815481106106f5576106f56140ad565b6000811180156107ba575085600f82815481106107ad576107ad6140ad565b9060005260206000200154115b80156107ec575085600f6107cf6001846140fb565b815481106107df576107df6140ad565b9060005260206000200154105b1561083957600c6000600f6108026001856140fb565b81548110610812576108126140ad565b90600052602060002001548152602001908152602001600020548194509450505050915091565b85600f828154811061084d5761084d6140ad565b9060005260206000200154101561087057610869816001614127565b9250610651565b61087b6001826140fb565b9150610651565b6006818154811061049657600080fd5b6000600361089f33613725565b6040516108ac919061413a565b908152604051908190036020019020805490915082106109185760405162461bcd60e51b815260206004820152602160248201527f5374616b696e673a3a756e7374616b653a3a20496e76616c696420616d6f756e6044820152601d60fa1b6064820152608401610539565b80828154811061092a5761092a6140ad565b9060005260206000209060090201600501546000146109975760405162461bcd60e51b815260206004820152602360248201527f5374616b696e673a3a756e7374616b653a3a20416c726561647920756e7374616044820152621ad95960ea1b6064820152608401610539565b428183815481106109aa576109aa6140ad565b9060005260206000209060090201600301548284815481106109ce576109ce6140ad565b9060005260206000209060090201600101546109ea9190614127565b10610a4f5760405162461bcd60e51b815260206004820152602f60248201527f5374616b696e673a3a756e7374616b653a3a205374616b696e6720706572696f60448201526e19081b9bdd0818dbdb5c1b195d1959608a1b6064820152608401610539565b808281548110610a6157610a616140ad565b906000526020600020906009020160040154818381548110610a8557610a856140ad565b90600052602060002090600902016005018190555042818381548110610aad57610aad6140ad565b90600052602060002090600902016006018190555060007f00000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c366001600160a01b031663a9059cbb33848681548110610b0657610b066140ad565b9060005260206000209060090201600501546040518363ffffffff1660e01b8152600401610b35929190614156565b6020604051808303816000875af1158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b78919061416f565b905080610bd25760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a756e7374616b653a3a205472616e73666572206661696c604482015261195960f21b6064820152608401610539565b818381548110610be457610be46140ad565b90600052602060002090600902016005015460096000828254610c0791906140fb565b9091555060009050610c1b610e10426140d9565b6009546000828152600a60205260409020558354909150839085908110610c4457610c446140ad565b906000526020600020906009020160080154600003610d2c576008546002848681548110610c7457610c746140ad565b90600052602060002090600902016008015481548110610c9657610c966140ad565b9060005260206000200154848681548110610cb357610cb36140ad565b906000526020600020906009020160040154610ccf9190614191565b610cd991906140d9565b600e546000908152600c6020526040902054610cf591906140fb565b6000828152600c6020526040812091909155600f8054600181018255915260008051602061446383398151915201819055600e8190555b336001600160a01b03167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd848681548110610d6957610d696140ad565b906000526020600020906009020160050154604051610d8a91815260200190565b60405180910390a250505050565b81516020818401810180516003825292820191850191909120919052805482908110610dc357600080fd5b906000526020600020906009020160009150915050806000018054610de7906141b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e13906141b0565b8015610e605780601f10610e3557610100808354040283529160200191610e60565b820191906000526020600020905b815481529060010190602001808311610e4357829003601f168201915b505050506001830154600284015460038501546004860154600587015460068801546007890154600890990154979895979496509294919390929160ff169089565b610eaa613095565b8051825114610f0e5760405162461bcd60e51b815260206004820152602a60248201527f5374616b696e673a3a7072654465706f7369743a3a20496e76616c696420696e6044820152690e0eae840d8cadccee8d60b31b6064820152608401610539565b60005b8251811015610fa957828181518110610f2c57610f2c6140ad565b602002602001015160056000848481518110610f4a57610f4a6140ad565b60200260200101518152602001908152602001600020819055506006828281518110610f7857610f786140ad565b6020908102919091018101518254600181018455600093845291909220015580610fa18161410e565b915050610f11565b505050565b426000610fbb3383611576565b905060006003610fca33613725565b604051610fd7919061413a565b90815260405190819003602001902080549091506110375760405162461bcd60e51b815260206004820181905260248201527f5374616b696e673a3a636c61696d3a3a204e6f207374616b696e6720696e666f6044820152606401610539565b60005b81548110156111c257818181548110611055576110556140ad565b9060005260206000209060090201600801546000148015611098575083828281548110611084576110846140ad565b906000526020600020906009020160060154105b8061114757508181815481106110b0576110b06140ad565b600091825260209091206007600990920201015460ff1615801561114757508181815481106110e1576110e16140ad565b906000526020600020906009020160030154828281548110611105576111056140ad565b9060005260206000209060090201600101546111219190614127565b828281548110611133576111336140ad565b906000526020600020906009020160020154105b15611179578382828154811061115f5761115f6140ad565b9060005260206000209060090201600201819055506111b0565b600182828154811061118d5761118d6140ad565b60009182526020909120600990910201600701805460ff19169115159190911790555b806111ba8161410e565b91505061103a565b506000821161121f5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e673a3a636c61696d3a3a204e6f20636c61696d61626c6520616d6044820152631bdd5b9d60e21b6064820152608401610539565b60405163a9059cbb60e01b81526000906001600160a01b037f000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d8169063a9059cbb906112709033908790600401614156565b6020604051808303816000875af115801561128f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b3919061416f565b9050806113025760405162461bcd60e51b815260206004820181905260248201527f5374616b696e673a3a636c61696d3a3a205472616e73666572206661696c65646044820152606401610539565b82600b600082825461131491906140fb565b909155505060405183815233907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490602001610d8a565b611353613095565b6000600383604051611365919061413a565b90815260405190819003602001902054116113d65760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e673a3a73657457616c6c6574416464726573733a3a204e6f207360448201526a74616b696e6720696e666f60a81b6064820152608401610539565b60005b6003836040516113e9919061413a565b908152604051908190036020019020548110156114f657600361140b83613725565b604051611418919061413a565b9081526020016040518091039020600384604051611436919061413a565b90815260200160405180910390208281548110611455576114556140ad565b60009182526020808320845460018101865594845292206009918202909201920201806114828382614245565b50600182810154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560068083015490820155600780830154908201805460ff191660ff9092161515919091179055600891820154910155806114ee8161410e565b9150506113d9565b50600382604051611507919061413a565b90815260200160405180910390206000611521919061393e565b336001600160a01b03167f2629135685361a12b8336cd760f20c013116ea0ee04812a556657a173bffd10d8260405161155a9190613ec7565b60405180910390a25050565b600f818154811061049657600080fd5b60008080600361158586613725565b604051611592919061413a565b90815260405190819003602001902080549091506116045760405162461bcd60e51b815260206004820152602960248201527f5374616b696e673a3a676574436c61696d416d6f756e743a3a204e6f207374616044820152686b696e6720696e666f60b81b6064820152608401610539565b60005b8154811015611bbf57818181548110611622576116226140ad565b600091825260209091206007600990920201015460ff16611bad576000610e10838381548110611654576116546140ad565b90600052602060002090600902016002015461167091906140d9565b90506000838381548110611686576116866140ad565b9060005260206000209060090201600101548484815481106116aa576116aa6140ad565b9060005260206000209060090201600601541161172557610e108484815481106116d6576116d66140ad565b9060005260206000209060090201600301548585815481106116fa576116fa6140ad565b9060005260206000209060090201600101546117169190614127565b61172091906140d9565b6117bd565b6117bd610e1085858154811061173d5761173d6140ad565b906000526020600020906009020160030154868681548110611761576117616140ad565b90600052602060002090600902016001015461177d9190614127565b61178791906140d9565b610e1086868154811061179c5761179c6140ad565b9060005260206000209060090201600601546117b891906140d9565b61373b565b905060006117cd610e10896140d9565b905060008585815481106117e3576117e36140ad565b90600052602060002090600902016008015460001480156118495750858581548110611811576118116140ad565b906000526020600020906009020160010154868681548110611835576118356140ad565b906000526020600020906009020160060154105b6118605781831061185a5781611862565b82611862565b815b9050600080600080600061187589610634565b909450925061188389612282565b9095509150885b86811015611ba257600081815260056020526040902054156118b85760008181526005602052604090205495505b6000818152600c6020526040902054156118de576000818152600c602052604090205494505b6000818152600d60205260409020541561190e576000818152600d602052604090205461190b9083614127565b91505b600f54600090851080159061192557506006548410155b156119315750866119c2565b600f54851061195f576006848154811061194d5761194d6140ad565b906000526020600020015490506119c2565b600654841061197b57600f858154811061194d5761194d6140ad565b6119bf600f8681548110611991576119916140ad565b9060005260206000200154600686815481106119af576119af6140ad565b906000526020600020015461373b565b90505b60006119ce84886140fb565b116119f757905080846119e08161410e565b95505083806119ee9061410e565b9450505061188a565b81811115611add57600854611a0c84886140fb565b611a169190614191565b8760028f8f81548110611a2b57611a2b6140ad565b90600052602060002090600902016008015481548110611a4d57611a4d6140ad565b90600052602060002001548f8f81548110611a6a57611a6a6140ad565b906000526020600020906009020160040154611a869190614191565b611a909190614191565b611a9a84846140fb565b611aa49190614191565b611aae91906140d9565b611ab8908f614127565b9d5090508084611ac78161410e565b9550508380611ad59061410e565b945050611b9c565b600854611aea84886140fb565b611af49190614191565b8760028f8f81548110611b0957611b096140ad565b90600052602060002090600902016008015481548110611b2b57611b2b6140ad565b90600052602060002001548f8f81548110611b4857611b486140ad565b906000526020600020906009020160040154611b649190614191565b611b6e9190614191565b611b78848b6140fb565b611b829190614191565b611b8c91906140d9565b611b96908f614127565b9d508791505b5061188a565b505050505050505050505b80611bb78161410e565b915050611607565b50909150505b92915050565b611bd3613095565b611bdd6000613753565b565b60606003611bec83613725565b604051611bf9919061413a565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015611d48578382906000526020600020906009020160405180610120016040529081600082018054611c5b906141b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906141b0565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b5050509183525050600182810154602080840191909152600284015460408401526003840154606084015260048401546080840152600584015460a0840152600684015460c0840152600784015460ff16151560e08401526008909301546101009092019190915291835292019101611c27565b505050509050919050565b60008211611da35760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e673a3a7374616b653a3a20496e76616c696420616d6f756e74006044820152606401610539565b6040516323b872dd60e01b81526000906001600160a01b037f00000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c3616906323b872dd90611df69033903090889060040161431f565b6020604051808303816000875af1158015611e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e39919061416f565b905080611e585760405162461bcd60e51b815260040161053990614343565b6000611e6333613725565b9050600381604051611e75919061413a565b90815260405190819003602001902054600003611eb9576004611e9733613725565b81546001810183556000928352602090922090910190611eb79082614378565b505b600e54600003611eff576001611ef1610e107f00000000000000000000000000000000000000000000000000000000664edf8c6140d9565b611efb91906140fb565b600e555b600381604051611f0f919061413a565b908152602001604051809103902060405180610120016040528083815260200142815260200142815260200160018681548110611f4e57611f4e6140ad565b6000918252602080832090910154835282810189905260408301829052606083018290526080830182905260a09092018790528354600181018555938152208151919260090201908190611fa29082614378565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201805460ff1916911515919091179055610100909101516008909101556000612012610e10426140d9565b9050600d6000828152602001908152602001600020546008546002868154811061203e5761203e6140ad565b9060005260206000200154876120549190614191565b61205e91906140d9565b600e546000908152600c602052604090205461207a9190614127565b61208491906140fb565b6000828152600c6020526040902055600e5481111561213d576000600e5460016120ae9190614127565b90505b8181101561213b576000818152600d602052604090205415612129576000818152600d6020908152604080832054600e548452600c909252909120546120f791906140fb565b6000828152600c6020526040812091909155600f80546001810182559152600080516020614463833981519152018190555b806121338161410e565b9150506120b1565b505b600e54811461216a57600f8054600181018255600091909152600080516020614463833981519152018190555b600e819055831561220a576000610e106001868154811061218d5761218d6140ad565b9060005260206000200154426121a39190614127565b6121ad91906140d9565b9050600854600286815481106121c5576121c56140ad565b9060005260206000200154876121db9190614191565b6121e591906140d9565b6000828152600d602052604081208054909190612203908490614127565b9091555050505b60105460000361221a5760108190555b846009600082825461222c9190614127565b90915550506009546000828152600a6020908152604091829020929092555186815233917febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a910160405180910390a25050505050565b600080600080600160068054905061229a91906140fb565b905060005b8183116123925760026122b28385614127565b6122bc91906140d9565b9050801580156122e8575085600682815481106122db576122db6140ad565b9060005260206000200154115b156122fc5750600095600195509350505050565b8015801561232757508560068281548110612319576123196140ad565b906000526020600020015411155b156123435760056000600683815481106106f5576106f56140ad565b8560068281548110612357576123576140ad565b9060005260206000200154036123a957600654612375826001614127565b10156123925760056000600683815481106106f5576106f56140ad565b60056000600683815481106106f5576106f56140ad565b6000811180156123d5575085600682815481106123c8576123c86140ad565b9060005260206000200154115b801561240757508560066123ea6001846140fb565b815481106123fa576123fa6140ad565b9060005260206000200154105b1561241d576005600060066108026001856140fb565b8560068281548110612431576124316140ad565b906000526020600020015410156124545761244d816001614127565b925061229f565b61245f6001826140fb565b915061229f565b6000546001600160a01b031690565b6000806000806001600f8054905061248d91906140fb565b905060005b8183116126595760026124a58385614127565b6124af91906140d9565b9050801580156124db575085600f82815481106124ce576124ce6140ad565b9060005260206000200154115b156124ef5750600095600195509350505050565b8015801561251a575085600f828154811061250c5761250c6140ad565b906000526020600020015411155b1561253657600a6000600f83815481106106f5576106f56140ad565b85600f828154811061254a5761254a6140ad565b90600052602060002001540361259c57600f54612568826001614127565b101561258557600a6000600f83815481106106f5576106f56140ad565b600a6000600f83815481106106f5576106f56140ad565b6000811180156125c8575085600f82815481106125bb576125bb6140ad565b9060005260206000200154115b80156125fa575085600f6125dd6001846140fb565b815481106125ed576125ed6140ad565b9060005260206000200154105b1561261057600a6000600f6108026001856140fb565b85600f8281548110612624576126246140ad565b9060005260206000200154101561264757612640816001614127565b9250612492565b6126526001826140fb565b9150612492565b50600095600195509350505050565b612670613095565b600081116126ca5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e673a3a6465706f7369743a3a20496e76616c696420616d6f756e6044820152601d60fa1b6064820152608401610539565b6040516323b872dd60e01b81526000906001600160a01b037f000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d816906323b872dd9061271d9033903090879060040161431f565b6020604051808303816000875af115801561273c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612760919061416f565b9050806127ba5760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a6465706f7369743a3a205472616e73666572206661696c604482015261195960f21b6064820152608401610539565b6006546000906127cb5760006127f7565b600680546127db906001906140fb565b815481106127eb576127eb6140ad565b90600052602060002001545b90506000612807610e10426140d9565b90506000821561282557600083815260056020526040902054612828565b60005b905060008161283785856140fb565b6128419190614191565b60125461284e91906140fb565b905061285a8682614127565b60128190555085600b60008282546128729190614127565b9091555050601254612887906105dc906140d9565b600084815260056020526040812091909155600680546001810182559082527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0184905560115490036128da5760118390555b6040518681527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1505050505050565b61291d613095565b6001600160a01b0381166129825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610539565b61298b81613753565b50565b6002818154811061049657600080fd5b600481815481106129ae57600080fd5b9060005260206000200160009150905080546129c9906141b0565b80601f01602080910402602001604051908101604052809291908181526020018280546129f5906141b0565b8015612a425780601f10612a1757610100808354040283529160200191612a42565b820191906000526020600020905b815481529060010190602001808311612a2557829003601f168201915b505050505081565b6060818310612aa45760405162461bcd60e51b81526020600482015260326024820152600080516020614443833981519152604482015271020496e76616c69642074696d657374616d760741b6064820152608401610539565b60006003612ab186613725565b604051612abe919061413a565b90815260405190819003602001902090506000612add610e10866140d9565b90506000612aed610e10866140d9565b8354909150612b455760405162461bcd60e51b8152602060048201526030602482015260008051602061444383398151915260448201526f204e6f207374616b696e6720696e666f60801b6064820152608401610539565b6000612b5183836140fb565b612b5c906001614127565b6001600160401b03811115612b7357612b73613a1c565b604051908082528060200260200182016040528015612bcf57816020015b612bbc6040518060800160405280600081526020016000815260200160008152602001600081525090565b815260200190600190039081612b915790505b5090506000612bdd84612282565b5090506000612beb85610634565b509050600080865b868110156130845760008181526005602052604081205415612c215760008281526005602052604090205495505b6000828152600c602052604090205415612c47576000828152600c602052604090205494505b6000828152600a602052604090205415612c6d576000828152600a602052604090205493505b600e5482118015612c8b57506000828152600a602052604090205415155b15612cac576000828152600a6020526040902054612ca99084614127565b92505b851580612cb7575084155b15612cc25750613072565b60005b8a5481101561300f578a8181548110612ce057612ce06140ad565b600091825260209091206007600990920201015460ff16612ffd5760008b8281548110612d0f57612d0f6140ad565b906000526020600020906009020160060154118015612d5e575082610e108c8381548110612d3f57612d3f6140ad565b906000526020600020906009020160060154612d5b91906140d9565b11155b612ffd578515801590612d795750612d7684876140fb565b15155b8015612e1d575082610e108c8381548110612d9657612d966140ad565b906000526020600020906009020160010154612db291906140d9565b11158015612e1d575082610e108c8381548110612dd157612dd16140ad565b9060005260206000209060090201600301548d8481548110612df557612df56140ad565b906000526020600020906009020160010154612e119190614127565b612e1b91906140d9565b115b15612ece57600854612e2f85886140fb565b612e399190614191565b8760028d8481548110612e4e57612e4e6140ad565b90600052602060002090600902016008015481548110612e7057612e706140ad565b90600052602060002001548d8481548110612e8d57612e8d6140ad565b906000526020600020906009020160040154612ea99190614191565b612eb39190614191565b612ebd91906140d9565b612ec79083614127565b9150612ffd565b8515801590612ee55750612ee284876140fb565b15155b8015612f21575082610e108c8381548110612f0257612f026140ad565b906000526020600020906009020160010154612f1e91906140d9565b11155b8015612f5057508a8181548110612f3a57612f3a6140ad565b9060005260206000209060090201600801546000145b15612ffd57600854612f6285886140fb565b612f6c9190614191565b8760028d8481548110612f8157612f816140ad565b90600052602060002090600902016008015481548110612fa357612fa36140ad565b90600052602060002001548d8481548110612fc057612fc06140ad565b906000526020600020906009020160040154612fdc9190614191565b612fe69190614191565b612ff091906140d9565b612ffa9083614127565b91505b806130078161410e565b915050612cc5565b5060405180608001604052808360016130289190614127565b61303490610e10614191565b81526020810183905260408101869052606001879052876130558b856140fb565b81518110613065576130656140ad565b6020026020010181905250505b8061307c8161410e565b915050612bf3565b50939b9a5050505050505050505050565b3361309e612466565b6001600160a01b031614611bdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610539565b6000851161314f5760405162461bcd60e51b815260206004820152602260248201527f5374616b696e673a3a7072657374616b653a3a20496e76616c696420616d6f756044820152611b9d60f21b6064820152608401610539565b7f00000000000000000000000000000000000000000000000000000000664edf8c8311156131cd5760405162461bcd60e51b815260206004820152602560248201527f5374616b696e673a3a7072657374616b653a3a20496e76616c69642074696d6560448201526407374616d760dc1b6064820152608401610539565b60007f00000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c366001600160a01b03166323b872dd613206612466565b30896040518463ffffffff1660e01b81526004016132269392919061431f565b6020604051808303816000875af1158015613245573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613269919061416f565b9050806132885760405162461bcd60e51b815260040161053990614343565b6001600160a01b038216158015906132c5575060036132a683613725565b6040516132b3919061413a565b90815260405190819003602001902054155b156132fb5760046132d583613725565b815460018101835560009283526020909220909101906132f59082614378565b50613372565b6001600160a01b03821615801561332f575060038360405161331d919061413a565b90815260405190819003602001902054155b1561337257600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016133708482614378565b505b6001600160a01b0382161561338d5761338a82613725565b92505b60038360405161339d919061413a565b9081526020016040518091039020604051806101200160405280858152602001868152602001868152602001600188815481106133dc576133dc6140ad565b600091825260208083209091015483528281018b905260408301829052606083018290526080830182905260a090920189905283546001810185559381522081519192600902019081906134309082614378565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201805460ff19169115159190911790556101009091015160089091015560006134a0610e10866140d9565b9050600d600082815260200190815260200160002054600854600288815481106134cc576134cc6140ad565b9060005260206000200154896134e29190614191565b6134ec91906140d9565b600e546000908152600c60205260409020546135089190614127565b61351291906140fb565b6000828152600c6020526040902055600e548111156135cb576000600e54600161353c9190614127565b90505b818110156135c9576000818152600d6020526040902054156135b7576000818152600d6020908152604080832054600e548452600c9092529091205461358591906140fb565b6000828152600c6020526040812091909155600f80546001810182559152600080516020614463833981519152018190555b806135c18161410e565b91505061353f565b505b600e5481146135f857600f8054600181018255600091909152600080516020614463833981519152018190555b600e8190558515613698576000610e106001888154811061361b5761361b6140ad565b9060005260206000200154876136319190614127565b61363b91906140d9565b905060085460028881548110613653576136536140ad565b9060005260206000200154896136699190614191565b61367391906140d9565b6000828152600d602052604081208054909190613691908490614127565b9091555050505b6010546000036136a85760108190555b86600960008282546136ba9190614127565b90915550506009546000828152600a60205260409081902091909155516136e290859061413a565b604051908190038120888252907fcc05d0d8e455b2febc74adf64a3ee8e308af4335fe7febfa09864afc7b276e3e9060200160405180910390a250505050505050565b6060611bc56001600160a01b03831660146137a3565b600081831061374a578161374c565b825b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060006137b2836002614191565b6137bd906002614127565b6001600160401b038111156137d4576137d4613a1c565b6040519080825280601f01601f1916602001820160405280156137fe576020820181803683370190505b509050600360fc1b81600081518110613819576138196140ad565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613848576138486140ad565b60200101906001600160f81b031916908160001a905350600061386c846002614191565b613877906001614127565b90505b60018111156138ef576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106138ab576138ab6140ad565b1a60f81b8282815181106138c1576138c16140ad565b60200101906001600160f81b031916908160001a90535060049490941c936138e88161442b565b905061387a565b50831561374c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610539565b508054600082556009029060005260206000209081019061298b91905b808211156139b557600061396f82826139b9565b50600060018201819055600282018190556003820181905560048201819055600582018190556006820181905560078201805460ff19169055600882015560090161395b565b5090565b5080546139c5906141b0565b6000825580601f106139d5575050565b601f01602090049060005260206000209081019061298b91905b808211156139b557600081556001016139ef565b600060208284031215613a1557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613a5a57613a5a613a1c565b604052919050565b60006001600160401b03821115613a7b57613a7b613a1c565b5060051b60200190565b600082601f830112613a9657600080fd5b81356020613aab613aa683613a62565b613a32565b82815260059290921b84018101918181019086841115613aca57600080fd5b8286015b84811015613ae55780358352918301918301613ace565b509695505050505050565b600082601f830112613b0157600080fd5b81356001600160401b03811115613b1a57613b1a613a1c565b613b2d601f8201601f1916602001613a32565b818152846020838601011115613b4257600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f830112613b7057600080fd5b81356020613b80613aa683613a62565b82815260059290921b84018101918181019086841115613b9f57600080fd5b8286015b84811015613ae55780356001600160401b03811115613bc25760008081fd5b613bd08986838b0101613af0565b845250918301918301613ba3565b80356001600160a01b0381168114613bf557600080fd5b919050565b600082601f830112613c0b57600080fd5b81356020613c1b613aa683613a62565b82815260059290921b84018101918181019086841115613c3a57600080fd5b8286015b84811015613ae557613c4f81613bde565b8352918301918301613c3e565b600080600080600060a08688031215613c7457600080fd5b85356001600160401b0380821115613c8b57600080fd5b613c9789838a01613a85565b96506020880135915080821115613cad57600080fd5b613cb989838a01613a85565b95506040880135915080821115613ccf57600080fd5b613cdb89838a01613a85565b94506060880135915080821115613cf157600080fd5b613cfd89838a01613b5f565b93506080880135915080821115613d1357600080fd5b50613d2088828901613bfa565b9150509295509295909350565b60008060408385031215613d4057600080fd5b82356001600160401b03811115613d5657600080fd5b613d6285828601613af0565b95602094909401359450505050565b60005b83811015613d8c578181015183820152602001613d74565b50506000910152565b60008151808452613dad816020860160208601613d71565b601f01601f19169290920160200192915050565b6000610120808352613dd58184018d613d95565b602084019b909b52505060408101979097526060870195909552608086019390935260a085019190915260c0840152151560e083015261010090910152919050565b60008060408385031215613e2a57600080fd5b82356001600160401b0380821115613e4157600080fd5b613e4d86838701613a85565b93506020850135915080821115613e6357600080fd5b50613e7085828601613a85565b9150509250929050565b60008060408385031215613e8d57600080fd5b82356001600160401b03811115613ea357600080fd5b613eaf85828601613af0565b925050613ebe60208401613bde565b90509250929050565b6001600160a01b0391909116815260200190565b60008060408385031215613eee57600080fd5b613ef783613bde565b946020939093013593505050565b600060208284031215613f1757600080fd5b61374c82613bde565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015613fd357603f1989840301855281516101208151818652613f6e82870182613d95565b838b0151878c0152898401518a880152606080850151908801526080808501519088015260a0808501519088015260c0808501519088015260e08085015115159088015261010093840151939096019290925250509386019390860190600101613f47565b509098975050505050505050565b60008060408385031215613ff457600080fd5b50508035926020909101359150565b60208152600061374c6020830184613d95565b60008060006060848603121561402b57600080fd5b61403484613bde565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156140a057815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101614066565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000826140f657634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115611bc557611bc56140c3565b600060018201614120576141206140c3565b5060010190565b80820180821115611bc557611bc56140c3565b6000825161414c818460208701613d71565b9190910192915050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561418157600080fd5b8151801515811461374c57600080fd5b60008160001904831182151516156141ab576141ab6140c3565b500290565b600181811c908216806141c457607f821691505b6020821081036141e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610fa957600081815260208120601f850160051c810160208610156142115750805b601f850160051c820191505b8181101561062c5782815560010161421d565b600019600383901b1c191660019190911b1790565b818103614250575050565b61425a82546141b0565b6001600160401b0381111561427157614271613a1c565b6142858161427f84546141b0565b846141ea565b6000601f8211600181146142b357600083156142a15750848201545b6142ab8482614230565b855550614318565b600085815260209020601f19841690600086815260209020845b838110156142ed57828601548255600195860195909101906020016142cd565b508583101561430b5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b5050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252818101527f5374616b696e673a3a7374616b653a3a205472616e73666572206661696c6564604082015260600190565b81516001600160401b0381111561439157614391613a1c565b61439f8161427f84546141b0565b602080601f8311600181146143ce57600084156143bc5750858301515b6143c68582614230565b86555061062c565b600085815260208120601f198616915b828110156143fd578886015182559484019460019091019084016143de565b508582101561441b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008161443a5761443a6140c3565b50600019019056fe5374616b696e673a3a676574436c61696d416d6f756e74486973746f72793a3a8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220c8a4342914a1ac846963a5364814ac14f3b318399418a7dbbcf5130027ffb05364736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d800000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c3600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a800000000000000000000000000000000000000000000000000000000000278d00000000000000000000000000000000000000000000000000000000000076a7000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000005a39a8000000000000000000000000000000000000000000000000000000000096601800000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c8
-----Decoded View---------------
Arg [0] : _USDTToken (address): 0x192fD4AD52CAA2933d6E153a3f87EAf732b984d8
Arg [1] : _DLIComToken (address): 0x58B4F4A11e4482235c63242Cad5Ce9eb5e336c36
Arg [2] : _lockingPeriod (uint256[]): 0,604800,2592000,7776000,15552000,31536000,94608000,157680000
Arg [3] : _poolMultiplier (uint256[]): 10,12,18,25,35,60,150,200
Arg [4] : _poolMultiplierDivider (uint256): 10
Arg [5] : _burnPercentage (uint256): 2
-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 000000000000000000000000192fd4ad52caa2933d6e153a3f87eaf732b984d8
Arg [1] : 00000000000000000000000058b4f4a11e4482235c63242cad5ce9eb5e336c36
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000093a80
Arg [9] : 0000000000000000000000000000000000000000000000000000000000278d00
Arg [10] : 000000000000000000000000000000000000000000000000000000000076a700
Arg [11] : 0000000000000000000000000000000000000000000000000000000000ed4e00
Arg [12] : 0000000000000000000000000000000000000000000000000000000001e13380
Arg [13] : 0000000000000000000000000000000000000000000000000000000005a39a80
Arg [14] : 0000000000000000000000000000000000000000000000000000000009660180
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [16] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [17] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [21] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [23] : 00000000000000000000000000000000000000000000000000000000000000c8
Loading...
Loading
Loading...
Loading
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.