diff --git a/contracts/staking/liquid/LiquidNodesManager.sol b/contracts/staking/liquid/LiquidNodesManager.sol deleted file mode 100644 index c0725c50..00000000 --- a/contracts/staking/liquid/LiquidNodesManager.sol +++ /dev/null @@ -1,164 +0,0 @@ -//SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import "../../consensus/IValidatorSet.sol"; -import "../../funds/RewardsBank.sol"; -import "../../finance/Treasury.sol"; -import "./LiquidPool.sol"; -import "../../utils/TransferViaCall.sol"; - -contract LiquidNodesManager is UUPSUpgradeable, AccessControlUpgradeable { - bytes32 constant public BACKEND_ROLE = keccak256("BACKEND_ROLE"); - bytes32 constant public POOL_ROLE = keccak256("POOL_ROLE"); - - IValidatorSet public validatorSet; - RewardsBank public rewardsBank; - - address public treasury; - Treasury public treasuryFee; - - uint public nodeStake; // stake for 1 onboarded node - uint public maxNodesCount; - address[] public nodes; - uint private _totalNodesStake; - - uint private _requestId; - uint private _requestStake; - uint256[10] __gap; - - - event AddNodeRequest(uint indexed requestId, uint indexed nodeId, uint stake); - event NodeOnboarded(uint indexed requestId, address indexed node, uint indexed nodeId, uint stake); - event RequestFailed(uint indexed requestId, uint indexed nodeId, uint stake); - event NodeRetired(uint indexed nodeId, address indexed node, uint stake); - event Reward(address indexed addr, uint amount); - - function initialize( - IValidatorSet validatorset_, RewardsBank rewardsBank_, - address treasury_, Treasury treasuryFee_, - uint nodeStake_, uint maxNodesCount_ - ) public initializer { - validatorSet = validatorset_; - rewardsBank = rewardsBank_; - treasury = treasury_; - treasuryFee = treasuryFee_; - nodeStake = nodeStake_; - maxNodesCount = maxNodesCount_; - nodes = new address[](0); - __AccessControl_init(); - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - // POOL METHODS - - function stake() external payable onlyRole(POOL_ROLE) { - // retire node if maxNodesCount was changed - if (nodes.length > maxNodesCount) { - _retireNode(); - } - // try to onboard new node - _requestNodeCreation(); - } - - function unstake(uint amount) external onlyRole(POOL_ROLE) { - // retire node if not enough free balance - while (getFreeBalance() < amount) { - _retireNode(); - } - transferViaCall(payable(msg.sender), amount); - // Try to onboard new node in case if maxNodesCount was changed - _requestNodeCreation(); - } - // IStakeManager impl - - function reward(address nodeAddress, uint256 amount) public { - require(msg.sender == address(validatorSet), "Only validatorSet can call reward()"); - - uint feeAmount = treasuryFee.calcFee(amount); - rewardsBank.withdrawAmb(payable(address(treasuryFee)), feeAmount); - amount -= feeAmount; - - rewardsBank.withdrawAmb(payable(treasury), amount); - validatorSet.emitReward(address(rewardsBank), nodeAddress, address(this), address(treasury), address(0), amount); - } - - function report(address nodeAddress) public {} - - // BAKEND METHODS - - function onboardNode(uint requestId, address node, uint nodeId) public onlyRole(BACKEND_ROLE) { - _onboardNode(requestId, node, nodeId); - } - - // ADMIN METHODS - - function setNodeStakeAndCount(uint nodeStake_, uint maxNodesCount_) public onlyRole(DEFAULT_ADMIN_ROLE) { - nodeStake = nodeStake_; - maxNodesCount = maxNodesCount_; - } - - // INTERNAL METHODS - - function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} - - function _onboardNode(uint requestId, address node, uint nodeId) private { - require(node != address(0), "Node address can't be zero"); - require(_requestStake > 0, "No active request"); - require(validatorSet.getNodeStake(node) == 0, "Node already onboarded"); - require(requestId == _requestId, "Invalid request id"); - require(address(this).balance >= _totalNodesStake + _requestStake, "Not enough balance"); - - if (nodeId == nodes.length && getFreeBalance() >= _requestStake) { - nodes.push(node); - _totalNodesStake += _requestStake; - validatorSet.newStake(node, _requestStake, true); - emit NodeOnboarded(requestId, node, nodeId, _requestStake); - } else { - emit RequestFailed(requestId, nodeId, _requestStake); - } - - _requestStake = 0; - - // try to onboard another node - _requestNodeCreation(); - } - - function _retireNode() private { - require(nodes.length > 0, "No nodes onboarded"); - - address node = nodes[nodes.length - 1]; - uint deposit = getNodeDeposit(node); - _totalNodesStake -= deposit; - nodes.pop(); - validatorSet.unstake(node, deposit); - emit NodeRetired(nodes.length, node, deposit); - } - - function _requestNodeCreation() private { - if (_requestStake == 0 && getFreeBalance() >= nodeStake && nodes.length < maxNodesCount) { - _requestId++; - _requestStake = nodeStake; - emit AddNodeRequest(_requestId, nodes.length, _requestStake); - } - } - - - function getNodeDeposit(address node) public view returns (uint) { - return validatorSet.getNodeStake(node); - } - - function getNodesCount() public view returns (uint) { - return nodes.length; - } - - function getNodes() public view returns (address[] memory) { - return nodes; - } - - // balance that not used for nodes stakes - function getFreeBalance() public view returns (uint) { - return address(this).balance - _totalNodesStake; - } -} diff --git a/contracts/staking/liquid/LiquidPool.sol b/contracts/staking/liquid/LiquidPool.sol deleted file mode 100644 index d3dd9503..00000000 --- a/contracts/staking/liquid/LiquidPool.sol +++ /dev/null @@ -1,285 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; -import "../../funds/RewardsBank.sol"; -import "../../LockKeeper.sol"; -import {IOnBlockListener} from "../../consensus/OnBlockNotifier.sol"; -import "./StAMB.sol"; -import "./StakingTiers.sol"; -import "./LiquidNodesManager.sol"; - -contract LiquidPool is UUPSUpgradeable, AccessControlUpgradeable, IOnBlockListener { - uint constant private BILLION = 1000000000; - - LiquidNodesManager public nodeManager; - RewardsBank public rewardsBank; - StakingTiers public tiers; - LockKeeper public lockKeeper; - address public bondAddress; - StAMB public stAmb; - - uint public minStakeValue; - uint public unstakeLockTime; - - uint public interest; // user will get interest % of his stake. Sets in parts per billion - uint public interestPeriod; // period in seconds for interest calculation - uint internal lastInterestTime; // newReward = totalStAmb * (interest/1e6) * (timePassed / interestPeriod) - uint public fastUnstakePenalty; // penalty in parts per million - - uint public totalRewards; // rewards from interest, includes totalRewardsDebt, can be much greater than real rewards - uint public totalRewardsDebt; // real rewards = totalRewards - totalRewardsDebt - - // rewards that has been "claimed" before stake changes. - mapping(address => uint) internal rewardsCanClaim; - - // new stakes will immediately have rewards to claim (coz of how shares works), so we need to - // artificially decrease their stakes by some value. - mapping(address => uint) public rewardsDebt; - - mapping(address => uint) public lockedWithdraws; // nodeAddress => lockId - - uint256[10] __gap; - - - event StakeChanged(address indexed account, int amount); - event Claim(address indexed account, uint ambAmount, uint bondAmount); - event Interest(uint amount); - event UnstakeLocked(address indexed account, uint amount, uint unlockTime, uint creationTime); - event UnstakeFast(address indexed account, uint amount, uint penalty); - - - function initialize( - LiquidNodesManager nodeManager_, RewardsBank rewardsBank_, StakingTiers tiers_, - LockKeeper lockKeeper_, address bondAddress_, StAMB stAmb_, - uint interest_, uint interestPeriod_, uint minStakeValue_, uint unstakeLockTime_, uint fastUnstakePenalty_ - ) public initializer { - require(minStakeValue_ > 0, "Pool min stake value is zero"); - require(interest_ >= 0 && interest_ <= BILLION, "Invalid percent value"); - - nodeManager = nodeManager_; - rewardsBank = rewardsBank_; - tiers = tiers_; - lockKeeper = lockKeeper_; - bondAddress = bondAddress_; - stAmb = stAmb_; - - interest = interest_; - interestPeriod = interestPeriod_; - - minStakeValue = minStakeValue_; - unstakeLockTime = unstakeLockTime_; - fastUnstakePenalty = fastUnstakePenalty_; - - lastInterestTime = block.timestamp; - - __AccessControl_init(); - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - // ADMIN METHODS - - function setInterest(uint interest_, uint interestPeriod_) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(interest_ >= 0 && interest_ <= BILLION, "Invalid percent value"); - interest = interest_; - interestPeriod = interestPeriod_; - } - - function setUnstakeLockTime(uint unstakeLockTime_) public onlyRole(DEFAULT_ADMIN_ROLE) { - unstakeLockTime = unstakeLockTime_; - } - - function setMinStakeValue(uint minStakeValue_) public onlyRole(DEFAULT_ADMIN_ROLE) { - minStakeValue = minStakeValue_; - } - - function setFastUnstakePenalty(uint penalty) public onlyRole(DEFAULT_ADMIN_ROLE) { - fastUnstakePenalty = penalty; - } - - // PUBLIC METHODS - - function stake() public payable { - // todo final stake value should be checked here ? - require(msg.value >= minStakeValue, "Pool: stake value too low"); - - _stake(msg.sender, msg.value); - - nodeManager.stake{value: msg.value}(); - - emit StakeChanged(msg.sender, int(msg.value)); - } - - function unstakeFast(uint amount, uint desiredCoeff) public { - require(amount <= getStake(msg.sender), "Sender has not enough tokens"); - - _unstake(msg.sender, amount); - - nodeManager.unstake(amount); - - uint penalty = amount * fastUnstakePenalty / BILLION; - payable(msg.sender).transfer(amount - penalty); - - _claimRewards(msg.sender, desiredCoeff); - - emit StakeChanged(msg.sender, - int(amount)); - emit UnstakeFast(msg.sender, amount, penalty); - } - - function unstake(uint amount, uint desiredCoeff) public { - require(amount <= getStake(msg.sender), "Sender has not enough tokens"); - - _unstake(msg.sender, amount); - - nodeManager.unstake(amount); - - // cancel previous lock (if exists). canceledAmount will be added to new lock - uint canceledAmount; - if (lockKeeper.getLock(lockedWithdraws[msg.sender]).totalClaims > 0) // prev lock exists - canceledAmount = lockKeeper.cancelLock(lockedWithdraws[msg.sender]); - - // lock funds - lockedWithdraws[msg.sender] = lockKeeper.lockSingle{value: amount + canceledAmount}( - msg.sender, address(0), - uint64(block.timestamp + unstakeLockTime), amount + canceledAmount, - "LiquidStaking unstake" - ); - - _claimRewards(msg.sender, desiredCoeff); - - emit StakeChanged(msg.sender, - int(amount)); - emit UnstakeLocked(msg.sender, amount + canceledAmount, block.timestamp + unstakeLockTime, block.timestamp); - } - - function claimRewards(uint desiredCoeff) public { - _beforeUserStakeChanged(msg.sender); - - _claimRewards(msg.sender, desiredCoeff); - } - - // external methods - - // this method is called by stAMB contract before token transfer - // it's used to calculate user rewards before his stake changes - // it's also called on mint and burn - function beforeTokenTransfer(address from, address to, uint256 amount) external { - require(msg.sender == address(stAmb), "Only stAMB can call this method"); - if (from != address(0)) - _beforeUserStakeChanged(from); - if (to != address(0)) - _beforeUserStakeChanged(to); - - - if (from != address(0) && to != address(0)) { - _updateRewardsDebt(from, _calcRewards(getStake(from) - amount)); - _updateRewardsDebt(to, _calcRewards(getStake(to) + amount)); - } - } - - function onBlock() external { - if (lastInterestTime + interestPeriod < block.timestamp) - _addInterestToDeposit(); - } - - // VIEW METHODS - - function getTotalRewards() public view returns (uint) { - return totalRewards - totalRewardsDebt; - } - - function getTotalStAmb() public view returns (uint) { - return stAmb.totalSupply(); - } - - function getStake(address user) public view returns (uint) { - return stAmb.balanceOf(user); - } - - function getClaimAmount(address user) public view returns (uint) { - uint rewardsAmount = _calcRewards(getStake(user)); - - if (rewardsAmount + rewardsCanClaim[user] <= rewardsDebt[user]) - return 0; - - return rewardsAmount + rewardsCanClaim[user] - rewardsDebt[user]; - } - - // PRIVATE METHODS - - function _addInterestToDeposit() internal { - uint timePassed = block.timestamp - lastInterestTime; - uint newRewards = getTotalStAmb() * interest * timePassed / BILLION / interestPeriod; - - totalRewards += newRewards; - lastInterestTime = block.timestamp; - - emit Interest(newRewards); - } - - - function _stake(address user, uint amount) internal { - uint rewardsAmount = _calcRewards(amount); - - stAmb.mint(user, amount); - - totalRewards += rewardsAmount; - _updateRewardsDebt(user, _calcRewards(getStake(user))); - } - - function _unstake(address user, uint amount) internal { - uint rewardsAmount = _calcRewards(amount); - - stAmb.burn(user, amount); - - totalRewards -= rewardsAmount; - _updateRewardsDebt(user, _calcRewards(getStake(user))); - } - - function _updateRewardsDebt(address user, uint newDebt) internal { - uint oldDebt = rewardsDebt[user]; - if (newDebt < oldDebt) totalRewardsDebt -= oldDebt - newDebt; - else totalRewardsDebt += newDebt - oldDebt; - rewardsDebt[user] = newDebt; - } - - // "claim" rewards for user before his stake changes - function _beforeUserStakeChanged(address user) private { - uint rewardsAmount = _calcRewards(getStake(user)); - uint rewardWithoutDebt = rewardsAmount - rewardsDebt[user]; - rewardsCanClaim[user] += rewardWithoutDebt; - _updateRewardsDebt(user, rewardsAmount); - } - - function _claimRewards(address user, uint desiredCoeff) private { - require(desiredCoeff <= 100, "Invalid desired coeff"); - require(tiers.isTierAllowed(user, desiredCoeff), "User tier is too low"); - - uint amount = rewardsCanClaim[user]; - if (amount == 0) return; - - rewardsCanClaim[user] = 0; - - uint ambAmount = amount * desiredCoeff / 100; - uint bondAmount = amount - ambAmount; - - rewardsBank.withdrawAmb(payable(user), ambAmount); - rewardsBank.withdrawErc20(bondAddress, payable(user), bondAmount); - - emit Claim(user, ambAmount, bondAmount); - } - - function _calcRewards(uint stAmbAmount) internal view returns (uint) { - if (getTotalStAmb() == 0 || totalRewards == 0) return stAmbAmount; - return stAmbAmount * totalRewards / getTotalStAmb(); - } - - - function _authorizeUpgrade(address) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} - - receive() external payable { - require(msg.sender == address(nodeManager) || msg.sender == address(lockKeeper), "Not allowed"); - } - -} diff --git a/contracts/staking/liquid/StAMB.sol b/contracts/staking/liquid/StAMB.sol deleted file mode 100644 index d6212413..00000000 --- a/contracts/staking/liquid/StAMB.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "./LiquidPool.sol"; - - -contract StAMB is ERC20, AccessControl { - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); // can use mint / burn methods - - - LiquidPool public liquidPool; - mapping(address => uint) public obtainedAt; - mapping(address => uint) public holdingTime; - - constructor() ERC20("Staked AMB", "stAMB") { - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - function mint(address account, uint256 amount) public onlyRole(MINTER_ROLE) { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public onlyRole(MINTER_ROLE) { - _burn(account, amount); - } - - function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { - liquidPool.beforeTokenTransfer(from, to, amount); - } - - function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override { - if (balanceOf(from) == 0) - holdingTime[from] += block.timestamp - obtainedAt[from]; - obtainedAt[from] = 0; - - if (obtainedAt[to] == 0 && balanceOf(to) > 0) - obtainedAt[to] = block.timestamp; - } - - function setLiquidPool(LiquidPool liquidPool_) public onlyRole(DEFAULT_ADMIN_ROLE) { - _revokeRole(MINTER_ROLE, address(liquidPool)); - liquidPool = liquidPool_; - _setupRole(MINTER_ROLE, address(liquidPool_)); - } - - function calculateHoldingTime(address user) public view returns (uint) { - if (obtainedAt[user] == 0) - return holdingTime[user]; - else - return holdingTime[user] + (block.timestamp - obtainedAt[user]); - } -} - diff --git a/contracts/staking/liquid/StakingTiers.sol b/contracts/staking/liquid/StakingTiers.sol deleted file mode 100644 index 1a046c21..00000000 --- a/contracts/staking/liquid/StakingTiers.sol +++ /dev/null @@ -1,54 +0,0 @@ -//SPDX-License-Identifier: UNCLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import "./StAMB.sol"; - -contract StakingTiers is AccessControlUpgradeable, UUPSUpgradeable { - - StAMB public stAmb; - mapping (address => uint) public bonuses; - uint256[10] __gap; - - event BonusSet(address indexed user, uint bonus); - - function initialize(StAMB stAmb_) public initializer { - stAmb = stAmb_; - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - - function isTierAllowed(address user, uint desiredTier) external view returns (bool) { - return calculateTier(user) >= desiredTier; - } - - function calculateTier(address user) public view returns (uint) { - uint liquidStakingTime = stAmb.calculateHoldingTime(user); - uint liquidPercent = liquidStakingTime * 75 / (3 * 365 days); - - uint nativePercent = 25 + liquidPercent + bonuses[user]; - if (nativePercent > 100) nativePercent = 100; - - return nativePercent; - } - - function setBonus(address user, uint bonus) public onlyRole(DEFAULT_ADMIN_ROLE){ - bonuses[user] = bonus; - emit BonusSet(user, bonus); - } - - function setBonusBatch(address[] memory users, uint[] memory bonuses_) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(users.length == bonuses_.length, "Arrays length mismatch"); - for (uint i = 0; i < users.length; i++) { - bonuses[users[i]] = bonuses_[i]; - emit BonusSet(users[i], bonuses_[i]); - } - } - - - - function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} - -} - diff --git a/contracts/staking/token/HBRToken.sol b/contracts/staking/token/HBRToken.sol deleted file mode 100644 index 87d5ac7a..00000000 --- a/contracts/staking/token/HBRToken.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol"; - -contract HBRToken is ERC20Pausable, Ownable { - - constructor(address admin) ERC20("Harbor", "HBR") Ownable() { - _transferOwnership(admin); - } - - function mint(address account, uint256 amount) external onlyOwner { - _mint(account, amount); - } - - function burn(address account, uint256 amount) external onlyOwner { - _burn(account, amount); - } - - function pause() external onlyOwner { - _pause(); - } - - function unpause() external onlyOwner { - _unpause(); - } -} diff --git a/contracts/staking/token/LimitedTokenPool.sol b/contracts/staking/token/LimitedTokenPool.sol deleted file mode 100644 index ca09ed2a..00000000 --- a/contracts/staking/token/LimitedTokenPool.sol +++ /dev/null @@ -1,327 +0,0 @@ -//SPDX-License-Identifier: UNCLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -import "../../funds/RewardsBank.sol"; -import "../../LockKeeper.sol"; - -//The side defined by the address of the token. Zero address means native coin -contract LimitedTokenPool is Initializable, AccessControl, IOnBlockListener { - using SafeERC20 for IERC20; - - struct MainConfig { - string name; - address limitsMultiplierToken; - address profitableToken; - address rewardToken; - } - - struct LimitsConfig { - uint rewardTokenPrice; // Represented as parts of BILLION 1 = Billion - uint interest; // represented as parts of BILLION. 100% = Billion - uint interestRate; - uint minDepositValue; - uint minStakeValue; - uint fastUnstakePenalty; - uint unstakeLockPeriod; // Time in seconds to how long the amount is locker after unstake - uint stakeLockPeriod; // Time in seconds to how long the stake is locker before unstake - uint maxTotalStakeValue; - uint maxStakePerUserValue; - uint stakeLimitsMultiplier; // Represented as parts of BILLION 1 = Billion - } - - struct Info { - uint totalStake; - uint totalDeposit; - uint totalRewards; - uint lastInterestUpdate; - uint totalRewardsDebt; - } - - struct Staker { - uint stake; - uint deposit; - uint rewardsDebt; - uint claimableRewards; - uint lockedWithdrawal; - uint stakedAt; - } - - uint constant public BILLION = 1_000_000_000; - bool public active; - - LockKeeper public lockKeeper; - RewardsBank public rewardsBank; - - MainConfig public mainConfig; // immutable - LimitsConfig public limitsConfig; // mutable - Info public info; - - mapping(address => Staker) private stakers; - - //EVENTS - - event Deactivated(); - event Activated(); - event LimitsConfigChanged(LimitsConfig config); - - event Deposited(address indexed user, uint amount); - event Withdrawn(address indexed user, uint amount); - event Staked(address indexed user, uint amount, uint timestamp); - event Claim(address indexed user, uint amount); - event Interest(uint amount); - event UnstakeLocked(address indexed user, uint amount, uint unlockTime, uint creationTime); - - function initialize( - RewardsBank rewardsBank_, LockKeeper lockkeeper_, MainConfig calldata config_ - ) public initializer { - lockKeeper = lockkeeper_; - rewardsBank = rewardsBank_; - - active = true; - - mainConfig = config_; - info.lastInterestUpdate = block.timestamp; - - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - // OWNER METHODS - - function setLimitsConfig(LimitsConfig calldata config) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(config.maxTotalStakeValue >= config.maxStakePerUserValue, "Pool: max stake per user is greater than max total stake"); - require(config.maxStakePerUserValue >= config.minStakeValue, "Pool: min stake value is greater than max stake per user"); - limitsConfig = config; - emit LimitsConfigChanged(config); - } - - function activate() public onlyRole(DEFAULT_ADMIN_ROLE) { - require(!active, "Pool is already active"); - active = true; - emit Activated(); - } - - function deactivate() public onlyRole(DEFAULT_ADMIN_ROLE) { - require(active, "Pool is not active"); - active = false; - emit Deactivated(); - } - - // PUBLIC METHODS - - function deposit(uint amount) public payable { - require(active, "Pool is not active"); - require(amount >= limitsConfig.minDepositValue, "Pool: deposit value is too low"); - if (msg.value != 0) { - require(mainConfig.limitsMultiplierToken == address(0), "Pool: does not accept native coin"); - require(msg.value == amount, "Pool: wrong amount of native coin"); - } else { - IERC20(mainConfig.limitsMultiplierToken).safeTransferFrom(msg.sender, address(this), amount); - } - - stakers[msg.sender].deposit += amount; - info.totalDeposit += amount; - - emit Deposited(msg.sender, amount); - } - - function withdraw(uint amount) public { - require(stakers[msg.sender].deposit >= amount, "Not enough deposit"); - - stakers[msg.sender].deposit -= amount; - info.totalDeposit -= amount; - - require(stakers[msg.sender].stake <= _maxUserStakeValue(msg.sender), "Pool: user max stake value exceeded"); - - if (mainConfig.limitsMultiplierToken == address(0)) { - payable(msg.sender).transfer(amount); - } else { - IERC20(mainConfig.limitsMultiplierToken).safeTransfer(msg.sender, amount); - } - - emit Withdrawn(msg.sender, amount); - } - - function stake(uint amount) public payable { - require(active, "Pool is not active"); - require(amount >= limitsConfig.minStakeValue, "Pool: stake value is too low"); - if (msg.value != 0) { - require(mainConfig.profitableToken == address(0), "Pool: does not accept native coin"); - require(msg.value == amount, "Pool: wrong amount of native coin"); - } else { - require(mainConfig.profitableToken != address(0), "Pool: does not accept ERC20 tokens"); - IERC20(mainConfig.profitableToken).safeTransferFrom(msg.sender, address(this), amount); - } - - _calcClaimableRewards(msg.sender); - uint rewardsAmount = _calcRewards(amount); - - stakers[msg.sender].stake += amount; - info.totalStake += amount; - info.totalRewards += rewardsAmount; - if (stakers[msg.sender].stakedAt == 0) - stakers[msg.sender].stakedAt = block.timestamp; - - require(stakers[msg.sender].stake <= _maxUserStakeValue(msg.sender), "Pool: user max stake value exceeded"); - require(info.totalStake <= limitsConfig.maxTotalStakeValue, "Pool: max stake value exceeded"); - require(stakers[msg.sender].stake <= limitsConfig.maxStakePerUserValue, "Pool: max stake per user exceeded"); - - _updateRewardsDebt(msg.sender, _calcRewards(stakers[msg.sender].stake)); - emit Staked(msg.sender, amount, block.timestamp); - } - - function unstake(uint amount) public { - require(stakers[msg.sender].stake >= amount, "Not enough stake"); - require(block.timestamp - stakers[msg.sender].stakedAt >= limitsConfig.stakeLockPeriod, "Stake is locked"); - - _calcClaimableRewards(msg.sender); - _claimRewards(msg.sender); - uint rewardsAmount = _calcRewards(amount); - - stakers[msg.sender].stake -= amount; - info.totalStake -= amount; - info.totalRewards -= rewardsAmount; - - if (stakers[msg.sender].stake == 0) stakers[msg.sender].stakedAt = 0; - - _updateRewardsDebt(msg.sender, _calcRewards(stakers[msg.sender].stake)); - - // cancel previous lock (if exists). canceledAmount will be added to new lock - uint canceledAmount; - if (lockKeeper.getLock(stakers[msg.sender].lockedWithdrawal).totalClaims > 0) // prev lock exists - canceledAmount = lockKeeper.cancelLock(stakers[msg.sender].lockedWithdrawal); - - if (mainConfig.profitableToken == address(0)) { - // lock funds - stakers[msg.sender].lockedWithdrawal = lockKeeper.lockSingle{value: amount + canceledAmount}( - msg.sender, address(mainConfig.profitableToken), uint64(block.timestamp + limitsConfig.unstakeLockPeriod), amount + canceledAmount, - string(abi.encodePacked("TokenStaking unstake")) - ); - } else { - IERC20(mainConfig.profitableToken).approve(address(lockKeeper), amount + canceledAmount); - // lock funds - stakers[msg.sender].lockedWithdrawal = lockKeeper.lockSingle( - msg.sender, address(mainConfig.profitableToken), uint64(block.timestamp + limitsConfig.unstakeLockPeriod), amount + canceledAmount, - string(abi.encodePacked("TokenStaking unstake")) - ); - } - - emit UnstakeLocked(msg.sender, amount + canceledAmount, block.timestamp + limitsConfig.unstakeLockPeriod, block.timestamp); - } - - function unstakeFast(uint amount) public { - require(stakers[msg.sender].stake >= amount, "Not enough stake"); - require(block.timestamp - stakers[msg.sender].stakedAt >= limitsConfig.stakeLockPeriod, "Stake is locked"); - - _calcClaimableRewards(msg.sender); - _claimRewards(msg.sender); - uint rewardsAmount = _calcRewards(amount); - - stakers[msg.sender].stake -= amount; - info.totalStake -= amount; - info.totalRewards -= rewardsAmount; - - if (stakers[msg.sender].stake == 0) stakers[msg.sender].stakedAt = 0; - - _updateRewardsDebt(msg.sender, _calcRewards(stakers[msg.sender].stake)); - uint penalty = amount * limitsConfig.fastUnstakePenalty / BILLION; - if (mainConfig.profitableToken == address(0)) { - payable(msg.sender).transfer(amount - penalty); - } else { - IERC20(mainConfig.profitableToken).safeTransfer(msg.sender, amount - penalty); - } - } - - function claim() public { - _calcClaimableRewards(msg.sender); - _claimRewards(msg.sender); - } - - function onBlock() external { - if (info.lastInterestUpdate + limitsConfig.interestRate < block.timestamp) - _addInterest(); - } - - // VIEW METHODS - - function getName() public view returns (string memory) { - return mainConfig.name; - } - - function getStake(address user) public view returns (uint) { - return stakers[user].stake; - } - - function getDeposit(address user) public view returns (uint) { - return stakers[user].deposit; - } - - function getUserRewards(address user) public view returns (uint) { - uint rewardsAmount = _calcRewards(stakers[user].stake); - if (rewardsAmount + stakers[user].claimableRewards <= stakers[user].rewardsDebt) - return 0; - - return rewardsAmount + stakers[user].claimableRewards - stakers[user].rewardsDebt; - } - - function getMaxUserStakeValue(address user) public view returns (uint) { - return _maxUserStakeValue(user); - } - - // INTERNAL METHODS - function _addInterest() internal { - if (!active) return; - uint timePassed = block.timestamp - info.lastInterestUpdate; - uint newRewards = info.totalStake * limitsConfig.interest * timePassed / BILLION / limitsConfig.interestRate; - - info.totalRewards += newRewards; - info.lastInterestUpdate = block.timestamp; - emit Interest(newRewards); - } - - function _maxUserStakeValue(address user) internal view returns (uint) { - return stakers[user].deposit * limitsConfig.stakeLimitsMultiplier / BILLION; - } - - // store claimable rewards - function _calcClaimableRewards(address user) internal { - uint rewardsAmount = _calcRewards(stakers[user].stake); - uint rewardsWithoutDebt = rewardsAmount - stakers[user].rewardsDebt; - stakers[user].claimableRewards += rewardsWithoutDebt; - info.totalRewardsDebt += rewardsWithoutDebt; - stakers[user].rewardsDebt += rewardsWithoutDebt; - } - - function _claimRewards(address user) internal { - uint amount = stakers[user].claimableRewards; - if (amount == 0) return; - - stakers[user].claimableRewards = 0; - - // TODO: Use decimals for reward token price - uint rewardTokenAmount = amount * limitsConfig.rewardTokenPrice / BILLION; - if (mainConfig.rewardToken == address(0)) { - rewardsBank.withdrawAmb(payable(user), amount); - } else { - rewardsBank.withdrawErc20(mainConfig.rewardToken, payable(user), rewardTokenAmount); - } - emit Claim(user, rewardTokenAmount); - } - - function _calcRewards(uint amount) internal view returns (uint) { - if (info.totalStake == 0 && info.totalRewards == 0) return amount; - return amount * info.totalRewards / info.totalStake; - } - - function _updateRewardsDebt(address user, uint newDebt) internal { - uint oldDebt = stakers[user].rewardsDebt; - if (newDebt < oldDebt) info.totalRewardsDebt -= oldDebt - newDebt; - else info.totalRewardsDebt += newDebt - oldDebt; - stakers[user].rewardsDebt = newDebt; - } - - receive() external payable {} -} diff --git a/contracts/staking/token/LimitedTokenPoolsManager.sol b/contracts/staking/token/LimitedTokenPoolsManager.sol deleted file mode 100644 index 283ed6b7..00000000 --- a/contracts/staking/token/LimitedTokenPoolsManager.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; -import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; -import "./LimitedTokenPool.sol"; -import "../../funds/RewardsBank.sol"; -import "../../LockKeeper.sol"; - -contract LimitedTokenPoolsManager is AccessControl, IOnBlockListener { - LockKeeper lockKeeper; - RewardsBank public bank; - UpgradeableBeacon public limitedTokenPoolBeacon; - - address[] public pools; - - constructor(RewardsBank bank_, LockKeeper lockKeeper_, UpgradeableBeacon doubleSideBeacon_) { - lockKeeper = lockKeeper_; - bank = bank_; - limitedTokenPoolBeacon = doubleSideBeacon_; - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - event LimitedPoolCreated(address pool, string name); - event LimitedPoolConfigured(address pool, LimitedTokenPool.LimitsConfig params); - event LimitedPoolDeactivated(address pool); - event LimitedPoolActivated(address pool); - - // LIMITED POOL METHODS - function createPool(LimitedTokenPool.MainConfig calldata params) public onlyRole(DEFAULT_ADMIN_ROLE) returns (address) { - bytes memory data = abi.encodeWithSignature( - "initialize(address,address,(string,address,address,address))", - bank, lockKeeper, params); - address pool = address(new BeaconProxy(address(limitedTokenPoolBeacon), data)); - pools.push(pool); - bank.grantRole(bank.DEFAULT_ADMIN_ROLE(), address(pool)); - emit LimitedPoolCreated(pool, params.name); - return pool; - } - - function configurePool(address _pool, LimitedTokenPool.LimitsConfig calldata params) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(_pool),"Pool does not exist"); - LimitedTokenPool pool = LimitedTokenPool(payable(_pool)); - pool.setLimitsConfig(params); - emit LimitedPoolConfigured(_pool, params); - } - - function deactivatePool(address _pool) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(_pool),"Pool does not exist"); - LimitedTokenPool pool = LimitedTokenPool(payable(_pool)); - pool.deactivate(); - emit LimitedPoolDeactivated(_pool); - } - - function activatePool(address _pool) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(_pool),"Pool does not exist"); - LimitedTokenPool pool = LimitedTokenPool(payable(_pool)); - pool.activate(); - emit LimitedPoolActivated(_pool); - } - - function onBlock() external { - for (uint i = 0; i < pools.length; i++) { - LimitedTokenPool pool = LimitedTokenPool(payable(pools[i])); - pool.onBlock(); - } - } - - function _isPool(address pool) internal view returns (bool) { - for (uint i = 0; i < pools.length; i++) { - if (pools[i] == pool) { - return true; - } - } - return false; - } - -} - diff --git a/contracts/staking/token/TokenPool.sol b/contracts/staking/token/TokenPool.sol deleted file mode 100644 index 97294db5..00000000 --- a/contracts/staking/token/TokenPool.sol +++ /dev/null @@ -1,238 +0,0 @@ -//SPDX-License-Identifier: UNCLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -import "../../funds/RewardsBank.sol"; -import "../../LockKeeper.sol"; - -contract TokenPool is Initializable, AccessControl, IOnBlockListener { - - struct MainConfig { - IERC20 token; - string name; - address rewardToken; - } - - struct LimitsConfig { - uint rewardTokenPrice; // The coefficient to calculate the reward token amount - uint minStakeValue; - uint fastUnstakePenalty; - uint interest; //Time in seconds to how often the stake is increased - uint interestRate; - uint lockPeriod; - } - - struct Info { - uint totalStake; - uint totalRewards; - uint lastInterestUpdate; - uint totalRewardsDebt; - } - - struct Staker { - uint stake; - uint rewardsDebt; - uint claimableRewards; - uint lockedWithdrawal; - } - - uint constant public BILLION = 1_000_000_000; - - bool public active; - RewardsBank rewardsBank; - LockKeeper lockKeeper; - - MainConfig public mainConfig; // immutable - LimitsConfig public limitsConfig; // mutable - Info public info; - - mapping(address => Staker) private stakers; - - //EVENTS - - event Deactivated(); - event Activated(); - event LimitsConfigChanged(LimitsConfig limitsConfig); - event StakeChanged(address indexed user, uint amount); - event Claim(address indexed user, uint amount); - event Interest(uint amount); - event UnstakeLocked(address indexed user, uint amount, uint unlockTime, uint creationTime); - event UnstakeFast(address indexed user, uint amount, uint penalty); - - function initialize(RewardsBank bank_, LockKeeper keeper_, MainConfig calldata mainConfig_, LimitsConfig calldata limitsConfig_) public initializer { - rewardsBank = bank_; - lockKeeper = keeper_; - mainConfig = mainConfig_; - limitsConfig = limitsConfig_; - - info.lastInterestUpdate = block.timestamp; - - active = true; - - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - // OWNER METHODS - - function setLimitsConfig(LimitsConfig calldata _limitsConfig) public onlyRole(DEFAULT_ADMIN_ROLE) { - //TODO: Validate input params - limitsConfig = _limitsConfig; - emit LimitsConfigChanged(_limitsConfig); - } - - function activate() public onlyRole(DEFAULT_ADMIN_ROLE) { - require(!active, "Pool is already active"); - active = true; - emit Activated(); - } - - function deactivate() public onlyRole(DEFAULT_ADMIN_ROLE) { - require(active, "Pool is not active"); - active = false; - emit Deactivated(); - } - - // PUBLIC METHODS - - function stake(uint amount) public { - require(active, "Pool is not active"); - require(amount >= limitsConfig.minStakeValue, "Pool: stake value is too low"); - require(mainConfig.token.transferFrom(msg.sender, address(this), amount), "Transfer failed"); - - _stake(msg.sender, amount); - - emit StakeChanged(msg.sender, amount); - } - - function unstake(uint amount) public { - require(stakers[msg.sender].stake >= amount, "Not enough stake"); - - _unstake(msg.sender, amount); - - // cancel previous lock (if exists). canceledAmount will be added to new lock - uint canceledAmount; - if (lockKeeper.getLock(stakers[msg.sender].lockedWithdrawal).totalClaims > 0) // prev lock exists - canceledAmount = lockKeeper.cancelLock(stakers[msg.sender].lockedWithdrawal); - - mainConfig.token.approve(address(lockKeeper), amount + canceledAmount); - - // lock funds - stakers[msg.sender].lockedWithdrawal = lockKeeper.lockSingle( - msg.sender, address(mainConfig.token), uint64(block.timestamp + limitsConfig.lockPeriod), amount + canceledAmount, - string(abi.encodePacked("TokenStaking unstake")) - ); - - _claimRewards(msg.sender); - - emit UnstakeLocked(msg.sender, amount + canceledAmount, block.timestamp + limitsConfig.lockPeriod, block.timestamp); - emit StakeChanged(msg.sender, stakers[msg.sender].stake); - } - - function unstakeFast(uint amount) public { - require(stakers[msg.sender].stake >= amount, "Not enough stake"); - - _unstake(msg.sender, amount); - - uint penalty = amount * limitsConfig.fastUnstakePenalty / BILLION; - SafeERC20.safeTransfer(mainConfig.token, msg.sender, amount - penalty); - - _claimRewards(msg.sender); - - emit UnstakeFast(msg.sender, amount, penalty); - emit StakeChanged(msg.sender, stakers[msg.sender].stake); - } - - function claim() public { - _calcClaimableRewards(msg.sender); - _claimRewards(msg.sender); - } - - function onBlock() external { - _addInterest(); - } - - // VIEW METHODS - - function getStake(address user) public view returns (uint) { - return stakers[user].stake; - } - - function getUserRewards(address user) public view returns (uint) { - uint rewardsAmount = _calcRewards(stakers[user].stake); - if (rewardsAmount + stakers[user].claimableRewards <= stakers[user].rewardsDebt) - return 0; - - return rewardsAmount + stakers[user].claimableRewards - stakers[user].rewardsDebt; - } - - // INTERNAL METHODS - - // store claimable rewards - function _calcClaimableRewards(address user) internal { - uint rewardsAmount = _calcRewards(stakers[user].stake); - uint rewardsWithoutDebt = rewardsAmount - stakers[user].rewardsDebt; - stakers[user].claimableRewards += rewardsWithoutDebt; - info.totalRewardsDebt += rewardsWithoutDebt; - stakers[user].rewardsDebt += rewardsWithoutDebt; - } - - function _addInterest() internal { - if (info.lastInterestUpdate + limitsConfig.interestRate > block.timestamp) return; - uint timePassed = block.timestamp - info.lastInterestUpdate; - uint newRewards = info.totalStake * limitsConfig.interest * timePassed / BILLION / limitsConfig.interestRate; - - info.totalRewards += newRewards; - info.lastInterestUpdate = block.timestamp; - emit Interest(newRewards); - } - - function _stake(address user, uint amount) internal { - uint rewardsAmount = _calcRewards(amount); - - stakers[msg.sender].stake += amount; - info.totalStake += amount; - - info.totalRewards += rewardsAmount; - - _updateRewardsDebt(user, _calcRewards(stakers[user].stake)); - } - - function _unstake(address user, uint amount) internal { - uint rewardsAmount = _calcRewards(amount); - - stakers[msg.sender].stake -= amount; - info.totalStake -= amount; - - info.totalRewards -= rewardsAmount; - _updateRewardsDebt(user, _calcRewards(stakers[user].stake)); - } - - function _updateRewardsDebt(address user, uint newDebt) internal { - uint oldDebt = stakers[user].rewardsDebt; - if (newDebt < oldDebt) info.totalRewardsDebt -= oldDebt - newDebt; - else info.totalRewardsDebt += newDebt - oldDebt; - stakers[user].rewardsDebt = newDebt; - } - - function _claimRewards(address user) internal { - uint amount = stakers[user].claimableRewards; - if (amount == 0) return; - - stakers[user].claimableRewards = 0; - - uint rewardTokenAmount = amount * limitsConfig.rewardTokenPrice; - rewardsBank.withdrawErc20(mainConfig.rewardToken, payable(user), rewardTokenAmount); - emit Claim(user, rewardTokenAmount); - } - - function _calcRewards(uint amount) internal view returns (uint) { - if (info.totalStake == 0 && info.totalRewards == 0) return amount; - return amount * info.totalRewards /info.totalStake; - } - - receive() external payable { - } -} diff --git a/contracts/staking/token/TokenPoolsManager.sol b/contracts/staking/token/TokenPoolsManager.sol deleted file mode 100644 index 7f726310..00000000 --- a/contracts/staking/token/TokenPoolsManager.sol +++ /dev/null @@ -1,81 +0,0 @@ -//_ SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/AccessControl.sol"; -import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; -import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; -import "./TokenPool.sol"; -import "../../funds/RewardsBank.sol"; -import "../../LockKeeper.sol"; - -contract TokenPoolsManager is AccessControl, IOnBlockListener { - LockKeeper lockKeeper; - RewardsBank public bank; - UpgradeableBeacon public beacon; - - address[] public pools; - - constructor(RewardsBank bank_, LockKeeper lockKeeper_, UpgradeableBeacon _beacon) { - lockKeeper = lockKeeper_; - bank = bank_; - beacon = _beacon; - _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); - } - - event PoolCreated(address pool, string name); - event PoolConfigured(address pool, TokenPool.LimitsConfig params); - event PoolDeactivated(address pool); - event PoolActivated(address pool); - - // OWNER METHODS - // TOKEN POOL METHODS - function createPool(TokenPool.MainConfig calldata mainConfig, TokenPool.LimitsConfig calldata limitsConfig) public onlyRole(DEFAULT_ADMIN_ROLE) returns (address) { - bytes memory data = abi.encodeWithSignature( - "initialize(address,address,(address,string,address),(uint256,uint256,uint256,uint256,uint256,uint256))", - bank, lockKeeper, mainConfig, limitsConfig); - address pool = address(new BeaconProxy(address(beacon), data)); - pools.push(pool); - bank.grantRole(bank.DEFAULT_ADMIN_ROLE(), address(pool)); - emit PoolCreated(pool, mainConfig.name); - return pool; - } - - function configurePool(address pool, TokenPool.LimitsConfig calldata limitsConfig) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(pool), "Pool does not exist"); - TokenPool(payable(pool)).setLimitsConfig(limitsConfig); - emit PoolConfigured(pool, limitsConfig); - } - - function deactivateTokenPool(address _pool) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(_pool), "Pool does not exist"); - TokenPool pool = TokenPool(payable(_pool)); - pool.deactivate(); - emit PoolDeactivated(_pool); - } - - function activateTokenPool(address _pool) public onlyRole(DEFAULT_ADMIN_ROLE) { - require(_isPool(_pool), "Pool does not exist"); - TokenPool pool = TokenPool(payable(_pool)); - pool.activate(); - emit PoolActivated(_pool); - } - - function onBlock() external { - for (uint i = 0; i < pools.length; i++) { - TokenPool(payable(pools[i])).onBlock(); - } - } - - // INTERNAL METHODS - - function _isPool(address pool) internal view returns (bool) { - for (uint i = 0; i < pools.length; i++) { - if (pools[i] == pool) { - return true; - } - } - return false; - } - - -} diff --git a/package.json b/package.json index 853eb434..cdda575c 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,8 @@ "deploy_astradex_tokensafe": "hardhat run scripts/ecosystem/astradex/deployTokensSafe.ts --network dev", "deploy_astradex_fee_collector": "hardhat run scripts/ecosystem/astradex/deployFeeCollector.ts --network dev", "deploy_government": "hardhat run scripts/ecosystem/government/deploy.ts --network dev", - "deploy_liquid_staking": "hardhat run scripts/ecosystem/liquid_staking/deploy.ts --network dev", - "deploy_limited_token_staking_multisig": "hardhat run scripts/multisig/deploy_multisig.ts --network dev", - "deploy_limited_token_staking": "hardhat run scripts/ecosystem/token_staking/deploy_limited_manager.ts --network dev", - "deploy_token_staking": "hardhat run scripts/ecosystem/token_staking/deploy_token_manager.ts --network dev", - "deploy_hbr_token": "hardhat run scripts/ecosystem/token_staking/deploy_hbr.ts --network dev", + "deploy_liquid_staking_multisig": "hardhat run scripts/ecosystem/liquid_staking/deploy.ts --network dev", + "deploy_limited_token_staking_multisig": "hardhat run scripts/ecosystem/token_staking/deploy_multisig.ts --network dev", "sourcify:dev": "hardhat sourcify --network dev", "sourcify:test": "hardhat sourcify --network test", diff --git a/scripts/ecosystem/liquid_staking/deploy.ts b/scripts/ecosystem/liquid_staking/deploy.ts index 5858fcea..f595fbab 100644 --- a/scripts/ecosystem/liquid_staking/deploy.ts +++ b/scripts/ecosystem/liquid_staking/deploy.ts @@ -1,244 +1,15 @@ import { ethers } from "hardhat"; import { ContractNames } from "../../../src"; -import { deploy, loadDeployment } from "@airdao/deployments/deploying"; -import { - LiquidNodesManager__factory, - LiquidPool__factory, - LockKeeper__factory, - RewardsBank__factory, - StakingTiers__factory, - StAMB__factory, - Treasury__factory, - ValidatorSet, -} from "../../../typechain-types"; import { wrapProviderToError } from "../../../src/utils/AmbErrorProvider"; - -import { parse } from "csv-parse/sync"; -import fs from "fs"; import { deployMultisig } from "../../utils/deployMultisig"; -interface AccountData { - address: string; - balance: bigint; - lastZeroBalanceTimestamp: number; -} - export async function main() { - const {chainId} = await ethers.provider.getNetwork(); const [deployer] = await ethers.getSigners(); wrapProviderToError(deployer.provider!); - console.log(); - - const validatorSet = loadDeployment(ContractNames.ValidatorSet, chainId, deployer) as ValidatorSet; - const airBond = loadDeployment(ContractNames.AirBond, chainId); - const multisig = await deployMultisig(ContractNames.Ecosystem_LiquidPoolMultisig, deployer, "eco"); - - // block rewards will be withdrawn from this contract - const nodesRewardsBank = await deploy({ - contractName: ContractNames.Ecosystem_LiquidNodesManagerRewardsBank, - artifactName: "RewardsBank", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - }); - - // block rewards will be transferred to this contract (except fees) - const nodesRewardsTreasury = await deploy({ - contractName: ContractNames.Ecosystem_LiquidNodesManagerTreasury, - artifactName: "Treasury", - signer: deployer, - deployArgs: [multisig.address, 0], - loadIfAlreadyDeployed: true, - }); - - // fees from block rewards will be transferred to this contract - const nodesRewardsTreasuryFees = await deploy({ - contractName: ContractNames.Ecosystem_LiquidNodesManagerTreasuryFees, - artifactName: "Treasury", - signer: deployer, - deployArgs: [ - multisig.address, - 0.10 * 10000, // 10% fee - ], - loadIfAlreadyDeployed: true, - }); - - - // staking rewards and interest will be withdrawn from this contract - const poolRewardsBank = await deploy({ - contractName: ContractNames.Ecosystem_LiquidPoolRewardsBank, - artifactName: "RewardsBank", - signer: deployer, - deployArgs: [], - loadIfAlreadyDeployed: true, - }); - - - const stAmb = await deploy({ - contractName: ContractNames.Ecosystem_LiquidPoolStAMB, - artifactName: "StAMB", - signer: deployer, - deployArgs: [], - loadIfAlreadyDeployed: true, - }); - - - const stakingTiers = await deploy({ - contractName: ContractNames.Ecosystem_LiquidPoolStakingTiers, - artifactName: "StakingTiers", - deployArgs: [stAmb.address], - signer: deployer, - isUpgradeableProxy: true, - loadIfAlreadyDeployed: true, - }); - - const lockKeeper = await deploy({ - contractName: ContractNames.LockKeeper, - artifactName: "LockKeeper", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - isUpgradeableProxy: true, - }); - - const nodeStake = ethers.utils.parseEther("1000"); - const maxNodesCount = 3; - - const nodeManager = await deploy({ - contractName: ContractNames.Ecosystem_LiquidNodesManager, - artifactName: "LiquidNodesManager", - deployArgs: [ - validatorSet.address, - nodesRewardsBank.address, - nodesRewardsTreasury.address, - nodesRewardsTreasuryFees.address, - nodeStake, - maxNodesCount - ], - signer: deployer, - isUpgradeableProxy: true, - loadIfAlreadyDeployed: true, - }); - - - const interest = 5707; // 5% per year - const interestRate = 60 * 60; // one hour - const minStakeValue = ethers.utils.parseEther("100"); - const unstakeLockTime = 2 * 60 * 60; // 2 hours - const penalty = 0.1 * 1_000_000_000; // 10% - - const liquidPool = await deploy({ - contractName: ContractNames.Ecosystem_LiquidPool, - artifactName: "LiquidPool", - deployArgs: [ - nodeManager.address, - poolRewardsBank.address, - stakingTiers.address, - lockKeeper.address, - airBond.address, - stAmb.address, - interest, - interestRate, - minStakeValue, - unstakeLockTime, - penalty - ], - signer: deployer, - isUpgradeableProxy: true, - loadIfAlreadyDeployed: true, - }); - - console.log("Setup stAmb"); - await (await stAmb.setLiquidPool(liquidPool.address)).wait(); - await (await stAmb.grantRole(await stAmb.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - console.log("Setup nodeManager"); - await (await nodeManager.grantRole(await nodeManager.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - await (await nodeManager.grantRole(await nodeManager.POOL_ROLE(), liquidPool.address)).wait(); - - console.log("Setup nodesRewardsBank"); - await (await nodesRewardsBank.grantRole(await nodesRewardsBank.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - await (await nodesRewardsBank.grantRole(await nodesRewardsBank.DEFAULT_ADMIN_ROLE(), nodeManager.address)).wait(); - - console.log("Setup poolRewardsBank"); - await (await poolRewardsBank.grantRole(await poolRewardsBank.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - await (await poolRewardsBank.grantRole(await poolRewardsBank.DEFAULT_ADMIN_ROLE(), liquidPool.address)).wait(); - - console.log("Setup liquidPool"); - await (await liquidPool.grantRole(await liquidPool.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - console.log("Setup stakingTiers"); - await (await stakingTiers.grantRole(await stakingTiers.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - // on prod - multisig only - if (chainId != 16718) { - console.log("Register nodeManager as staking manager"); - await (await validatorSet.grantRole(await validatorSet.STAKING_MANAGER_ROLE(), nodeManager.address)).wait(); - console.log("Add block listeners"); - await (await validatorSet.addBlockListener(liquidPool.address)).wait(); - } else { - console.log("Register nodeManager as staking manager calldata"); - const calldata = await validatorSet.populateTransaction.grantRole(await validatorSet.STAKING_MANAGER_ROLE(), nodeManager.address); - const multisigTx = await multisig.populateTransaction.submitTransaction(validatorSet.address, 0, calldata.data!); - console.log(multisigTx); - console.log("Add block listeners calldata"); - const calldata2 = await validatorSet.populateTransaction.addBlockListener(liquidPool.address); - const multisigTx2 = await multisig.populateTransaction.submitTransaction(validatorSet.address, 0, calldata2.data!); - console.log(multisigTx2); - } - - if (chainId != 16718) return; // continue only on prod - - console.log("Setup bonuses"); - const bonuses = getBonuses(); - console.log("Setting first batch"); - await (await stakingTiers.setBonusBatch(Array.from(bonuses[0].keys()), Array.from(bonuses[0].values()))).wait(); - console.log("Setting second batch"); - await (await stakingTiers.setBonusBatch(Array.from(bonuses[1].keys()), Array.from(bonuses[1].values()))).wait(); - console.log("Bonuses set"); - - //grant backend role - console.log("Grant backend role"); - const backendAddress = process.env.LIQUID_STAKING_BACKEND_ADDRESS || ""; - await (await nodeManager.grantRole(await nodeManager.BACKEND_ROLE(), backendAddress)).wait(); - console.log("Backend role granted"); - - console.log("Revoke admin roles"); - await (await nodesRewardsBank.revokeRole(await nodesRewardsBank.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - await (await poolRewardsBank.revokeRole(await poolRewardsBank.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - await (await nodeManager.revokeRole(await nodeManager.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - await (await liquidPool.revokeRole(await liquidPool.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - await (await stakingTiers.revokeRole(await stakingTiers.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - -} - -function getBonuses(): [Map, Map] { - const filePath = "./scripts/ecosystem/liquid_staking/staking_holders.csv"; - const bonusMap1 = new Map(); - const bonusMap2 = new Map(); - const currentTime = Math.floor(Date.now() / 1000); - const thereeYearsInSeconds = 3 * 365 * 24 * 60 * 60; - - const csvData = fs.readFileSync(filePath, "utf8"); - - const records = parse(csvData, { - columns: true, - skip_empty_lines: true, - }) as AccountData[]; - - for (const record of records) { - const stakingTime = currentTime - record.lastZeroBalanceTimestamp; - const bonus = Math.floor((stakingTime * 75) / thereeYearsInSeconds); - if (bonusMap1.size < 1200) { - bonusMap1.set(record.address, bonus); - } else { - bonusMap2.set(record.address, bonus); - } - } - - return [bonusMap1, bonusMap2]; + console.log(`Multisig deployed at ${multisig.address}`); } if (require.main === module) { diff --git a/scripts/ecosystem/liquid_staking/staking_holders.csv b/scripts/ecosystem/liquid_staking/staking_holders.csv deleted file mode 100644 index bb45a5f1..00000000 --- a/scripts/ecosystem/liquid_staking/staking_holders.csv +++ /dev/null @@ -1,2476 +0,0 @@ -address,Latest Resulting Balance (Wei),lastZeroBalanceTimestamp -0x6e20D8356fB3B05CF113c3Bb849394e702162013,7573043945390247997317,1681873230 -0x7249896b5eAbEb28074c47eAF74Cd7dCc305360F,305962565452396252,1680331785 -0x6472cd12d62aE74e5C73B0154B0792bFc11d57d0,741181032677837163267,1702384960 -0xE8ddeE82e2ee2661c6Adf11FAA6C99555e301DC0,15670551689293418404083,1650367050 -0xAA84bdcDF97fE9b1a79099958200FE0357c0a850,12994707898379343332440,1711663920 -0x43f2dA6f301A87FCCD2962C82bB5EB9164919CB4,1846426898735774050979800,1721158675 -0x3FEBfaa0ccbC8eF3B1EF2772E2f26Ad2dcDC4038,2227791630620857442696,1720774130 -0x02637de7848f1Fb1F4D6764abf68E01Ae2Df238A,103879424028006793772764,1682429240 -0xeE609ba9df4953a288DdF18E3A750dA894bcC65c,756851249797525346258,1683809685 -0x71a571962597c1872B2FdB16cd605aB5a313B81c,166185676955404848574172,1705907510 -0x70484b20da4c958B88bF5567D45FB0f4B65fb7a1,1045472289112057789596786,1689090540 -0x2D0ee8e5D45f3b4AD78b2592a0b4a1863fD51786,757138760512250295759,1681739885 -0xCb32ba4D4A1FB0D398abe00575405f6A43438365,9372743809291679464793,1650554730 -0x06cD940933CC1311DD006f4FA2596733a58f8648,2667895003383845966874,1640342305 -0x336d6B0C42DDdAC697D391348EE3aC9C1dadd609,12067709366732550043561,1639966400 -0xC338fDFc5870cB2AfBa09BF4842a1994bE36CBD2,753488953427091452426,1683976890 -0x5FE7670DCE5EEe74fe3c26341F576b32538c5E22,370163292064734671,1690365755 -0x7b5263b9820aB064709d5B579d9A15932d18eeF4,6333376319964264242726,1718949855 -0x45b244E005C9fF045cA37e90eB829F684160284F,21058278187289682869499,1708197185 -0x34F1fcaB0E7661a1F78A0b34575Df856e19C3B38,1144819579146048831921,1681631080 -0xE2233645c360684141794F7Be0792F823477E65e,1056008590386667968904214,1653498005 -0x60bBa9ca40D4A5ef331b6065dC58a13c91a67B3C,778671446513617483893,1692613735 -0x1044d82Fe437799E53C2083De75CB4a2EC16858b,17615919663988191626070,1643722410 -0xfDCa82fa20134dce5dF8fcF1BBcC753bB942d682,59757662533748628133979,1652869335 -0x3bC85299Da4319A36DAeB1AcA9eBB8edd81B6797,94725321053659243485525,1705923505 -0xaD5DBD9a843801164732353f8555A90db13dC0cd,11918875168882552705283,1666508850 -0x5656d7F1040268e4C8ef4A2Ae715De2b52EB44c2,47773155927890242630020,1655729585 -0xa113bDAA3F45F749dA29c1E469B4e0c14e2BF919,646008536604814786530,1714155845 -0x70e5D229fb6d3F121DE36b828E54a1Ee7D00Ee32,18474724532944767586733,1642615530 -0x99Fe582d44e3f84c09BDCf10B9F7a876eD1129a3,639939874944117003244,1721141850 -0x4fD77B7b7eB917B759912371DDf6fAd5a29Feb3E,757389097133226532609,1720045940 -0x829da5a886Bcb2f7A289BE30980F964333BE4582,946200628439771250676,1689730305 -0x476Be6B54668FDAf31185C5909Cb8703fe086f34,26864442325119041717814,1674169035 -0xE7B9dBfC2717edfb52B5DB38Cc0968ca058FE2fe,875917171066696215624,1712137665 -0x3f85c65b638709e68f356f78da9A4ac91578375B,358372858283498,1721695430 -0x5a88bca52380e222d0bC355f0FE036Ed2d0d10B4,1018590562283825318653,1720837855 -0xD083091D05d859423a159a65f12aAC0602568FBB,41211468446867413832911,1685713605 -0xc3A192b4A637fcD20c87e91eEB561121C28d4028,243934009092123686057662,1652106980 -0xe8d204D3B12E643888DEBD525e2f8034fC7EB855,408249492776016041354130,1721899890 -0xAF73226F0343474480644ADd818130ef8d6214c5,31302514352433393487228,1720535075 -0x5415154958268258eDA49313EA88822e1E83795F,3333990187008180,1720429035 -0x4fd926E6BF71A5F98Ea28E9d326B3D95aEC8508C,1576309081263246163869,1675749390 -0xDfc2c13070Cf0E07e950b3793DEf6C1044F35ECc,47639345154809455858402,1678162025 -0x7894eDa8Fe9006b76f95E5F3A5D45e55b698b0E1,1255557220770381206450,1718913360 -0xB7E8aeEd1E6b00776079c5FdB9d5b5547cd67Dc1,854376360128992898028,1718631745 -0x518A1138C7e860D93eD7Fc69BF2d1EC6699bf00F,12420572547084882902550,1709548445 -0x509e4ACc040BbA03531CdcFDBB62759253af43b0,84809673704975564521960,1662637585 -0x0626f9D2f3fAdbb8D75c35B9FD2ae21DEF84b687,8110551290073392042499,1669963550 -0x752395E5EA46E000dfb2318c66C776b3EC102b72,2270835287641119696346,1689753880 -0x69615DDAa3FaadAc453e71f6ff41155Cc25E5B46,19675588356384974994399,1671498590 -0x876BDfC898bE8c4E003f1Aa02ddAbEAF45A3C985,59392295958832169629372,1639746690 -0x420394563F1e41267DdF44ef2754e9Ce28fFCBa0,2171957426344724784931373,1681774775 -0xFF987814BA089118900b4362C9Fc996ebedFC024,1016881142843917,1721465675 -0x772735021D99700E06a95833cD236ac161a4eF45,17728272906463533406262,1637171210 -0x68Fd18dfc29B5012C78f21714370dE1B9f3520F0,7574558402733591712545,1681871875 -0xFeaF90E52C365E51Bc501b460f14DC32476deE6c,11062271557994548218544,1710193645 -0x6E2af8a2071Eff582F6Ee254fD6b947FE4bD16dd,14576551565828783464897,1637392720 -0x8468D3B30A6308e3a1d4e3Ebf2B7C14E5e842C2B,739585681343282715787,1692614405 -0xE8e8A647e2EE752417a4684A4fB2DB55D2264A81,1539383427400911545988,1638011085 -0x37a9e397E4650e34fa068A1b8922d78f58f0d5F2,644003431759871702997,1714805470 -0x06989073814042F3B32a8E662604642E2E5E04D1,31711000634157099564613,1675452525 -0xcd64f1Fd797783BC042d70c8cEF4625AB82fA9a9,41736909945035153509832,1664221045 -0xa2c0394CC3091538219c1fFcc26f49Fa9594bcaA,756819856591707171444,1683809965 -0x0E65B9a51D96eAca294BE7D21952f84E1A4F4368,27029504271509520932894,1686389205 -0x262557c8228758eCB6253CaA5ba52568f079CE97,11284849505366475268379,1721933030 -0xcAace3A21479DcB404CE5b4F929897F69F44Ec82,1272502629506482087146,1720267550 -0xF44fD2266BA5a9c866A4DCD3507485beC2eb9Db1,757554562610339320383,1682674070 -0x60e7CB73B6Bb7506Cffd803e60FcEC5f7275aF0C,34324936685505645239274884,1662694640 -0x28CFdE11989F8D52a6c9Df5BD17130735A67B900,1633929147136604770074573,1649258530 -0x225A6fc937Cc2c3C81c0C7cabdf6096b28645553,6636962167046541700486,1652878720 -0x8aB929F29B3888756edE359EF25FEE57D22389Ee,3663415030929437125724,1710605130 -0x43BD10636207BcE990fB0c5905f7EA1934199eA8,6133085784927629255262,1661238030 -0x346DC562600712F0f5762fcf4c16353d890a164e,1996725334981221636975,1705723845 -0x1b09Bf1a364E941F48a5de7E72540b3092a97ed6,554361421618066987,1693320115 -0x958dc25fF9e1D4FD8ffbee9F731Ef939101Af24a,37116755528551652934322,1684764415 -0x474272D8E6fB3580559dFd7fb0865742945153b6,94847948602947790202892,1652878470 -0xB5226e38CDB88a30305bc1AD281F5b8d05e36B65,2630695366069632519570,1708346015 -0x7dAD9503dD410C215ab765E027323Cb82f971305,10840163948110186884832,1640984920 -0x6c8989A1D52eCC8EC989D959db7Bc3bbDE706732,78450090609181340221176,1676798045 -0x4E4b5Aa1fEB2f2eE230BB45ED8d38A8936f62B72,650233032177896428348,1717331220 -0xeDc048e4D85bc80A03a6efe781CF8208bA67c0d2,786341635989532214557,1682343910 -0x1b32ec0Fd18e507E97E16c15c516DeC6017aB0B2,34051443659484917697706,1666018055 -0xBcC95C957A239929fbef1159Be405A6D1267aF90,2115048110761565908439,1666834440 -0x6dd6515Ad8B1f1f55cE96d85d0EAA4603e2DE19D,630876724822830569683,1721173230 -0x427EF89adCDf1FA7527CD5366d3a9C6e116571e6,1003681711598545117751,1704024865 -0x6d3d7322E7c2A13c5afdb1b674DA65E4098F54A9,631174813751307441440,1721135015 -0x3C1d5D370b752De0f62120A23bB8dDE4437fA31D,721141248507460681916,1711941415 -0x94CbC005adB23A95455DABAd7013982D9C34dAB3,12949169813733094846326,1682028535 -0x4674A9c00be63FF5754691eEA3dD8F6c17f73Dd2,75432162121767602405456,1711375985 -0x08545FBc07805e63a0C5AF5301d4e26D1919D673,1058264570756870449313,1713063130 -0x994D90f2B5A8707188058c8b3d99991Ae77D05CB,349814174172670680656514,1718609185 -0xac58d7CfE5a11ec4792E25c4F70e54e6E499b4C7,757529012582139481067,1681655655 -0x145Aa9C6aB767F3d576DEB1747034d2E839c6e4d,745171623853424283323,1705407565 -0xE82D21AD97FC531B3Db528a488F199DDbD3a2e42,155883558077511994387571,1721997415 -0x33E61cD2F3D6f669dA69e79f18A7DA908D365f39,247727016004407071,1698804875 -0x1acaf052b960275Ab7FF188419986dDB1E6d3bc5,70958331281637974991052,1637271220 -0x05c1949dd5640d358B5fAf8c7E0D5C09c5341EfE,712686237926350974022,1692615495 -0xE993D2b21C748E4d892aE42050f8ef2c35fc4619,7034596837188807387,1681787390 -0xD2F64d9808c0c7152B69c1D0Ea5973491aC59530,85953963631650622828307,1643750435 -0xfeeeB2a8fec2a5Dfac8E4EeD2335ce6FCBbB8c12,3895799847393413930503,1707311650 -0xCb45b6be12647943fB5A49AB68AeD7283bCf0743,739617557098712116932561,1685235615 -0x72fe16B0D99Ee723CE2176E8B157f5f95BA7B902,65342772744239690940119,1704472935 -0xb24A078A224D4080e5A5e01Fda227bFF2608f84f,759460257967442703805,1682937070 -0x76e2a5fC016A900E1DFD34C72c52CAe2164C606f,783189624320015688837,1681676405 -0xBd20E971ce59AEe2Ca67ca7d8CCc9078820a965d,10717382600521738561835,1709759865 -0xd401e5B8E3D371FECA6c83f6d00a014637b7415b,631166500277628875834,1720258255 -0x42BF007D2837A93825B4e43Bd294cf854967A9A1,11073343886644258601466,1674417985 -0x374FB45B8CfcF97b366cE7e8FA754dd909B43953,3571567255461486276016,1688470290 -0xC42278f1EBfC0E767CFC415832e993Ff6F10FA24,761360593435204323924,1681648335 -0xCC646E54c401380b3B13Ec641adc5A1Dc4aA871E,16633689351448536578773,1680109385 -0xf7EC4A333439503C9632f34cCe84ED756EBa7Fb9,2631361589745306324319,1708345315 -0xdbc4BBFE5F87cAFb4E914C72d1DFc5dFafb4266d,820605778820673254665,1669154815 -0x47A9416dAF651B35ADa1Abf6098c6a53EDfC06a8,5302030492310721921585,1709540950 -0x01E24A248d95d967f4dc18919183DeC163902629,5894624104610856142903,1673289905 -0xe582B2F0e2dd5B4Cd9adAe496c3f5B3eB702c259,639654495382244711569,1716085405 -0x2f85C11E26fcc832EcDb08624edE9B972A211aa0,1765184187483120080515,1681804850 -0x8bE0f69abe7dfB52acce604Ab6A881e366CA88Bc,44564915108778377844886,1641412700 -0xCc249E3C281F0f7949B5Ec915C5e44513927E03c,592467540477088029494784,1709866695 -0x3bD382B142b937c81BfA1D8C3E7010b2eBEE6674,757563837950387339675,1681649170 -0xb92e6C3cdc6EB2e1C09E69c5530C6a0048895e6b,19882698495621656,1717615405 -0xeDafa372A171875f2497bE30724365de3BD1DA2f,23796735314295110390245,1674362060 -0xDe472a646d949B0A36b3c747b7eE213681Fea9AD,15869738462401593745716,1676852170 -0x36ED1Bd4644ae108241Bd874B67805C76a43a8e4,845788472041084066423,1671657565 -0x682417E279aDf7333549EE8D40b55796b4c123d5,2552321164132500811433,1721017845 -0xF050d2f0C8aa70A25A084C8cdc4DE86d7388A504,4769690910323222712053,1710357030 -0x1D4e4DF137452Bf017Bf067bDB4cCCf80d059c78,757263447132349249664,1682008915 -0x9D6fa7c7486efbB4C8a4BE0c2b276A828984dAc0,84425998799860277,1699031835 -0x1531cb23c7efA473E26263c2d0c74e4Ca1aDad2A,10922877501491128221599,1717943425 -0x9e7eC67BBED5b668A331530A0A6D6ca1682dB41a,1892362739700933080288,1689751090 -0xd0DD4d5abD4344a146fEd146883091281A8cF455,37890815478948016891385,1682460150 -0xaA8aACf3f7D8872864b9B516C7bCe9b0A7A54C3A,757212396371054030235,1681723160 -0xaF420f94f1e699cDE4B9b0e6b7719C3e6C12F2FD,2841417097171296768177,1647020550 -0x83CC43713e28a9758E112d39b76eDD7a7fAc4ad1,1406643070992262002400,1714156125 -0x5E851214952B50Cf2D0818EAb61aF900D57bD38c,2108925056209435055500,1685776880 -0x363f11D15E6C6974057E637dE4349fB0a47D076F,5236345018338330620035645,1708807125 -0xF775B762132Fb0b027c5DE2AF9EAd39BFf026614,7434451766349380505,1681798030 -0x17B41e5790FBC9aC003453B9EFC753503Eb5dD0f,136014729679436511062542,1675689925 -0xFD31Ce44b1BFab949E08DB2EBcFd3AeEe4e0FDe7,242439789841731359966120,1688490115 -0x1a3516345B7C5353e6A2314F4FbD0F17317d0D99,221718998073569489066154,1668228285 -0x9d998Bc2196d73eD695B721A5C3d215749529976,7458043885244487497476,1704213770 -0x231198c0e87b83DcE685a484c72189dd70be514F,39560928553311015473409,1674756085 -0x701104339B82da091D60a0B9299c7C18496A8d06,540800943683513824,1681800900 -0x7D4F47253c9DB1899fd5222CD8c564109452c802,2961623450735200481229,1644967855 -0x5F1dB3862939e0df71F0cd511c95596edeA36754,14666218722094215263192,1709888065 -0xf6B4521801e55641359939F3E86fa039010f452F,1253867605316029191958,1722181235 -0x3902270964A42894D281daA5A401e8F6C9BeF7Ba,10879393494966528184363,1653222445 -0x0B7bd29189CaF10CCcB0770933836234Df74A06e,5533439065719164360990,1637838975 -0xecfB4E01Bd663Fb6C137e60E4e9802f35A32bA6f,2630718829589513944112,1708343455 -0xb1Be1620A745580919A01319C38AD5900DD231A8,126811435890203638448073,1718010945 -0xB9322537CB482189870Da36f7030cdBFAb1E4173,2044397829583185844160501,1722184270 -0xFc16fE36f887A77847E8A2C4808DEbe5C5108810,678845038732364472845117,1685043445 -0x12df104e1Aa65bd5eDa3e759cA384fCecC4882c4,1286458520083997288576,1722039855 -0x508b0907701dFad406Bc80e7833Fd60E267e26BB,140328185900799450204508,1664751455 -0x2eB27F608521009f9663904Dbf002d93cfbb5957,645208531592005254655,1713699640 -0x16F65b4C08E4c048c65C50C4AcA007960a46A331,1515093058757902161500,1681825085 -0x2254BF1045871C918dCA596047Cde00bD150AB24,7955230007637622431671,1638530155 -0xf52a70e925911FaE0F2F82Dd173b22AD93B933aB,20244925446671214412759,1638397110 -0x69fF6f6f60cC0537425c16A26E322751e331256B,6301837185373144775617,1720535615 -0xEbecf720A248586815D5B686725d9798c8e2d666,946190530115139343574,1689735725 -0xdF0772a2fCc5Dc880980462b28EDcB5010d3f55d,757572729786272959128,1681676925 -0xe6A2BebCc4B6A34eB67936FE6FB597161224be65,756796879705716442299,1683806985 -0x9D8cdeebbb32B8EAE94B97d8b0AbD0984279af19,633529813516664595695,1718855655 -0xaA84f04496538ab28c128f1684FdBe3aBc9BCb0A,646010786509656824463,1714155665 -0x1653e86CBA80C6444e158aB95170feF3b769F293,2598216695018443458885704,1681631555 -0x2b59Dd236AFc30efaB66f14efEA42a5b50EeA5B1,36121173894406219291035,1717623890 -0xf89351D7805eE05210b5da2276542AA23eFF5E9C,748397739808099581520392,1688408525 -0xcDD6c6055E3f365A54a4E8Afa1A28a5D038eEad7,758588015955028955658,1715871655 -0xfdDedD992fC3B3CEC21A59f8DC2C1221C5a0FF67,631982047364024938905,1719999050 -0xE04F3c65B27776AbD30f9957bcb33Df3f5CfA147,1262786491674383583678,1643750455 -0x9997b26F1f747736e048A5Dba6D5Bf3BE5652570,24005020111089210206128,1673711340 -0x43eD802732f0b317f43a1938fe80d5f7ECeD6D98,1159590702664702502951,1675859165 -0xa5735BEe5e9233ae47BDE5e22c23D68AFB9f5d95,1510500981669871541227,1683652375 -0x34282F18eec18A7709f14E43c6126d1d27bbdaAf,636586766081062552701,1717525755 -0x977Bfb133562A5Ff3Df5F0c44D17454796a060da,2667689402506726403688,1720317470 -0xF54E696A3Fd3C8eE9241eF910aE3Bc06454cA330,169419069972936434615,1705937340 -0x3d0F06a5C723e3B54B097994249dD9Ec9a0EC673,75955973278641956,1637247450 -0x1ff4458ddc8fac4Cb0B752072d8331EC4853769D,116017725747251420610332,1673682085 -0x40abF3B747F58D11C80b6124a1B102821f521608,736033480983553703717,1704024823 -0xEB42c5f748Ee62908d0AFC9eFafCd0216082C78A,23399384348894599827391,1721723515 -0xb48247686ddD4C44a6Be8B12B1a6aa9802B3992e,946200628439771250676,1689731095 -0xa9D7F2Be493725E005Bb5bEd0024167013ED8057,435400710940260072701731,1712611530 -0xEFEB310d913a5C347B21a216f0B723DC5B2478DD,757341875204681508476,1681696485 -0x20965179BACa2AbF4c2321D428108b013C1ed90b,847385971608616096381,1671658665 -0xeC5daF010681D2Cc18679917B239869595983e4D,183277215687734967,1682339300 -0xb0C4eae03f39F62966a953ecE4B895cA8EF5a49F,25373332778384725639675,1697531290 -0x54F947f4EaEF10F3035845fe9c1C28c6Add7f08F,636596994519496561699,1717526125 -0x3368d5EA8562b717D744aA204C6DA5ba2275A61c,2212009104826356080159,1669853415 -0x9821eA4ABAc885cF1E3fa22fd6AD1A3Eb5b11A6c,1315899037028187964703,1722270555 -0xC6edF216D2f5a83519Ad306D2306fDe926a0cb83,2399075446977679502131,1646409275 -0x889DF6B8175De8011e6082DEbBE60900E68D704e,7066530177496053330,1681787300 -0xdae889D2648ec6E229218D0510239077B5D5c850,838736232148364343095,1717669490 -0xd277F1471589A1854d75329f9E54bDE1992812FC,636023005451589242507,1717827950 -0xf9cF8775CD6697c1bB52fdbD9625C8f5Fae6c62C,294030254661906344239801,1706627570 -0x97c3917271E5Fd1D29C30Fcd47D7b1be7eCbADBA,51294401565156492960458,1661495410 -0xBd28AE31C8413e58c706Ee8aaA7560C3998c9e3D,8234337853487572907233,1719640745 -0x3d18E776189c03445AC3638D614071078eB01e15,2766091855906553025716779,1711485100 -0x4d7Bd0a10FD2Fe5Eba659af46f5F5fbA7C66eE87,857668231738002324034,1662739560 -0x43359c8aF70407587D4A3d1CC9F26DC0F7dC3ACD,82688491221042938186640,1639074885 -0x84e57bE8449c8417DC6eeb4C75fD367D55Fe522A,3192389486989624175721,1709148895 -0x1835cE33563377C4019f2e7150Ba3696DFB1bf16,8537260394803111346633,1663296175 -0x13fa872880fff8543a6e21c19e4b11dEeB1CC787,49179225753534920883468,1686064335 -0x4541248B0Cf02445590FB33f04C012bbcc735429,11405249006461076636772,1646665400 -0x3E1d2675B20cc38D3a069B11600C836e8bBCE546,13086740884534390732227,1708590665 -0xe880A08092539C631F1f1cCb5f2B55CA638d1C3b,1513890191760746464231,1689753410 -0x08B1f6724BF069150Aa382e1454C5CB6208bC3Fc,31652908963280427285961831,1681594545 -0xC3D1f056068acB39009be30C2C218bc960412815,4433523140512806115548,1658349770 -0x84A7AcD4a65Ba22d6D16FEA2Df9908C47f2FABBD,6921871427672490080644,1638466245 -0x90095fa666a9dC328626602EF4fE5dd0eBBf0663,3772767612135500618508,1680560865 -0xa11ED25f760C6988cCE283C4759e81C02C4B6561,23555433328035411792239,1675777290 -0xF981c2d81D15EC97C977FB86E3c17B2b56D97958,11563745371374291785281,1687324310 -0x2Ec830347F29a25663e190d1704ae8F0CEDe3beb,1892362739700933080288,1689751250 -0x97000f8D868D767d192A9a403D1f9954Ac83aF1F,24544911815918535111121,1637516425 -0xD33d479B8A2fF03aA044c4047317e3fa76703E05,632532466565485253220,1720917170 -0x6655E0E7d82fC86B27352422c9F03d99324e3c43,5042079413169478,1717756665 -0xE765eFd305dDD2fc4D4Cf5Da480d38EdaA5263b4,636202779241905101775,1717865320 -0x3Adf280cA5CE43702776e298443dE576d24b7bE0,2270835287641119696346,1689753675 -0xcE2df464375E298f08aCBec6b7933d94f90b5cD3,252426017891009314954399,1686528705 -0xCde8dE032C56F4a64380b6fd7C410c02C92cB431,728958927821113824544,1692617765 -0x8C2976C7b4E4016355c439D0886113e6Ea1760F8,2593409090501876047303,1721371840 -0xBC414BbFB26868bF89E702d96Bd8b95DFCC36B86,1211179720636453226,1681647570 -0x68962732440a1c4eE84ef300A24AFC719cADAD79,2670054890505044999160,1689736810 -0x65a52BF1D2Fb33Ebcba6F7cd9a55E85E79202a0C,1213688252886632914640,1676973225 -0x04CE784b3ACc349114e3aA0a352E6FCBA22d5cA5,8489564172267797265796,1671173240 -0x7C3d3c8Fd226aF854980eB6a2f0587E25638F57a,687624917681405808971,1698316235 -0x93042346b5322641bD1baB5724EA0E03b8Aa6788,6795953516536334505725,1718086100 -0x88b882599140eb4962A03ECA1deece611568B6bE,140565287064396050781496,1673749580 -0x847511735b4a04aa0E84d6F7446c59B82E429Fa1,2399096832001501295135,1646409215 -0xf44fCa041a22ebe19E490c416B1f5b5AB25069f5,1857796796977826521161,1692614545 -0x785065C575985055dd05756e340659AC7a038fC7,4580366742877684,1719083610 -0x71aa4C869ba1FFc78e25f0E1862F92a14De71E14,669112981366550546595,1704027910 -0x772B8e5d90c20A2706CA2aC019dccA6e2268A0D9,2342154570304581677669599,1717785455 -0xaA392Aa832FFd3CADC1a9E56070cFCEfe244C285,142129276059700389,1697238615 -0xB397040557D7C815F16A686376828058e5668e1C,92168970121696205119966,1667837225 -0xEc413f2D8D15f82E6297dbC07F2c6E5f7bBC4FF4,1135843007507786420955,1681718910 -0x831571E0DaDf9eEb7A6D23d8730e2A683d35d01d,700000000000000000,1711716680 -0xFd16D776d9127B3d86ec0F7B1858304F96bFF88e,1160859576368812630865,1641447560 -0xDcEe99B4F9C6D96a56B4DDAe2f746b6FBF6DAd5A,802945738793893965519,1704024670 -0x01e4cd3f617473F3eBE9bE10A8B72b8D63Db7D34,74148543177556545235818,1659546720 -0x3142C83081248aF4bEC2C2a49513e96A984841B6,2024743675228746037530,1708960660 -0xE1716ab0f0124B69927F2E70b778F78a79150dA7,651790699167325374778,1711538715 -0x9999d29a1DF911aA8bf4b0Bf81eAbb65dda05299,165331955486461745739851,1675238405 -0xf089c2bF9929a6761D582b4696B6D44d63Bc6903,2247731645460684404033,1682556365 -0x5C01325bCBc8f13D7eD4d500cdDE8A94bedA4249,582527747875894339,1689590515 -0x355797acEf54c045ac2786a2Dae4D78564Ffa23e,8489937076419280,1681816265 -0xAd0302859aCB1a88792d77Ed94865181Ec445581,282038255743208341621230,1717598180 -0x2A7B99eb0706F6b404A73C649a1a9265741eaaB9,1607765541892365815117,1703930595 -0xf5A120d42c679d7A26F81AF08aEA629329Fddd9D,742664762986703014377,1684851055 -0x37136438f16B3d1bABddE23d32F1Ed542ffca3fA,5329037658205103265095,1683314330 -0x27F2F8C79dFb39aDc9230fcA21351dB8D5300dc0,155099842374284506,1696717640 -0x675520FD09631E373379d4F9FB76Cdb3c93745F3,1513890191760746464231,1689757565 -0xACa896580Ac93E7Fb693Fb5817857360C652D022,4911849936542898787721,1716906590 -0xC6f4B92F0d1deF0890234C0510aA87d424dd9622,631157825299766531221,1721111475 -0xd470c01f5BD8AFb1A75f9ACCEe109C77a92B24fF,1513890191760746464231,1689752755 -0xF65a189cB620555705120607f301489A8A7909F9,259717830739039610461597,1681641150 -0x555f5a3d345Bd62ce44FbC4A9Cf534e1fe454536,10039857725091992368557,1638651245 -0x1F7c860a18baF69eDeFda25Bd93b61B2B48CD874,20216464499938237337791,1677104865 -0x850EA67cbCDb28d51118c53ea95Bc48E369684E5,9097550562789519231535,1703661635 -0xd207b8157f9b9Ab5c540cE2aACe75CADFB58EBCe,44301491522500164692039,1638669475 -0x1A4e8944b97dC090ba1A206d5D6F9229Cba24D87,756678745539451435285,1681843500 -0x674781615C71F8236EC20065a689Da4132E99154,7034596837188807387,1681787610 -0x6a30E44556917a218f2C2321ACf05c61d62D3fD7,2399096832001501295135,1646409245 -0x38855f95429C3Db132ACcBc6E051E991703C385F,7573801174061919854931,1681873865 -0x57B82b67680A17Ec09d9a951801766EE9B2fCFc3,4632683903293982855262545,1705235225 -0x0111bF7640326821d4061e15dA840a52274A7AB6,44277300110324502237087,1719651715 -0xE240F86d64E945cBc0Cf7426D3E3F3fd6D152f8C,3237293063655534049925,1720281710 -0x4Db0b1A2E410665FBd61d62069632a7E4c559df6,7066530177496053330,1681787125 -0xB8a0664A8492FE0F1b7f401Dcf56FC574e15f6Ba,818497500072198532572,1671648425 -0x7B598f5bbF5CF80227ceAc0B1469d1b303EA7d0c,2984782836868032242,1660379815 -0xf7dB36D888FF762Bb4f99a02A75b745C799355F6,8743107410030097991524,1664839015 -0xCdCD1A5c4A547326ce4Fa106a3B03aA6926D56AB,5074162305345095485108,1712708590 -0x34b60b86aBB9840d0ec6Ae791c76E4d54c85c454,8252117880181120429356,1670102680 -0xd299Dc11A276FA7aD7669dE175459a782517DBdA,15122975087930366341548,1652461535 -0x9f9Dc982637B04878D8330629cD3A3C1d110d836,18734901512769700221976,1716476015 -0x3eA7B48Fe54B7625a9c6A466f23B3c762EDFCdf2,1866939063831101402694,1664287515 -0xf8383B6762843011D3cb6e23ac4015d6119540B4,67745367453227680975989,1719231320 -0x5FB660133ad9d86Ad616CA023946CcD1d99f5d6d,9804025773094231835448,1645340525 -0x707cf220C126CA8d0e069416F8474AEe12896bE3,644300264021381556,1681018105 -0x95f90959549b4101b18f4eCcad0AfeBdB6B2dc0d,130241875094715419,1681648130 -0x50AD2C01a9c5B2B0Af29A204649dE2f62734Ad85,30771428790780247445026,1671063235 -0x91FFEf06007e398E20F62d4190Be9437142C04E2,38647732042843170278088,1641404490 -0x42c7C326140ee1DEFEF0FE2156d91627f3A521A1,2399075446977679502131,1646409355 -0x3496cC53d6d8650Ec936891038E656a85475126B,11314461789170116007545,1682520850 -0xb3e62F66e5f96C01ed6916c82A088B4A46de7B2a,3784762120460557374297,1689738060 -0x895504a359C23B7955154452ACDA23d18556512F,631220998936193752615,1721005675 -0x641C4E11C021e47940F39b95A5C9CeB130C85D6c,3260663106155311177350,1708636725 -0xea2B808c2EB80f250A48DbD3891B5ae4B72848B7,540800943683513824,1681800820 -0x1B0EDc3167f099613262b61f42ABBee2FF86348F,2392165672739954106755,1713035890 -0xa51CD79C66a3892D4eb91AFcC2392f08FBaf12BA,2631361589745306324319,1708345400 -0x3a9ED4dC94fd09087B66DFC4b3E64D22D5887C50,94040761412694062991870,1638540625 -0x9262b55E8E670826132c3b61442B02A969C12eba,857808619414267204922,1662718815 -0xEd9DF53C68939a326A2B75E8D48bF7AaA526CD73,64797356227574992187822,1637930350 -0xAc51F67f9b6676a65166De63917C0539d6A9a8C2,818968887904011101888,1720633655 -0x2AB3FF857A5408fCfDe1E3d747d97380A01c12fE,639226593170002099818,1716456980 -0xBe35273CDD1D21aB6A6701f03FD657884aA6e3dF,638914219249891644626,1720158175 -0xf2890B84509198F5a361c28C82a924A1eDDfD4fF,1627164092002524212268551,1717004405 -0x6D6E688B94EF5a5D5d9192f24e46691422428998,8186007427418322824266,1668954380 -0x46981F910eeD23aF189D779897506Fc7e1d9378C,549575052460522000,1681801140 -0x6133025B20047CD2C64C684A1D7057Be54cc0D47,361106700873998,1715077910 -0x6fA040aD7e94f905a29536Ba786D433638FeD19b,66354519044435652290518,1714368030 -0x751B3a9c147fde88e53AD73130273EE5c11a6F28,974238886933216960330,1704025015 -0x1b8321A7C0e14a113734B1752dfbc7888457d0C7,1253485690300451196698,1722293610 -0x4E38bd28E381421c97E0401EaFeC26Df7B1F3F10,559251462748921516658727,1678934785 -0x159579f8D5880aA25449274fD612cD9f93411939,10663103267386279326401,1711499630 -0x1F3d726389c3EC46AbAF0C541FEf8D0A510D96C0,3972284043472142331001,1707399510 -0xee897E67Ec139516C3096663357fA41f4d415213,431250000000000000000000,1712845330 -0x121D5c0bAf2275935Da5439809f332cD423Cd6C6,7411409768398039506213,1700688560 -0xF999F27Ebb207c9688687483cfe7c4E628c90085,24171368875468483906947,1676012865 -0x3d61bA60d987e8dBFAdaA1FC308231a5Eaa363A0,10440417491743760324691,1708855385 -0xDe45e5ea6A699463246f41113082719e9Ca06d26,22783369864255095524307,1717476825 -0x5Af0Ecc46077E127D5D8bCa00Fe5d21214bA6d76,161480255857589854,1681817765 -0xc0D92B587743e1AeD12eCBfd79F7E94A4713d208,10154370185836767436289,1711062086 -0xE82C9B4519Ffec697933711159dd66eA503fF6b4,4674574397152678943417,1710547415 -0x085D1113AFDcd9709E3E9506e5A0E142c3d2e1dc,42791683255160702926480,1710436180 -0xC16C4b31df64eE44Ec59D57eAe0aBF92dFF9b025,41425703981521539521089,1666908070 -0x8F024651691Ce39Ea07fc43e45a6d1c824C44375,2747304350437386568306,1669477285 -0x754F86F59fceA9793b580B9331AEAfc952Ce3Ef7,756327184455692385845,1681994695 -0xb12bef7b37278a6Adcdf200b7714b9efA6D19C19,1168828250648402786627326,1680302180 -0xe87607C4326DBEdDBAd0Bf5C749ffdaC19d07789,235857507024000023408706,1669402880 -0x0bF19e344F6f9cd26a926204fF11B6291D05bD87,756835629887275392748,1681821190 -0xF1D323669e46811824551ffCA9EB069c09eA6D96,31340209216488193590173,1664378575 -0x148fB134596dc0Fa31CfA8fcB6f55b6EB215795b,138987936776948220902061,1676575715 -0x9710C4be65067Dcdd37a004fA062eD2B41F04204,549575052460522000,1681801055 -0x075a4bd432E8e862733C8E41efB773D604f35e5c,3464300597335001337898,1663256605 -0xBf62181A2aB12e8b7fa6a6CaFF456B7d2b51d501,882125147141880015366,1706188270 -0xAceBAA7090b3ceBF828C8b970D5885f12bAC60bC,756320081246347291641,1682241525 -0x75F8ffaF1b5F2D94D081B75503ca3358F21BCB67,764888882614391974233,1681700840 -0x2eA9ba03070B386E0868B8E42C2a50FfD55E8085,100418609502899439,1692693140 -0x7C421d49621952a90E93E4932a2fa8357d34e4B5,1610658286580663153273,1669636335 -0x9433cf9d58a2D17E1167114869D78c5c3A764DB8,324823372503050994419504,1662898685 -0xc05aB35967954872a0D081c381fDCf064a5bB292,755885900218434139207,1682024615 -0x9854961c047Bd36ECC10b811b421Fac22cE9db5A,1488057663236727347547,1695968525 -0x7991ba593c05f733BfAacb5D851904eDb2877e3E,549869280898591826100,1637580630 -0xB29A83a374CCBd36224A41d51f769ec15cceDD4e,355497323620189539,1686447230 -0x09530e14a5658BceE95B2120c271004B482e5833,7268145808732314162820,1644259605 -0xE058b3FA7BD785b5978207dE99f318Ce7e2C9343,100000000000000000,1702562035 -0x78627bE3bf8dde3D566388145797C5250D17cc71,51794822613252242373752,1654488410 -0x20820A07654A49285A555fCC1606e8C90995292b,5727619002634289508493,1703930680 -0x86c9E20d845b5B7Fcf653D53f4f97Cf1cf367B7B,7571704410531875462280,1681872880 -0x17cC774d29581E180d3d700ee4C3c8F552a2Fa25,143937129210573594538380,1685730280 -0x75cEFfc8a4ACdFBC8303c54A70f106851bED81C3,1255598492199022676556,1718908945 -0x39933AaE9040F6bB6ee0E8BB8495973Ef5675772,272700392282693220,1674215470 -0x784C9b792Cd5AC082F4391a94d8A17A9C4B3DfFD,727000000000000000000000,1712844535 -0x226FD250bC889043554fA5E7d262dd1EB2209725,631895338928925251576,1720773380 -0x203c2083F4F9aB5c35db3E2e002133277B637228,64029688915330684426779,1710090165 -0x98e468Ff3C22D851A3D19F281672a485d65Ef8d4,728969618931656648097,1692614285 -0x605d8C194c2174470b8025D0bA97289Fe4AaB39c,757056438726786167114,1681757475 -0x6Bdc89C8752825bE13926F7C069799fE662F4804,31225796908242975455961,1692051025 -0x0B4c81aa2928e6F8fBfE71448C0eD26635AD16dC,7573043945390247997317,1681874120 -0x0583aE0Ea24199ec87256b9227e96b138CDAd363,17920489912233472160204,1640747665 -0x45D67d2E8b1475DD7449AC9D3194CC50063b59e4,657872549994813763275,1708271905 -0x23c660B8DDF4D554ef40007DDFEb65E63dca56D9,7270215838672101638796,1670903905 -0x07476f89082FeAE4AF22d361faf7Cf7b3b78F156,31342927075571279368318,1722257405 -0xB51ea0BF3F951a09CD2B9d523C9D69f3A2628881,31500580274857104,1718381875 -0x644bC61Cbe1873194B99864Dc2c0d9359b56e11b,298880806116202491,1667933905 -0x09951Ee84ed27e09c9d08955da719B5Cc7Bf558E,2399075446977679502131,1646409490 -0xC554eC951708D26C04f88c156BDa67983D00Bff7,150295395419514950670592,1645755595 -0x711A86ECD1207473e40C6Eca017b7E2832b0C552,951982058210099781669588,1642938045 -0x61D76CB19Ec793255E8549Aa69919c2041cC213a,644842972237260241537,1716674830 -0xB489cF9342EC7B37e8626a132ee6190989842fF5,142800851146013927985218,1711410070 -0x44126C77ea848bea0206765ba3456F89765397c2,2818197855675254125350611,1681182280 -0x04FFB36D22017756B53A937DE871490d9de65C45,2754668269930575343856,1654680035 -0xc08fab93B6bbeFae4440816C96E60c8AF769b9fF,788738332934127769787,1719900261 -0xc998D0bF479aCbC768bAA6B25C540D06635Cc831,1758709690509997357287,1681801210 -0xED6d67062799961542eb049dD2801938671B9bfd,7034596837188807387,1681787715 -0x7D2F7F93a88818A75D782bB19Be84a3B0B555838,1513890191760746464231,1689754850 -0x22EFa53504277B1846F366D75C9dd21D2716327f,5515113517463707565356,1679252995 -0xA6E5Ea758a20f88f8e9b7Ef73B60FCADF2FA8256,29426820392815750165996,1655034485 -0xA9Aca00dCcf8D6741cF4231E12dF10eCC36A7D88,666034592186248246499886,1641393320 -0xf4348DaFb8eBCBf930Df05e248Ea0b6AcDe979Fa,936274535852550838351,1667468645 -0x89eb370F21d188685ff75Edd157704dBF8ec58A0,657629871551216498485,1708362705 -0xCe6d05f6A03620383176F9EDfC2788AC79A29226,757453491818867331532,1681721475 -0xE33f4778FB8dfB9CD41347cf5fc745995974a18F,20329039338223881629371,1664377960 -0x79246d7702a47eEa52518C3B3328f7181B330458,223607904360037037,1681717600 -0xe31ba15427B82D496FaD6415899B793d183FBDD6,2399096832001501295135,1646409190 -0x0b3Ef6c6E1c6F340c700Af8f77D287147e7746F8,627501444925271292278,1721813310 -0x671A8cb376e239b973cD174aA5e63CA38F04BD63,39590496135743573,1680712990 -0x7241c3b318cCb8Fe7cc18d678b52b5dF66850ab6,757554562610339320383,1682673910 -0x905631bD01adbb535EAA94a5ed96E26C2140FEbE,2119001215466003107544,1668971220 -0x9603cFFAc7342027d66b8D2C4D4F68B09B88B8dF,811004206059870490302,1670246175 -0xe484099425B99Fac1b90fa9B0A43124337f41527,7573895922511832796489,1681874670 -0xa69eCCe73875BB637AAC51bbC6785f7c22e5048F,35145262954072889270486,1720092516 -0x6c49cE9CFecD5E2F44e74f9659e75fD7c1132CD3,7034596837188807387,1681787680 -0xa4259AD9c5Eae475bB066fC0A620ea05d4127A04,716720565169243307328,1690130645 -0xE66fBC8Be19bD6B60a7FdC743a1019435EE0a04F,1031712793230090180856,1686120175 -0xc907E78d94Ebd765e5A87aaC10b780a4d6668D35,61554722497771888079526,1652892935 -0x48C63e605a08EF7dd668Ce4526D059E991b5C5c4,3354781524388770600740,1661331410 -0xA9E20D263cB8F9627464f5e660b575F2ed6163FD,379833946673680470124,1682588540 -0xD31e15811507f9e6308A0d9DbB3b0aaA60D69c4f,853567725101460198279,1663321370 -0x34222528882a34EAcc5a1b3607996EDfaFfeC084,6989296511714910319366,1708169690 -0xe8947F20D94F8388E6a9d98A8af0740257303Ee2,936770028592876293105,1704024625 -0x229d0a089968AF767fc9E722Dfd224273CC5aac6,272544312037990705,1696747105 -0x4CF89784625200632aad1e964e4aCA3C586D32BF,2838571590345418030723,1689733195 -0x21b92A8DbAdF5a0dF03ea48A6ddaD40B06e876c7,225396119119363285665643,1656073840 -0xF02F4c86BC6D121432d40Bf6330AC298885A0a7c,2399075446977679502131,1646409315 -0xE504369039D02661175802645F2a7ab0D519F3Bd,71807031652584120267669,1643835040 -0x2Ade1bf403734457BF8360D0F9b9D432b8Aea5b7,2186934039636780914483,1709944645 -0xAb52e90b3b1cb339C051d28727A4107EEB0FA5Fd,1201370147959506214246,1662837235 -0x3Bef7AD66A190bC1B1B2a781f19227dca7162653,63771286154188085600946,1652952575 -0xDF43648A9748901A784c017821b05Ba26274898c,96440029290152267,1687277030 -0x971e994F5451B609b24A41Ed9C72fEdD01353A6F,19962720262563634218778,1709469700 -0x2708Af8bf5882D9Fd5BfB709bC3FB63a85a14968,64106752739495750,1682773785 -0x5355dB5f5Aae1c99C3e4b41ABEDD6AC41385F277,22030465806456794393436,1702022750 -0xFC851991A95Eb64fa9d4D015c78D3BB172bd8Ec6,645249241726200055202,1714509005 -0xEC80457Fe5a0E9155c26240Cee64bBA4c21D9645,11986274766336924460725,1650253695 -0x48B0CE7764eDff9F600B779aEA992A0764C8Ef10,86129282685740897882267,1713263675 -0xA59a3fb236D52Ee6AC6eCED02eD66Df9EcAad274,7066530177496053330,1681787265 -0xe006bb2D81D135ABe9A7bf1f3107a098C8b31646,76203978967973422214960,1667634375 -0x724Dc327709Aa408f57734e0406B9ebfCD43DfC5,757453491818867331532,1681934050 -0xCBD6D7172dFDCb78CcA4bf905a2d3D313408d998,4142829696921060,1717423360 -0x205280d9B9d3a88DcB5C3f4801C3f2520dBc46B7,903879603758530259821,1680612740 -0xE90245B8dF6CCB3409CADb56f518612468AC2F8A,854136438861926893060,1663251375 -0x7813B43e2CeF39CFF88f9b5B54F4c12240920539,2399096832001501295135,1646409140 -0x190bb90aA4D3a47699ff29167764B2b0c7002C9b,869857883693385129312,1704024535 -0x55d46039e187b37a0201068dE189ecB63eaE87d2,664966134929822001292042,1710986440 -0x365C0Ffd00f83936920f6366823A10A39d9CB333,6802744037635991114943,1718086290 -0x919AA860C672bc1cfC56E2007A982e846c16FCD3,2630722285882133495373,1708343165 -0x6aAbEb613ab9B39D9b9F8dCE2A655adc16086630,313114955076149411910409,1678649745 -0x0509d712d96EF8661262c9faeb9D541cF9E77810,2169937298511739,1714118505 -0x1555f5Ea6bb0937b25624839f741fdA22F53C828,85268137309452595200516,1718316420 -0xA4423BDBA736AAFe27d85CfF2F0F45C1712AB0B1,18006470465605144035380,1683722925 -0x5a308724Fb50b0DdB49375311Eb4d79091100019,3278627428514534103,1681650960 -0x0bf4dAC013775Ef421cE0a558E63223D5195c407,1899677328088372487524,1714132515 -0xd157D4c34aCE65fDb586b7C205E8b8074396B02E,627287859124092821,1719355320 -0xD5948fA5e89E37001f94D0e7b62C5C4A91eE8d5F,3157963570744962502041,1721290315 -0x872FE1890a0fEB8c1F048336D61b8E6D03444EAC,637692001950001309860,1716943600 -0x1084C027162ac971D4C2B26ec4168eC5c19b7F55,2654284770481455580402,1714636925 -0x29D0EB07132DC5f05da00b2083ac6b4813f6d71f,520078948365505,1721738110 -0x32A9C2CCB8e9F496a965A72403a97Ae489Ce819f,757520356219526714408,1681686430 -0x75aa9C79598f5AFFdca1d4426960AbDA38269996,9732833438085379991758,1718086825 -0x4afeE85Ccfd249eB7b207cd3629A0b6dAa4dF327,7648910707552072626909,1643721840 -0x48c11B9Bfb5738382f6b1759E7894a6B785F9aAD,3713404865844095875809,1643722165 -0xA6bF13906e2FD5C5Cbfdf09295A8Ad5A4BeDb77f,18754165052420752022331,1711873110 -0xCE9c0876a74C6E800Fe126146E61338b72ceE013,7841458741629242626071,1644957560 -0x781919717cc5b671bBC06605C90A369EFa7762E2,639940111702853257971,1717304455 -0x331293EDDa0D6658df3AB93Bd23F8033D494a312,4548622166473100907,1699139095 -0x886f2c957049e2d241240F3EceF8bf9B77cDe6B9,547317978329241844,1637152955 -0xffa485e7675dF7879d940943Db172d4e76423D06,99999696483432522776404,1708012985 -0x033d6791e104140f837c2e3E9f9b492655AfEe33,981907174430313856727,1685069070 -0x905cC542483f66b0f6749777107bB9c4141BF144,65078811739922442917884,1678157415 -0xcf7bE9F9474034751E6f3521A330aB185A48bDC4,661330230770620134,1687935690 -0xe70755785672771b95599Fb85c861A1C645D3bD7,25883198765858534509966,1699980800 -0x6a05a5e7b5fF34f06C34c4baB4F199F7E82ED550,194520470939465438377910,1705691160 -0x30E65feF8A0208338235AFF874ECf24F1D127c4b,27638358122936984343855,1637910585 -0xca8F5E2B46d1b736bD2363a9b70B70A408c2E062,117095611392751357,1661173025 -0xa61c0b1c40D51f6094621d96cf4649205Af09B25,20014189939193216868204,1637241025 -0x313a1df33D5662b7128122ae5D9A11B501f39ED7,3974172991412798741712,1662699025 -0xeb0428329A684367DadA8cDDe462ead6063F6Bcc,1253608475591378782771,1722178120 -0x89A99e24209d1A8B82EEA8ce0Da83323f69cEe59,25082841197471494048450,1663137880 -0x53bdd5B741b0923F1F08c1bb96c342697b89952F,802945615618422222237,1704024775 -0xDBAd861024Db1039F3D7181ac67F68130edFE4b7,7632640294080086316870,1681741640 -0x6B5d414Da9BEa368482b73C2CAdde2772663D6d7,757453491818867331532,1682023515 -0x61Cc5b65861Fda86484786823560677a543C6438,754389472313443837216,1722038080 -0x16DA9383964CC8241Fb9b339B7E38e7fbD37b0dA,24125444665546511289932,1678563625 -0x01769A3d86CcC0d336a22Eb3bda350DFCD29527E,80400407242848668,1637319765 -0x724f9D09546Fc071d144D53466d93DFB0A1887A8,66308180287249165291851,1658832790 -0xc46B2106abD4205796bBB3cF9A6C2490F948c3E5,15332898961646726906089,1653926600 -0xB4f303591D92b23a1BAcC245720CdAB47C375346,638333350541259050189,1718405620 -0x33d744DA0948047C3A4c35B7069536B9866BD086,7532602112653333933694,1683601740 -0xf873C6e3f27519c0584EA21c5aE1653A64929eCA,50774314249242214695849,1713804030 -0x123F3b47a08e120EAec267fDFfb9F5670f44525E,115531051628946282355509,1679232035 -0xd11CaEDF16A2Eed74f6aBE9Eea5553c4BC3aFbd1,67948268746184327724154,1681313335 -0x57031bD3485e89523AfA091b637bF0E0C815faE1,3903358432177262331073,1650296960 -0x3cfbCa989011A43359a3cA694697f5BB7cE4e898,200399512975170240,1656507250 -0x4bF7A07b273D9c20c599E78AEFcA8A838F8A7fbe,185759781856184952239110,1699692740 -0xFaeEB9fbD1d65Bd217464E7BEB30DE107BA6a808,14082993290424492228671,1685338780 -0xD5Fa451b452c8584CDB1e4c5d411d2eac6E6b8b3,685542566439883008,1669725775 -0x72E6ac1893A4A6cD869880F1E005d170f195D678,2649307835581306312404,1689754055 -0xe91e4cB7777104c4DB80D26CC728fa7175d56D25,50781862811336288278931,1679734940 -0xA2D8677bBff869C98AaF6E4BF16B5180FED7B442,40560227729981304204122,1674165455 -0x133Df58102bf1992F16C56DF9528666f915D159B,1074925619913067410884,1664354095 -0x6B3Af28719AAa4D84c8a049900B6801a49AFBD63,15215003661654685763121,1697968795 -0x74e9B2D620AD16F117f8ce7054682090DeC2B60F,252293745911473086663529,1721266725 -0xfCACC85D10c9cd442EC8944FbBff7AD6497AA368,16880093869243508419016,1676201000 -0xcE33844aD03d736F7210eEE58A7Cc532f4EE3Df6,3667387770789780009339,1704744830 -0x1E6a48718b5314630B1a5B232c03c764Ee75a3DA,57808011298959777,1681648855 -0xD876f4e05CfbAe3eBA872A67280A40e4e2B61823,1253290345618030494998,1719384965 -0xb57B9A01d8DDF70fFbCe6803F62DF02488C8a28d,1286640661046022666445,1714508710 -0x51953E66779f70A4402F290c485daba251D57152,126701666879164012842991,1683855195 -0x4d8a4B206F100E5576B6D0C987beA124DCBa4Ca2,1257841912853515353021,1637783000 -0x010a5D3993d17745f22bED8d86A4b45B2c143dEF,3129940254969297515494,1666013100 -0xb1CAa212B245f31d980f3F57B22DA2cf1a09De19,1998071065005125721592,1712134735 -0x610f35D8ae201E51FeecF966B4DE303F843A4Bfd,783459449239791984352,1692615740 -0xCfed8383faB1849fED25a0B28012E57765FAF234,104048720514112625896177,1708770900 -0x45E20e612D553EB89b36b0FD23ba102D00b74A70,2632261785716335948578,1714148340 -0x73812B5a5f2393D7002F0a29BBb7246EB770C578,646271000657885237784,1716153850 -0xf42eb776f61a5751787aebcB7ebAd28EAc7fEcdA,757238144622258827883,1681719050 -0x50A3c110fC546Fa9A6a3762Aa97CFFDFa106EF53,145011769727889687823851,1704564365 -0xDF38C034D8FEf671F3b1247CA6Bd9fF0EfF4C645,10938089975445930959529,1671813840 -0xE707Fa7f715ba8BF81d5B83cd01925A91880480A,650136155305557490399,1713252575 -0x7Aa08BD938c59070ff9f75785C908574F9bea3E4,5939669580819641267823,1662749285 -0x51a037406d8a8320C707aF6E5D9E3644d2CD1e62,632365244173009375780,1719730165 -0x606F6278640d651b9FacCB5730840E90E3C47348,5278398818026751,1707270550 -0xB6B6967B262005BD3e8Cc7D21a2808d64D12881B,101242833151708429784526,1683654195 -0x3B83076dF3344eD9A3aC7D086E23D0397535D086,98986880093723808411847,1712846470 -0x56beB001ad759a727120f78AbC644cE45Cfa1d0f,1060619455192809624971493,1643901615 -0x59053E2251670cB68D3ed2011cdCacb597CEEA4B,1513890191760746464231,1689754425 -0x801c7F8A2C48c02c4c706227928C7A98d77EdE5d,149897933391489943306579,1637331750 -0xC3d05EDd8e68B391DB575bd9C327B473201A8E18,765148457084135688719,1681649015 -0x2b26db1EF907eD18e2540115F988daa2F87504A1,49095000000000000000000,1643569930 -0xd024730EC4cF3563d33426805e81B93ed91A9064,398704317659733027578156,1653154860 -0xbC806AF6733eFe556CA838dc8712eE45A9f4Fc48,2272691513851162019027,1681650200 -0x354c7495D52A1cC132d4787D3C15ac9326CF3C25,26287379534059446202640,1718718375 -0x59d917241B55A5afbba3B4f91b178C058caB9fB9,32743551575388437835090,1677243670 -0xeA7bF615505494D47bD849393f4b252b048c3315,9088827323064531290858,1681831430 -0x292a7cCCfb910F8A14CDf171c4d5165aff97fD3f,637450021614668939459,1717030705 -0x18842D30863C114E4C6986db4E42FD910D68E034,7362593821947490368606,1709429245 -0xcD092a88C2e6CC2F9Ea30F714bD9dFdeA074796e,592467540477088029494784,1710986295 -0x93F5e9929725399E7d8905521eb64EF27CF31034,1016869935769022586873,1703527160 -0x78dDc3BBC6D1c6C3f6Ae2d9d34D7202eC52c3B67,71643439696153229790773,1710290855 -0x4cF323792b441C3858C7f33E7794471545a9eBaF,4366045699011280199786,1710917085 -0x78205e4b27E6065dD24c900431b5329584d54a34,631174813751307441440,1720037385 -0xbbb121444318B55D9375aC7545577965FB3b0E05,351558261507426591,1698488665 -0xA7Ad138c39A42B5bcBFfb8db93D40Fdb502eAaFC,29726510128977135251069,1717489160 -0x2Eeea8F208be9E4c2AfF6084F602299388f44F12,1020990086072404060135,1683560775 -0xba3aC57b1338c6727E73118448B9155b9f44519C,9878831389908006505920,1682983820 -0x51b7ee700978b7913304BA3B4D45640747c97f42,549575052460522000,1681801100 -0x40f8bD0Ae81F544f70b23d656013946ffe1f1898,25288107596236277292928,1672389040 -0x36c6BB1fbAE62FB104F21f54beDe137e901364E2,757469812181565861066,1681686740 -0x6dBA5c4765e579702AfE264e34B29139647115B4,14923785049922957413255,1682092920 -0x71307991f173545886a86e127C7196146327C465,627984991658559110251,1716796475 -0x88249C558aDCd5cb64FA3850158AEf83BFdA488c,168721671185339515548589,1669240740 -0xc36199107a5271507ce2E28f0e1043fa4e2Caa80,78161868762298596362,1663481030 -0x81E7eF5219a34d8c009FB8C219EbAD5Cf8B9FC50,3208254312221582008939,1647398130 -0xde065B0e1B4944Bf8DDd1bff071b7f1353e98D60,35860496837802933934112,1647983910 -0xb1580415f82F1ca89568840c58D8a84924356B61,11101495982398586622226,1665337400 -0x80e1b5040300Ad83D2EdE850991Fb895CBc4d0d7,8533722616695631953851,1638207460 -0xef046ABb470D91c68fF75ca8c92A0C1D5146F4e1,199678724043123409024289,1717616460 -0xC57CDA5b0D0e7A5f9D6dB91f0B689Ff95F4B6Dd9,4918736946386231071240,1706739850 -0x8Df977d329C4889A84E36e3395C7499856b96Ea0,278384383079446264482739,1684238330 -0x2b6b63Ea94310f3e96d3dC90422f19E81DcA6c25,193902839812049999417790,1677151570 -0xAd88eCDc39Cc41FC3A6CA07a95CebeA0f7F9E9d9,337866482875000472204209,1637576435 -0xB40bcC8501Fd3Ae423F1cf57759c8dfa912DcC7c,1253240137730867395256,1719900850 -0x579EC43e42F86d041ef810b85817db202192b288,31750735952098566063458,1716980170 -0x6CBc4a44dd43A8ba4731b90a375c625A19427893,98588416672177101302560,1651141035 -0x5Fe8a5FF18a6253d23caED5bf4635D4EA8Df293F,1765208342993178032635,1681801465 -0x34819F9a46A6e87281BB7DD2695FcE2B0b92c24A,17817850762709890390737,1663013630 -0x701e4De035997786109ce9d4A65aaEb59550975A,845612839329947667027502,1687355715 -0xE0462B3F6cD55F4a1b9D62236db527A20DD29718,3621659073142263432366,1689532110 -0x76942F576C7b6D8dB0d333024Bd1F03e31649B2E,3324000000000000000000,1637161300 -0x79a82bFBa62E958ff233A0B8c0C81191439d8976,652757292700864782525,1710357205 -0xFd0BF8D18504fb7F11160050D74c12c4Fc8007A9,42746127423229877227500,1665106165 -0x5916ABfB43F0501a93A6C155758B5d3979d61fAE,648023133885764018427,1716295120 -0x2cF0f81bD4b1D7fD2ebcABa9893d78a1c830472a,670178712136653916802,1703878685 -0xa5d885846dD5a3c26019C3ceD50F08aB6D9b5E63,3994238984967641806730,1705266540 -0x0d107fbC83f6FB5Be8a24D128a5f314D899FBaD8,9984347403888538767358,1653288515 -0x9fDB9fc5215E6D5423777Cd0f1a11Dbc588e3158,1454522568864743692177,1681655930 -0x72496FC25403d3574529De6BfFC133F7FcACB9fa,19678733031794851162439,1704810255 -0xBDd0687D6E843e1dF6F8f132757cba06740E11fB,2000000000000000000,1718377615 -0xcb63c4623e0E6f5742819a230FB78F2CE74Ef873,239182858218564327193533,1643775415 -0xdD560f92c0F72850e8673159f6B5fABAD6b565A5,758312117172949659703,1681651315 -0x1c0d690CbB405830dD8FeC6f85BceC14203B0723,757572729786272959128,1681648890 -0x409011fd80f594DEA9117E3C8bE7922c438498d6,3784762120460557374297,1689737670 -0x3fA2dB90a4B8f33E17CAA46C1663d84F977Ef2Ca,9479606755686320055340,1684049720 -0x84480325138E08f5cf1cEf831FCeF563F13357BA,4795800994245431101274,1669175430 -0xeB990cd5C11B6b1D7Ed2c528e7705d1dD042801A,7575315631405263570159,1681872015 -0xaBF3591A6e95dd1A303Eb722Ee466b0E5e6b9A74,4415988162991653694404,1649060400 -0x14C1Dae467cb66c72B4C812E8F0a2B4Ec44eCDe6,677790326913255117240,1714779755 -0x3B3fcb032b94c66d424F24b231a33deCF54E3e75,652141406302409990864,1711538735 -0x266183D3636b70118Aa5aeb78C6F6d5102377C17,170415227992692315882965,1685734180 -0xFa8565c06c95d3F1e52235529E73FfC70180708d,237518347837898155,1637264900 -0xF5EB1Bf4DC47aBBbD3198fb22b5F7ECA4C740dfA,421803405203915487908735,1712846405 -0x2B93a314A7425952ef619D7c6233a14d451509f3,1729219345200011810129,1663324655 -0xDA6C68F8240280C1cfA8e2EFfC5Ea675703187cD,7424383438095542534,1681800620 -0x591a46215d72e402CDAFbB38194A2a1FD5326a1f,64474061221398630135881,1713717650 -0xeA77C54A446fBe5FefFca60231D2e7Fa458FBAdc,633081774562801788375,1719662730 -0xfd0d85700A6109Ab14FD560a91665C3eC29EDD9D,4402165549895146692613124,1712734650 -0x75E19c0eA4212D3CAe9eF1186c8Aba66b3028ecf,1014849707722821298786,1681693240 -0x1D7334F3627B719a05A716c959585789E1F8E1EA,732961618461827934175,1686525360 -0xaD83D7114e9A784B4E01Df71F2C65217d5F375D4,757032021850966193212,1681763820 -0xceF1D967D02EBBd6C4D34AB2136847eE25cA7Df6,752623436763110137260,1705141330 -0x7E0f75E63A30083D32012aD7A1500e582095F958,639472731412292646654,1717565710 -0xccb7C4FE4a7e7850936df3d7B7Aa0C35340a2151,4834908143776661457538,1712569685 -0xf8D4CBcda90252ca2b5E8BEB7C65664632c5258d,167652183578775696598495,1722106440 -0x02A841b6792B07E414bDAc093D786490ccaa30Dc,176111488970619694312439,1711402995 -0x109eF80A56827a6C17Fd32cdc14FaA793EA1BB37,126189446325789686,1682339005 -0xf88a97265350f5e5ef1232f78928320dA95a0191,255770877525524367,1671445985 -0x51662cc955a1243A2e1eD72d69014Ee2b098bd99,1472832156410703338544941,1707998840 -0x5e262d3932aBb09F40d4676117539524F0eDeAC7,78849065664104541345180,1667320575 -0x58359C13beCCd58c0A1c86b19Df5E0E50463bdDD,3826089280865267406737,1721927450 -0x2CD313bB6d01d0EBEA29c4f4B234cc91e8505B4C,1310931896463796508638,1711621015 -0xd92E7DC209e049A8bAb3Cdd8178BF9e981510c77,866606247212576,1719437045 -0x0A177F077A6a3c5Dbcc887eF33fa88e5328F8194,66692868683771759841960,1703251185 -0x7ad42a4ccBaA298c4183Dfc5468876018A97c9b2,25528984914482932765419,1721915805 -0x08ca6e4A18d1BDD6a024E0E7CC83F567a5402A53,5167051761450658431807,1637253480 -0x6e21Ce0C114929B31FF69E07d5e210148f0895ef,7040617438736690139842,1692297575 -0x0293616680F2b2aDEC558C5a485C070Eb28E053b,3402258291605928081017,1701520440 -0xE29C9a4bC6530a119a6C7Da66a205F80f38E6b0c,1071786430687547982267,1682345655 -0x71995093DEF2E271993A3895D0c64c7783014989,14816439691808721271800,1679424090 -0x0d804d4F5c4231fEe84F6179F7B337b43c6d481B,87461446934299270841356,1681691800 -0x4e05ad8b4874B8Ae45979182eB2A639f96c91663,776705230866490577102,1678132360 -0x81B7426326624bf14DDFeeCdF58A053AfEa4f84c,15459308595779963835197,1647612710 -0xF5356fb1633303a3A56316B25eFBeB780984C839,260751187975298720119641,1708523670 -0x4375342e915876e71C32b7f2f5b41f18AD3013dF,645988719637322512258,1720973345 -0x5F3F92C06055125C8cB3B3110970F19d8aDDa7c0,2000707961174161026958,1704810320 -0x66485bB62896Bd7bE54dE8E2050cc8746a50E0b2,3393362531551916532239,1663009730 -0xe80915eD72e9Cb1b56e2a9FF29A4Ca5ECf3334e1,5684976561218456506344,1662477680 -0xc3E6D0CcfEf629baA6364AB57E17Fe869b787bCD,250257402496885753,1684780905 -0x8A5d3DD58a6F140D42b829e5f2D95Ca22667F020,108861538445657092448534,1688185680 -0x990f4EE5cFf9E77089669a28281d8cFb518c5F2C,9973998043148566570831,1663279325 -0x690aBe750E22D95b95B7Fcff70a4B35C10eD0842,492864250665888970827821,1722029890 -0x39f20db36A8f01543fB9780a4825eCF2e2781E7E,33026039310534388498887,1664073535 -0x28dc7A9E306A8aDE89c756B2cd3d6C609A9A5aBA,180166228410091722684421,1650685615 -0x33f78e71024291eA32aA3D2E390030931879FefE,1724680965679765406222,1710699290 -0xDfed12F44b6e0B772dbC23c3dAf80019E57a7984,798321823615614596522,1692614855 -0xE8c3D5Dba9DC91BD938024c8a4Bd0742b7d5B295,757572729786272959128,1682251660 -0x707B59bDe61116d4B3634670E1d0b9b4a311a66A,6183514775564265496874,1717019780 -0x27F8Fb98bac01ea5ba2C79ba6B369D7438cd80c9,644911708770821972975,1717681070 -0x7b9C1a0ac5036229021aC317913Fe3741c8D8d8b,6698813362665820134641,1640342255 -0x1D6ED6C56425457a0A31BEc79FE5E9DBBfd54226,112844373955270401502104,1711807890 -0xD5cCccC0B26601c04f423b5d701c9B35d1862B33,548878774203925562,1685996515 -0xab97544118197A133B74Ad5751f0Bff5c4a1D744,422628309822381192,1678743345 -0x27c6C1Bb3Ca12B52EDB0D413945934823803BcC6,20666243175646799507696,1718718495 -0x05D709a7197216C0F439B8edaBd4c1F900aad6dF,1315127934306746371686,1711290990 -0x9a02f3D971e5060a80DD7B5C3C38ECcDdE4e71F4,834543463314112578947,1678883905 -0x117b6583ED1516513aC4D9A57718044eF178De16,15530800115170531043565,1705760620 -0x53Ab3B7cD7C74F3DDD8314753b5BFEcD07128e9d,1050291791193218517558,1663411730 -0x6BF8445A25DD9cA788743B44Bc8CC2C4a1380d58,1565199487379193212780,1681845230 -0xe41AB12Da924b54DF704B8AE64CBe548664C069A,205073865534392842464355,1656217450 -0xf4062482Ef01be5Bc788CaB3a30754C7ecB82e55,629823927621314434956,1720718630 -0x96EeEb5Dc841392fFd678F65Ad08862D53231196,757333230494337793795,1681854090 -0xE4AeF19ef172731Cb0fB6b7909b582c6c1ce4759,28207261707595623634640,1641989975 -0x43c67f20a539B7AA3A27F709c4EeCF6d7BDcD26B,11024677794866209232025,1710615820 -0xA385904377e510d91B08cB1144c8800304d88D82,8758997113162187468493,1708900925 -0xBB72609CB953d9E43EfDAcfb8C252154d08821dA,1255257032425241753505,1722039260 -0x028e38f462058357F735457Df40cD82206D8CCE2,20733562698624029527889,1682805910 -0x10B51C30E9A0eA5E0bc31af28F0583129122A398,6946113242106282962350,1705409265 -0xD116F467e362c4674f95B7836946e1eE33D58aD8,47394497124165381056032,1642507690 -0x25FD53b5049a6bAD4D0e41aBd6A16146c6fA05aF,757106060587746599674,1681747965 -0xFEb9cAD556C53EA1500d24A70DBb820DDdE84b4F,802945615618422222237,1704024750 -0x5D9613633C40a6edecEAD0e08a5c3E6d520c8643,629935461826386251175,1720650490 -0x7838B2d5B68Ff26b9066Fe64Aafa343E505a4D91,7579101774763622858229,1681873535 -0x729dEC78b655699E064dAD2a62fE26c2C95Ff788,2315955966355561818968,1676977340 -0x56F7053A212A3e5a556e38d1dA42D2C030c4fb0d,9047861213353215241411,1670821950 -0x29B8dE41BE05053f3af3725660D4FAd588A61C03,3194375822966861123369,1661278880 -0xafA6Aeb62e45273fee56c927407eaa355cD66c1c,519670842978273465967543,1711709175 -0xeB9b19BCEd812D21Cd2376D770701010B9aB4ECB,6595161063741832021783,1704113630 -0x37d6bF7e8875137EefA8286e6AEA2cc4bFAF1247,2258240046396005028033110,1719557415 -0x8E32cD84697458A93D5B36DbB01d59633b210eac,12353459348414720085774,1648741375 -0xfba01440Cc9c2d299C9F2024a3D1F75A6a59F699,22397116817767813322043461,1721679285 -0x0108f7a10353A500901C8b3aE6E2E0462C896663,629695070224413113464,1720784216 -0x0f193b940E0E1779f09c3ce34E7f01bc8E80aC6E,14303682123108766525065,1713871055 -0x822cE69816F849d0D54555Ccca5675d113f6A3EA,17723838895644777862155,1679056535 -0x64bdA8fAE03772A77F34d272Cc11b3D531c7027E,22121208282852802664290,1662663275 -0x04615b65C4C5df2a8766aFFf30aCC55891d58853,13130981021712979417137,1720176200 -0x858D49078630dC285Eb4fbaB31Da8fBb33728df9,1306314736028119667159,1711291085 -0x5438b6a880FD8Ecf7F02A358c95C4188ACEc24A6,3372305766890652917675,1675348310 -0x1D6302d59f83a020E1ce5a5a2B1248026fCe4024,637970033140056088,1694803555 -0xd1b800D5AFaDa5734fa21e1A3449e11aAFbfA5F7,946200628439771250676,1689730115 -0x0659a83bD5d5dD71aa6ABda4C2B0A3e90b8b2629,946190530115139343574,1689732100 -0x9083bAc2Ec4F8B31Ee3f23a2F5D8dbc0083DF359,27296778135028497432481,1667389865 -0x11a4e2bAbb211513dFD3827b84E2833997C5091A,3726222394699057122428,1683699765 -0x295AbCB5FfA68e3Cc3C3F614C54240132C40D7bD,39041474189889463405120,1668987885 -0xb13d80989F7846fBA3a87125A7467a58958beB7d,4046905546468529016389,1670506495 -0x3d89e4A2B872D9C6872A114f8FEC38173BFFE87C,6111576773848841659975,1664831850 -0xF026e0C7eAF3FB6767FA62750298249604F6569a,638048251699154151163,1716998540 -0x57Ab11d4fc158958DfAC4a8a249Bb0Cf182B4c8e,1513890191760746464231,1689756585 -0x17E6728cB21AB88eEb103C3D7fc756D1FaC5193a,2632676395673537656211,1708345510 -0x09294Aed6D6A18d8F2e569439117df02349C8Ba2,756976294906658897856,1681849820 -0x60805f545C035Cc02164b60124240FA400f00C03,14617109221572871932678,1683575275 -0x060fA66F756b442C9adB817eB72d664E56e2501A,643783821214337723283,1715945620 -0x915394687C09628aD584ac6DD3902caA117C4Dc1,758330302516059232087,1681651370 -0x14B3Cf5481D50A48Ad21561bA34738aED0666167,15013408585298857952648,1684049790 -0x369B11490cB3d0D8ae2CBC484A04C9c42c1B5385,756851249797525346258,1681817130 -0x4c3DB51769e2A4356CC908C0c32F9aBC2D882DC4,1879351236198152149608,1668940025 -0xCb5C4f2f4925ff0c4E5b670172b50C78dAc8ed46,3891255874554760695233,1721748835 -0x4bB9B0a8C89a50263c6E5025914A9375B5702f06,639956955996026147578,1720859895 -0x085b4188CaE12cB29198a595b7bE8bF3c966ED74,4807481266858060126105,1710360550 -0x646AB4E92963284880b2099920B6a7A9F277d34a,1250765243087040926991,1677319370 -0xc282e8E4909C9D13896D44727BBF02F3aCB55E49,158795103545044229292699,1665655895 -0xC0E17CDC9667d2b99FBA7b2270CADd2b93fA1f33,649161588870941919855,1719365110 -0x88aa1E901015f0b3585af14a30764bAf17490011,1254841478448510822779,1719744445 -0x61Eb3fA0401324A14Eb13b20C4be71A716c5ec56,3955676268731664385,1705234855 -0x8E44DccEEe5509318eD01a71C08a8943E5334934,9484101304932856063501,1686244905 -0x57A3E7088651B237Cd363d7025554A63D47fC21F,892169465653057387157,1663935815 -0xC90bd18Fc97e7c6f900b7f9C08A03dc5A0C686D5,33343585528912381016395,1709928645 -0x820F6299540e170f96A3857445b1272029afEEc3,1979666487619246071871,1709624750 -0xEF33E0235570cBA1Dc2D4ad3440544b7c71869DB,386358820573952367,1690560145 -0x8794C6b88e230C6c8F737580c3Ef0De8b67E2d36,7414695825744092092,1681800355 -0x69Df187844CebF018d055C670386e8d954FF15A9,502783096620179959241979,1672950990 -0x7046e00A9C35347389bc33E9823c7b1176dA7Eae,25295113356041558585292,1719424520 -0x109a8569Ec3c370eeC008fcf06EA5671CA2baeEB,10766095349396859428079,1668100645 -0x2686e0535E380f71C91Eec241D248Cc5a040eB27,632860536119974287653,1719533795 -0x149E83889ad0a00196E6E9E366abB319b0392685,163368781192355649922563,1717070630 -0xFA32172D73873ba947e4ea7229822e4eFB84347D,1513890191760746464231,1689758330 -0x6AD14618Ce2042E748d27043B1D9aE9c45DCD09B,33373460005546714625369,1645540975 -0x12Ff909684683df68B6478d1701b26f7Be1e5B42,61602406411322776262757,1651671525 -0x11c2eDA67DD366656a348562CDF166b9e7efa7F9,22520054392854173471977,1713443630 -0x972f891A17402C73E76d1fD6536FcbD2b0597da8,5300062046177464108696,1719400855 -0xfB00F2c1c416B0644962160AFAC2D3b7E7Bf246C,82129639639040835471964,1689398610 -0xB99D1B41E38a15E7a9ef18c4fA4ad8690c8Cd50A,2583245220192435574929,1721929195 -0xB22A233FA3f100fd61364431A950Ef74D3CDe690,4484829637734425215622,1712021785 -0xCebA00f87E2b4e7c2318953DF2285B04218D79F8,8335795617747268563620,1665675545 -0x71B8d46B1205AF325FB94ABFe4C899Fc0AacA104,1003682019523027777797,1704024805 -0xFC8A2c9c2e64978b7a85b8A3a9Ea8fC839e4e130,58425031955823845667361,1698505455 -0x3Ead14877E72E922e92B5Edaf9c23eeDf715dC17,29801765831964213146608,1681128640 -0x199f9c0F0849162a6e2290511cbd26668Be5c354,2005340888272902918670,1638738490 -0x9A71A279d15f15b1423EC7F760996E94Df58694b,21030911749253096002682,1709867775 -0x796A1f2f5872fCcbDe20f3fCC00B688D7e14515E,628697842520834405244,1721216660 -0x1266a3A8f8aba30E817C6d2e2412a2a4733047F7,1253291444023774102826,1719384386 -0x7e7dA6E516493a1936ae647366C5534B1918e0Df,546454058109871771,1715957586 -0xCb8c01E3987809e4934AF49a77FB2c838f00f9f4,457198359685930839476959,1649656140 -0x83881cb8E7190D41596a3E4ac3DfCb0132F0378C,55469426992302597747563,1648256185 -0x76e554C5402fDFa55329c878e96ff8c65b8e0b7f,6873357176679982774126,1707202305 -0xb24e6e86FF509CfD1098BCfdE1646E95c315709c,1408317918859314245341,1677993480 -0x891A57d1E66EA98E7Ddc0d09a34340284271ecFF,629974207992406795046,1720903545 -0x52F622F4bFbe4b566134c1502089Eb4dbe4B5734,168239322572023162125757,1705405830 -0x76851F4Fc890ea8Da0cd87489679B11e1a26fFbF,7034596837188807387,1681787455 -0x2870C61ffbFD08804Cc509D756e64b1780D26EcD,765148457084135688719,1681648980 -0xCb26825152dB752C6dFA53a94Ebc221C7FC16e0f,75472604303194558287618,1663538225 -0xB4D06e51dd78047b108CaA77F8950Ae4C6435C5b,799731639260056914306,1692617555 -0x0b69E97DC43783918bac0376BbdFDE22a6560321,2085422622753255365304786,1718125480 -0x1D077595DD56637311A0B4A0e61F1B71EFF8acA1,1765185277458855238306,1681804755 -0x47092a0F53bDe75DF05B88c347678bF1957a2DF8,1245162600285966366997,1722097000 -0xBDc159b7A04D99841E3DA690a3E67351c0f9CB77,26318633956605243487085,1708109255 -0xfd99aBC4aE3B6463F829f5571083df1a89B088a1,7573895922511832796489,1681875390 -0x80C09fa2ceC7d89f16ef7e340E742c05BdceC71C,2000742347646740284881,1704805960 -0x7832C0C61d8506E9F97d91186057282E4A8050e8,1513890191760746464231,1689760075 -0xfb0E9743F859519AA9fA46a9f70275299E9d8263,1892381060230278687148,1689750070 -0xE89527e336cD90eee855F7F872511b32a95adb27,7574945963620336459994,1681821200 -0x878F2B80071764710f471164c3d1e34779114885,907167831710703669226261,1718364070 -0x842FeafC4F604880419F13766488090966671555,833281913840353429174,1681657105 -0xDc3fAdb82FaaD75DdaeE4dE46185481e0D02d33E,34054273452014341866457,1669114550 -0x1f6161083c05C63db56174E38398911B3993c391,40172895812768741910579,1649839560 -0x137507e338c3F6d9A3e4DBE4F43Af73829D349Fa,148038553706704657294936,1649700810 -0x51a01787967407120A0B363Eee5F8B9Ef7486F29,2668073510664644811581,1661887340 -0x787680992483439fDC0A1262Cae6cc1E55914565,1758708479325631073658,1681801265 -0x74678aCaf7e0715Ed0267649CAb0EB1F3a97B0A3,7049650674680897810782,1643929455 -0x698f8D3d3087C70a1aB1Cde97EFE015De5f71FFb,40603924256091079,1685124645 -0xa262C24a656f74d5309dbc1588e9F7B7093F2795,3860986750769649408207,1637358650 -0x11F85EE98dCCcDFf474D6552C9322e364207B97E,44036499471668823,1697379095 -0x99F2828BB7DBE91326EDdcEA0AA6B767ADe5f9B6,14170039027651569772552,1671893315 -0x425D9242D3548634aa10C8a5E5C8E883535d732A,1994033257722965475014,1705639910 -0xbceEAbBB98D01148d76F4Eb5556621B8989c3103,757921077234976290524,1682347355 -0x7Ae54cB4154c0968ef3dFb518Ef23D0EC0b09197,21161176849774413426262,1722039855 -0x73c2309a0BC6f30873577266adCCD7a3d0CE1f5b,21668929522772797743228,1705772720 -0x6AEa08A3Fb6D12886C564B232Cc553115C71b478,2748131626752675,1719819725 -0x46907Be2F347a3d08A7e484c5b6A7fe13089cB20,46360737561507718761669,1689091820 -0xC012AA5b02904fF8D8FBC3ab9e6006130d531AEA,13261790074226419459797,1687638050 -0x78FF478dBEE65744fd2154a97781479a8d9C8F46,652715041926204897636,1715054485 -0x38930796F455EFEEA8E3eA0a66389EAa2E424593,511050000000000000000000,1711710835 -0x08B8bb3e4daD4929B47DC8cc7B5AcB6cbB557651,869857883693385129312,1704024655 -0x7558899d8109D8a2CE457837ADE56C3d6eBFE90d,247535859391937780301656,1685789645 -0x92Ea391A0627eA47c45D31BF9161f2E1e17449cA,66868863003296225650421,1637937475 -0x976ED0D921b22bC2149b38C61846Ef12a546D6B1,1705760751042785362370,1702891760 -0xDe464D9e7c2EcF2A4a4e3E2AbeA876fA3210245B,788566296845612505579,1711538830 -0x760c022D96265CC476CaE0C5E85869D9fd7CcBa6,6699685246840052285982,1684353640 -0xE64d8A7BF9613cc9B78347085B39474B1D1722cb,631945431960369313281,1717703980 -0x86c42F5378a5c27b338Bf2e875800202d59e2DEF,93546555562311460524485,1705313145 -0xE4bF09Dd20f8AB56d8A7541fcF1839a3475e1687,663669286949542786160,1720922385 -0xAC62028251155930e58b0142fb92478C9EbeE6EA,1858491402386645537140,1692617750 -0x198eF67E6f5A1C436C59a6b38ca84C05D9833f01,756804230942138642071,1683809985 -0xDc8257c872b2094335E14EC122fAacAB590bfc2f,759550786857308480585,1715837325 -0xC9941CdA007Bd7Cb9b24803d438126fc1Be4c9F0,13677488792554406075497,1716814385 -0x4d101C8182C4F5AB15266Ec583d281a6F5A213cA,20758584241767868326855,1652157015 -0xAE3A7eb1b9B7Eab312f4Bd9153e68A98B87271cb,5934162649414942927795,1680179405 -0xAE04083de707D6EF666eE4A49b40c16Cd42fE124,7573801174061919854931,1681874760 -0x3348d28CA032B9CaE803A87bB8A4808bc8bB82b1,630652356664603416620,1721159545 -0x1A1c3649CbBD4624a0531f43E04C1c033D3DA75D,373176228351554937020451,1683235800 -0x171692a5ad20143CD050788C731003bA22f27B78,850963476497747491579631,1680537580 -0x40477316855d35035c521441D6354B264c1eDa52,5874270903933578284002,1662997380 -0x35c508Ee4a299e243a610A6726369655504B467e,637527223764548461820,1716996735 -0x84Fea525982Fdb9cad08CBE2E14a4D28efc65dD7,3955676268731664385,1705234855 -0x2F4b53A66795B17980C0959D54149348F3A1cdd2,2397606202339625411497,1681704320 -0x9C3cdd65c26Ae73908306698fE04CA13815927b9,14867327063179408934056,1669207140 -0xD8A33695a83f6D15C5A5257e0EFb5f63E569f693,633387210665744617951,1720314970 -0x42d076C1088E091207691CB9b4C1013753abC197,759087875245845505046,1681814690 -0x5191e3d0cA870679d2E077aFF6A9604e56A2e0Dd,637328564893270813410,1717093615 -0x5d14eAC1cd8Bce260EBFc0c4D9546e8b50F78508,946190530115139343574,1689737145 -0xE34F64aB1281f1FA464739e7FDa532829c170b3E,653935553359096407295,1710101300 -0x7C71a1Ab88d5f6b966d4E61A2e03F57bCCBFe724,41716614322630500676988,1662646100 -0x238731Af7c3B617D8fD1f738f0880d3Aea2109bF,13893214392589535745050,1712856605 -0x05aC7CC030cfF4f493f49664C3CeDbb8c6d11Bdb,199061103253040469293296,1717616345 -0x1AF7250157121DFB6200D4ec18b94b2a9E5ae131,14428717034045849027797,1685122440 -0xb53e02e40f465664e0BF166819EAeaE513E5d4Aa,3180982061048724601409,1717617920 -0xF2ab9cEbc36Ccdc967bDFb9a452a06FbEdFB5DbE,15331666248100404637295,1684049750 -0x6218CF7c549162BF05B94a5910eaeA054f74438f,753478828112939597248,1683976650 -0xf829cD29A250501DE20c32092B94cb84D14e2ae1,74894910906349711207723,1680738750 -0xAF823643aF301a9E208aA8D459dFB67f94EcA18C,251548956619660188312646,1720630950 -0xaEb35889cd151654fB1a52eE3Ad536F8283E670c,121894161276461494165774,1668936710 -0x02569D7d9e3bB2AE79d678C56CB9aF06d8197bfc,25416843961653008739691,1642947730 -0x232306bDAE4b6Ad96b24bE38Ad732244046b3a27,312729763833391487448907,1708523625 -0xEE0aC9f2beb87118Da543430Edb7b08c24c53E69,627500352017560983041,1721813770 -0x2E53331381ba3CF9d68A6375A6EA37a8E0309e70,643707578320649175822,1714725890 -0x296FE570FaD50D7353C0f66923f16E51B5Fe0905,95749574426571689631344,1637320480 -0xa0EBcb9Aa60c4A14302F4509821384006E92788B,250440268593190805315060,1709593700 -0xBc2e61822443b18070E387F045CcFAD33E6958d0,355023557388726528620729,1717778525 -0xEC69717B0520C57A87F95Bcc66c35688b35BD925,2904650692511628,1720881060 -0x3dF8bB5978614aa298b7e254570E57f5277496a4,1303212186928699623988,1721876325 -0xeA98CE9247177489824C15d34a776696c7b3A4c0,711512163525724774384,1711538775 -0xF8B42f9FE2fB2A2Cc0fA5d8f8e9D900B1FA5a1F3,7066530177496053330,1681787230 -0x76293B4F526Df301036dbd905846a969Bd131d7e,9433476627190534129351,1683657300 -0xA383cAD060DB81d1DBd9E6cD168E02c9f9422f22,807534713355752019735,1681830355 -0xC4703593D5D154776133eD457a22f44efC8c99f2,2696797124795163861012,1714200770 -0x0474B223fd8f7F8be1ca4e0907b9D836b33B16ab,757572729786272959128,1681651775 -0x70f645Cf10b8277293F9Ed837dbd6dbD9a7a844F,546421511489290755,1663053420 -0x9e7E612601522c9c097e9a4cC3732b9A61380814,110259581235854345929843,1679355485 -0x3ba331b7026b60E5f92F5A039CdDeD8E52c90CD3,956369529085874148042533,1647873470 -0x8237141D58497F55B0e68b8ea775BDEe972Fd63c,11333958616376566384949,1643626230 -0x17a40AC8b3673B3750cBCcaeD7E893a32B0bF012,99058789976223373389288,1639662855 -0xDd335a236D093a5527894b66eF68c968e6d93fE1,24866390040810789369673,1652860880 -0x251EE05081AeDA1Fd74c58888269c6D53a9A8fca,94835904226034473367305,1646030375 -0x2f793c5Df81eFAa6953DD18EE35C67D37Ee85082,728958927821113824544,1692618135 -0x638bd18461e7b240101D7C9C1EE19CF49E268579,25479306944098856232933,1722136490 -0x07BB55BDcD789d582D8c02828C6b15cb46c119da,3814979262111282299320,1675611020 -0xf872DCEfFc20Ef1198223309Da0BBAB4068082E8,2632019265723748040471,1708345420 -0x9dece60191A7e8cA462Ceb351CBF1bd2Ba88b184,2638354468072404283053,1666264725 -0x1eD3aeAb0a0e6AC1222dcC45BaE23CdD09C14A55,1892167628293460673286,1681945905 -0x1D2CE35AF474619fFcB39DAF728138620429F4d4,448410892548977937,1693597625 -0x6B9eC6E11daa2737febc7Ffd437338c3925a634e,2155494123559854762399,1705823350 -0xD10D68fF13a1977250F91948f3b6Aa3a559057Fb,1075518534551421642348409,1700062690 -0x84AAb229B1789B32aAb5848D53a257699aeD432E,616852255839690108006300,1715006020 -0x92A1B131C65FE6F98b1794A84B107D30591223F3,106838680165106371255051,1671559065 -0x30E835752181f69f3D486d45E181c79a28D172Ae,30202627694683438618553,1663017470 -0xD269d1af98D27B76a55D2bE4e829e7cCF5f9223D,8832735986051319416341,1656990680 -0xA6dF16898925855860c4aAC784EF5e173b292aDA,69769149907564495756941,1638541105 -0x3C602f39456B939368a26f30e5fB99d5bC8E39E8,130629570677433352904882,1664380830 -0x229c0dcB9687a31dD08fcDc3956cb52134B90c9a,784161642743489434558,1692616830 -0xBCe9f1F12f26606B79f462EEfB72152d807f9F84,1264753565507238107775,1718339830 -0x0d69c7d12ff6BeC87AE5E7e3AC29a71F7Fdefa20,1765208081385437528917,1681801490 -0xA0934C9330f85Bbb035D2a8b248Ea529bE77e39d,1198757067156949734098,1667658685 -0x6E7C9Fc8fF89274b999e3D0Ba3E83A6a09A8816D,1892362739700933080288,1689751415 -0x62440301842152aB442D02e36909337D1AA79F5F,1353074304536256875144,1714083840 -0xF275FfC982b0521506fCfc455056C52a7a293eca,111688572180651272503947,1686248995 -0x69f0306303f8B37e1cb5827711792505A0123f8f,1316963545053639492663,1679747625 -0xC8A84762188E695C930b9bF26A2534794ce0eC04,7034596837188807387,1681787495 -0x7cFea49a8845c1B0Cd390a5Eef41f85fA5a96F3d,295675531406691961105308,1712844775 -0xAdd916054C465dad9E185A7BaE7a15Abe72812Dc,18491200662936416648004,1682777915 -0x38a29c4b2B949b5d7af79002F9Cb93980Ac505B1,992773315503299564413,1638994305 -0xd96e5fE51862D65e92146534292F402529229FfA,4919808245326815328125,1641392000 -0xc350a0A827b0254a602c0d8946CB81f0D0df5a8e,117109497519740448544933,1681435265 -0x47Ab81f131fAffe867393c45F4c6435C868DfCC4,62669834883942490321692,1683718250 -0xCd0B214F238dD308C4f6554BA19a65d8c0aaaB8C,65396650230298132015146,1640029930 -0xB31B30B2F4472815eABf5034F956cFEA6DEB3DC9,1662413629080872997643,1709993595 -0xc2717AC84982b78B742E364bD20c5DF170D2762A,1515145459572545918,1681648920 -0xfda6dBFD823e795e982Ab342aa7a5d41B07B5dfb,635357267730286706306,1717995455 -0x50860DEDc6881D849F56291b337437dfA8bDC4D8,717837760927457006729,1715322345 -0xe0bb0bA968004663dc45C8C99B4691be0b50E57D,5369973832996794458770,1703709260 -0x8a3cd04dC61c990d51626233d785590672de3bB5,633588764618166026332,1719595360 -0xcE9ccebAC1D161E1D6333609a3528B6450e36b15,338810120882572506290040,1706185200 -0x9f9d651050E2E3A7b49Dc196c43540c64cb42A46,19947598797087663994523,1684743085 -0x37EF7b36D3E33b2708A8687E94b58D58ed59d2dD,69935885851341496676088,1710210055 -0xd5FbDC8158C8f5422c01254b66775CbC716A3d60,1130984745955225917177,1682395155 -0x1F522f0B05a2D085345904001eC4e8E4160996e2,168000000000000000000000,1712845410 -0x5693C717FAD3e825a76BeA5E80B2F2D36f3ce04A,1858491402386645537140,1692617350 -0xDB59a2A410fcD72CB64724389Fd8Ad20A4132Da1,4805211181043950983319,1671705065 -0xe20d86B1f7c56bEC0B0Af82107DE49665E26c07A,2365318838726225034314,1665365240 -0x8A2AdcC75B695ee4F19deFFc5c87acb86f151f2A,12196603121463168396247,1665450115 -0x33dAd46C248a8A7125b5240Ad4e23667C967321d,111667603208001664573593,1705499520 -0x74c333dD7ED5D1bb48b1192b887078FD66D1c1F3,14064036315537398033477,1648941025 -0xe34edeC138f9db97Dd0c2d735A35f08f1366D2C7,11797960392423383953779,1644524555 -0x7f7AF6cb36aE63EC190b723a8fB87C1C7F0f5aED,946190530115139343574,1689736985 -0xf07e6361128a66D3bA49Ff7d41Be77E073BfFF28,428579508427281438,1694210635 -0x016e6D783C281D83dd4c8517FF21Aa9053989d1F,757912627829891608012,1682347720 -0xd0e03d727FFb115f95bB16A6ae2ecF4E00a3FD47,12841125921271433627216,1676997500 -0xacdfeA912C80d374edc0ca2E77dDDe6B6013E900,758286541594721620548,1681823695 -0xB75fad698dEeDB3332489205e9d6E1f8D8DF6C62,7424383438095542534,1681800790 -0x534d35B949112d9Efc84A62be0D696b230dA0Ce2,743823619860711818078,1703878790 -0x67Ac377cBDd8EA9115D7e7824801D948Ba871dfD,66337413499115362917942,1703427515 -0xb1cDA9a6a2F53eDFFBd9D56447A6a7a9A09DF546,5862099653473524034490,1667087850 -0xaCCF78b8823DC3ed737CDB260367b0F44AD6C991,19088840922565617455287,1717599720 -0x7311Dce924121614642B2C4F03C34a4F7c5fAbD4,640574668694313891148,1717784165 -0x5EBC3E82aD33Cbc1654559bb0827F42Cc9d0fb95,3569221646343063202154,1710367580 -0x8b9E27e26A4A3f3C614cb14E55bd161Ca5082248,142456378145183004590483,1710186310 -0x01C58d8ccA775Dc7bF918E125025FBd351F10BEc,10460727138760051942235,1657391905 -0xd1aaDDe532C93D39bd96629CB268bC159B1b8B80,90202556971389414011379,1664540365 -0xb16398c0698149Ae6EC342614830bC0511b83CAf,154488845176714394879969,1710244970 -0x4Dda16e9F894771b7202009c2dE772e45A0d5714,757563837950387339675,1681649525 -0xf049b709436657Db49Ab357A4079f5890a58715A,17835911710417133956635,1718377937 -0xB1bF52b7ECb0784F07D47934068E1b5bfd3fa86F,3784762120460557374297,1689747660 -0xaE83BCcB4521b2e2a430C9F03Ca0E6F0D51DCA04,7573043945390247997317,1681874445 -0xa39A3674d6aF14063126165bD7B7bE1b64eD159C,3195227181148481095304,1657794760 -0xe3eDad12fc2bD3d0c29c5948080e5a29AF73a6F0,1299212030466147537415,1662698405 -0x68E065f287732fBD2A871aeF1bF21fDA45cE2c54,55265746113771742454548,1648256245 -0x315cD2FD8E2CE272fa777699b2c86A70349Dfd3B,636515624307710556000,1717773220 -0x91eb5C67fCB5af60fc0C976Ff2B06ba9EB20D2CB,23975464899612292030039,1637337370 -0x3D018fd8E2FA37747a45d55F418d59b9A6149205,2399075446977679502131,1646409590 -0x96C942BcE20B47ab52Ab0cBEaa39CF4E7c087800,89315966799654,1715854185 -0x17c8cF0522e07D1251455abaA22F119Af30718d1,11610250612215536332446,1638998900 -0x4b16fE31F92A5EFe71162E1Ef24Aa12F0Dbde43c,917414730503665563328,1718006650 -0x9d21Aabf392C88c63b85A9f385d06074511cb87B,730744492837117694997508,1709117875 -0xAac2eD3721A735c3C0a637A944ADe2Afb33150E5,2485585017062585141469,1667890505 -0x1dD4D13955df7Af6A5F75B9240B95D23774D26f3,109524943966658540443456,1678001450 -0xB40cc9A8fc8096bBF06e6653F12285f639242594,2091890473375831675425,1666299635 -0x99BEBcf85B9ec82287650a5c630EBa7fe37089a5,79954912101207235,1719991839 -0x79a228A7b63CAc27dB9eBa70a51c0ab5D30ce214,631067000000000000000,1720804335 -0xd78AB887A33EaC829B0DDE8714f79276E1255028,351183988480568,1713187245 -0xa3664867Ff06f27FE88961eD58d55011E959Da6E,7066530177496053330,1681787160 -0x3992fa327F702D577FC5551A9f2b3846543aDC8d,15246412560017908815890,1675709765 -0x5947eb1b44A88C57F84355d049d5175Ce52484ac,1354609712823125093413,1661199750 -0x1B0554FFdee832389e70F36E50F13D868Cef277a,2972218961213689777626,1670860725 -0x59d0121804F65BA5DaEa166DA112175ade6E1f5c,894036386566060677963,1673870530 -0x5454D45189E3b5D5b519a5543c40fD7D18b2d641,2630722285882133495373,1708343030 -0xe7aBEfBb7797D20F46ab31b41845Fed8fe46750a,471882878312448,1714119115 -0xF6f727dd4d71825017Be41C37eA6b14965d16f6e,1253595509454525205942,1722181455 -0x2Cd27a121Db4c7cb91b47843e96EE26923C03c84,17503076082958999320386,1682368425 -0x38C9CbEdc1cf5DF8334214c4F1705758246B00fe,42392267734885454,1676078020 -0x4De4960205Bd2AC24b0c89225b20c52b45743f72,7034596837188807387,1681787365 -0x7934e3a40017D93770010146FcDbd311b0413d91,646225718128189210295,1713884945 -0xd755B5EE4DcB2e3F5cf762f21Cd50d5C2751eDB9,639462864488977031234,1717565390 -0xf3fc4a58c3C362241ccb48e23812877Ec2ecdD21,5171304065301472798157296,1685717260 -0x9D2eB2fa842706673FbC518A85F5978753f3ce5b,116646779987068922662178,1722267505 -0x93D490a740b02b227980cd0474BA196c63607380,1513890191760746464231,1689758680 -0xA5D1B502f0619a3077fa1470A8bEBe080199A893,179820221898633464503008,1709820375 -0xD4A19eae8246b8BC3003b4605E028f545cF74AA0,2801816809283958950252,1679491370 -0xDDe075581C6F142923F06116fb2a1d67cddEF729,1003682250481459647131,1704024460 -0xD4d59ba36f8A81Fbc8BE4473A0651c05BdEb54f1,14016793626032076510439,1677155460 -0xE960425e768CC23DFda335c1Af69bB4554774708,812825233111726227333,1671657330 -0xeb5B080fc1F4a2502f09D5e5AcA26E098242e21E,4584099978669669667444,1709455135 -0xb7e16986569FE6a25be81140332CE06C2eDC87e0,2399096832001501295135,1646409120 -0xdA2ED0E729C2fe4fB63427d317Bb8e3E6Efa6A3B,3614370484545981,1717854745 -0x2457D1DEb7c6B92931b944FB9F39dA2FEEe15be4,203350605706722920360032,1681666670 -0x398A82244Dd44A61367366b5e55D084BfD19E93C,82362667014783298617402,1681690530 -0xF93d3EC6A1638C51cB0025B1CF5F00eBF5b62aEE,101225230494040565616713,1677455005 -0x3087d104F4652AAF3472e419b0e6200179F3297A,104742451399372985976544,1706140300 -0xa72B2691AF83175BE8e625FBc6A41dd4439934D2,2831499939922267836552423,1705918300 -0x07cC9cD72aa397D86A2766a127a9c74150237F79,4360367824861066773805112,1715334525 -0x1B35311623A0f26926dCa005820afC4153936F29,7573043945390247997317,1681872790 -0xC94df83b2f4Bc293628ACD100a54FE92A2dA49e2,757554562610339320383,1682692355 -0x4Cf6C0966E437a25efE50F57762de9285bf65c2c,7598152648472987644762,1689197100 -0x5B1C5D0Da8409cD37f89BF1a2DC0Ca81844C4d88,21194690692152437765182,1710813700 -0xcBdb08cB485c46a519568AfEda1F813a77D7B36C,32493092649744678858704,1640908355 -0x4d33c4c9fB6A7E7670dC5cAfA46124178B3B0a8b,2477062395970435361548,1692614985 -0x6ed77b989f62164408B0e351b75B229a300BaBEc,630674724488917304772,1720763025 -0x1d4489902325ed69BAa1E4Ef3fFbF230da3b8A58,780105777454365549327,1682446920 -0xbd2057cC41adD2063f7502ffCf6267C24E4A70Af,765095559781721981552,1681822930 -0x4fB246FAf8FAc198f8e5B524E74ABC6755956696,632449880593654951500,1719387135 -0x9A78b73ed44d3cf05fD43D4FB3AC5418Bb366d00,2685170501893094,1719565495 -0x5d065Af229b5f22DdF5ff66df4FBab5B0E987488,129541273447243,1714387385 -0x2c65165a2291209aef72af6fC71F4531213555EC,214025501371119380423794,1692552230 -0x572e322f43a30e5e52E404B3c4728Fa5B95fdB2C,757341875204681508476,1681874670 -0x5025f20d3fDf11bEcf42A642E8865ef91eD900Ed,874731803783934851967,1671657795 -0x8B1157a81f0a7A722D30f5Ed871397Eba9fc4028,629883005615497637079,1720707350 -0x845801c723Da321F9afD31ea403f61867868FB87,49879181035899563392752,1721621715 -0xbdDf7E9D6Ba3f795e627112Be54FB75EFa904Af9,141483634505426917,1667748985 -0xbDff565F9Aa6Dd0cd3f2007faF30a45ee040bDcc,2001999545817232455789,1638785690 -0xF974753B3C6ea005568d8461c5062B2E8FBFF158,638139260720656812969,1715582995 -0x235482E5990068E98e9fc817809FEb704046E51e,234693324756694065,1664977135 -0xcCBc5bcc691312593eF10EBE76B92AD68c257311,824891564160531405198,1682686505 -0x5721cd09FD6983CfB864C9D5CdCF912266af8BF3,55877923083889604097856,1708710945 -0x46921D39Ae8F35AD58d11617d5DCa03132409d15,491218068470568237,1696911450 -0x9F770d711c096A7557d41C41650250a55Ba7aC81,1765184056688128689907,1681804885 -0xc58C42644E9b889D68F507EcFE0D802790Bc6217,9516764392578493281043,1666112590 -0x74B3f564952e84a11AfEd88705987b26A05f7Cb2,754189103895759156653,1682358655 -0xAd3a2E4632eFCCd15c69077e6d3eb6a75Ad669F7,7573043945390247997317,1681873750 -0x432f040cCEe378210A5c27942c9904332864E5a5,4593225127663803708339,1709832420 -0x1Ddd1bc72691AD1e380C82BE6D0bb886a40055Ef,13939760762516856657464,1680776495 -0xE8CFA595556FEEB20df8a707781DaB75796B9640,815924359594657694113,1671876805 -0xfA86c0394323E2e58c133450981e67A00A96e216,6536446075297745891100,1711971280 -0x860FbDbD4785D13edcC454fABD980C790ca0fE8b,1485201236007266488048,1670610255 -0x4D1a5D5DbD8e50A4b4E65759826AD6EBfD5cdb52,41337922387123002904775,1720611955 -0xde7770C423dcA233a9FF4C3E39beA2eF00834FBe,611418583034376685,1687464700 -0x870B427FE4B04cb9322C4db05A352f2DCb57039A,1119696824643320275834,1667346990 -0xAc4CEcE7e4779bB28728E5f9aAAA6AC1F72C1b87,1274738188848126667651,1708198435 -0xb545aCb5F156d625e29D69Ed9ec91145513d56C8,247009079263554305712725,1646286035 -0x53a75F3d2c1EA14b4bE041d3271D677499D15e3a,3929585003881913073904022,1683106550 -0x62bce40a74B7ACD3901fee65e866483BC21E25A9,401937305485213891750386,1712846685 -0x51b5D6ff27e0FCB0909e15752c04A6a9F19d559E,632949574879184257602,1719864620 -0xdfA0D5157d20400AeBB0aBf66B7D030FB9D1e823,121823239889942293971184,1667837140 -0x6502F40108bF2E5f2B361B3c7c962972E50da0A1,849059481276521703073,1682349350 -0x125854A4Ce5875ca46d1504ECf08897976022563,4738736931594571981677989,1715681230 -0x0F062Ac6BafdD5F809b7994db9B4D48786Dea0B7,3342604979910140565757,1673635410 -0x267464F4355b4aDbBa259aEBc0E16d70fb2E2E58,10126376584527664588796,1687197580 -0x79aAfEC251D7A4c90c724a922f9Ac98864A0854F,391181963119108503,1683013060 -0x79987a8436F75cb4Eac96E39DB6fEA0eE5f81521,2399075446977679502131,1646409385 -0x19887c33FE5A3307Ba3F52027A4d5b3Ee5303dAd,999313856782946388788,1645195975 -0x23Ee3263Ee8AD2AE8aeF4Bc422A25ecbD7950CF0,7081283276088779434762,1670559470 -0x495f8614EcDe3B26291b72b406435498AAF08a76,24458776541421447559748,1675652765 -0xD1Bda2b3E5c982c9242eCCdFC5D61062Bb29964A,134191262350488616842995,1669446880 -0x7322B9b0C681Cbc4875DCdC81f404122dA705f95,1671049991084060584588,1642349430 -0xfDcDD5A11C9fd96217BE93100a1eAe7E1736E426,2139352987377037258106727,1638251240 -0x89aA2B4ef3789E7DF4823386b5c12FbD311C0f95,82617974469131380710417,1703886995 -0xBDAe7683b7CDEACeDf141666D58352D7d55c6871,1351074211817090635348,1665008655 -0x19Bd7329add311852a53C0f933dd2f01afcc440E,1858504529090960931265,1692615155 -0xfbFb61C3a02cd0f56e1294d25A8C136940Fe892e,55981622698651696551063,1711324570 -0x920D51D7Fa9ea642498CFC32146D507f5f50a6F2,85780767864361716079731,1710014265 -0x3BFfa2B60E09520808B2831c8f61795C88104ed0,1555456619957975341,1713344395 -0xe356f59eAF5c23c71B52069A14B5de49E4AF3AF3,2062986198344624650112,1700849400 -0x39100aec3Dafb740761C87996853d572bf95a433,1965226569388028237708819,1718374685 -0xD989c51fF51c014cA137c9E13635CEdF623360A8,631209547703012543711,1720647520 -0xF552990A230892f6624e92157501A53D1f59F164,109242021943915366993652,1685701000 -0xEc078855AEd558288177b097D5e6B5EA0AB1CE58,761360593435204323924,1681651325 -0x372641e05EC5ee66B6898c2Fb88ef0aA24db6bA5,12190008987466333242985,1661175755 -0x23F77E6c0e548A494e70Fcff8C51049b401cE545,616872727396433016367847,1714997730 -0x3d2E3cC23be8E29968096236Ad0eD60F1457ECFa,4376460363705144727594422,1676554850 -0xc8D604cC0817a6F4A6A259E792A60f7aB7959aBe,231669915625669700,1695644150 -0x6fF4D598A33eC1EE3ACF0ad2DF75DCDd9f1aEFb8,52775154635546778171088,1655561855 -0x9Fce4eCd2fA7af7569E276dafBD27B686380F067,795154495651221985394,1681706770 -0x90D4Ed57898FCe223cf830c28350A1BE520121dE,771746427045902829320,1676794910 -0x2140AFee34FCADefE1F37a9097A99736198CcC3e,704325902130908783023583,1674949510 -0x29F82d09C2AfD12f3c10ee49CD713331f4A7228E,284419154261066903,1675135595 -0x15f27f22e5d36fec1FF35c4b79AaE15c5fe9f493,3246905056943893724328,1676919805 -0x29eBe47ACCB5b53fF4cD5E1f0652c6a8224B805B,856549057681465285152,1674233525 -0x928Cb566eEc33847FB6aa68E85831202A497E138,1765186411047513892002,1681804645 -0x53667d90D9B4fC95625eE916190Cd9c2172b7A92,2590838016806045891832,1715153695 -0xDF7eb70127C9065f4a9b86af66E87aF292623381,8531536468622275807639,1721953470 -0x12a95F9f9A3Ae419786cE9d04Df44150fF95C4Fe,129326342967557858959935,1713079085 -0x9dA0ef941F3F670b0D4BD3b96F4A342A11eCe6B8,6245630843980013717899,1696333145 -0xd002b45Fb12a40048e2C26c5dA852b0a9BEDc591,1902295793430029853367,1662632825 -0x4E22d349148Ff016612f112B43B6128DD57c0588,1894120617985005694248,1719935345 -0xA37649B6c61c7E014D874949902d9C69B01c4d32,7775340444103925327599,1669667645 -0xbA40264E9a85b2b619C728Af7b9f04483b1808C9,50524000000000000000000,1637153270 -0xEf158130D698aD48733356893a53690E0e264a55,3450602661857250673931,1705675065 -0x65477d5f31ab88AE87508C4Ec53fDD33C7C2c393,3811060468011087625770,1653486750 -0x24e13d219Ed74fff2c696A7A7404B873CF6EaAaa,13874428966739178578335,1652875040 -0x4B84Cd109F57701B6ba27bDfcF45dD89a127381f,7049588719130525452,1681787335 -0xca273304FAe4FCE80C008829Cbf92dd14F5228D9,6966710501703637532797,1718950130 -0x0edB12268c0f0e9EeBcb6Ff436C8324cA948cFf3,359189604119291735246166,1720614380 -0x1ec1dd0d2c7B2c7ED9427b1aa2228ADFCB18A91b,129134061356490553469714,1718033420 -0xd766Eb5338959C5D19D618c46B7081C4B7642171,632386208153993715473,1719849650 -0x7241B0fAC5cA811351c1C8bB12173e902121d5F4,7573801174061919854931,1681875705 -0xEDC8E0D7FEFf76113FA4936e43351D35FDF5CB26,7573895922511832796489,1681875240 -0x03332b9eCf0bCaDbE3ee9DAC32B27451f48134f8,756781251523423307521,1681820400 -0x6660b6447002b3b62a520253A3667a444fa56c62,516062736119438610129169,1662628825 -0x9B3b65fa35448616Cb883b693Fe70960AAF2841e,794579279140398571240,1681843900 -0xdE759fB6e372aF247eB582Ca1511d29DBFb3CE92,633382973599043339802,1719402000 -0x4D912d29fc298a0384f70A3bC5c6071313Dbb162,555933974799697061,1693777165 -0x550BcB88FF776824748c449aB15169e00E79C550,1575602042165718061118,1705254395 -0xA7A1A5Fd2F71225809834e8E8b629440D1eb2ed5,769808608495071189179,1694817225 -0x627196a231A3df8c129f4Fc5a982ac0999245dD4,757546529378951080750,1681823955 -0xA22A889c011d5266b4e0e3263e92f073Cd2dD7D3,67988942768535237878954,1687896855 -0x13fE14597908295Ef921041c1078D314377673bD,1254791127435163562979,1720889175 -0xAb50C42043b3dFA85291Ec3dEAdEbc89B02fdCCC,33501841305038811030575,1638096310 -0x3b41fE688d8c873845dfd000169B4c909492Db22,631519400670035318528,1719939350 -0x23c5501BE83BA0B79CC1f77c7c8864FB0D5B00E0,2132417570958943854388,1710494200 -0x9C142587127b3bc0945f1E83Ae455bAD2Dc1929b,3784762120460557374297,1689749695 -0x9537c7f6E118be461520Ee4c33Cd79bF2AA7ac00,60266137254989352156609,1662151840 -0xEeBbde8F4A397bc90bD52F7726C505c35A7793bd,22509108679991187969576,1644321520 -0x30b0b0f047F0FD0A769165b1F37E880910722a8e,54921779869142118975408,1650071340 -0xCF4FdE7Af51236631eab85C9DE60b7e1C0d3162E,714798756557987840862,1692618285 -0xc999ecf2833530398E7eFfb7d62b605C3E33e89b,2335984276751546802595394,1680050290 -0xaeE13A8db3e216A364255EFEbA171ce329100876,14698714024869969621614,1712664020 -0xF168D9dE35f945D7936155aeea6B060A9f51CC26,817665658103032615795,1704024910 -0x17d52BE8a68569eD42e353ed5daAAd5E1fd825B4,906435018468036858839,1681857265 -0x1254707d4a7bD253cb6Dd0F7054e8A2EFA681196,757333230494337793795,1681854065 -0xD1053883a937112D91928EF704985b2841fd4B2e,739198561357236617419,1685735370 -0xFcBE597e80a3959b8E6c7D595db59900DaB0fb31,68369746026648221312244,1711179605 -0x4CEB4B359bB295F9E1Deb5D5f52C3CBA4c504467,1738508746987010914869,1678467000 -0x0EE2289f611A43205796E10Ee00b5415dF2FCbdc,836098002836480315173,1666032315 -0xA8f499147BdbDD548155D3cD556B9178f5b71Bf9,140542390188925357980913,1673246585 -0x15950CF2Ed0B4bCDfc8b5bCD217123dCBAe76762,2054260501381749972884,1705898420 -0x103292Fa4e3195d77006d5d397274E30791E8D43,781562276820968205785,1711538755 -0x04b3574b13C229Dd9aC8b52e02F2808638c1f741,642994095306345738975,1717680870 -0x942d2546ca71Ab98efdD6D73C6d4688102f5d5a7,946200628439771250676,1689729725 -0xd77Af4d30AB7F1EA229124321D69b364ED6D6eb2,3288892910198821864176,1664983545 -0xe938984adbAd9B6fEcbB66cd2Cf5B5665e4e77F1,2635960036866195520743,1708345705 -0x0f36B2709aC8056A4E33738b52C78e92F4d728a9,6814863403423322095131,1710381200 -0xF3B7637e0AC7C31fef5Dec70C61b072ABd3E7469,631438343817140560580,1722269050 -0x0e95c0F39998B3fF33b332Ba0430D7FCf6c548f4,802945492448287571254,1704024850 -0xF7e34d6Dea66a68b6a971200Da57C2Df6E69852F,3710847054267842251232,1681825835 -0xA62b64D9A76b42CC492Acfa7952f22Ed86aCb866,2980939413372120,1719150445 -0x8CC5FcAD633e6A8200B1ff22463DAB983E9f2e7C,10014266178597604252200,1710986495 -0x90B7c367018B07e648e75E3555B6f15f72D6784c,1364182470511442839318,1663078490 -0xD68Cd84a9Acb977702194d71cbf314fd31A5CcD9,1977417194622646494316,1666299680 -0xe450Ca59E9adC0A7D86a39C9A8B8818b9450C522,758167867519716674337,1681996315 -0x7f63224d57f8feE1fF273AdBB31Ae78d495f7e0B,1255577667042418356723,1722004045 -0x2B8d904E3b377cC82bCd1EF8BF42d8ce8Eb670B3,171373493989849710601674,1653696240 -0xf9CED87c15953875416390EE2E3FFfEc27FA9153,948363634996951884002,1717954025 -0x890817fB83B6f78508799398602cB32957426818,7077321131344101032997,1708430780 -0xEF78b79cE1b3b2Eba4e065c0F388491ae1470195,2962608975885380163,1653033750 -0x43F3b2dDF95Ffa3C793E93F081F6A43f161a392a,1594912718289154129372965,1717004515 -0x7cA0f507d05b3682cD39c4fa5C6FD973e73449c2,7034596837188807387,1681787570 -0xF74E4c1f4cDe4097861EEc4fC37B199bfA9c2ccc,757385028926290582718,1681687125 -0x60Cd77654Edb129fa87696750F25ac8dD8Ed80A3,1254923968437438276735,1714781520 -0xFaFDc894c02e7CD6820087910dFA215AFEA1938C,763431026181796259018,1717236785 -0x3BD358b35b6Ff3cADf01Ac118b3d21Ee62E56C0C,631708514680880359886,1720086130 -0x4dF7E56ea65784C56d601D201ee2915b9dB66c7E,89717301257086689,1658841325 -0x52815bE83315203e4586810E2700EE8b50337cB4,549575052460522000,1681801015 -0x11aeFcdBCA35b93d7C72521993778a02D969169c,7034596837188807387,1681787525 -0x2dC8fadA12dfe970c5dA429861D867CF76c6a97d,7576830088748607285387,1681872080 -0x0190f2AC2a54c48b7e5A6aaAA4C694507DCC620A,5936220526985070021472,1652901625 -0xf377489688D5e4516c5dEF1F4EC3FB34b816246C,19407237281716141,1720140480 -0x59ADE9d2bB7529fc4270B30a1de5815712ef737A,2639427975433040945336,1674162720 -0xD22B370F3Fe8b80661fb3673f0b3AC87D6c7F082,12891871759405794867481,1709163610 -0x6D84C38663d92e1EFBBb5c403A22665187B0325F,2005871675576935230156,1705655460 -0x8Ad14E827078b47FE6883505bEd50F8c3aCb8De1,1279381148918780366957,1658519725 -0xd6706906f6840D94b1D78AE4310baAf268a16AaC,125480905605412910211275,1675617925 -0xC8fdDEDe4505e4CFCA98f650cfe726350160dD70,1415718347991382155107,1638935355 -0x92D6bAd675f299f2C4b7eECe45607B22247565e3,9227212768533158698491,1685864140 -0x6489193Ff9cC24222e36d98fEac5B0f8134Ad6c3,7573043945390247997317,1681874200 -0xC6E4bBE85d05355e313F9E4855f574b6bd8Bd572,1756812233845131574229926,1663085220 -0x45e2F8dAbb25586b6682FB544714ccA9F825AcE4,802945615618422222237,1704024835 -0xEaA70cf46B0ab7d1b9E5670d250Dae21c7752c75,2679318400573426589717719,1687792975 -0x9F6AC1720506F042154530058B5800182A402FfE,38686013583579647334079,1680004205 -0x57A3e871C86Ca5bC1c98B4839BC7122d9f70542E,6328196735833713690239,1677144330 -0x144D5dc1c119EC3D63ba846617E7BFefb00E268d,746657379356802658981,1692614760 -0xCA4E560df8AA957eCb52A3271dc1f330C95C8c79,9943319143167618539083,1638376765 -0xC201b305229bCA6B6Ac854F6A72C879bC6368b73,733013785983644,1719386315 -0x65CD53037E6d751a4Dd3934FE63189faC2e38d5d,8800998033385609102610,1676579145 -0x602E45E14E56E14bC38A8dC9A80A961b1CeD81C7,1787992720280808,1714900575 -0x14e9642071b18768883d083690b0C5435c46F70A,4345925135118062458983,1687464170 -0x2AaC9fb9bF3Ae46274DF81663d01DFeCe7624fE3,1298438346566061222702,1713374090 -0x6F413B49673d2f918cdE926256AB1b7191a87287,1654225487191486055601,1667406925 -0xedDdFdD745d13bDA8cD0c54E6240C1bd57F0E1BE,420249669167150788,1695728095 -0xFBB32686677B7D2d88A640C441e336ea46F28c98,11684048908999804640152,1644699745 -0xF5c2Bc6D6AFf9294d96e4726A8C0336cc821E0ef,946190530115139343574,1689734560 -0x99f5261406718DF9bb28681d43CAb4c8427725Fc,7516349961291297184200,1668952490 -0x4b664196eB911852bACb03E031c3611987D6336d,9922780816724869037308,1645541785 -0x5Da32402071611f1dCeD09164EDD46b1135956C2,14548720794374181524345,1648592540 -0x85A0C13150B80d15C41A5348b6f27145E462da45,891938207401027256102,1704024895 -0x49dc32bf3684c6733510CeA3508956eDD530e58F,13009043250328059768233,1712743890 -0xA18c826216F32409E9fF1F6E7A7b8cF30E1DbD9E,25163924506662187518418,1668943050 -0xC8B3AAd09673e2596880d28e29762B3158346975,90312332022808252151845,1717925030 -0x55E081382BD101ba305f0F7B31Dcf6d93c36efFD,2699922655448371,1717603465 -0xdcfa7b5c2A2f07474d9972ca1c66960A952F168D,7681955874983117336832,1679560485 -0x6d1B91a1756d192A6B78AA733f85C285dd11C347,5526452154205680377552,1637838610 -0xB75A529a11c69aD5Eb403AB8865FD4102aA1508b,640344036810602833257,1716606270 -0x575bBB3EbbCAFfd7991489e22D8FB83Cc16A986f,630720054851300623762,1720717538 -0x0581a0928CA8B69eb1d72547CDbdB05ff4615997,759181301263485571,1720558950 -0xeBF3EfCfc6EE37e5582FFd1391B8824388209D58,279084899696391630400685,1643305120 -0x76126553774c144Be2E51B6Ad7164A3D3DBd97b4,3068976673659088955519,1711156355 -0xc9dfd7731f22D7d8bb1804c0dC8A5D23766018F0,1889262917215056690377,1658959940 -0xa2d606CC30CAfDD22d106E9d6dbb67bfd7478D98,76681732842904006672017,1684718075 -0x26c3E1544dd5Fe9F1c343B6A8ca314e2f6d33142,631555531124320388191,1719872750 -0xBEC4A165d5AfE449F5697725E64d1c28494760f4,794551175930073943510,1681676345 -0x8cb6d746D8c020AE3Af50d0eC6a9b1533a4465de,757393000633255510755,1682378795 -0xcCcF106b5870D29dDD7ac77d5253e82B9D2C56E2,822617184637007522053,1685732170 -0x97a9BD3868Fd892a9C0b2e37590c423AA6661258,468968297910620762,1697257185 -0x4cEfEBAE3BeB4385e85F03d9D923284dCf4e684D,409774222687838626,1642699855 -0xD0b07162ceB888e471acc2caa7B0cfa035Ce9351,25052441126829214638588,1637281745 -0xA7548576FdfC57219811Ab0b61281DC7aE11232E,757546529378951080750,1681825420 -0xE5dc8FD596a813b1D7E821E78cE55220957581C9,1255588632304766394581,1718380860 -0xDF1081E41e9b476F36127a616577cC382B4aCBF3,710041563554192321396434,1657616065 -0x59C66c7E3D3F239961c87A4627F86a5a9049407C,181803907490831614618509,1692613580 -0x77E0864608b87be82165C20EDE55Fb238f5981F8,6672356533703082244893,1682624620 -0x36b3A569b76afae4a47297F8cBab67A71662eB44,736033480983553703717,1704024790 -0x8bE615b6c482b44eeae33Ba109654CAD615480C3,756686612613301322060,1682013625 -0xd336AEAb5AB8ED31209d838eb2e69DFBF298E9A1,3800771052564815316666,1670602245 -0x2b1E1d245504D45504EC19D04eeA789B691181D3,3159657792834043862557,1721474405 -0x81370280D7480bbF333469dcAA02cd4cD15A4b61,1254930863470618204606,1721834465 -0x29079ab1C565BECa46cbb453f2C6318dA8130a46,758304075908330031831,1682373710 -0x3Da412A68468D615D3D4D46D44a043A5F4f5dCf2,6878299418827234941925,1713262770 -0x7204389c35698BFfBdb132071FEaAa0F8D6BF88D,126181317848406337492172,1645473715 -0x591D334D419A859875a9Eb96cDea73D28aa3981d,7983307663321392981841,1709979405 -0x73A8f08c36074c2c6C5f327C7BC32795c2cCF1f8,50546870387447308505800,1702332390 -0x9df90bd919593E4ea4edf4a694Ac8cE87E3bCBC1,5095029875539520905380,1721755330 -0x1bEbF0E2C487bf6dB1703145F0bBa42F528d48CD,3264041688551837782252481,1706287445 -0xD97C1221576dad479B9262343101e04dddbB282e,1155498778003161071401,1653146900 -0xAE33652d9E9DDC4DeAbd3a7651d2f52b1E54B7f8,754662955810325385636,1683807010 -0xC9de7fEccFd93E89B52e4Ea019b56ea1A3e56f5e,787545435520548259471,1681845920 -0xF3d00acc66DDfaabA442c771978a7157E1f38b08,758694983343147360146,1682936605 -0xf4877511a5E2Eb83780Bf631b5240DFA9De0C919,1765186498247742969406,1681804625 -0x8E1ad21D71898Bb33ca9fb60490395Ea6256489c,644132846678636713139,1714360780 -0xdA2ba9f10C336e76CD31b8A9005F05C7D560066a,11571502699553612199578,1664417860 -0xA30aDd100988139cB548Cf57ff88F081df74A421,600000000000000000000000,1712844670 -0x63fFB98aE045252AE39714296eF1110CF458C365,8690259346710206303444,1660002915 -0xD95B077595d9cFCe603fA37928f8806443EAC047,12068129798957894494172,1652870700 -0x7b2D86A8500852Ab2FEE93Ae5b2f8A7B68A02f31,4464315821899230671908875,1654851685 -0x7aAfbE9c4A145AE58f6227d39A18D59c21EF415C,765148457084135688719,1681647205 -0x39F887ea0Ac844d618a67f45137D907ef2D5E7CB,152181648135764493316517,1637408215 -0x818c1CeAd721fE1cc9d52A6B9b187C06178C59E0,1255438368298677754190,1719965270 -0x8dF3b37ab001f3fc84A49992F1efB8EF9b74f93b,3784762120460557374297,1689748445 -0x90526e89f3B28A37C7973906A7862C0FfD80316A,40939386603510868081427,1676660460 -0xeDB53A262c210079Cb562fcc1bf26C8ff4fC70F2,5031193773485124621419150,1682903495 -0xf23cE940B15a71D95D32BAf7612083CE76AFEE86,21330072914756756551679,1710430520 -0xdAd625e13FB66BBF3de0401765C05e7b9A9E1403,6790521099656609218350,1718086370 -0xb968e4c503e35f2d96C2253117fAD6A692D5ea79,7245432319055812392174,1688291410 -0x251a8284FC39da10BdFb5401988b1B5b62337455,2630710098161481857926,1708344335 -0x5A5a5A01132eb55468928Fab6Ad81bA308E5169a,178274084846912355123439,1708420250 -0x96C0B66F5ABd74DFcD668d54bD688A257f143399,51603574467019,1713512915 -0x13696009a3000EF1903FDA6d6CC4d14bedf70F28,1513890191760746464231,1689756820 -0x8529FAF1E4fEC338DECfE508a651890CE3Df9811,946190530115139343574,1689735975 -0xb958cc2A584c95915Ee6d3e48c69C380102371d4,2095136175823799819176,1679236150 -0xF550922F72cFcDe8bcf9a099Eb3Ce523B40DB99D,128708195774622601530498,1665695770 -0xc1ba28414B8f89A3a34c5Cdd7338c95fb176Bf62,186070225616307701376736,1709707935 -0x35535De91a8E06F65CAaf1662835Fe705E250FcD,1880669346170914781186,1716792840 -0x53F69A0134b354450AAcbE1432ee8B618a29e67a,49153203171233487699546,1664517685 -0x256e82478ff37Af32dCc752B3F08ea823a7d762e,7927005329439645170496,1712791500 -0xaE7404Cfdd4a9465A2fF38e6a2be080a04135189,25695665745100549454202,1637579520 -0x20B3adA1d6916348625C5536Bbe7f66C2e98e676,271765052377861531002126,1703463100 -0x64613AB16B7f4e86C92D332905071e7B78c19094,783273755532268841738,1711538695 -0xbfd3cB871fedeA6b107eA4CBB81a0C21fcD8B410,7573043945390247997317,1681871935 -0xE225A6963B657D38c0c485d9D382cD4885A6011c,5920628838116485794699,1643737485 -0xde91514Af39647f9a411cB3164DEE0251a66b5Ed,4088640908799155078100,1667693320 -0xE6b7De299a3c76d8ee42Fd1B769b42Eec25baB08,710558022846988621206,1692617175 -0xb2FF94D5fd0DefeCC621f41f8a5Aeb33496bFe99,639979856561423949229,1717243595 -0x28445056E8f2e603334034a760c984ec6B7E4520,632395861945757479634,1720281610 -0x83e0240Bb4214d4678b33C89B930245Ca83284cC,1765186062249087166620,1681804710 -0xC9Cc2f2213F518deBD7a2fAaD3dA0060c8025d98,64267222207741086250934,1683717330 -0xa1c58328D018B0cF58b1f226c6FdDDf88FCf44c3,6144046121734047767991,1637838730 -0xdC606882cB15568Cb85B3316cF60b0e6A25113C6,1382643179461554081383,1682413480 -0x4f4266a797fc097D0C55129ae221a64E2BdBEaE6,55761219908009510880630,1662711615 -0x0f14588c202d216EE5731de905390516F5714E95,1517416275246125109583,1685753245 -0xAf106234f2DFED3c1265c02c1702a9fEF8A80Cc5,75902631205110285812870,1684389855 -0x54EC8E5D9961Ca11F01762E8ce350A68Ff9ED4E1,3906970200491257889586,1653583915 -0xa61d5CDA7241DC5A57238F526B5ec97530706B6D,52265319316339019820947,1679331870 -0x624C75e599e26784f58FA28Ce8685B7e71c42282,1358329408968461751030022,1717778490 -0xe4A52c0497198AB804075f769cBe016b516BAbb6,2715338228581672471887,1712172175 -0x187Ae8Fda9306DfA60fEeA4642B01e05A1F7F881,632636143808049098281,1720540835 -0x649E0A25f2588b89FE26Ba30E7327CB4b671cf26,135349147783569278855311,1679261000 -0x7Aca0F351b8eE66B87bAd01aD26624FF51C1A026,217559514944454444616877,1664438425 -0x15E8E75e5ea1dFBd1c3E8F15dD5AFD94c5201e9f,6046219062648331,1720288405 -0xeE1e63EE10a016E00091373B029b4d7135B1B969,763781515722017025203,1717238255 -0x5A7c69D51Bd6D574209437D20fa1CB7aDAa9cc32,36840003146020515037563,1651323295 -0x1677DAE8e1E193B1DA56Ffdd473C8F08405FBB3a,202838701634707720,1677240355 -0x1bC5e2b1Ca32DdE987294c16545471c7D02Dbdd7,16980409234749880691760,1722284800 -0x7C67D0c731325c9bB860ACcaf946634980f787f2,639872883554870603978,1720748310 -0x96e70215d17611491F32B1D3c9035E0Dba90E11F,114020573468265808282868,1660333180 -0x401A66D250Bb931E6538FaEF2717eD419aCB4Eb3,8399326470492007540787,1722172170 -0x84e2100C72f01C61709Eb2A6fe5bd486f05adBe1,932381380769047066288,1671763595 -0x3b157Fa2e4ff9a0323dFAC1F92b404b139A5879a,991809307682960349439,1718931705 -0x072CDA92046756c17D3F9b5273bC2A12D956628e,1567123929287240664666,1676197085 -0xad2849Ba3C1F2f26ad09C97f5511F5D20a44FC32,9655410384799540254396,1644770295 -0x0c3C6b2C4d1113bfc556e86A8Df7E2B84da10379,3784762120460557374297,1689749195 -0xc5865c3ac0D6e85b524112f1348f97D7B88EF656,9822239077977016126967,1643702700 -0x4E97283BAC00e1Be24474E0671a1457e55991d11,9848428744300245536495,1669465310 -0xFb6530D53Fee45CAd0E251353d1A35841DFc72E6,263926260289226856802296,1647317940 -0x554c848A774fAA68d327691EA7525bBD799FA9Fd,571648261335570,1721896295 -0xefA6e7474F28B50f52d38B3FE08D01b1736A33c4,757461536444504338531,1681934410 -0xeeaB2BFc4287D3B697f94875C063C2B126709351,631840880373687893593,1719861520 -0x0Efca35F212b1e670aAdc042f56a06e2716c7628,6393958628988626343325,1672639825 -0x530B034693189f71B34ffC25d20ce90C41F078f8,48454150048369215371985,1675872985 -0x8b7C3EF20380b42A7280008282292c410E6d4b06,15391147543912823435696,1712828815 -0x0Fadf85422981093A72f235b7FDbD8e244CEc361,7077321131344101032997,1708430860 -0x9120C98e00739f6F3aD7F49a4E8c7bb449740a79,2535470335902356359984241,1685728505 -0x7e6347eb2F421Ddb693068C8d7c29287fCd79235,1782277875423786333023,1681663965 -0x7c3359ecE9C94aa977E50DC9966c86B95A18aA1f,636907054853276527787,1717287775 -0x127BEcE55CEA1efcfa53B699427eD9a30A5527bF,643176016130282046358,1717816845 -0x11E7C1024Deb4Feb5cA7d0b245a67dE293a136FD,135519993145788728757823,1677558880 -0x7D2aA928a7947F3E5c5e4B846cD6B12CF9905844,85711004155784222944841,1656555885 -0x29F281D15d968603676acB22eC71e9176f308fe0,757546529378951080750,1681825110 -0x5eDD64513985CFF484E5577B9d2b33F4Be646785,648046210493561734965,1714553355 -0xF16a47Bbb97Aa232a4D66351B12A35CA3e332589,4077307846114165,1713341265 -0xa273fc72F0A63814a1410cAD7AC97B9274Cc70Ba,677214182079246804191,1721416555 -0x4b874a751e71d06607e2d72b497444afc1D4be2c,646008721022022911796,1718805260 -0xeE10290DAC78131879a718C329Ab8c276Ee0A40e,816564922918913120059,1669058895 -0x99ff9807Eb5717516983e9ab3D9fE8128C912832,2200866609512831333237,1704800105 -0xd644137Fafe379ee8a51C801339ADe28C3440730,1238522450181504070828,1692617435 -0x1c7b100cC8A2966d35Ac6cC0CcAf4D5cba463b94,893279814914006419,1685121355 -0x5b1419E3B2ab4F55178c14b7D1d5326d9FCb5dec,1005262418947181246700,1708750340 -0xC2Ae5EF365701745D7d61711386949B11aeede41,2632676577681031600183,1708345470 -0x27233e2924A495F43916A82Ec0FFE390150d2c3F,15309550442860283576166,1643472845 -0xaDFb0b20C6eD256be09B7918EC6B234081053E94,646162430548739527784,1714958700 -0x7F2fe16141C637FC14a6A2b68F9e9511c51b2B12,479950092779276373897174,1646023255 -0x0923eb4386D6725442110C3d1B2521E6C07541Cd,813236455403375412440843,1711707500 -0x85D0dc96dA0521eE6154bB489A75E6EE3d82a856,13292805548114344413504,1637301085 -0x874569552C4489Bdbf40A4869eFCa53b14a6D557,1422108299127798991715,1682141950 -0x4F18bdceDcA901905725FCa7446A8de0707CE220,1912928183247011683772,1717416895 -0x43E2DEE90B38fa73DD163e1cA1c0FdE7Dcb1f118,8468165389792106644612,1678439500 -0x49ccBbB783b2019BEbDDC40DB1d5a284583C6e27,158133522443339568286583,1668532860 -0x30ebe445D3afa98D896A22969E52855E35103ba4,2399075446977679502131,1646409425 -0x295C2707319ad4BecA6b5bb4086617fD6F240CfE,728953187380918293157,1692618775 -0x48B7D6F01AEd5fBfB19BD20a723F81e358C0938F,632309751532747152540,1720725590 -0xF6B63B01a058013BCB98809A793e7A46a3b8E8C6,8172200631936828436135,1718086750 -0x972Cbff8Fb20CBf97FC03183bA6F48ed66a79ac2,271796536736040070,1686419815 -0xaf450B5d6E050E532889de3fb95569da08CbB062,72385342878994137345360,1686999050 -0xCB6e88C69fD8406AA31C5955F1D16132Fa8C13D6,95737278402946586172939,1706812440 -0xd05F74DA1572Bf6bE8eBED552907B137579196Cd,757272508146600244717,1681824825 -0x73901b20833D5374D4fcFe591a74F8ff4b6cA922,757196736734166515133,1681821200 -0x76A9492dF1d1A0BC2b462B07C90CCcEC84222913,101244291232126099771231,1653113650 -0x4708348B44A39B26f5C50e6fe6587F415f0D266b,1070920642472803545485,1658613920 -0x9F763799373159095e45A7bADc302C93DFC6A38B,1154217041675166317534921,1712847960 -0x13c6B9ac508f3D6E7b840bA3Bf60D11b4acc1aC5,9041306009137034462332,1705506860 -0x6A77418529627846C70bDb7D8E63a4bE4AB22F91,802945677205789556963,1704024715 -0xFC9Da28545dDCAdcdCDB2aE16c4705de68CB6570,757494596362033645999,1682623620 -0x8E2e41Ade6dAd598D6991860A6561D4122C59b13,43220229051916658569124,1643950070 -0xF4B6081C197D4073625bF1D7def46a25FcF5b476,1513890191760746464231,1689759830 -0x614CC44AB5DD4Ec7Ae4b1852875e6e3385E634c3,758133128575173757457,1681731950 -0x1dcd0B7bDB466526F22b50416755396a9b96B5Ff,757537254555114465042,1681656265 -0x70b8Dad9AA753501e57edCCf0955ca88593a695f,86422852283538610653446,1659827945 -0x9B3905aC60f0f9267Af1931fbd42C5C35fCeF57c,12697261415045022077041,1637413160 -0x8913647eA12d3e88B33493b2AccC8F519fAFa5a3,5814023764942110499627,1694042705 -0xd80d400724f2fb8BA458B40096edF6aC6894A6db,639304038340030859510,1717614165 -0x1A2bb49AcE629e20bAb55F0f59ee1014E7623A22,975119841417067566293170,1677821380 -0x111B35d671c7d8E80cc5CB01ec4267965fBd648d,305358737694511471093555,1675238465 -0x9a0f6D519D09B51740a11c849D3e140848F6b846,5485626485344387791958,1643666635 -0xD283E63F1058bc47CaaE25F930B32E8F46485190,743124368813824738351,1692613870 -0x7A72c3d427eEb1b724197Af1DB5Ed896Ea9BC7f5,9933006824835471488459,1709558645 -0x7077BAf41520eB129148e068CBC2d576139d1A01,756804230942138642071,1683810025 -0xd103f6A4EB488aa11644672B70fb5a8Ea5240753,288338626708278302935994,1650366895 -0xa8EB650d195B8c271d16Bdd80DFa0dC54A0FC27A,715092056018247246533,1714142390 -0x60f5Bda825DAFb1993Ad85Be7395ac8f67Dbf431,633451841952239120040,1720871030 -0x1B41B1C0f21A09c6BCbC8d65cDa4cA17324bC5Dc,2477770128083569771652,1692615295 -0x6DC2C9CfB12E79151534290Eba3bB5a3788129d8,7573138684367210537661,1681873380 -0x1193d005ac6E016dd481c3B7E110BD4F63Edd8f1,977106176497437663226,1652959700 -0xfcBd83A733D381776B76e1B9C8895D41016C2513,2573502020763110486136,1721478610 -0xB3420a7a6FDA012b6fA5DC015636d0EA32A16787,6799348777086162810334,1718086210 -0x649AB6b2d18E734205B5B1A3C8C66b1523E48760,4919633079795486078500,1675764775 -0xAb0F37183BA79aB089707dD084adCe1e83fa767e,632334213061939035549393,1660187150 -0x4cF3c3c0399c2BD8C20095FD2F3cab210ea551AF,657121031786789710637,1711626050 -0xfe9c81F9b9Ea46C0DC83C430Af0CbCe4Ef9E2Ad3,7977671072354769663156,1663160535 -0x95c96f70E1d4FA515fc131eb4561522BBD3Bf469,10154852549620076076298,1638254780 -0x62dFAaf59Ecd353C5932aDd4f246bA66d9854357,1004593868867375316,1711718385 -0x9A4667aF636339C549930CbB30043AB3f6f39fA3,645614449408546912913,1713528125 -0x0508CB3FF0F836E3c26ac9f16805F1da55E8fa58,2631361589745306324319,1708345285 -0x49296B65E012c392c0B1cddFe17f9D834cA676fC,7569524240921114748594,1689737315 -0x986A83a72481964674DEa89e883D73F86500e8f7,946200628439771250676,1689730470 -0x5b009F64eafe69776468cf77AdD7f9c566e20E4c,321801826748465095070734,1708969880 -0xDC777ab0a38a3eCbA1734daB7715a78Beb9Afe56,39435590939137744205239,1657654655 -0x80B390f7dE513d3373d86d86eee1CfE702204fDF,663984175697055595546,1720922535 -0x5cdA093f3200c6EEC84e4276ce86cC964Ef0Db3B,61563003499119431402465,1708706300 -0x644bF2c24623E5C14EC611183a8124E348667d8c,757307078337773622761,1681703050 -0xc1f58e44E2E1E6Ac8A0f7b932fd12aF421A83c94,700000000000000000000000,1712845510 -0x3F1F31dFa6127F9e1b432E94BE5083c41Ab447C1,779213056560985523732,1692616040 -0x1Aa9Dee142B74F7cab30dA54db5649A0b6Be09de,15512644310359909083761,1643472915 -0x10103d79Ac194EB0c4cc75742Bda65C18dFf335b,784826526864311535916,1681903670 -0xa5E32D3fB342D9Ed3135fD5cb59a102AC8ED7B85,491881338971741989191660,1712704800 -0x84aeB0AD3431FaDb647F3dA433f7DA6C1129993d,6282998290736674789977,1678282570 -0x73123895630417cd1798a82A1d519A91f1A99935,2705335154564650807277,1637501170 -0x3D4C741e832a92864Aeef484F46Ad45C7E2d2f16,1197092486888702628891,1720602880 -0xd5386b1391381b0e66575EA09fb108CE1e117Fe7,787875638977723877493,1681649775 -0x9C4f4aB4A97B942A87Ad0E1C50f3B5a547D2bD18,37915787295133058510017,1637491565 -0x474EaEEcd5dFC9554EC05fc4A31a282B1617AC59,10225087222753139221522,1641127840 -0x18678469353070F8a7EE35eBD9e213a6dB83969E,4049913345534953994810,1685753035 -0x90b946Dd342Ca17A6d8343896063bd320Bf637F8,631597077785549011211,1720496455 -0x2aEf08E185a5872f9CA36904Ca223568aC6D40c5,384315828209716201700422,1686858235 -0x89cBCe8B1a8E47F95E63bbbcd3EbD6E1c99eb2E4,943536752743338503505306,1649390695 -0xA2890A36135E0a9d169121f360eA4E52F990c4A6,44513885920159376278673,1670374740 -0x6B2366fD81512Fb7b760a37b338e564eC319f566,7361854043227331728079,1647258680 -0xC2e64727Fbb33e38A3D264146fbAe42faa9B5873,5234060593643120703850,1662647910 -0x80baE1Cf1B1023f3eff8FC689A04BE4c7be25948,1012734045483112484,1720620475 -0x26cBdD5cD96833F9912f5F5Ee508537894b990c5,756702929350070579328,1682347240 -0xDF9c7ea6560fbde104bB2566c4494E2c7Fe5fbDF,78188893129779705875035,1714870995 -0xf39Da0Eddf72bf5ce379C043Aa79EBc89F46DBC3,533956851333458708813425,1704849825 -0xEfD8238b79aED83b5C1B1e6b8C2a6e7eE746a6d0,627027076935519182461,1722068105 -0x519aa194258aAcd7eb84A84ec8491587cFa9584B,765900707185434921229,1682349960 -0x6B85681f5AD347eC384Be99485873ce4c90a0526,1758707916993695491052,1681801305 -0xBe3784E99FAa41A57Ec7433Da8f39C15adE7E947,4069318554665773327587,1670250550 -0x27BE147Cd99eB66B9F113F2D74489e2690De2D07,5984098085299598536209274,1685716600 -0x8e8Aa915e95557Ecd9b3e86d1918f2e35657fB2d,3212510209957752315608,1715331760 -0xA70dc622CA684Ce366e82247e1E14e4bed41a597,86159500317634583472865,1671915145 -0x33F317951EFf4e19Aa5398E429af77600BD6E3Ef,990361651193035503487,1707678760 -0x1E399703e7Cc1D383a7991C45c81095FF8231850,823817042102622023146,1671730815 -0x1Ec701a7Ccb90dBd351CA4d4ca7b330edF994945,23334899439010542485177,1663919055 -0xb03AF61CE57BC5A0939b2F076dDb89940682d2f9,32775041677705777916720,1703859105 -0xC7A6CEd1782160f620dCa8bcE020CAF134aa56bA,7573895922511832796489,1681874365 -0x4FA948862f6AdfCa9Db65c7E382d61540e3c0668,26944372941428942981546,1708531610 -0xd9ac5457fA30480049941cfA34Cb7866b3C4515A,556791797565672329,1643731660 -0xc42AdF536Cd71f84A681A3cA87DA745c3Cae909A,757572729786272959128,1681648780 -0xd074d9659d7a7765fB44C523d15A718AaDf0AaB4,757089322692581864738,1681751215 -0x235e5bF3700177d7c472bB45E98b46611D47645F,7578439351379566349456,1681872985 -0x4adaFC1863E231869Dc57A7f09372812c212774C,150859796269769071022791,1663517280 -0x68a219accA8f663EAbDDA67B65140b62A6924429,757572729786272959128,1689699990 -0x6c2679140b39DEc5c22DB270cb612F80d87D70b9,10563501756740444833394,1684049720 -0xd62cAc94B77aBe6b020EE6289b4C2622c976454b,1682035118063017200560893,1663252045 -0x53A477c11F24A8e7E76b5D0A32FbAEA8A5c46Fce,129927584897782616293444,1640009950 -0xca99a9C7C5f2666DD17bD0F46849674518488D50,16976700790711000720905,1710293100 -0x778fe5BAAd14955117BAAF3Be79a29c1D5eC7a9A,862847404916562917725961,1662637810 -0x393fC7D3493b643451b16A384770d9F2dCC40906,3798906770900329,1719840400 -0x4a13CaD1b094DF100126861aE272F05bCA585808,2080845344093896629216,1705888790 -0xc40A091A1fDa807c998d992798b3614e3e7807C5,370731481367132293122433,1670937480 -0xCb4771A9901E3AA0B0a82EaCbB4E330adBD5816b,17556807790854900776363,1694186170 -0x08e5505BC2A8b89cb430CC0286cF93FE70292310,56728057011638270441465,1683804660 -0xF24D7FB6ff3a51886e10854C313BBd926505c441,52922526160566438244221,1672666075 -0x78dad33958dD07C6EcFB216ee67aBF8C455F8746,627425837049735250632,1721856955 -0x95B872EF5245A4Bc6c0F1efcc66437b2cB08Bf45,2632012897175670340430,1708345735 -0xaa177A18227cff6D0B554eAf5ecF870F0ffb71ba,631882699778019045676,1720028640 -0x65a05e8161aE1b01E7780A0379F0559Ff6c07060,662405101504174814980,1716422305 -0x46A90C8778f63a440fdd98476657D63359f9B391,716720565169243307328,1690130770 -0xB025c76CFCd807c4059cf11585A252ac5d8BF6Ff,4809394025228034025931100,1681631450 -0xa9cB54745839E3d59c4C7c7d9eFC1c86c7984C6C,757255226462065634107,1681714955 -0x9f2287f8E9B19a55afFF14d666397c3Df3cf164e,797608002998751224389,1705641495 -0x88a31B42f05ad530EF237152Fde26d6cf0f89b0f,771416479849709650040,1692618490 -0x52E582762450345D7B11f651336bcfD9d251b7Fd,12804669915612418143263,1717374915 -0xCC648d0aE4875d82B50F4462F571F8eB424DDD86,338395570419705153491516,1672203935 -0x69c23edf9DA6Df810FAD515C12579C3Fe782b2C2,2631367411799192420532,1708344515 -0x6bCBD453Ec30AC3f2a7aA4Fbd397763F91905172,632406153735132488670,1721689475 -0xF4b79f72E03882453a5CD7D1e28331896462B6f7,63460496544198236019010,1717514215 -0xFB2C551Fd5a7700ef91756Fac1A3e2230F5E9A38,83102555572460059425743,1710259325 -0x7261BE64fc5ff52F4Cad9f5811B88D66FC98Ce5D,1253287660653266907836,1719388095 -0x2Eb79e22A5de41eE140746D563DEFc8e4563b213,666628993044259965508,1683361325 -0x715B478C9146B748dE5401818D9d297B9Ff4ed41,652720408876429240298284,1712704800 -0x9E38D1F86925238d0C4ca915C1a69109fD4cEb1a,769300098553379822655,1686581890 -0xCF664A26ba8fc5bAa1dDe9B55B75c6FaD5B9cb61,1892381060230278687148,1689750855 -0x9E1d60EaC9bd6711D8f98965e25B457658C25d26,12563000017673235999824,1652939665 -0x391c63616934742D6D5381BF7812D3222C87Da2C,2666632539172112987612,1709265185 -0x324472CE8a5a3BC28b9B345fe7AbF268A0A5062b,2589596734647835017975,1721010290 -0x8159e4593039875F00140288D17B0a83ab8e6CA4,69138451281882934560530,1666692405 -0x38daC0383F62Ce821C2b4618D655012789B15541,305467326797230869963292,1687356565 -0x01D01dC4f897aA600499b3bc29A624d244f32992,1513890191760746464231,1689752360 -0x84cAd62cEAA1B638217DBF667ac1FdfBC3FE431e,3796131193580577251861,1717608280 -0xf3cb1e06e72233e0350F7588D11a2585B268C7AD,230398423083460627458260,1692614910 -0xDF2de3467C59FFAc57a0F8C341D362149EBe6253,5515344642726779044768,1682473285 -0x3c7E91b44BC58a48f65B1eA1D94d0525CBd2537E,758312117172949659703,1681830765 -0xC9EF1A5f407DE603024F947296bCa4Db4E5bcca7,111732413209356408449,1664656870 -0x8A8B22911c2A40A9F3f247087FE42A39012e6180,757511907484033648367,1681716295 -0x898010E75908A3a9d44F29BA6da39DeCe7a04CA8,637563928038911895450,1716724910 -0xaa87d59baB8B014a902140a3BF2FaF5BDE095910,7616578432763767908576,1685559475 -0x76Caf7F25E3AA87e5Ee7EaeE8f1a023Fb59DD1FB,178955762399357730678737,1651659925 -0x974cd2f84384DB81a03367F1A189f3828e95451b,91000000000000000000,1718352285 -0x40Cc1A8cF13F247F183805f01364cB416057691F,24597154563221800874475,1662900405 -0x0be3478C8FeEa8FdF9fe93085A65dc291610346D,30299173071744319395026,1720007845 -0xb973E27C696fD46ffaEDF72a659bfe9d92c848eC,282189557148648024,1645909875 -0x874eB356035Dcb546b9C0636E2847b5068f24f53,15871830808677250076769,1653939180 -0x9d9d357d58EBa0994D1998c26A41e304e6A309f3,438894381866285127330883,1705758520 -0x164F90dbDc55C1fEBD92B76fab26D42bbf703096,725900368308087946663,1719072595 -0xc0c2047d910F51c05E541fdAd0F15aa30aC15aEe,1892362739700933080288,1689754255 -0x2d798fa6dAD9717D091d83558FF918Bd1AD6C319,162284773212610334,1637165535 -0xB5E471a0eB53078Dc1ab4d5FDc19961e3668bD8B,8255123893235873484422,1673261295 -0x4CC55bDfA1A9574E88Aa92EC7015de413E2394Fe,319550447058237483062822,1647336345 -0x157414497B6207d9819d01730F6918a88a5f473E,757554562610339320383,1682674005 -0xDd8cBbC80300E428910E83C1d444880025eB8adB,10518675704872988446650,1648322795 -0xdcd51CAEda94F46dd5B4E43dC829B579338A5b6A,10730985428309750983394,1703386020 -0xC05Ad4905e63244ecD5076c1C130958ccCbA54D2,2099549445663698,1719392190 -0x0915318A22Db5f301C26A181F7e3c68285886993,1094401136484969317686361,1721908230 -0x1708Ba6A58ab3D0105507344f878b9d0120645e1,1251095218536481398420,1682447320 -0x5Bec06EFcd65bEC5D937de4fE374BE35425c6977,630909484172231202454,1720347265 -0x48C62BfAE5db47857eB5Ebec6B68835F98A24DE6,646271000654865224176,1714774060 -0x39EcF4e5fE8157aa17C713351BbC1086b6730022,757945880583659169002,1682376515 -0x5d40DaDeFB0A9806Eb596A749BbFd715e8879d46,2053095053016754986804,1663002745 -0x30C37aF35B1e907540D8b6B2B0Fb80D92498ea0D,7501562802144516802756,1667664595 -0x1245ceeF84C96BCF92295Bfec6f9442A0912fE87,639974917654928319537,1717254090 -0x1458800809b5F3C48Aa1408cbE3AD6cA232657e9,1892362739700933080288,1689752015 -0x19812518A5a455500210b23167c9d60cc231e8b1,7573138684367210537661,1681875915 -0x26bB49EE98C3F62535C61b0a200C366d0615f8EA,43102262399217547207788,1662633630 -0x3eb62146675cEE27363D72a5816B9b3009C7ceBB,694565053422332555129950,1717112590 -0xaFAd6DD27b221e6590bC96E3f91983b5d32FF205,13260007187128470458334,1637773235 -0xAf1Bb226F78D24B7023a3b59bbc31BBa5A43f7f8,37683632549714030186703,1662651415 -0x077086B509829a5129557D3Ad3E22E4AB42c14fa,219851696937939918175200,1663091345 -0xcf53bF8d79fdC05f61586df20c00536b901d0ccc,291837017779859130622528,1721935645 -0xE6446c6c42900Ba1dBdD0414d6EacB82dC055554,946190530115139343574,1689733080 -0x9f4882534f46A3bc982977ABb1D2398dCA69961a,404297776206777382854407,1713879075 -0xF6EB78CBe82Bec2F3e412a6170526C1685a2B4a5,7647252355214090043486,1681872585 -0x2c108C83b9ba7Fe33086676e4Ba2db0D32fA36A3,4238945282748383254137,1690487860 -0x7f6B20509f4337dDE2Ca05C4E64975BC3164ff87,630050360438848573000,1721157055 -0x7B6a5EAD573293Fc5548F508904567b1D2c6f6F7,31691661131871940596964,1689194330 -0xB1008cef6Add50009EDB4D8e8D8Fc5344418454e,21838697396003057135233,1715759345 -0x4D414d965e198abF9E54ee3b0823F41622157132,8978402657797255020500,1644880170 -0x6B55ccD5C55D71F76aF5A5795eb7cB336059C7B6,1052083109133573108413,1637379855 -0xaF79755123eF620792B0E20C5d187D74129d628f,757554562610339320383,1682692285 -0x1280C9d354A761017e0435ee88F79bB6431974Bb,315806548521918756012394,1712169165 -0x8da00466fd096E86d919b7b30B53513b87Eb4122,133829343929910927862355,1722024365 -0xd05C50917ed21687096879cdD495ffDF617908D0,81995612294363275750670,1679217415 -0x0319eE8Ae899F358026fd946BbbDbFd0e59c0A6E,295761010011086784311923,1679845725 -0x7aBF69ED2A8347C7c8a1a3db8aa19d34C9148023,36324161184069,1714173920 -0x6D1f34bb1aC1c24fCDe8edC3d8A683AfA23EfA3F,486574847505923162653249,1663068475 -0xdE793414F215dFe37bf9e61C57aa5A98c6D23b14,2059849316960256914868,1698165565 -0xf7E70E9394bf8f090a25B96226b93F0fA5A4bEc4,373406070909731308,1691283085 -0x343753aBfE0AAdAE7646526F6a03EcFCc83E2144,756726594594610550854,1681833920 -0xe325014a51491481c1B361ed212ceFbfE8fcc9BF,4670557143448963232681,1714845490 -0x0FaFD10ec3C794B56a58E6F1597a51F411888d88,23517351788424350539502,1668323675 -0xC75B6C784B610318A29b50Af385242f6Cf5AEa03,19318645397713341697577,1644832860 -0x95b59DB656FAF6388b217B27D034Cd7b4Fda8d59,6093880833083607853242,1639503765 -0x8b1F5C197F4a4ECF4C430b030CBbdd0a6c4CfD36,69589933681464213304636,1712897140 -0xe551A791C6D044D6e34b517345B82F56931d739a,2813269562252493001258,1713184255 -0x404fC91AE23Ac3587375cb757388B13eD57FA494,708434841503820328513,1692616535 -0x70Af9eE164FBbD3127B871c989f479B7807CD212,9569298152897112950149,1717790030 -0xFA42742aa488d4Ea7Fde7D3F3f440A3bac68E5F9,2880852983520118,1717493310 -0x77EEFAe1FF9F6F3B342656571F9Cc1CAdd863238,757461536444504338531,1681673125 -0x0D2b8246c8c8167595Ab27253C32E8c012e03929,802945615618422222237,1704024755 -0x18AE266c1BDaD8646764851e23E42c3b0326A0d7,71167886522675626210902,1662045105 -0x797eBd7e7F23F944000D8692f70b0ea7230e2B1d,2399075446977679502131,1646409520 -0xe36e2936c6Aeb4339B1C06f30F3121722470CDe9,1765183969491872996288,1681804915 -0x854B9e23eF1598eBe112a0fcDE3c4Cc93e876301,65354080488236173363291,1721567260 -0x42e773B960b612b15D3e3ba582C797db716d5d7a,841653656321084,1720091055 -0xF6709a7478Ab06375C7395DfAE6e01bE2EccCE58,531000000000000000,1711025100 -0x0C57A49fe5b19F5dFA0429dA65dCD51ccFdebB8e,90812320636335068975610,1684489130 -0x0F1cD4b5400A8fc10990CA881812c3faC8815353,3038461387932744793090,1645563935 -0x4b1a3b46985188b9406C01A529f79E71FD12CBAb,757196736734166515133,1682340780 -0x194f5428967647eFaD484ed65Cd54e65A9Ef337f,4627334411293884374944,1721209410 -0x822B0d0024F460d1D187D8e9ac797d7F903795aa,4796626438192699189,1651425035 -0xF25d523B15356911523a61394158472162bF9Da1,757912627829891608012,1682347785 -0x216EB155e0EBC7859EC62D454965f2Ed3a3fA99d,3456780006895599029381,1655389770 -0xECA056B6a08B712b5c2573Dc51C32C14a1287C7F,9490456243591599309999,1663381535 -0x9dFf366011D42b5A6b5C6089d526882933a68c6B,2617461614259773101694,1648383835 -0x2B0CE7603E3BF8505AE87d61cd0B2D504750885a,7612873704847276104,1681787055 -0x0A34c8b66980ce5F2353817651C59da0E8538FEb,8438976659228471557458,1669144810 -0x552ec167d3fC2e1edAbC0C79E8057686165C9Dce,17351153296087037687147,1686060120 -0x4cb6f2D485812d951d310C3D666e70E3a2Ea71ef,2399075446977679502131,1646409455 -0x7764e471f22B2B3ff1ffF18a3E1582f1Fbc4BDe0,980716952287265259941,1711291035 -0xdA6DAa9f23e85B997e937Dba5D0dafC49D95aACE,281028232205210910876150,1687316385 -0x2e7a1eBF72D4e6EDA4c92569074d8D227d86C472,725307928518874399141,1699073445 -0xbB5bd958bFDD217283B4723B63186069c27D5F9C,24330126181796114709064,1670215725 -0xb9b25700558aed7161027fA338ca046aFf4B9eae,342875841954738432379658,1683715760 -0x620F796fC2dA39A6A160CD50790bCC5AbDCd19dE,1626489068373873217488,1709800705 -0x43d3436823504C6f2479491960f00d28c34B8524,2617713865015525315305,1682528760 -0x02cBC59cD696ef7482fF218B97C295F191A96dC8,778499825828373987377,1692618000 -0x35Dce3927aFB32B82FeE5d9bba5eF393e3270bAa,1765184274680190943008,1681804830 -0xcE3f2ea35811cF15a46A2eECa382b26307911232,757546529378951080750,1682372900 -0x3b27A3C9d6e94d0FC570B0c23c408Cb40c950C89,16199547714309708637006,1638550860 -0x796723F11c7DBB871a787ED9AC343A9B8292d7a1,211783118777279419586756,1710100060 -0xB32eb13eCbFb49C051FE6583ff048876Bd1c10cB,4532231175231977554430,1703079565 -0xd1F59Ac33d3a2E0cf104F81EF4c97857BE7bB729,1307744866891271259071,1708545945 -0x3b9C917b9683EEAE3AdBb33215dd953a6C3c7f9F,1337381470640280179068,1712012395 -0x866D392495440780b71a6C1766B42b324CccE453,954291002870108885334,1717865165 -0x344BeA371d42130Dd7Ee1091929f05B9E6B375aE,646198124073705850557,1717681025 -0x555302761f474a80a68D5cB7191E7FA10a94d317,3710198037004299936521,1686439415 -0x12D41A66Cde06c32b5544519D1561E0fE507956E,2847176980159451273904,1710192645 -0xB843A334fca270295bc03E22eDD59FCD7C3A2151,210554944615816526412643,1685083090 -0xb792b21FFBf444E9732A03A40A16986C3306A127,3224715529397697740646,1718851115 -0x3Ea6EcDEbB7501d0A6Ae76a85B5B953F945974E9,1627482578973691386636,1669661625 -0x46C8a837B056c59e95CC67e3286E62a028f09701,7573043945390247997317,1681873635 -0xBF2c47403BEB7A149010508800Faea59dc6d8792,757427705801513946150,1681829515 -0x07b5Ab7f46fd0b0A1270d68EC97ec994057a9dBF,633636602522259252859,1720247780 -0x5AD0A4eD2A57d82c7D0C8b880C61fCD483101F27,2775556642069430451251,1696350855 -0xd4F2C4ae1E3e70776071195bf6b18C8E71BC4C53,2413010211433447413455,1720064160 -0xc88acA4aDCa94b5747ECD08197a1B2fc6BFeF583,20853724459091809404287,1703695605 -0xd1D31B21c55769BE3b37048991c25DCEB94d81c3,10080253430166057132944,1682440120 -0xEcE210e10efd7da87a22E06CF2d36137017E2d14,7424383438095542534,1681800690 -0x7764b7076d58D6248f5f5Ca80Ccb4fc66F10Fa74,11459844231831671738605,1708049775 -0x3d95EA92d73ADD4e13b22E9a4f9C80679f08fcbB,1513890191760746464231,1689755110 -0xab54f4B2D10fE8C3F30E0c73acFA7C60d12fc771,1890752566264007952191,1679480305 -0x361Df270D6FcC1Eb923AD7A8372173cDb553D23e,1074960747442877404885858,1679500985 -0xaa15d4f8AF3d7d4dbd799421Ef8a9a0337930634,698592373059637413253693,1651062075 -0xd8350208b1f3EDE7B12c213C9e64a610f3d2eD4e,2577195351408077805311,1637242515 -0x555ef499A80519DeC9f0Fd305c6D679c0aB2a4b8,320678632097238620684253,1675238705 -0x3Cb533b73bC6566cd57144efE1049328d7106810,4102407876135853307664922,1709814200 -0x1C3eB8677faFb715F2450347867A5A98baA2E76D,1674946882696116,1717774525 -0xB21BBC45A9bFABe2b7Ed93707c997260A6164a1b,7275781474321560217654,1668947790 -0xBfFB23444F7D72e51538e9CA27B2B9ee7D63D565,756796879705716442299,1683806395 -0x9fB40674a8377dad4eaA8a60FF55C41F164354f2,631513162043184673555,1720392170 -0x86052DBD084Ec0cF1b177bda71B2e97787bc587d,757341875204681508476,1681702820 -0x67422771D41B84F48AAdBeb36B2b134d98eC9E44,4887246136699050915818,1642624240 -0x8B082088ea1b1004C15C9b68A2992E3eA0a41D15,108887492786349411988602,1679588280 -0x3762Bf67FF1CB2B6A722898EE29A2EF666f44E22,1001516647733578844510,1662980455 -0x356Ec53fd510B601956dD71291107116a3A76C47,757375752822351406051,1681691005 -0xF99eB40AD6AaedBae8f3C6608E5184f2E28ED576,904368106206878903873707,1705659900 -0xf7C3678C93254938fC2dC0aC113D1D50856Ac8E9,3133214335872443335663202,1699096280 -0x751A34105E0a391D1562431E7B98AC8C80f2B55E,969096937651722245257,1717945235 -0xbCd199726f9abB4659a7E8c95dF5736c960Eee04,7573043945390247997317,1681875585 -0x8e2820094716D442BC3EBb2BD89bED63bF39c6C4,1298116176604808386785,1715712890 -0xdF4bb29Dd7F436584e49e4627C82A6F5A69eDCc5,95215168677234812341036,1663069030 -0x20711BB63da6965917b4336A7B58Aeefdb1A33d4,551572108976481346057716,1676855590 -0x383B122D592Ad9Cbe83E1D2F6528Dc432715ef79,757469812181565861066,1681737445 -0xB22d88E86ab6a6ae15257Ebc5454D57558A834f2,756983777402082039237,1681775230 -0x5c2A7a3aD12fc293AD3f72275C0A5aE679a12c7a,8574723431142029643061,1664744170 -0x0c98A8C50834f192c3bE6CD3F5A92c315B2ACBe2,39073460005546714625369,1645541920 -0x68fa07243feB6F199d81036e76472cEf0e6ddDCD,1267078928630400749826,1717705145 -0x3Dd5c2D841500a1741a30DfADEeD1879208111Ee,663203092296393691171806,1718630775 -0x4E5a8ed5E1d97724bbb88DfcFA25C6efd7044eC8,633625634432690650977,1719986870 -0x1E6a5548a79FaE314287d52dDb5caB598554C3D1,46143612877120994314936,1721919165 -0xd53cC774080e0a7Cb39C700B4d274976CDBF52f5,15567980822401985227381,1677615235 -0x3D5d2a8EAf3118D08e0c096C7Ad63E0bEBcD6243,710898100713426293834,1713205220 -0x774102293B64bEf2b84a754D63b4aFB9E18F6661,7861623616832895945382,1681305095 -0x70035Af18d90CF2E67F440d9EBA606a8640689df,788975136686160882542,1719873275 -0x450399f00FdE45f23218814Db0E88d563589F168,3074552849925349691374,1644450790 -0x8576c400BDF999E067eD920ADd76B65c6FbD1E40,757572729786272959128,1681648750 -0xf1Cff704c6E6ce459e3E1544a9533cCcBDAD7B99,1950024736468540089531,1714376970 -0x0505e8ceACA665961Aad6B348809Dd081bD022AF,2288374157058132172717,1637667815 -0x911F57bC9cCB48C54111531Be1A1F15bB4B03EB2,106844242519998739267941,1637827010 -0x60f6982d0d87FD55Ad9b9d2Be98C1C44969D62Dd,1625052396682853095658872,1685728540 -0x58B246B228752F65f31Beb0a41DBe14F6Bfdf4D2,1000057048621120159764,1638383315 -0xD693a3cc5686e74Ca2e72e8120A2F2013B8eE66E,736030402792383519304,1692618665 -0x570A84C0cB92cb98816caAB25eDa5d9766983B05,41832157313310466452935,1683747650 -0x831098c07D00d720A5d9C303ee3890AFf93b839d,2202784757999238056580,1675302880 -0x731372e0Dd9Cb9996802BE19e7dDEc300f5361E2,707721541146522614715,1692618390 -0x574FF4a21Fab1307A4a10855F8C457d688CD16a7,81666024731484659179136,1721818960 -0x8A17B528F590413e5dFC2dF30C522A8E001dB4c8,354249298443251772,1683975180 -0x2C6dd2C92115A8329721Ea0290cC0839156Cab69,745888285161993143140,1684122790 -0xba446477C941142d901FA01a89cA668B17A10E55,757341875204681508476,1683742805 -0xa138f273635735A7E095C6a2a13d3b3a06B22Dec,248310321421537612,1658892870 -0xA3B5803B51D2704f83F4F573A3dcB17BbEf0d5a7,9256489706685799758989,1682669470 -0xA301f940111Dcb0c5967e0a2C7904f34EC4A6AD4,757445008201846206284,1681828430 -0x6d4DbaB1c230433E8Fb0C865a65d85f9ED212cF0,757554562610339320383,1682673715 -0x44d652a0BC335E7AF664d5c3aB23a2F8EA4ef8dC,2053410091243240603475,1676688555 -0xf9d8D6aD617D8E329f130b6d5Cd7aE66dD017d9F,13543330230198889573618,1642795920 -0xc24D1c16497cE34ef9C804c58078b9A717A73839,1272771037848203039849,1713572350 -0x3cD24bce955365bAaD45301435fa3B9A501df2Ad,10058234375828230077912,1637183575 -0x5680BC44c01F013a6C643a9eB22D973932a5C5e5,5280401073311013,1717080255 -0xB65A1b1739801Ed38116655594C6ff0420F7B7e1,1217529066188083635912,1669780600 -0x9195c5740b3a14f05c6dD19eF96010E5Cd4D6F65,306727789920146994,1650185335 -0x5E25ccE74f126fFC22ABBEB14A409f106B00D5C1,40555202958304823093800,1676913470 -0x2E5A63185a32282C866F0C044e233224B164A5dB,17943463697659032920631,1666773380 -0x457d5939eA01EccD49B39bBB9724d507F0d32e8C,2879396290833471989781,1717620665 -0x9CE9536245b2893B878da8E5C228C3939C938737,13808561462220978951389,1680578365 -0x249bccA8A2BFE43586BaB966e21e5dDf75B38442,946190530115139343574,1689734990 -0x1851AeA1b846df8052Ca62cE93adeb0565eed3a3,1758707570946313858454,1681801425 -0x7893ef0BA92d40DA28565B9CB9dbBA96365392eF,435308153274640024469452,1661175105 -0xbfC3f58748fC743c3393B722a8650869782fB52F,1824962427146920,1720413185 -0xE30009CE9E8d843B5ea51BcA2E2705D1c5C27e4D,185117113279497699,1700422770 -0xC552F966A96Fd45F2e5A623e3486d7af36bc3ecA,25480000000000000000000,1637490655 -0x409e4c8479b3e3a236504C4626dB532451b15501,73338201629185739181272,1641837585 -0x72348B711d2b99a5A3f53Ef01d05Cdc118A22d52,314985697237275538,1696993230 -0xf71b56405eA8d11544f06602fdbd1FF8Cf1299e0,67733559290120542738873,1709961585 -0xB84e30B9dc0154676dE3D61682969A39A43A4A56,7414695825744092092,1681800190 -0x675b7db929f87b935EBB0F7e1F6eA2d41C537a67,4718260038446297605003,1710641005 -0x38cEC7F44d89F4dF6C977188947BdeB65d0358E8,15873579227856667286786,1679388745 -0xBb601d768C5336A6431868373F5a6b8d04474298,761087496257032941670114,1687356560 -0xFa57bEf5B37C3b4416e96aee804CDa3c7542EA8F,2778507678923867,1721742880 -0xE6C856463eE8b7DB5682F54567AF0CfC4243980f,6411583279666640681769,1652870615 -0x46157014EDFA0Ab5FA6AD4AaD31F9cc7a3993967,5458129357781537144340,1701344050 -0x627f50A1E52750b2423d10f755bafD187Ffe678D,72022877491826546076682,1679361630 -0x6C7704023DE5bF0B9E4D20e2A38A171DF2cF65Ac,316600039310237668,1691856205 -0x1003FEA51162e0Fab409F5b58496d12E10021E62,758321401788337727015,1681650135 -0x9b8d949C629da408c584256B84d8a127965dD0c5,757221251089246547672,1681819280 -0x450a5d40a9611F8AaD07eA4C0Bd23CDBc6a33dFf,77528812851196922745209,1718027345 -0x7a86C44e1B41c6C37fF783E8f6B2f6c68AB251f4,51261147755845362297941,1683164740 -0x960e6C511BB83D390210Ce6324c2E5784E122CCF,8420343169890131113311448,1681631505 -0xC7c976d269ac4758c2b81E657440137FbAA6264f,1765206337348198924108,1681801555 -0xB9830ecc83BD54A574D81F7Ca04080Bc8299c98b,121456688449054479593022,1641397040 -0x36eBbc8ac514cd8D2061632B89f2e445A3F55F08,138322771609921662383710,1651063280 -0x23e3cf863885Be97ffBd8E127b0311156315388E,2585884765342650,1720129790 -0x65a83820d3A8cd3c72e1b7F8B9e95C1571f0b062,71337827768301362463923,1638265710 -0xDa14f2aDDCF590EF0E2e3EbBD9A12b3DbfdBf09b,5200298916309247195598,1646576460 -0xf0Ea05ADc0C452C2F38F2e94eECc71F931089F32,856229658219332203649,1671658305 -0x765F4fE400e5fb81a9f77b27ddA88Cacf4679678,821481124417568943539,1668640545 -0x3F2456D81eA83ac2727a0706bC0868f507Ac68A9,632587611586870842038,1720972880 -0x68fa67abB52d40C28e6abAD284506A35602C746c,1268279849941362344839,1718268625 -0xa4bBE2835ed79DF3951bbBC1a528E7B7c6Ae7C2a,10549612106972427122474,1722128595 -0x5F79baE1c2224AfA59B65f80150937485Bdb0eF3,3088174696204916367,1720569895 -0xbEBDF550305B3c3287611d8628bA5D4F84871119,6578643078088707073906,1708274550 -0x47f6a801D5f85ece22f0bb1cDfdB21E49C9842d1,1000000000000000000,1719281310 -0x76Efb09A472aA7Ed921088B09b8E5f02c6839792,1513890191760746464231,1689758520 -0x40Bf94f382a5D00584A0D3A939966e77FB3667b2,142869012775883697383227,1645304420 -0xfe77111aE63a14266b6eE416420Cf9cf1E90bebc,64432046667449240130212,1722086830 -0xe1443EEA1f3931267cd680352f8Bf424aC062Eb6,757131266152176006038,1681828870 -0x9a90Cd19998F44391d050A174014B1495d435b18,105495679839440757157450,1639618470 -0xccAdE2B331c00Bd48bCc6CC476BE6a326B477804,15576237673602077901469,1670266315 -0x94671db94291e1A1d4a0c5AAD9860A0A7bC43BEf,645580965690161438681,1713693730 -0xd9D912738fF2Ceb1F668befB96B8228Ec016a825,638525032872434841039,1716650685 -0xFb4EaB8f643107C94330a12e7570aE8e0F775F57,66510143275340770,1681993085 -0xD836f082F1D0884015F052c3403E80DCaB1419c9,981396874671926677889,1662634530 -0xbEc6Eb5A834cd23738EB7eC293eF11AF9955c672,393368259686223163324837,1721929595 -0x5584c0f8256c46dba778e696cbef138B6Fd32FB4,5949437680582706063143,1673805865 -0xBce4E96D0b2c8F78A1adf245f4273D5BF09ffE21,11858953913078966627770,1710918915 -0x27f2Ddf4ff488F4E47b149366603C1558E6BFf4d,3227796740118284551402,1670359460 -0x61210c36eD697ccc8a61A4F462eE87905de09f02,757554562610339320383,1682673955 -0xa39bF426e25a45d5E241157e13df8cAcB5D5faA1,642553466185076980887,1714821990 -0x22CF3d069a452F08F61FCd8E2A41B8C2cC3e20dc,946190530115139343574,1689736195 -0x8789BB52fE523AcB635CB162098c58a9A30AbA26,14154642262688202065994,1708430825 -0x7F1223856f4A1E3Ad3CF7774E19C85F23D7223d7,507000000000000000000000,1708523650 -0x3921f0E85Dae347094886a69361C806FA57ac609,5024372473129260800682,1718111650 -0x4d3Fc2Ac08393e447e9220d0Faed630f4ac0ecF4,832194310167371517753,1681720090 -0xF834fEDCA1DA4594c00868B0C0fC306Cd07Af832,1094520702260076248727,1667925780 -0x18FEFc61F4974481013bB5a4397a6fc52e108298,646818587039651362287,1713290900 -0x0FfC1Bc705bcfA104f8d460004EF4ca59BF39A10,3307590870807913468903,1640463645 -0xA3B855b2B1513a8fb6e39159F9841d3069Df6344,909087393645360499406734,1685748130 -0xFf8BEdc6369452091775A2CC2bA059A04d3bbE59,5368885960810146330743,1696343205 -0x62D5A4c5e5b83Ab4FBb6Fe5C0f9d19Af19cce982,15055046936310879744,1654977355 -0x3251f797A0AF4FDA580037dDd935aB67f34aD44C,750024904180453679268,1709384415 -0xb0a579482296f956C93d4b21255F392dBD093094,5710285977871556093839,1719393155 -0x5B18f9c484665d8C3ADd1e15DfeeA5FacDc089b1,4509736329292604,1720170970 -0xa2cCa588e0D863F524E7f9A81574717Aa0E9A42F,663417127070833043,1697295650 -0xB09BA09bF27A2ea6013249D05E57018d33CE7B5f,714814869049488557842,1692614100 -0x6e77E412a82e1636c70816692058fDB10E379763,2158849412292097723391549,1685366395 -0x1152634121E684388bF8a0B554BDFAE77dc5cE06,4839030843204161483523,1678409000 -0xBe63E743929Cc8074e0Dc6E07F3410282fb2856b,4652872697640484810137,1678703795 -0x41A7e2d418FfDb77aCD63f2B211f7820f8ce7cae,1253278122757547681746,1720430745 -0xFC2CE03690eed7548a2ABb5Ce12058e76B7f8c6a,693313240867119274796,1721894685 -0x89aad11f31Ff8DEb5AC32C10008087316160fe4a,6541942208791443,1717597925 -0xA93D6Cf6aa5de876351044017d1A996bdDaa7EF5,168051397341875977615079,1703082270 -0x3e67E9c147Fa18dF710199D329F46bDaab128087,757263447132349249664,1682004870 -0x226F7DD93628C5F74C80f41D9fa12C1ed502bBEf,83273607318831889951042,1637386375 -0xBa47B5DBc9295107bB7cCCd73D44DD8DC33a79F0,5321811632738191063240156,1641393135 -0xe69B25f0C12cC775662BC046932892C21451Da0b,2000806918972140855350,1704797755 -0x5F87C633dd2E39458530D7C963754f8622FF849c,17506231238420247008941,1710004785 -0x87B6D8e922b614678A5C8607D3732E160CEA3bF3,7034596837188807387,1681787650 -0xe462Dc03a186cDC61156BaEb3CDcD5f297F51B3F,683960132492160365,1721887485 -0x21dd1B9Fc55B667Ce5Cf665ac10a28b604F58d69,11804038986924615573177,1640862390 -0x00108a272F0Bb44776F1C66d9A03d7bd262aA996,6806139298185819419552,1718086515 -0x988a502BC0375bB9E0923902b547C6ae2723fC05,118939111716186667,1696668700 -0x1aEDE1D3f848eA0FBE4d83FDB195C1EA267a5C07,10020216757054748925934,1653141790 -0x5556e8b51Af24EDa26A560e6938A3446C1DA61CB,1305319899081068267444,1711814890 -0xaF8A2f2DcAF47Af90eE830B855C077CBac2a44B8,1513890191760746464231,1689759240 -0x4f05F140BfedD63f65A7352021A9379d68983893,405065749437066801224062,1706318895 -0x181235Fb8233aDFFDcd878854e7033ef66e3AEAc,710860321768777294476,1691746560 -0x14A8a6080914c69fCF871192BcC9532f9803D5be,21631992460461668322467954,1717757995 -0x53d479F2fd41Bd5d3749aB60BAdf595884a4F756,11191782871198387320808,1717356935 -0x2c8fdA8caDFe3b6e2f21dF8698d8c9d4E93Cbe43,387927808436874268231830,1683836820 -0xF6d3a82d96C325e75CDB1C3B9CcB4b2a02a15086,3784762120460557374297,1689738200 -0xb7C3c81C6E21E4bD601c1592fF53A20e0ffa1c8f,15786012319026077702579,1681112780 -0x641b1eaC6d98A476F182C18B913DBdF9b3B4F54a,33154936815123183797633,1708084500 -0x86317EC7B9769b0DBDc3ac5c834650376b6c69aB,835159802125229156959,1666324785 -0xeC1B27B906d66BE58Fd4aa07Ade790c65826B112,2513213088151458555925516,1722030275 -0xB66877D1b809CF693Be8217C1f2DbB7232eAa8C0,135802622462890347077804,1664661350 -0x2BF5CfabC37deaB31143555e317C3145A75E1C57,4007743046842576058134,1709907420 -0x2e54B21b1d9A8637144F0Ef98E32d41C5e339987,12979261540643706968935,1671160380 -0x3D8C1754228BC8023f0Dd8831D64Fa70dB19F4D1,160904216670500610882511,1708714120 -0x1bb829e1b2a5C2cba1C4108AcfF17F93a1C8D7DC,946190530115139343574,1689732335 -0xc4B709868fAC6A2f4E5135E19Dd7637005bA1EB6,4045811796930860,1718740250 -0xFdF179f2d7C6AB3434363194c470F9eD9dE3093d,594172330311973912,1679692315 -0xc2F7044A9E63999cE5Fe2697617CF00519Af9ff7,757138760512250295759,1681739755 -0xa73D146597e37aa5431Ebd1085674cbdaE987830,16572943658452070,1663994505 -0x4560E0262aC64015F2f902136D36eA1cBB37D74A,1513890191760746464231,1689754595 -0x7abd986995753C186a8e22cd7be89Efe9Ade9C0d,8109256207494098906695,1692614525 -0x3B24472214E69933bC0609fA4523d24e1126e3AC,3509136833444370006072,1716791820 -0xdd869d98A7bDFB94FFe3F953B45704C852de6EA0,6242913033431695794116,1670009030 -0x120BAe682F79111a54307c8C836c42a263c32E64,7818967520252262008110,1702714115 -0x0c7846745AAA1E2AB17D1399EC9CbA232fc68D48,5339784390865438762528,1718619320 -0xaAf331659204936e96dAFDf50A2353eA86c1cb06,23610436696511305815581,1647252800 -0x448519B132d4df2D21f2CdB44298493d95032d5E,1378852245967614960683,1722270025 -0x17e4c34cf2EDa49277cb4F2089eF54C247388F49,35150494813937717086697,1707223365 -0x0fC2c1A6a8d21DeB7A43219F3BF9b1A23D6db33d,631355380595927792753,1720294715 -0xbb7b75E62a1E9355807fdf60a07a614E8B2C6243,733564227604550501262,1686461540 -0xf01451D87532f805e20a20b9F45079d6031449cd,8410220602376948214860,1675108130 -0xd3E4D074f01Ca3089bB5e83877B9A1413f458677,44392973661316583439668,1657361730 -0x5DD381445Af04812360f611730eEc95bdEd3ddCC,215695454679484171583979,1718375550 -0xa3d50B6e973Ce1daBF133FdB90cd065E1956ba15,4777415454421830945115,1681875810 -0xb3654d8cb57F03410eA7e0A699Fa3261394dcbCF,23264865714864225573273,1684651175 -0x7d05bED8C4ee1aeFC8E942F7Cb9F0Ea88e3E40Cf,736459317369520791138,1703878755 -0x462d5dE5e2c90642c18F5f1cc9a724Ab76DAe98d,4423018033805219995157,1674468905 -0x46eb42d396d1C9BF3E50c12134aC356768B8205b,195756899686612503772562,1669093590 -0xBc78937a1cBecF9FD8CbD986099F2Bdb0103Ff68,431327647254478081984292,1661172455 -0x91980Fd16b0A6FcD5667e86e322Cbb06cAeB4704,2429110683578195976771,1668326590 -0x946f4B3563057F30f28F080Bb6cf14a472be29DA,757138760512250295759,1681739600 -0x04A7E476606f17dCf6472B86d287c10535efA48E,1700028060437111153770,1670459545 -0x35E007dc2fF223de6b09bF08fcD15F6329A6ea61,1862871817233038703484,1714834765 -0xdaaCcb7993487fd42E7211B4524E6A94613CcEdD,371925330360731246961037,1642076900 -0x8964c1d4F8280de50255E5809B2A9D905F98608C,7064424981506636405379,1651659990 -0x137c869dbf657d3e88F2f416174709338020d504,757453491818867331532,1681933630 -0x02F273121e9D9BBac8e40aBedE8BC50bDfd494d0,1954380636501042349567,1720134675 -0xB88971660A12Cdd162a4d67d0bE37DFFE58152f7,10432517289109775272864,1680355750 -0xa48690B20C660487BAf9A1391F99aE0B88E78Fa3,671746378981698047278,1717085370 -0x162783eDF7c369795Dd05aaF5d09dD4219dc7e74,26905638290232638928734,1721932585 -0x6aebbE676ab514A916E77756350B7A8bb1E4faad,103493185151679883392859,1645762655 -0x2082c7D5E56C08de391eb5b48312Aa3AEeDfCF76,177969857137510340710972,1670679230 -0x2Ab19D91D356C8AB85E3C22968eFE95Aa1A0550a,7414695825744092092,1681800525 -0x3Aa85AA84B8fD5aBf06E2F6D428d21fb50C4c240,1062585923648518227959,1682061320 -0x1ab21891E9230e4a8c3e09D88E3C0B48D54f1a86,23441664983551239595733,1670289700 -0x999A77ae40Dcaa585308c176092cb03Fbb524752,154017104373442928475714,1638664025 -0x858cA49613881D84978600f01fA2a42Caf868Bae,420000000000000,1701245610 -0x1E5aE9D8A9225f641aFFACE8e0b58Ab0009Ef035,152051637446594951586096,1706110930 -0xC2fE917CBAd6D589e09992a8f373321449026014,1406050297523758228915,1686123150 -0xBc06C0d76aDcf5C4ca7172d649A9AF9DF9f4E85F,3700191162603020675578,1665526330 -0xe1DF070e1c9537B52ed1dC2116c44bD1b673722d,25228677972840503490036,1641082575 -0x4B10211eFf5Aaeab2bfDe798B7323033e9Cfe02b,600000000000000000000000,1712845855 -0xbC463cf440534eE9164336377c262E1EBd6f75CC,4727992592006518912965,1712813590 -0x012b41FBbebB18628DD430f6DfABF94F9E8160DD,43512341545383642052565,1664456155 -0xE252836A1beA95DB30aDDb2A5F6256A0AD34C96e,200000000000000000,1701779985 -0x7844Cd72923B139E4c3A7cC7Cd65ce37D652f906,2534144515831824101479,1721036645 -0x1c0d733d0Fd0ca902Ff8D9aC02B2924d41237A1B,3260663852191905602017,1708636635 -0xED0205eb083f3D31501721Ec43445C3150EBEf4b,2399096832001501295135,1646409065 -0x8D2E6A7329dA74635c6a8054bCd05F40eBd6d878,645750076191798247184228,1696347505 -0xC3899B00f71Fc03cfe7A89B155c7ca2D9688e87E,18998208739352168786428,1683387105 -0x270ABc6aBC2941e2b88797b2d5a233Ee2a9cdd12,4375657174824286440571,1711636915 -0xA64a287F973700388C631378067Ab8F01618514d,4500000000000000000000,1664743235 -0x39f62A8A6Dcd9C37a8B0DD00C0B8a5032D60d7eB,3615900237267166760394,1718980570 -0xfB0037E55DAfE012F13a7B696133E51d13465efD,4389501244294047651421,1683909215 -0xAaa1FAfc7FF9e2BA3A5526aC858cc09ff52383C2,51955044811906407880678,1694011800 -0x41D44BFC80A57e88651DbCb68Ba1D38c791B91AB,213885007914135301422217,1646309490 -0x8992c1577FBD097d1A5aD7E5B72a8F86d883Ae76,2268739937990325282492,1637845100 -0x12818EE351C5027347f155B0D81F8Bc77015ee7D,36381793293054923589527,1642327910 -0x7F5DC71A380B3fBcF56a3e97b5eDEC203D4B1e85,438912399816158829594344,1705758255 -0xD09e7923f01c2489Da8883749EAD3c84C868cbB2,645981671055192576218,1715010090 -0x2a02ef433f5caC79f4517d8af0599e13269e2E37,655965065655232688028,1720968130 -0x0ef1D06f51D9a64Bc8b7783B320Fb8aA103eD1a8,1255490603106604645740,1722099545 -0xEdd193e425e3Ba3b05e2aEd813652ccc757A1fFD,99383542853686805567706,1647583725 -0x5457Bcf021E4411dfA107B4120ca431672cc8b30,737555124939762699376,1662640745 -0x004F947f1DEe08d7d66e106Ef73979A92B047CEe,321026142314419870,1681739590 -0xbA96B063E1c871A7238Deb521029c171C69341f8,2992331116955298348798,1683536830 -0x421E84Dc43B05a5Db967ADAc16F231341CFB2195,757041341687592790539,1683109425 -0x3aa29d06f316beE250210E476549b1f43A34b1B9,49099766022818729875951,1720173385 -0x60cA02cD012B87C71600a2374c87991Cab02Eee3,24711742448033360287604,1663066475 -0xb783816628AC38131c9687d558389D79D3F29265,197359621769958597109245,1662317695 -0xBb2010f28d2EE10A0fDde3204DfE6166b436CF64,630820072769897148498,1720800195 -0x365cf5a847010363fc7a2981eEf19184a2130205,649396232566971861936,1717679685 -0xb0374Bb81ed6db6af7EDc8672379792ad472dbc3,757341875204681508476,1681874755 -0x2A316513f9a0d01f503063BF0bAD1cB089aAC776,18113472276439166028981,1669625135 -0xa934dcEeBd4196aeD0728ecc49bA95218DB1E347,5044064294710913806052,1639147155 -0x2E64944F48c6d954fb8a6019479c1A0b0C16F104,62823653757042989665848,1709836900 -0xbC3fB2BdB6F3de80638943F16fd9c65D834faA4a,153777155450611093642317,1683694795 -0xD7fBAc7345eDaFa085b44625b6dDd6255AA83337,749885812386660679095,1684326200 -0xe61d448C051dA10e6F1ea53e953658a8bd0bB00B,2583353900907917892545,1713433285 -0x7B5E58994020Fc30836D8506bcD8739385fb5f38,1508093840943947440485,1682384445 -0x66132774eC2c59cB2Ae60d4f8EDf509784D8b3B9,3583581662831460237298,1638369065 -0x1bEA1e66F797aabDf293dd5F5534C7F3F9D583a0,316279687818883016057707,1677436480 -0x27ab8191b67Ae3484f6fDF299c4fF7b69392dFDf,4689034990821840515677,1721722395 -0xa77Ab95af28eE92e4c1235BeFEBA6830Ca830F50,4716494812462985789050,1668926215 -0xF62B91b0b50B00605ABE9Ae8257E43f078869207,754662955810325385636,1683807030 -0x5b6CC2c2C3527941d253ee35f285e1336Ad6Ba96,22850154667114617483862,1669185705 -0x85e5e089782a3cAd89D1672DFBd7A9300d635Aa6,18444613803799394696203592,1714733910 -0x0275280CD8D7b7abF56751caa244bE1df8E51631,637420971950054064183410,1701253610 -0xEf2be86C959133dA018FcC008758a387177A4a8f,206241071620283496360240,1643159330 -0xA9b92D47B656D05007A7f846Cc6aA49B972961b0,1892401256879542501352,1689731260 -0x1f5348A8766e73f548f093da7d2BC34ACbF1CBE3,36702110097806186538340,1681690695 -0xfe965E5FBee05a36344b19Dc523648359e743dFe,633623968055061887131,1721169520 -0xdE517E902E03e422e77EE7AB9FFFb447b5551CE7,3708069142752546313764,1645023955 -0xC867B09565467bb96c5f112248f11E10Da0C1dd8,737123491536002636338155,1722068105 -0x21A98a1da4850EF7cB053881250fCBB4Ed6CF11C,412787496529096207,1666442330 -0xC87Cb8942Da9bD121072f8f738314F0bff4b4fCF,4967897633089650989539,1710430905 -0xb582571E719D14aE871E36976AFce8B98171d903,37780637595841393643270,1641168560 -0x03b1dE3e3ece5d23E3fb6c1903E70a86d34424Ad,4673381432946315807,1679397820 -0x165754508186D5358BB98becF17F14A553d56EAf,33672763594866062962215,1642768775 -0xba99784B18aC9C78E8A67AB7119C0E17fCF8C72E,991454518616912828931,1713744935 -0x2222F3E1512b8C026CAe7BAa59b7c6719758D4fa,13697098713238950275280,1718086915 -0xbBD5c56A44C720Ac59528C1fC279A87053cc02A5,288501765692640695538000,1670812240 -0x5550c24DfFcC3817C37f284f7Af1c9681DCA03eB,644136455049617162,1685803060 -0x6704374074BFb84cB7B53bF8193459bEc32DA04D,99970773360542247692139,1684388895 -0x88527bC2112d927bf384c7b804f71cF3C1E92737,3230639561938088503239,1659162470 -0x57F9d7956CEc5192Dc5c55c989033189587c7E68,1011816776537251508594,1665036235 -0x15fbB3E290fC6dD5508B6D39b3847af20a5A50B1,8758348653672114784604,1702061715 -0xB5036A868510b1B5F99F75645B38fC13c1344f90,9673527662676619553650,1674313660 -0x108b77B74434d1A291fa61F26DF061D8A2Ea1410,696759708303366911962315,1681740795 -0x22db3574F74f29A1887D0F46229b49Ea40d91a38,67559148146582896720161,1637171920 -0x87A884C120BbE5378fea5091c9a9Da4cAC297C84,26713658336595477300853,1688562705 -0x033fd4DE9057B3F07815848A370f2AA6fA28d545,2053780375333299397385,1711681475 -0x9579f6CC80Cde7058b2930f696C27b18FEBc3F82,2448876679708808974218,1706633135 -0x541702E2FBE6c1511e7efe0f982e0dbb25e8df50,957745358570676890611,1646314405 -0xf6386459012aa05732789f8ab34aD3d29e883741,3693921279936964643664271,1685717695 -0x7d92549Fe161cC0fa90A30eE65f8Dc3130F6DcDD,1288648100804442147971,1642436035 -0xc33a85904e04aEb9B080f6beDe80e1f65B6b0586,7066530177496053330,1681787195 -0x789d55710460Adb1dA36303BB51212f303b2BfC6,60733082632432346435805,1683728800 -0xce94cd5e47Cd87860E2E938B13C8eC93A623bCD4,2000688944881205274310,1704897650 -0x2eb536846075f2337c63893185CdD66A91F06612,757537254555114465042,1681654020 -0x9B4b39cb3E50E0753cf5e1B4E95a64Dd71b06910,787118066247937604534,1681646750 -0xeAA85E0447b4eFD7869c6845575313A1696308E0,90200043562641223590893,1716770085 -0x70F4f6E3F4C626Cd36ce983aD0a82c2ADF786Ba4,712226630419599443445,1714203700 -0x1543316360B09A2866d24DC6cf893e94f9774d42,231521474221975549691686,1704912640 -0xBF351eBDb29654e8C29A89B3EFDA58141576e6A7,148274725101562994684008,1716350340 -0xF9FcD5B21B72d90457065935cdE16A99af4e2Db3,100364525608173449822315,1678398660 -0xFD36aec08a2145DB6BEbCeBff57BA771Bf6A0eCc,43029804049213129987695,1685539635 -0x65b75Cbc1ddC7a2eD30F04cc84D926052FC7b8c1,902386663584123583206,1669136800 -0xd5F3F1bCE213F4cf165D6d0c9AA68E320f88df98,25650998769345617886807,1708004855 -0xd66f90799C6D663C74c604Fa0Ca9fD93281E83ff,2214662227369147993045,1720858025 -0x0f0e4604464332e44b0C7043B40838ceE23336d1,632231057968092387953,1721065686 -0xf5E6d5642066f6CA8515363FADd2DC2A9914a0D9,194981773280509575173,1708202970 -0x4240BF9CadC2E17f48dEf97D9c068Cf98283Ef94,1003682173492367456898,1704024590 -0xEF6881DCE372fdC99d1932838B024C875e27FBC9,80174139870338808,1662674940 -0xB15E48B5a8aBd73419af2de742A72D2123674949,736181633304284971196311,1663478245 -0x90156945974C5a5b2eD89982a11c8B1721bCb422,9234442620777435194640,1653330745 -0xA4df91E30dF20a9F9cDD91cf5A0F141a6e1EBb59,1249456007856095390108,1707904220 -0xb3B35dd2dd386BEa3fF58C10811f9022806d1062,757572729786272959128,1681648340 -0x167cDB62fe34eBc6f16fC84834A8f7aC8B16a125,315436103745999885549289,1663233530 -0xbC2db65EDF0309B0807a6E2C431E2E8eBd248AA2,345039173453677723258608,1674061360 -0x842dd88c2d470568016f04fB07dcaDa896FEcA99,6988340081268892080613,1716106505 -0xe77F0827D0314CCA38A5DD12B6fe12E2d4951F50,300392878506593762411106,1679181450 -0x0082Cb2CccA9F537Fa41269680CBD94eF814673D,8533628797329441031230,1663922635 -0x0c2ceA1A397468f8a93aFB9F92F747a9675CC948,444943251715295100883208,1668013090 -0xf014C61eA304dB1a611fa01E7260e2E99f3AdACb,6454795628823864225923,1714936790 -0x5AD6D3941716F5f6Eb84AaB3EfDa9c67389EDfb2,4816046172135239514835,1676996245 -0x4CB736236b3D6B2e3561791022C855f24c738043,757563837950387339675,1681649370 -0x6CB4Dd53aDb878858767a4666f2E4eE7cDf9d5Cb,677345478689307639056,1709831515 -0xE5B92d42B58076eeC628245104B22c792E957C95,67608922285623923566594,1704014560 -0x96d55895eF5FecA7B140D6446b6141625C83Cfbb,1758707700713330841970,1681801390 -0xb639de908293A919E54392979Ba9DE90CB21A03A,315157301361556191638508,1648695835 -0x02bFB2976E641Ad2389cc679B3ED55088cF0F025,685888057303505798992,1711439455 -0x3E6903accD6bEA9728A8B223ab614A6Ab728fcfF,639952558782865350350,1716651130 -0x3D4D39CEbf9965C9a6f62BB56597fDA2300B9857,2234839552869505229428,1681647825 -0x407c322E2B94109375d967E20b04924F4D438332,2907761780601866839408,1709902225 -0x9F12c061BdC41e8c6203Be071e58995345aC6434,749025178354669363395,1716906575 -0xD6D35988FBAbE1d874FcfE0Dd4B1c023605B9D2e,675534219084794534885,1714490225 -0x9B1752EDD65E11AE25bfd007Fb844696D9556D30,936770028592876293105,1704024575 -0xb861C3c63EBff7F47A0ED0AB3425E699e9Eb8ed5,6343002449029503113220,1714133335 -0x961D504DE6939DcC680fC55f5a15f3Efdd1a24D0,13511050679803395278798,1638996430 -0x48Bfb459a16f2B5c0d2A71B3588bDCF9E024b2e5,9982178525527943340047,1638483290 -0xF33671429c07f361a3BE8B241f83506aAb93BeB9,1241331942294674057334,1721244770 -0x4f2Ae6Bd583Cf89d3CDf479aC83C8cf158004cef,757929353185622991825,1682957035 -0x6C1684706b3f09Bd079Dc34dD00D3ccE5ebE8b07,64961937724982879613463,1637823990 -0xd262e762fd74Fe7EE904362C3F3616cd0A17Aad2,751188210156362430138,1703878840 -0x9906a2c7516aFFF1B2999bb0bADb43cAe7C2C012,2134183564694138071324,1704798935 -0xFf50Ae279397Db8FFa113600ae5bb17020aF88b4,2631361589745306324319,1708345365 -0xc8544c629816bC5cBc63c62Ad19fc27B772935Ed,7278010414444173474364,1649833040 -0xE8524077eDdf6B30cf7868d486ad328Cb7485fa6,1026610970177707459513,1662667455 -0x9499A15060791EC20375B1C73BceeEb19fb1B8d9,156005964289742533681152,1669462435 -0xeA8559379eAA1baf98f06fE473f5B2ddC8A9841C,1765206904157813028258,1681801525 -0x85e13208290b7aa76f74071BBd3478fFB98f08b4,33333900563816779431772,1704896345 -0xd4cDAFB138E565C9bD301Fe05FC629B8875469cE,2158190885878820492439,1677580995 -0x2A8BdCD1f001eA67Fd1ec51814a94149A8CdF489,7034596837188807387,1681787425 -0xf00E8A6ad29180107FFF471F67f72c64bDb9119e,16663029134216151410562,1665590610 -0x1b50E26e6B61Cc217E823447240bfc41de8eF227,1191190489010344137776,1721748290 -0x9D586FF39FBB7441660Ce67E50c74908dd8c3445,736033593894402801725,1704024700 -0x5BC51604B095Cff3f1CE0eBf0De4DE7F2f4C7BEa,84329501706186248454568,1667480700 -0xc9E2CB16dEC44be85b8994D1EcDD4cA7a690c28b,708434841503820328513,1692617045 -0x76E09c5d80DBcC44413aA1b64955eDE92e576E68,14022174569449883023577,1677089720 -0x8bD4D7f0A2d079b0D6a58A3ba05eE91Fb8A9E359,26880758237020608411125,1715088085 -0xf5EE916A9Cea56ca36CdE5457aC4748D7eaA138B,19512703646431481643626,1670376685 -0x918173B75F7FbABF5E0A680a2eFb792e59802A88,55071205814428693676041,1677161195 -0xc3e6B2Aef9fb2B64508d36F63F48c8f54CD46dA7,640509098531781739538,1717565050 -0xDA88195e7c37C25Dc6D11f35e57D531BDF7d8Aba,7424383438095542534,1681800755 -0x631FD3595e3Af85F9B57BB98DB6f0bD3c24Fe4d2,757221251089246547672,1682173405 -0x332a81E9AeB8E0B6E0750C133e759d9284073B9f,12213165390431106274562,1678896450 -0x1Dba3dEc4eB8Bd12E10fdbEa953b0a407FBe4e51,757212396371054030235,1681799015 -0x6f02568f5bB061E964eebC5900156997441a3bE8,2000301316171513611457,1704862040 -0x3b1b9Efe395a9C6398cF9Cf63432441B6A71EBE6,1122697080256449993379,1683630715 -0x2dB7b2EE1769003723c1f435Cd32dC00ffB490f2,1513890191760746464231,1689756405 -0xAcF8820fF5FDB5900b24f9abe0f3Dcc83d24b80f,643167287287110145893,1714572855 -0xEFAf5fe345e2558f8BE92604D7c4Ce1A0E46BF62,1308250513530263468695,1709620955 -0x3e8C9972c0031C85aFaBdeeF8F814f5E10aE4465,817047661272778140781,1669033275 -0xF58df835C8E8B59EF52cCf7385B09079d7897b77,135878352090344855405733,1663068555 -0x2C4a4be8CC60c25A6398F4c4312A6A1b33E22630,728127839855750,1718922670 -0xB96A3036ee241df6875ab7b8317e8b3d80CFB378,7322723409378387104762,1686377950 -0x50e22F5489bC1037bA5bF8f00d37c7921E3c2Aeb,7950557683598513512301,1711303185 -0x1a195E984040906bE2bD8EF483946b15056017B2,3200046802948103,1717599865 -0x61b395fae2255B7f22Ab9Dd8CB54edE88B66b2D6,4166029967836887323550,1666521410 -0x4Fd7416C1EB8A1662641f4F9f250484BE260f422,170401775917677427,1685116835 -0xCA36989F5383F20e6f3467287a75E196cfC55Bcd,99770746572637462332470,1681500215 -0xEFe4B90648e17678665C0DF73bE416e65cD4c4dC,17778813691985050896618,1717993670 -0x876F7f40B6b2a42A7fA2e45187027E395EC70CaD,1494178242380949986876,1682094540 -0x1fA11f4eAfE8cFe89a72427609461e9dA5A8a05E,753857859661202486436,1689641525 -0xF891E4D500467d3a1FaE75868D38A4547c7b582c,757221251089246547672,1682000535 -0x5b93fFfdFA341c0Fd072062119FcC07995817A11,167670407729955457238442,1722254365 -0xC2B7B4Ca87d03FAF8eF7604B6704Af280a1f4C2C,28281211072486665591331,1683788755 -0x30c957DF3467edD1E34390a9C28f5E3D8A1F4774,378896942425393049094,1720190160 -0x84155178173d28261Cef4058235ba6a375Daff7B,662927746708003075414,1707564825 -0x6A83864486004A842985C1729EA40bc82ecb3Fd1,1883153417519748987582,1722282665 -0x6c86714A4A4455706cA47E49760fbb297239C72A,9069762594383788489298,1651759075 -0x2889B9c27b13742d4BCE3f6B82bF746D72F788C2,66873099218647231578940,1637699740 -0x568aa10110B8b3f47B0F14c9790fD7F748E4b6e1,32935909017953335629227,1677246880 -0x721bCD65878D51aa6024832dc69325DEE17489cE,89981313264939978887579,1702180765 -0xf42b383946bE6E64DC1C48d7e1fc727bA919e365,2749606193409954757769,1667834790 -0x0F406174276C9492AB387be20a1C84688901Ea2B,3145352482432866483180,1653829555 -0xb7463dc700935BF550412a762FcEf0549EC901a0,7573043945390247997317,1681872710 -0xcd3e7B2e9b8cFEe6f82fEfe9951F72Ea319DFC35,7424383438095542534,1681800725 -0xDB94CD37D4e07aCeBc64dFB7A841673c28464Aba,478706671317865723402389,1684899580 -0x01AB9ee9Ac4129aCc5c906024fE2BAdd63E15645,1513890191760746464231,1689758030 -0x16E2bF96e39Fa81a10fc043b7BaEB56eEE0b51ae,4524886073603758718758,1668097865 -0x12F1FF859999da57c31786F7676c924507377049,6559409762791859177136,1708969525 -0x17AA7b0D17334C5EBBDBac5c6336E224110f26ef,4997704063006128817985,1709399765 -0xBaf7aF71Df99C3038508A9888dF6918f33F3ec7b,212377032607061735222122,1647878245 -0x6c160AA40Eaf62a54271000afD0425b25D658246,4057442124593048739777,1648075160 -0x1d655FaD023152BA1e5eFaD808865AdE57ce8279,904103766465739015342311,1637825050 -0xC5e789414db76D2FF259D7101dE79E09A9a5D1A8,7313779006342789264714,1703353670 -0x1a8681a74Bd6C3bE84dCCA6c6008BdAb52D4E908,4997765580353417013105,1637840035 -0x0bD49B143d3bECF4C5CB60CA318F7D29b047201E,45422619036177463060488,1646979250 -0xFb503A1333b2f9517Cbe92259Ca604108D2B1d7b,650806323274233150669500,1715315000 -0x0252f01cdeFba4586acC786990f00cF7494C2A3D,847171294967694597244415,1676998525 -0x025b362d989b266dadeCE6333f6D6d7BACaeD1a2,58567574777237724796032,1673530710 -0x66296685D93687aD206dcE272A5d8b5665F45864,189279961474706212550648,1701620800 -0xA662854e57b6728b848fB13608Ee94FbdC799Aa5,845497140431116966102,1664639910 -0x52776700CE5EFB633de50Ed4AfC1b0750C43Bbb6,4541951107649432599273,1681772295 -0x09577b4Edd055EF9943379D0286540F60BbF8c52,759009502809952601957405,1683696055 -0xb3490D193A2Be21B04b5AddC99DB00731193D352,104990355977091820810199,1708771460 -0xffd774345712E22d10C9D6C19176F71D81ad5627,136607634154168588846320,1689346170 -0xC7721320962a18CFfa0560Bfe538187cF6cd7545,631716839024524891300,1720288355 -0x6f099FD4cdfcEC682b2A949eFc15B2Cb85Db4e50,20649352456084847164424,1663256580 -0x153190c9A6fAF497273b9a27eD0fF2fc5E4a7B9a,8109256207494098906695,1692613945 -0xa42D502c6Cb989FEF6cb5BEdd74aF837Ffee4bBf,4982628618081928148672,1710763595 -0x61813384322F85654B76D191a67D34bd275beC6e,946190530115139343574,1689736420 -0xA87dBCF9caF98E6CfB74Afb9626eF460889db89C,4948925335399977315790,1658623635 -0x11BD8258eFcC46A8098a7a0B1c819C40C5d2f01D,325021005190473423946296,1649657675 -0x1407E30F7d278fa6C6468CBA8B0Ee2345E9C2B26,9907532123974226546305,1642625365 -0xb037E02fAd9bbCBE663C752C707aF02fd7B44Eb4,3961917965711308,1718805575 -0xC7DE1757336d369CB47C82FD630099ABFD634CcA,71575027457299817345233,1669073755 -0x047D9980A446aD917BEB69318De36DeD7d322E54,3755734881880866360652,1643715285 -0xde12f804E0AD635B9e9399F27D2e7630E75Dbd68,2113642290749219588698,1705643550 -0xf0517e1B8199f9EF9444dda7E6d013b84742c025,2000972287906040401021,1706665490 -0x5a96C4C18e8f977A4ff297b6E355E24f1A9Cc348,5851015127046873800584,1653343670 -0xC20561a589eD397261bE86d8800c68e1Bca70576,630207563386552768939,1720801565 -0x45A00568097bfBD795B6d881E988F36F6F0A41ef,757350528151359178199,1682066780 -0x19c6DC027A3FE2D0c713288c687532Be46D65bFD,138596797460808720157339,1677184670 -0x20F37e90e550eB98C82Ec3f7B764309F46dFc190,5025264673892884752,1637220230 -0x594a668a11a7Cd68476A0566a030c1F861eAC7b1,639869161675830274962,1717566445 -0x82764B60C8a41018352E3640e98346f09ABc2BDd,1765206337348198924108,1681801590 -0xFE5549671C1EE9eAF055371fE1E0A39Ff67DC0CE,4516410244046759793327,1709712610 -0x4CB3C431077F0Cc69925bAbDB8FF920e9f54E126,56029318680507244303831,1683118720 -0x08608C5C0993b65E6bA120Ba379187a71198ADe1,414278659962529616696536,1670628680 -0xEDc1Ffa550D9D052238CeBC8d70aF87Cc0A7c565,639061663911184415464,1719610520 -0xC5286732A4057F1BDfdDab4702926AeC3B48276e,198760689585363098994342,1688433545 -0x2ac30B4e74B70cd615a0d528Ef66C90bB16b9bD4,9830249093885636933975,1669883905 -0xB0a559E83318Bf265A14C9F8968dCF4111B18cbc,233234458909798882743542,1704473125 -0x97a8f7b115c49e042405346CB8664c94012f305b,57933972112674947960739,1662626320 -0x07C53b97a6076cffC462D3FC754308e9494cce40,19900000000000000000,1710844640 -0xD5474601BB96C80643E2e87Ec471689126474916,1582109680128182428570,1707738295 -0x3c753748F8F8597369050668D8D225F3c18753f1,20742278947402037221516,1707311070 -0xe670F3E7a2898f28B93b44B939280Bca80234E6B,318791122989495530,1637176760 -0xEaA9bB9Bb73771b770c31350A273e044207F9A7a,1515109125220678640766,1681826055 -0x56cDF37e0659DBD2f3269ABe0E44F10cA780C5f0,86765122392300751832768,1709865610 -0xa53C580e7FF5E772333e8F7399e59023350d84D0,211306138821512410392382,1717608550 -0xB931Eb79940688E9e03daA9E33790e25F7f3f897,60427813612823620123112,1716634915 -0x7D97408ca32b4Ebfaa505dd56A073d37F2547477,3805168976081160270561,1642973280 -0xCFd21e91bDD268C0936Be49F889762Cf1Dd64817,12628069291814491415103,1710946840 -0x577b876eE8bC581456143efCe31a309c01cD2F23,764339264438244423892,1692618975 -0xEF4cF07E318eD19e41f3D35D7F91FEdb13802d44,2056727639798411644118,1705813855 -0x42741eA7F1bfEdCD044b32AcfE85b6A52553Da61,711270773700082153816,1692615355 -0x82448D2D2ACd34e13D945A0d28786443544c7dFF,637780721208320732061,1720031600 -0x66dE7757E105B1c7602289E37Eaf9C8C311F4366,15847210628201062635736,1640119205 -0xe2e23Bae2Be2e33fD76EA5AB6fDaD8c956Dafc67,155519584261416813562956,1675645980 -0xCCEC07D6880D309C5C122416375c60d3aa01b397,774888388154664151505,1678009620 -0xD293065B2717c2FCCDEd1FFE7C007b68dBefB2d9,29845954122338611108055,1638014650 -0x3FB22EEB1610C5f274E639C83dABE92F748141b0,1586514132440244304821,1699387520 -0x834CB4F9e3c8463C9f2Ca4d8Bb9f9F512788A959,636053955371314460906,1717765960 -0x621c4bd9f48E2CC7F49AE0B946e808133cB198f2,767797491048444846345,1682348345 -0x001233E39DAEAdD7C2a2f5F5F33F2EaED1d2F714,2350922805497520920130,1649764670 -0xbC645f59392916b2a7AcfD4657D737d7bF5Ab532,757341875204681508476,1681874730 -0x653ef9A98dC4fC3ab79fEFc1Ad27581581DC6A35,102438640523089375385,1671424160 -0x9F2b88B695Eb9338eC5362ba7b24e536eAb1a7d0,999968966087478484197,1637310115 -0x9bF97A13f90F9973A95174545004eC5289aFeD28,1892381060230278687148,1689750405 -0x5Ac14CB24dCE00A816579D2E313e83Edf8A458ca,908944190182640797838,1681671855 -0x1A20976D77Ac7C05D3F63937e8d3CBd51807f7E0,2947711409080425304314,1685790185 -0x8F64D0Bc82557FD8c2be558382cDF793c48805C3,194529737496960266477367,1688436855 -0xE5971B225Fab106f906260A84b99A85c33D77BC9,1758707700713330841970,1681801365 -0x9c13Ab2BAa33D876025d9c7B4E9bAD44Ba20e73d,646271000642529577655,1713218085 -0x85a4a1152957d61F1a630074B74F708a9bB81F21,434302421227278335,1717075050 -0x776737f0c32A3872EC06be5273072Be3eF33433D,7911024572010451926232,1706864260 -0x1cca7A9B5A6d85ae9796FE9c7954f162298E89fb,2468165460097452603034,1649398190 -0xB9690Db52C0C384D2F9BBDc21f888B683C9263f9,400744492371622089559947,1712844190 -0xe620e1F969Bc3a24Ac96D527220AD6B6e2d12843,1143733441630453767080,1675938945 -0xa8d13aa9E6967A13189D556AacB80853328cEc05,32762515033962674094184,1711418035 -0x3d9723281227fB1BC4430f7f3a1422D86D11015c,10142150701607417077505,1682921870 -0x9F0236b03A72298aFAc515ecc3c00C53fFde3A63,132347482887625241234708,1653005900 -0x25C3CEcF05B6b4Bdc07e28A06B97BA2FfE74bb37,19692845619701557687546,1662642495 -0x34F469BAFDaD78d2b09f2D84499296610fF4Fd28,7993268387659057734158,1705802770 -0xb519D5fAbBDC42dc9BC533a3FCFbb5456434c1d6,2855266087048710066707143,1652659020 -0x8cA6d7C6046f2f450B07CDAc4596E85f823Ad3eD,5285476098355069285659,1688208535 -0xfA18799e2879723c9bAAdbE6D55f4073ba979755,10215976133470354160226,1642671345 -0x8Cc0571b2115b1F0a59BD94Fc4e4136AB743602E,1255281896803727107876,1721738175 -0x8362Bc0bB2ecEc92F29b811843a22eCc44ca32d0,946200628439771250676,1689731445 -0x33142250D8BC480C6850EEBa355792CB4b9112a3,171899116577573955076882,1637387265 -0x2c6a10077e143253cC3e14d3bf6D402485F83824,36238876410005298627710,1658697045 -0x679E2c4Fb7d434670f2DFe39C5b8e127Ad43eF4f,9102681909371568,1719946250 -0xCeEA91064102FA993b5C34450a24CAA363f35AD5,3226788359150227533988,1708017315 -0x0f02c6A0FE82Bf5B8EeB88Bd9ca1053f3F735a0C,3310731271949445935711880,1706289215 -0xD1ED3AD4F7Db0DE269D1978BA6f4B5A7962d490E,105338228077136811405376,1706358135 -0xE539c500bc26109aB8cd247044Ae9B59a311ccf2,754662955810325385636,1683806995 -0x4eB61D6D34A26173be13ACF3243c385FB3d56451,272715626902704077811,1639415030 -0x9Bb751050e6D49d6289320BECCd91Ac7933a9c09,2605429506680777612321,1717944890 -0xACDB14A0fFe0ce4eCd746507Da19c37d237eBb86,246757813475588157515518,1683883765 -0xaC2FE8cDBEaE19DD8ac77e4A95AE464bD49DF2c6,761360593435204323924,1681713070 -0xEb002422A0B8D8B52f46f48Df05fe0d7B269df39,87706011572414345237033,1650834080 -0xd5acffD834DBB644Ad05042620AF71e233Ae8251,23407300947106054583251,1721929327 -0xd9dF47DB91AC02AF72aEF9813A15521e0F313441,630156725125847868452,1720592055 -0x49633e9Efd2177fe180A13d5B610c04833c74f4e,593000000000000000000000,1712845615 -0x9845F17F1dEaB8B9710C995794819e4275d760E9,832467249357590942375,1681819555 -0xe1a3157E5cb2A8B81E1cb018dD3Efe2c2F788D38,16300457979797125466976,1640029670 -0xe06c54BE14B1F39bd5D384f4337cEA84a4fE2Bde,840867365656839,1721738455 -0xC48049Fdeb138ce3472De4976539BfC657D9c3b9,5809134676751925330853705,1712735565 -0x9A1524E938EcbB8d51dAFA6DCc12c3963c2Fe03f,241521798100574110742888,1720459915 -0x177148ee9a26a57412c2C8A88F5660Cd57033634,315161093420641430,1670816590 -0x0C97C6Ddf3547e7660f838DcF04d6A982A698119,760499691430292124510,1682084565 -0xeaEbE6CAd8a025b9670792a697d861dacA33d313,2632477399212441604309,1649332295 -0x9c28b1B02680B86029Df4E764F5aAF35060284Fd,49424516054374094632559,1647734505 -0x817679D7A504e5FD848f1ACC13cC947343B6D250,3784762120460557374297,1689737495 -0xf7b3bfc4C382e0acDBb8F96e8dcF49fA535DB49f,757419525109722900176,1681690330 -0xFA0F1989e79cAF7F264B16Cf85b77eCe770d0A08,630365922946917307455,1720601760 -0x6B94dFbe350Af833Fcb469792d3CF1969e6380d0,5122796735460735628726,1663303785 -0x1fE7d6E6660610799d7Dede3aDF0cfA396bab031,1513890191760746464231,1689752200 -0xD3961378B677E01B522054D2D91039C4fB688359,840160601979974191457,1671656885 -0xa19974171B24A0dCA3C6E735d93b3c3389C96b68,600803406082959071115882,1712846130 -0x35B42f3501d8f66042f8C8fD37B35e31c1FDeE0F,63962389911364896749656,1716291395 -0x600Ee9D839FdEafc505c88c6c22e5460551692A6,1035315922869614108,1689186405 -0x13996160A212686E55C120Aef3635D705e232D9B,757163913321654635888,1681733840 -0x792f03893e005b4c835CDa4ACC0DaF69a5F529Ec,818138903137435804091,1703879060 -0xeA8f4ae993F06f457523f4125fCb43584467081b,3021532503263289553145,1702290385 -0x1BFa7Df3b8e1367ef58d0e4290fc83FBEeAB8973,708605769238278605612,1720475035 -0x7825EF7609F241D404e0124f74DcFD95A91e1aeb,131211003562579075430397,1710236625 -0x752045da7965E412847D03D6e813763067b61967,7066530177496053330,1681787085 -0x35F4E60D8fd94eC4195D0e0eD826054AcbE7fc91,757453491818867331532,1681934625 -0xa7A532f0A63Fb1E408Da12a765EDE45dE11C3d24,2399096832001501295135,1646409165 -0xA19f6999A78ac8c2dd86289b054463f145ecC0DE,15225222662918557063885,1721914005 -0x3F2e8912a399980DA0D547D73dbB6ac97B4f3d2F,1002546865376530757437,1690301470 -0x69C110f7b172a311F982f12ed949250FD49B478f,757554562610339320383,1682673830 -0x3E6baf85bf93D25d07fDB608fD0a44Ad649feBF3,17043630739836396819460,1662916045 -0x40AE084eD64fE0e4D9De25a87B0f358efc44C04b,2399075446977679502131,1646409555 -0xc4f74a5f66B60a4BAc8d00124d99C31a19adD3Ab,631005490108935674013,1721134715 -0x271deC91cFE33F4d0987F964Cfd108212cD64119,28511409733141893990894,1719502840 -0xB38cFE4f83ff18397ddb121B4E2564b3331d852D,2399096832001501295135,1646409095 -0x425AfEc2CbE325355d8F8f0B3B6b267E0dd17Ff6,757546529378951080750,1682374540 -0xc5D4fDbea6a9be1aCE2e1194b7cd033eB5d66dc1,2477770128083569771652,1692615595 -0xF8C3d7f0E86fB92A2d7F2C794076d447071A2aeb,9951327840824882086356,1641987200 -0xFfD2BC4d3fbEBf26eE8fbc7099156852d6E6Fc79,1253176993049443610855,1720277490 -0x69660b93A7a6b8f9Cb2C9718f1Df4b9042610FF2,540800943683513824,1681800855 -0x837A1ECaFD3729081c3278d30815851F3f3c4836,549575052460522000,1681800935 -0x2852Ad4755F92FfA481857Aeb059E2d4e5E993bA,1925760948276739,1717547410 -0xaDbd3E993A635B1f5F65e83725255D24B75940F1,4459234004644297448274,1679590510 -0xAb84253fA7ec8542726F2b368f90beaA9d4EA81b,32763779168291053568209,1701213420 -0x703d19f122C0F59206C90274B4c5EFde726c4Ebd,4461437060975029941477,1684307385 -0x7520416f377390820366099b984faFF70f367Cc1,4293413312299823932575,1668835315 -0x0dD4015280c024210737BcC334137042242B4730,946190530115139343574,1689732535 -0xe8592B3a9ee54472A0115262871eF43B5F3e8E53,565296647191728783595808,1712842480 -0x86D1FE11A00b3eAe5aEE70A11bc87b1BA258285A,28789764132887675047303,1646164080 -0x656bd72FbAbC6Cfa53b6F91F7DFA259170a57BEd,6644973264769935653529,1677047920 -0x77582686CFf674Cb6357A61de3391df7409097De,16976363264605033207528,1652892705 -0xd16b7725f97729C79554Ea857a1A8962Cc42493A,13482937393903630,1712256700 -0xe617edb6CEab4C8Bb2C1F5E04F1e187c0E92810a,946190530115139343574,1689733390 -0xaa50BCC0Cead8924a6dA8cEb74B299D3cb7bb39e,1244098481605822349943,1677491380 -0x24E180846B57614d259c5bE0ca5Bc37cf5Ed7427,3427770358179302,1718918295 -0x094d5152c0A067C20C9356140a3B4AB3F8581E7A,4392755239449863,1720069090 -0x593C1F913fFe11eB410E7f956361ADb370E3E702,1776664746533090,1716288560 -0x7c0c310Ef956158B49a9f55554F91D97Dc8d3939,646271000636095085591,1713369685 -0xd16639F413a16edD7067cF6d253C788A18A18804,757138760512250295759,1681739680 -0x003DDF21FaBb44eBdeEeF3778Fad0527f61C04ed,3765345923550154803281,1662658795 -0xd70225b28ADB26266Bd138482aB64bE9e01ff215,727548612302173586192,1692615085 -0x1F8682A6c2bbd813EFe3AEa3AF19c2E153Bef2aE,640429534586362493987,1717243840 -0xA1d58F7Db63C659ED7BbA40982Dcd5B6fFb8a9Ff,284923166571868862,1647513290 -0x2C5E1bf1f9eC6a8eaE13b4f1eF0A8A8637F42451,300201182023253969,1663053195 -0x9b52132E717de64693995E1867ee0ecd93D2A2fE,18795286217879742548701,1642090170 -0x82403DC9544ca3F09Dd96D4635329b0C44081969,6802744037635991114943,1718086645 -0x8488e618fF451B2C0bA4953A54060a28931bc4d4,946190530115139343574,1689734260 -0xF35DcE3a88a6b2E2c3F6AA616599AA0F9FbfE522,4176715837849830325882,1683131940 -0xdFfbF8EC5978eF6dCFbF1b5B8E48B3325C764F24,7920317243403723251109,1718822610 -0x1CC62Dcc1d39319F9CF0111Df627420C88A42eA7,40953466097030331038415,1705613580 -0x0864f308B75b67B604Af32e74f39d3FdfFfd506D,549575052460522000,1681800980 -0x944B27E38975d4Bb560C73F68185Cd0403687b54,837738313487834888452,1671657925 -0x95DF1bE60a1C33D649733e865Dd3A7BAE2628Fa3,34063668358324788989562,1677753225 -0x037d7dC68b9f46400Ee33792aa258612AD5045F1,757385028926290582718,1681696930 -0xe7DF68d29869B80b5d396bd8D99Ca81F65263f0f,7573043945390247997317,1681871785 -0xEad5Ae0722ECe4CAFd63e2B289Aa23ecE2c5A904,33949181167816537743309,1665510515 -0x6fFc3b9FeB701644F98570D7F1b29c2124cC36e7,26933637599578717207940,1714898890 -0xb39c34cb06864f6721ae01A132daa839759bb3cd,2631361771680221246144,1708345135 -0xD03fb232911EEdEE1B25707498360414Cc8993C7,90826170159273812418575,1712845235 -0x71c7378ea1458fe79bbc02f651187E59e044F4B7,902549239757505101155,1681785020 -0x21c320b10AB9Dd61DC6308d7F4d3fBFE6C8b6Fb8,2028460561862003462366,1701592940 -0x1Fb68DBB6863fAB309A336163AcB0B83A8578327,2629880595548929663087,1708421645 -0x3eC8021480AFBc8126f66F35023B50cDfDBa3477,19198224516338859645940,1679613185 -0x8348F4b3feFED0791818d02a5C08E810FDed0eaF,32352113989790950151714,1668013330 -0x42E523cB44fdd30CD83de447839300d02C5f7Ff8,2460071561611213004375,1689755995 -0x73e148a52e5eaCf486837f5Eb99CDe4092785d0A,676236702894827404,1697632955 -0xe1A418035edd658a5E97446589E97082E1905EA6,75166900907108748493932,1644678935 -0x38755FD3E12a4d5c72A2cA0816f4801FFDfc2057,15862285114114873312602,1642532035 -0xa83eB8c52a9D912189DBC9E3E2f0A39a38322c40,756819856591707171444,1683809940 -0xc1D8e5ea191b56B2437c075658ae04fE14e69D0A,1485689889763418298842,1637876105 -0x76D1cca4D56b6a613d0989DfF464E4DB20791656,1372050151546137736964,1661172960 -0x5A86Ea97e98459086975C9d54dBc385804b2EFD3,946200628439771250676,1689730650 -0x3c0bAA4472678B709D40769a089e09C887540b5B,59810418682434282,1659620035 -0x93BCf7A699F9Aa7Fb0e16D70743c4a1B280C1a0C,645193301013368309394,1717847680 -0x055A8Ce4c0fc921aB699A096b333785BAa85509F,645013441655943962702370,1705307135 -0xe2E53464Ed1d027c2B1709F42E69a717A2B07469,802945738793893965519,1704024640 -0x203cc97e959d42170b32D971E7B79BFC0757eB88,7573043945390247997317,1681873090 -0xa4D1E5bDF4958B92469050c53fb55a485dcaC5d4,24157787401241374384223,1638286210 -0xa77CE92A601D504a6D64af843EB5a3994616969c,816518048475698295104,1669028765 -0x35fd5F5729e10F2919460415cb63e831a9868842,2979825242120393955056206,1715236160 -0x20F74e247cA5D926DF08e99a1CA9C72b42714554,3238623711522147710628,1689239790 -0x3af86D012116bA4cB90c011E1E8aCb8944355D9F,3784762120460557374297,1689747425 -0xd0B8809579D83Be1de9B655677B5278240688BA4,144877478847382224,1657821905 -0x03E9B9Ff1C6260c4eA807883e080204e3cBdb55d,335803405517858017276032,1712846330 -0xD9Ddb3522A20F56109307f511d1D774b2adB4FF2,11693769419474924804955,1676750410 -0x84aF5a5b8D9027d5CD64Dad8bb82C1C96Da481D8,1211450470502028408025,1682673540 -0xAbc12594E2779C5A432015c2B0b9c839888CA468,1739403962444831511461,1660939970 -0x89Ef17A86F1F103A1B1E36777B7544c825eE8678,7572225021223599017550,1682120710 -0x64D7f2Cf28F0857ac4720C8f50333D79045eD291,788150000000000000000000,1712845700 -0x4208fFb7b3719390Cf9E82A48A840889824Ff81A,3523868116402332970698,1681804790 -0xBC08A5D68BE20BB139411a966FcB2Af9A1E533E0,5408686166101161727694289,1685716770 -0x6AACCe381f06fF69cF35AA916B44bd8744e9F0a8,25540062636278804330478,1663758880 -0xF39151eaE41D289eEa2EE7A0f522BdB27fFE2D9a,737705085329059518201,1685628570 -0x257740D3229E3e65f0758359fDd80ECd802B4BF3,3050209298722046,1716186595 -0x444e56d57F916bc7c7Ae7462510488B1A1cb9Fa0,2477770128083569771652,1692615355 -0xC69b1dAA159f9CD24343722b960213e6Cf275F2B,36649469184945769,1685721445 -0x37000FA4D52E01fC611258670457Fa0fedF5af10,765906398687904741386,1682451140 -0x5E6917d9557Cd6e0Bf6be0E880E8a933d5Fccfc8,36372314025345783130317,1654434480 -0x96C9C0FEf1fE6119d7488F23F945CD432ee73d0D,1253288209848228784236,1722257050 -0x4e3aA6092cD50DdaFcB3e091990EDE029F18653B,21905842045171464750436,1675647515 -0xb92D42eE1De13Ff22d06e107c72cC62D4B84f814,5926333393247638247082,1681666150 -0xC1627BEd63cd38DA0Bf0F39E087Bff3709007877,20089189771296315889474,1708109225 -0xe84efe6da19aB96481B9B81AfdA94fA9e024dd34,3185041315372009934336,1673099175 -0x48d1D7dABe33265792748d46F80452c791aFAF30,1259987788766354001743,1719430465 -0x48edb2b000a746319cB249E431FD41A702cbE014,3133955682966054779293,1719146065 -0xf98fbe2A1953caBc02FB4FddbA950DA3077fc05b,1805554866115936691915480,1665108435 -0xf9734bAbB93d7c5d76E04159F90B48C7Dc609f47,1513890191760746464231,1689757350 -0x3c923A60515cf1520AC98409DB9A4aDc037FEB7b,1271831271198614515646,1718101990 -0x0e4160744E992e6cE8024932A3CCF0F9ED435919,38778901711630307442,1705691630 -0x945360a70E1A56033E4Ed4B95DfBcbCb040E291d,632821297020286093855,1719201695 -0x9fa72884331f729EfDC5c1d5F62E1e2A7BFCbc21,4242244414951369005,1678708370 -0xf4b7f9A367330bDcDc14d1963b43fa899B252FE3,2631367593741056868126,1708344440 -0xffB3dD4Ba90E7ee37D04c8cBC30216836Ec25469,1858504529090960931265,1692615935 -0x5F7B3291B8c73335D10C04B5FadDB542D7388Ba4,34732858587622970382900,1638641870 -0xf68ceEC001992942D944FC3681790cF77fca716b,1253624259368669876355,1714050965 -0x7eA04Eb8D29292DebCe93A7F3F1056b71CEE0884,760982720417837347709,1682935710 -0x217a610BCAE3964C0d04bA3Cf92D5B0a3059DA6D,35543990663235117120027,1664497305 -0xe4E01F3b10bF52Af6a79b75272dB4A7aF56CCC16,26905276331151248032908,1720528860 -0xb7f16444AA13e4D5Deb2736739E7618d1e035188,321273797165431510333769,1718736565 -0xB4532C013EF164C53881FE2E6127272BE65D189a,638331889283311503470,1717360265 -0x677029E369Dfb8fC1474810f20Fffc43c49FabF5,10337707360490232783745,1688834870 -0x35F0b0F05E4FFbC8E4315563E09B687A3B4500FD,6385478380472680,1719949910 -0x81d3C2AeDBdd223dB32E492DeC6227031Eff8132,643831806869604625597,1715655860 -0x1ed5784c45257202841D98062CD8400209F712AD,1263922496529272006427,1715949865 -0xA39dC848EeaA3d594E70397e4122e809953616B1,104633300401819871170772,1673560620 -0x9FDEBAf8d50Ef05613Ad17B5839200ED1AFf8c17,38644384660924488556088,1653077805 -0x2c8e5E0Cf60B05fBF2876f43F36a41d5D50eB589,3784762120460557374297,1689748640 -0x3De3d1579881eC38aF275cCdC3dBca2A2c6784A8,101030541568993017342971,1717754005 -0x9613b2B2bDD86fC695a3A272b66CAbE1317757A5,627877857112933941874,1721613720 -0x823d130a064Ea987596d78c34E10577A9EF302B7,7575315631405263570159,1681876180 -0x97be8a7A74CFcAFb684613BC377a09b00A8B19aF,637520500857019741311,1717083635 -0x28121144EDcaD957f83a241e61Cd1ddc9BbA5d09,45904163920331643695319,1716106760 -0x4ec28033450B0b3d3BfB8a5104D412238B557e9C,154539685382548891066475,1689366210 -0x9a10A7Ebae6e1B44444b2284994bC39D710da219,5160010046699490670699,1653965395 -0xA0395d306eFa8501D1D8eF794DE0FB72F07604aC,9192139812174725017,1681783050 -0xB08eD49d231a7ae7A2107463e3656bee9A7b52b2,2836285953028798120,1690035160 -0x6001004Cc67afba3Bb655Bf62e55df9306b096d2,1386360705348203034659883,1685728575 -0x9Efe78170FD705fEcf645301A7eAC66ceaC3fFCc,1544192126484886611264,1708023775 -0x45275CFdEbdc5d7Bd7644ccE1bae073Aba6E4686,14307943546532819303206,1668713530 -0x2a30c698d38E817bf14Df6cB06e3eF6A13F44D99,1253897784112421478356,1720568380 -0x9265d86F15445Db91118B426fcf1dA4a70D27B61,60144717748633937924979,1710984810 -0x8BfB8b8A326556E07F366FF4723Be9DBAdebf7c6,362740293547418102159,1652743110 -0xDd930FC2a1382026cc53E85e39627A412Bf56E4D,630998852905784553389,1721134960 -0x7dB87F9353B3d455849E73b5217435eE4AcdCead,103344431597710102,1692810975 -0xFc3Dd4fCE5E06ba856929D23ddF11349f1D187f8,37457754448542038063600,1683347175 -0x2be8Ef7f307a670114F74195A509A5C3d7aD8fA9,20000000000000000000,1712867665 -0x04C60ec0f73358FB0f066248A852a5E5bBAF5f7D,8994617513521804264920,1683119115 -0xA8c862128dF34a1F11d5299Afd07990e0445cd9A,8442133028555829231647,1711809270 -0xBee13028577E00BfBE0081DAd398319977684Ad3,631168618742955492123,1720631890 -0xb98067297cf92A19af502BE98064a3F6D78Ae8A4,686707639152588861,1668678780 -0xb017DcCC473499C83f1b553bE564f3CeAf002254,1302295985543189889409,1716389970 -0xb1E9a5151F63AE11e935955707fc188CDA86c0c5,2017696995752594317185,1707906765 -0x0c1bEE5663Ab6F6A517De02B13A41C2f8Be786ce,757453491818867331532,1681721735 -0x4eF6A665A2bD1Fb7dD577fA3e98e6AeDF3165A97,2007405714883055484252,1705887455 -0x2971706dCCcA0B8Ce40072BD4Bf1030F80ca58FD,811761182949900725246,1671730765 -0x7Ea940537DBad0d55dDeA1d6f1bd76561c74F711,1987769877660835,1719152325 -0xbd74EB4b69d5a916d3328810248988c550C4Ab95,633065132944487391189,1719396365 -0xA77208EbCaB6a884B2617731CE2888c6abF72DDa,480912720806627424741844,1662623285 -0x0154Fa7D1C37E8F0C3934A81a55cf8898Bce6D47,682502423013043671805,1703693935 -0x44291ED756653757f4c6cdB17EE1cFcb92F4DD9A,3037772690835476923832773,1685719470 -0x74753808f6141d04c7046F92BbF5912707F434f2,236342125395682509657197,1666415955 -0x2e3c0dB9109A5f866d4aBAda0F84b3aE426d897a,506031717936442251091160,1702916465 -0x31232b710b3aF493118b7d0b8af588495651B86A,1457278796480922196033,1682339610 -0x8E0FD6AB040360DD674dFF0F0C24308b3B056499,5207425350690407279822,1674580210 -0xf82caed63C7495EcFF8874958Fa34bdeaf7AB557,350755872109172670057376,1712844915 -0xa8E5712BfacF4d52798D4C031E1AD5D28772d8E7,3621104713727191371819,1643822650 -0x9bcdf5D89f3961aa16158e0eA1b21Ab05d01e831,54948146737415706337755,1637397470 -0x6427A9c7506344faC0d4A934E20e64d76368Faa1,23273025167810539907399,1687541320 -0x2b271d612982ed9F76A1C6997E8313A212d33746,21402081711993053903950,1675763270 -0xCe1ea4EEf9211a6Ca5e0c5891910C6e991708aA3,2686495609266724873173,1662545475 -0xBCaCf581D8CC6F2aEBd7996AB6B9165846ADf6fb,757572729786272959128,1681648340 -0xb7B9ffc4b4414C88aDd1b8A32d4690491BE98f46,97248361617709694316670,1703164895 -0x75CE9657a0b95413bFc52a31517CA2Eadec12F9D,1406052417443006,1718631770 -0x255d297864377bD4F4BEf1c7a55453F986E5201F,9681283639254914848879,1702408770 -0xE6AcA78b9C99eb28eC16731178Cb03037bB5E1b9,927853935936776715156,1717015865 -0xF0022e3B9052c90f03Ee7b4Bc46a3FCb3E815332,179798622537013318517080,1668041390 -0x7511eaa4F91bAa44660A8e34FD41858D14b2387d,20663424940646111319779,1668770015 -0x40F5a69CCA80077311D246c58E1fF295Df3e119e,840704100914634417847,1665389120 -0xBa5B52897721ED1050c0063a3a7AD09Dc87344ec,76243539193817522421587,1722268775 -0x0AFCa7caa2F7378ea146E3393fB1c2D2DB8c495e,676327341424989169131,1716159160 -0x4474b77a6A2cb4A422D3F6ceB5978AFb32E3A1Da,643845092054022256427,1716159065 -0x0F4dF92D000A77576AA638Da96F4Db1A95d79Eb0,15716000000000000000000,1656925045 -0x9d5FEbf260fED9F0F6E2344a969F1bF4E2d84892,869857883693385129312,1704024605 -0x468Da9A2E1690f9d8b956f2f67D58B7ECC3C034A,833207690088954772385,1681673040 -0xB507b4dE40734b85fD3caf0327055A9E7511BC92,7681955874983117336832,1679560590 -0x5746717C9F38236B6010Cf83dD1aA08Da7CBfefE,764862895816889719284,1681708070 -0x8c8C75Bf282f71936f1921Fe4951A41f3E3Ea801,295880789479245022,1681867355 -0xE2F4290cEeb817004c04f993aCeD5F130BFAb3e5,67830949593225276329921,1659461130 -0x0313dc8E9fe17683BA3F571782207AC90d922601,40194109202220512471227,1662633370 -0x4dcE3CFB02ce85110540AEEFc1d93359fe87Eeb0,30745819124540333087272,1642784330 -0x3D5469fA9c50c171555868960c1050D8065B9fBB,6817397250010909737833,1640342280 -0x4C4Ba3bE1175FFF77786924c3B493250dE2AEea1,252526669339551219846659,1654790010 -0x2d34FdE4Ba817819C97237135b2e4C31b75145E0,3784997951648101514888,1685090485 -0x3abD44373Fd81Adcad865eB599028cC90e0dD3FF,511754071861774633,1686331310 -0x4792D7711F03654a81243eA06617042643E7173E,9393315189781893093879,1663287565 -0x2f03151712cAd6e68DCe4dF33E017e7CF583e01b,631492739283334008136,1721236380 -0x7e2b5fb5198c7dDe774c563D896e6acE3203312C,15136957510845595,1714996955 -0x791750771Cb38F15efD65c211eaEC5FA32A96234,3407047188442358295731,1699893100 -0x96BEE57a84d94F6FDd6F07bE9b1a5FC2b03feAd0,4271879677498268830871,1687492050 -0x89FF28e4b44d1b0d650fEc6CB8b0240eCE1d5f65,5555586704059998908173,1714132905 -0xb9aeabeA7f183cA70757B4f593b411d92381E6cf,575000000000000000000000,1712844335 -0xB87854cc849Cb00F7e1453859078E75790c7d8d3,17693302828360252582492,1708432180 -0xc522a6F276999fA0A8574C837d91CF2435f256BC,1374341864490713421409,1712563845 -0xd73A4bC59dd1e3Fb59b8E1063a4267Db0DFa45B8,1253899186522827098010,1716250000 -0xbb15dB50e081eF3BA1B4f1440f0d07b7EF9B98d7,1147180030760542114702,1714985640 -0xf069C88d403B45A0b715975826a67fd64c40780b,11613388327678420235170,1680079695 -0xF70De2076e85A53AAD6A1DF16B1CE4968A7Ba7b6,636019406148981299904,1721065895 -0x6fb28418A50067DFEf9ddA435102A3F468c91d27,1999410893570004925296,1712134650 -0x768f883F259AA0f5b7Ed9F62B80A9F243326DfC1,7477381398173688342304,1663024090 -0x332A1C17F202bFC4a819D26F5eDad2044CAD9444,1513890191760746464231,1689753190 -0xeA2aD791D6f3A10B4467bA08c3d4207339210b52,151309005801906953413265,1708274425 -0x0d3E42a6E3C0965E145E7bE7c0077E12bFF80112,638330492977060091074,1716646995 -0x3b95eE6404b85C698f5866aAF358c11C016EB80C,4107192233838030855018,1694363280 -0x99F31077A80e050db4C05b9d651DFd3f753c74A3,4910970028565640641602,1686520685 -0x9De6114eB7c8E185D028d6A5d9BCcFDd3f1c7Ffc,759184425908390235820,1681870620 -0x02769593F582a0d9e34Af361b7d2bE891f816e72,2502322570653074969921,1684289650 -0xd8a981BB0EA0F500E7A82c6aa7607b20f02355c9,2000806918972140855350,1705782150 -0xE1059cAc06ab7488f5622389Ce3FE4A2F29983Eb,7424383438095542534,1681800650 -0x7aD179d4547e710D1A76008345C1a7E42112b9B4,1050468891614295826560,1688747785 -0x26BcDdB8e817A191fF0870a8937b250Bf3997326,247186780096199110069552,1637387375 -0x7D74032e06FE3Ea12fe00f726aA2e1232c0b2d26,818494338278381783601,1668785215 -0x239D6Bd5859144e9319A6e2eEf01C19114E9548A,7983016525368102246338,1687441560 -0xb0c9Db4CD4d8557A83Ec113405568182dB959580,2411953839284864246406,1709837995 -0xfA0CD597aB2d4E325fe9823CD3b91Da6AADfDeb2,637001113615439906263,1717244080 -0x9cC27bD400336bF4c00B6a0487f1Cb6e28fB3802,328707737270343,1719614160 -0x8f23905765FADbe2DD054B0e7F13ab91ACd1fEE1,152073167330361219106087,1684908050 -0xCc2AD6aB635974CB1Cacf050C440460B538E859d,3994362065370695379178,1637206680 -0x8A03077E543aF72F7C3E20fbE724AF85DB3799BC,1253650789095325289448,1714781800 -0xe50939b6f94EBeBBCE4D0f980a1289eAb6Ec8790,62203369220939145979644,1690273685 -0xd6E1f60C7Bb9724801d02b1584Dc535470AAe949,34925387507341445134244,1711532080 -0xfB79E9590aaf7e75d5a96bb569DC6f890F04A4b2,770012539090238192390,1692616120 -0x607dD8833Be5ac61AD3A7547497102253BEf4778,946200628439771250676,1689731860 -0x83B72E4B1ac452408517CFFC645f5420F742882c,185450628012094401510833,1713632390 -0x83393072FE3dD86c3A42166e2Fc19D2119E5ff9B,3016501478697533748133,1677789810 -0x999e4BA1C365B424a33B56107700D2FD39Bc18e5,639075471663569783993,1717789820 -0x479c547309dEF2471A8230Cc863A559D0eF2688F,16437084821273690909532,1655786985 -0x4f0cE6B132fBF46752C7a69eb504154DB3561FB2,22953039516490890061041,1640051585 -0x79CacE3c488C182f0079Bc173AaA5374Bc1BDb15,350168822758103783639538,1665675650 -0x941abAa0BC7C7d49D88355d6C2191Efa09f34A36,4942363695616635539241,1680271040 -0x73212d1e16Bc6cf50d2D07222A48ba03570cb259,88727976781371265052525,1679232105 -0x87819D011B05D6E970182cb0864e6F2181ec4E1d,4809848888972804523845,1710074005 -0x08956a58785B85b3962ac472De786f9AFcE86B58,630665718461490359464,1720701185 -0xEC6d0b024eaF14623c0A892AAEACE96595569E22,18019036492035301,1683384560 -0xe6Eb733f31e16835735457Fcd7Ac868eb33FaD44,2785201061168766316371,1646079175 -0xA6A3Fb501CE7805fe764bD8ABCffdC4ceF23b6eF,596799940642057075,1683126535 -0x3b10Ce1504686D432dd768F70701a34A69da7d06,1513890191760746464231,1689753025 -0x22A540a6e0fbD145ef426a28b258FeC19f3CB9c1,946911265727674351334,1652904835 -0xEFB1af6eD095dd9977c1323147E0f1c5b657DEc5,4027441732295877843496,1673724535 -0x17e7CA664D9619c0dA33FBDFb6CEB8FA5bf3303E,758312117172949659703,1681651055 -0x337F27E75c78108FCf185A3a18c94F5C308f019C,7215308871709900205474,1645221310 -0xB1961e6849FbF9667F2bd9Aa7D316975409Ba241,711141920791566460339,1720672975 -0x25bEEd70e2CcD75615653B22565775F7ab030d6d,8193814107847807184781,1679302750 -0x5E173D759789EF8e91FcF4Ca55608237b1dd2f0c,635600491076238271005,1717887830 -0xa62671D9157754c81797a78aF040e355e962CFf1,647082826772116339674,1715335545 -0x692Edc8378847BFbF94A63a40Ef48B8Af88BECc4,89380295666598199826149,1652356285 -0xcbEE2406767172fBE174462345e2c7156907D778,719677064653234396358,1714656090 -0xB0C816956b3e1CF3e9E0654D114Eab0e0dDA6361,6070614259322650136563,1659458780 -0x536f22FC24c7ACefaF828b7e9A177a1389B18D2b,82482511053786960055734,1643119815 -0x83768cc39cC2E06F56B1BE1d498cdF1fAA3dbA3d,7466208091095628489555,1641395235 -0xfa132038c0e29415dcF8B13dC789bc16BBd456D1,1673061855080760036182,1678086465 -0x981CDfb26A5F9c9d18aCD1FEFD4074F57B108FD4,249511633407963405157874,1683087745 -0x95056124b98e463c8954bfeE29469DDd4eF9Bcf5,8203972870750646801998,1668437355 -0x23eF48bCD3D4239Ef73E200025F37b0A5138cc22,7573138684367210537661,1681875040 -0x5ED1049796778E6e3534a6DF3175B05639eE34dE,1892362739700933080288,1689752540 -0x3C56926Bfe575Cc0115A7CdD7e34cB6eA914dd7c,757838314285006053280,1682358485 -0xAb79580E2cCb8229DF50979d7DCfEDAb82F28c07,59443651445050625303284,1668240770 -0x3030dA9f56017142787289d3C8BdC24C7b5333Ea,16866523902806833888914,1647531090 -0x38F9D648F337B89a2e14464925E95370dF7b928c,292162105993957801835010,1662934895 -0x3c7B387E5A41Bc20bb36786B835e618Df579bC68,1253282025466546477905,1719386110 -0x9A7402b9510049334407147ee9E0B796b85F860a,319450651362826384460611,1644809740 -0x79B4525dD572093bcF88392d855D12F626FAfe7a,633394460914782336735,1721266025 -0x555F0E23E7cFFF727F24d0980f8A99B4E0c7DEF3,643387913512540517076,1714490040 -0x627c70CaA0930F519e5e9e56d696cF0cEB446429,3484634195307353984919845,1671992540 -0xbeEAC8e59430CA29Af6c0BABb0d3Eba5Edb328e8,9788510680934431854721,1670710085 -0xB136a9da19e859D806298C7084147201bF67b3Dc,5520536288029420,1719170485 -0xd5C42527528D60731Be4b6926A6Cd1670d46294E,1726966263971088651612,1682887000 -0xa548FB66127627ff97E45154158c5C16e6F10D1E,169025527976155774742556,1702697505 -0x4c3e251e1139C0D63A1597D1833764aFC977986A,6994892877650237838,1658125440 -0x4F9F5472d799EC91361525178cDfCDadAC4A9B33,13262011015610918129685,1708078420 -0x0a9e3258eDE1191e24cc689eA6c88d27dbc79DD6,10049872040773804975517,1702321040 -0x4232B10Dc07425e2bd7F48155FFAa4878F093fB9,757461536444504338531,1681721285 -0xd0C394a55Ed86D49b1d5417E2ABD2bC716Dd25bF,739474323750664385883,1685385870 -0xA8D541a37A8cf50fEa3B12a54BB61f5Fb3EE70d2,9843074272218477357065,1641298280 -0x6B2C5fc84969Cf403A9fEfeEDA8834D00b2f0CAA,7573043945390247997317,1681872200 -0xa48B71d5Ae61607091F7568ddcF98C9e2385627E,639206348861021961333,1719641120 -0x56AC18511B003213b83819C0A1486f0e21713c8b,751084645157188414646,1688248020 -0x064C233d344B2b7e580CE9229F5FCf712Fb41CAf,67432591344888669442111,1683674465 -0xdF949156Eb903898E8AC0447B85BE46105E03ad3,9232473254458802651790,1643664310 -0x94E3Ad7F4D9A24eE95e2995B7adD8ad66dE33d30,200000000000000000,1701445135 -0x16Dccf74A33D34E8aB265e9D88dd24C8c56e4BeE,3784762120460557374297,1689747830 -0x1989c554798939E7F19EDA2fB6E1159f558826a4,775306851642110961597,1678202450 -0xa9e7156d5B9BA20a31cadb1557dd2c5783A1A1F9,24880595533643701972141,1638346175 -0xf46Bd42baEa1540d1BaB1728a9eB32b65BF3C512,2194154368124384802990,1706899775 -0x85e4F99A4911786935AC21c1376F42F79c4B4cA5,13616798917784175230005,1687029915 -0x2A71109208ecF88d89c0F1353A9e1962C6249a73,7339750885594487088332,1669194210 -0xeEc126d61B2CecC0756a4D2EC9797c8Fc7288264,1858491402386645537140,1692617605 -0xe54E47C223D96E940e93cb443d46586D058ea951,7573043945390247997317,1681873950 -0xd0596DF24728C9381d0CEc81c5b050d1BF9D1B72,13103060472490794629792,1638035445 -0xE69b4BDcaDD12A5087cE0e7ca84F55FeD16D18ED,20529734722429278336642,1681802970 -0x3B423e0933B3963c491437Ee26A41ee3931FC321,2832633498808218098642,1716880990 -0x95A305450022c96D67e937462310D78341A6718C,7906951605364828285193,1676836815 -0x435f5E7317Eeb00B9033B29174aCC30aF144EA3f,630699638627390083727,1720443580 -0x360Ab24a4eF8f2115811F295031DAff535a362Fa,630169745063626475168,1721730675 -0x63d8220Eb64b93149D36FF569323e66162b25AD0,84771695887843985155294,1643714240 -0x8f2feE68F18d40cD9Bc5D2d328EF7F548B02cF3e,49619467940979875334453,1667328190 -0x84a9A7778b07010A4c6C0D6cb7cd3B6bf71FaE0c,946190530115139343574,1689732750 -0x14982e85D2f97Cf9Bc3ebAb822CEA7223021c94C,43906474472640867930701,1719542735 -0xF7007C88a8E01001BA2a2A0285a9c15aD8e6BDB3,7573043945390247997317,1681874555 -0x1E3eE5b01D6e1d0E581ee54B63241D63693f7942,3784762120460557374297,1689748890 -0x90e4C0ac036Ee9776d33215E8FfA757E31162a96,3286017138981944017473,1708423575 -0x110e60309571371903E665f541238fD8576D21ff,756983777402082039237,1681773160 -0xa29a7C45870F30F960f1CEe481505eDaE07b6efA,1316275725621577350917,1722204315 -0x941912e908a9e4fc4389bE80Bf2Ea812F2357BD0,3553045048439739776404,1677670580 -0x7987e7d6EbbCBFe4b9622155eE26b9A18Adbe0a8,32387696817262813745295,1659475145 -0x253337a1766f3DB2f9FD7182D84a9bf78Ee9093F,79797340614049275620269,1651647065 -0x7962e7bf33D10Ab32dE56d247B2Ed9475a23EcD3,5154653275828526814133,1691420575 -0x17279Df397a889F1ED0A67EA338DBe4790415306,16326993610223896853656,1711890100 -0x74b7E6d4336df8038A44393CAc5B7aC53fd75C7A,853951179893087101811,1666681675 -0xBcf23582388c34b6507D14c883dEA8e3cFdbD16B,502038391733247349672808,1646646565 -0xc0fA2986Fd7856c15706aD6bFCe83BFBf12b7d48,757554562610339320383,1682692180 -0x18eC25951b21Aed0e5B2C17a9D7F9A1b32775ADC,14836521616541085526548,1664873395 -0xE2BB7f77bEf73B6C4bAe8E9460462cdfa5be151b,3300742511662908714607,1713443790 -0x49067F927BA9eD9d355b5FE12024e6A2739fEe26,1098258311409098205255,1682810085 -0x7B3F69F7ef9A168A89b24D3cAc05382EaC286E23,758330302516059232087,1682394670 -0x663Cc89230B953e292b76530ec0a8E9672d76EE3,1471432824983372693626,1650418590 -0x290b63942726Ad79Fe823aDde3415d866fd5B11f,4252268984496504829727,1713497230 -0x7d192952504D8Fd8cA8A5296b73d1fC76ea663f1,27250232825562185,1682922065 -0x304a713698eC58589567B70cb42e737971Ad6D7F,327500000000000000000000,1712846565 -0xd6D92d0ba8fb95745680419a1f0E14798351E9d3,5188993752189491,1718812405 -0x71faa2acE7268A7e1eD539E152Bd3F1Be45E3476,756859166624439444161,1681802140 -0xf4DF07D4D5114a5E953B386167a43DB103c83575,4391162740305155275253,1721954960 -0x58f9Ac85e4e9Ba8Fdfa349725A83a73d4D36595b,317202351933057393443989,1709539555 -0xf02D8a7B70457c954eA684Aca4Dd94177E3AA5A1,2221452427869419199395,1705810905 -0x35aEA9AEe384582c76e97a723032C8b346581BBC,87668401906532616,1686641840 -0xDFF28Ec657651B447E426ff5385461af1cc4F76b,327847795712755686082804,1704843880 -0xd357ba8345B69208a7D0b7549BE06aF86868F01a,3198833478356237031887,1684438315 -0xD7CF11790994C56682855B349c50D774693daF9b,274588228051090305048672,1706625390 -0xAD0f99431F6eD4F25833d465376A99347D3E88B8,1173710450488786114341,1652950235 -0xD55Bf79b35db54e28eaDb9dFb67621269938608e,102012129065370892082765,1702634910 -0x090Ec5e568DFab3242Ac3f11cD497eC731E4a5cC,924605924057116,1722172545 -0x2b64a72C873435e1Bd03B826F7EAA021fb225A96,5802140977061547342651393,1683701645 -0xF51452e37eEbf3226BcBB25FA4f9F570f176484e,10000000000000000000,1711716005 -0xad8788cfaE41e381409438B3Ff2AC9314C362e84,2561289091481817,1719851860 -0xf9d2E5f2Faf06Baeb10780034eCccc5C7b8437D3,44682925501112761143510,1642064980 -0x2eDeCFf9B0B54BA08183976f251dE21971b03191,644447171138641093198,1714896615 -0x9E8DecCC2ab480d677cb6A6Bf0eDbf772c01E079,1583516748809164922157,1680253605 -0x68DAefb59981Ed4aC8506D6ed41935bE570277b5,1513890191760746464231,1689756245 -0xaFB885e601fec0bcc538c24D066A874e04aEb341,7284629669896117741982,1678703900 -0x424B26472C152ff56ff5Ba65Af5705CbCc05E0e1,630662531327488149221,1720746890 -0x0E93eC0575363676531Ecc74a043f3F5ca9053E9,3713308894750363541799,1644958255 -0x13a0b87Cf9C7ee8F2Fad2d381963BAE423939181,3968315620568694852,1711310955 -0x4D2b92A4464D385eADCf009b013103A3fc86F50f,133033877707085664401561,1712168745 -0x101A0b2d9B9c5a8CA1FE198E75762E103075233D,3541946259688199202591,1676827950 -0x412c0279BD15981bE855a8E5F54a58C6d4017827,773533495374777673496,1690264945 -0x11bB80b941d69EA1f22E937dAfAF1bf2E40Ae75C,3374017033240594897871,1689543920 -0xf611672410F5923165a702dc3Aa2B169021a27f2,24119968430034905919191,1658123735 -0x13984A1981fCcb309b043a5a19eE10D0b545EB73,645935624966035339228,1715634415 -0x9c7E602b15Ee75a6EeC35293971466d6524D4177,494959565816214345,1686825490 -0x01332780691fF77139c24ae0f11289992EA76b1F,405749846029050293437317,1712846065 -0xc414450A95696Bcf6390673F8d724C622A0b29d1,7573801174061919854931,1681876615 -0xd34Fe0ebD0661916e758c751F4f0Db2052E8cf29,2272691513851162019027,1681649925 -0xaCE7538e64ac6451761ccFF471d5Aa976fe25725,8555485835198880811831,1677683465 -0xc2CF05fc4ca706D6eb012AA7a02BD698FDE345B6,97649584165631680982908,1650207775 -0x485B0a3A546CcB0eE294b5A34A1ec9fD3c17e8F4,29643896078134078565088,1643868360 -0x021a3Cb91bB56642b175cA82494893B517b6Ec61,15391422883077212135405,1712828330 -0xa66522d79f572fd5C4245B5f18d994027B9994fA,159480861374603590457902,1718652990 -0x4c2CECDCE4138d5D66BA2dBD3dfa2315ff1dBc63,757461536444504338531,1681934230 -0xC78143C3fBA42eCB1d4EdA2117177672870d20c8,11254747949825222385634,1638529260 -0xBb0d797bad32d726e837c2e57cb223C576eBCe02,25921215396303462430161,1670077075 -0x553E2130bDF5e61df2dE050C0298cC940f4Ae541,804855668424683130387,1671764795 -0xF8aeFF513D6f5dE6F7d638f0aDeC515857ABd8DB,508618318082416784578405,1663800220 -0xBB77605196b2da698467f04214BE1A4D227F12eA,633380164732564924,1692629070 -0xB8cDCa64d1F7eD64e1b25CD2C3a02fae994850F6,643452397841243771342,1717297750 -0xD61f3BC3Ba2fbf2c81E49bCFac98C8142D612Cbd,874006614891683639239201,1662116675 -0x8079577735e0B0d3a4Eef414FEC7bce6Bb351b36,37931642525987753013626,1708779040 -0x885aff526cBC4C030527fA5a3DEeaf1a0Cc5c115,5494647003917484058210,1721730230 -0x6Bf4a68aCFeDa102165DF26da16944dD5A88c002,663985213142411035968,1720922465 -0x2A8205B77D281d3AFBC77cB08CB15527eA9c863B,1882461818668857,1715974575 -0x0E492e5A1E0A68BEF4a7Bf85BE11AB776b7cC8e3,4269641358043670225654,1710542675 -0x90DE32B28D6Cd805Bffc2fBe39936AA7503a197F,946190530115139343574,1689734770 -0xFd0E586D061aCcd49B7cB68Debf05f8588F87cd9,757572729786272959128,1681648500 -0x5F5aDf225CeAaDFe0997576fC2E8548B30681218,113714226998211700206399,1664018270 -0x9279b5fc4a4b96699EF6a757fE7809861a7f759F,757546529378951080750,1681825055 -0xb28b8D13bFdf93ef030e188095258e4993067D9e,2802256624415562,1715008360 -0x6f47f889A84997Fc2fb620BBF9998D3562aED248,31617973049984806959365,1675159865 -0xcEC1a296972d62B023409084921946030C42E53C,485411276561421731670334,1648648175 -0xe806C3a3D30a8Adf2Fc52Bba33fc176eeEac6c0e,1167149599414203722863,1646666915 -0xEE79D15C2061d474BBe2c7041147da9C55b9C302,2630714281926757202595,1708344150 -0xAFA1f10C5D476197Bcfc0fFC37e21371B207aE6D,249889240131130942672508,1652979770 -0x856725fE0aBd65E44AAc2B83286Ae05C3A6e0bed,639596400188839566338,1716110760 -0x3061795d439D9556bb1668d64637B30A01A8e31D,7405168012349552327306,1640477180 -0x1596557cCBfF56C9dCD778bfDAA7a8D7DA3C3C74,928579377237967351177,1682497520 -0xbCd1d587Ea330Ca4E9f37b1958BCdF4b22aD5049,3806461715833732771445259,1718696945 -0x2039F87c7CB1620E65c0F6BF0a3eCdD50c75956e,3016377631618726063801,1682405385 -0x2eDBEDb58b4e345543e6D1FAD10ce35c7E1bA1A7,659886721373011321041,1713823000 -0x470CbCe526C0793a8a67060C757F1F45148958c4,1138923050228324,1714377125 -0x23880F4203517d0D6377a3157C49529dB8a5C7B4,1253595269622467779762,1722284850 -0x76A4D13e97f8D7d041f89DB33bE9b84512c29aFa,2247698445521144228,1676077750 -0xa8Bf1F8fCfC00C8b84ecd3298ed97C48fBCa3b13,16845221885644236073380,1697592810 -0x5018FA2754E1309AAfa81E9664e5f4F3066E0CC6,4199141096873842087978,1637215815 -0x391Ab47760141CE520792bD58a4c7315689443Dd,1404770257944214713719,1713063070 -0xC4A8Db724DCC6Cde819EEa8072FB2aF75F3E7A58,151199998970794487599607,1684668200 -0x8FbaDAbAe256708c566f46E9d900df4b071b574C,211454056908101980940348,1662111725 -0x78277c23d597192f7950456F308497dD96651CB0,8401674245324265251952,1672561910 -0xB53440EBBEdE112F908ae33291c5D046dBEccd64,632933375324659576013,1719911005 -0x7BbCa9bC4E711c77D0240b223F18cfa528637260,3854519500899190345013,1674503600 -0xF06E5993b8a76a167A2D5FF8a7a38a8FFC6F9206,9298816105885226789234,1683122860 -0xAF682De1193Ed543Bc82cbcFAae8003B0E63Fca9,75319474162679311109346,1669881315 -0x04aD16e7b59BA8088EeD21Fd982DFC82412E13b9,87786145811470582974969,1658841700 -0x2bbd540F02c2f0C3Ca910eaD847e7b52286A5E5E,4408068691120094,1714044025 -0x49f5697fB02d26fF47e9686B5A67D810462879A0,9807416937215037899647,1704017065 -0xc82d52304a23A3bCDBE129f4E2ff06A83dc5c288,678888849065878199312,1711538795 -0x3d0fce34D2bdaeAC27625dC999969dB0c1D65517,100000000000000000,1712930945 -0x72FD2d9b0248fa2313e0e35158A74d042d8cFde8,2632545092823949301606,1708170795 -0x83b603ac42B942fe607d76A51a0Ab65BDf3787e4,6343934809421256809811,1682289095 -0xfacCE714018D1618a1e4Ce81f4583CC5e31983eF,32958604273096461819581,1683740175 -0x704D9499411F26FF471Ac5C4f613ECB2D4C02AC4,1224428356248680361700,1678044405 -0x86B6Ee49a3Bb02fc3024eE0a823f2F46c70243Af,631085413850927639913,1720676650 -0x71F14109A9467d831ec3D90135a2542bBF59f36C,1218877251666219349030,1662624650 -0x0CC700374a20D125A736933D8169de1C29581196,757333230494337793795,1681853990 -0xdDA7BB5E85AAC3f9EC58c84b982F8900641c9c41,199594969488961280702957,1651027690 -0xB500558a3886ecf07B4B4B31B54c4bd1ef378D34,1400962409500173782440,1657719695 -0x1f7782DB136AbB77b70AF6291A56A9496B2a6cc1,27425530037159874200904,1718610990 -0xbEb8D83bf5579a934EF00fCe4c67eF4b1408Cc79,1127140931675203900671,1646808685 -0x9c5633079a6DC2F18F3d9f58436E1B8F9EEC9cAC,3829772833784842614801010,1685716000 -0x259Be8284691ff9f6Fe9f1E09EE46B58a45e55BD,4092835800491726648557,1715444550 -0x1eE930B67049CB5c32E9ac50C13935AfEBB42474,3393007071198140207431,1708340835 -0x417Bd4104DDaf048b1457Ac45106201c2c55851A,1765186236647882117405,1681804680 -0xe5425B47559DEE56bD38A774eaBe7C9938cbF0DA,65762563195500346715866,1640872645 -0x093906e25ef8F5635bFfCA937D58893D73d5b07d,946190530115139343574,1689733960 -0x6Cf87BCb37847De3B580Bca3729D674fe87003b3,456999386966846592,1697560905 -0x0cAB40b319F2d9f37D067995b96d9B19f2445cA0,32947902548691198892540,1648911365 -0x4a2Ec1b02F136527a85444fA3011884348DBacF1,120327532817096031221328,1673118495 -0xA7B422f58eE3282F0410aB475e2d68e12246c98d,1255547573270015552942,1719823815 -0xa93B37Dc94cAb63CF229CB6427b3BaeEEF9c07f8,391244565542405002,1692286000 -0x8679eaf8f0B6326D4ff257a3AbD64Edf040a589C,3660068505771215012130,1683010225 -0x6576d63D3C20865F8784a25079f7cc7c814D8B29,3505023418770973745095,1715038085 -0xA6442505133C4852d9a90b61f18AcaAd281B3990,2734929884213103444747,1643881100 -0x5d17616Fe7E53d2f817E04F11c45aa61Df3C034f,5126563891234177444247,1685643765 -0x4767cF2195447bD5Be99826D55e9c7576e8dfB70,1134490776683538578767,1682059945 -0x2846e8449724bC3C2e37FFe673537236144DD0e1,16420354503237567552296,1653165070 -0x0B6F1DCD018B1Ad7C8Df95f2b64675e551572718,139000235092264341010067,1709414950 -0x177A3aE413DD3545bef29023548b8CA9C96b7C1E,34671673482256162436401,1675055890 -0x70CCD3635bd5C52fdCb267b67647E0bc052E966c,6544290994742988545007,1670537665 -0x70834A1F67CCF2ec7fD11e1e708483DEF5D3dE1e,15464752309793719042238,1668953935 -0xf3AabeDcD4A547B87424f5779d0b2017f6f6fB02,7511347917737839058408,1671022125 -0x3Fdd2a5fBDcC2B32A62cF929d8e2EAA5b36743D2,339625104218938880,1719257900 -0x389BeBaB9b1Ea347D3c06DD7A9984e1C36B971dA,36559686433166259687,1678551615 -0x64998209EaC345cf432782Bb898563CB54257908,504513371452160153,1719478870 -0x009a6Bd594b88c85076791635d51Ea3D29C13D78,10394584017773876720118,1663590640 -0xb3ef995536489fc906dFDE75abFB611F9bf9857f,716720565169243307328,1690130425 -0xE02aB6BfF4E623a6A218c3806bDe54a1D8070d3f,82735683835590198259682,1660714575 -0xc3C60b503afB964139EEEd3F2ec5C2a32541859b,19387305578545120562574,1713336340 -0x508dD10fA897BF27C7141011f37D15b0431CfedC,1003682096507236946204,1704024730 -0xf85D54e554fD60d4c778e750d053AAea36e49898,199201026670752378,1686952735 -0x222104335ee80890ff6718946bd5ae7303560A2D,271915381030166495766646,1675238525 -0x4d5FBf3477a034144693300BCC6E48e37A5063F7,6552278863768665835416,1715009605 -0x57Dd419C1Cb4DeB625C41C05B5ae72521A52Bb80,5582300907913992417833,1679439240 -0x24aa769aB8045255F3B0e2Ff2A77982eA32E2846,128672256746888,1718310425 -0xf59fA7d188f492fA917B431A59cD395c4cC3d7e8,633076667581567742494,1719659660 -0xb9112c9CFAA3B0b01e5B2f9b8d0288b88808F7cC,946200628439771250676,1689731635 -0xbF4f0D1717fd094CA5b4d2cc3552DE7f6be8059b,10000000000000000000,1718686085 -0x4D33D84F667f22644b09f501f09CcBD3e876c68e,597426449676809882354310,1680561685 -0x3b9e89E67d55D07ED1b8E1C9Ebf3497C2d41eF77,86398370001597749038159,1683716605 -0x6cC47E23db1047c1E9F2a2C7F5083EA3B469cEb9,29179873822389894879284,1663670530 diff --git a/scripts/ecosystem/liquid_staking/upgrade.ts b/scripts/ecosystem/liquid_staking/upgrade.ts deleted file mode 100644 index 8981aa5a..00000000 --- a/scripts/ecosystem/liquid_staking/upgrade.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ethers } from "hardhat"; -import { ContractNames } from "../../../src"; -import { upgrade } from "@airdao/deployments/deploying"; - -async function main() { - const {chainId} = await ethers.provider.getNetwork(); - console.log("Chain ID: ", chainId); - const [deployer] = await ethers.getSigners(); - - await upgrade({ - contractName: ContractNames.Ecosystem_LiquidPool, - networkId: chainId, - signer: deployer, - }); - -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} - diff --git a/scripts/ecosystem/token_staking/create_hbr_amb.ts b/scripts/ecosystem/token_staking/create_hbr_amb.ts deleted file mode 100644 index 96c70646..00000000 --- a/scripts/ecosystem/token_staking/create_hbr_amb.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { ethers } from "hardhat"; -import { wrapProviderToError } from "../../../src/utils/AmbErrorProvider"; -import { loadDeployment } from "@airdao/deployments/deploying"; - -import { - LimitedTokenPool, - LimitedTokenPoolsManager -} from "../../../typechain-types"; - -const BILLIION = 1_000_000_000; - -async function main() { - const { chainId } = await ethers.provider.getNetwork(); - - const [deployer] = await ethers.getSigners(); - wrapProviderToError(deployer.provider!); - - const hbrToken = loadDeployment("Ecosystem_HBRToken", chainId, deployer); - - const poolsManager = loadDeployment("Ecosystem_LimitedTokenPoolsManager", chainId, deployer) as LimitedTokenPoolsManager; - - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "HBR-AMB", - limitsMultiplierToken: hbrToken.address, - profitableToken: ethers.constants.AddressZero, - rewardToken: ethers.constants.AddressZero, - }; - - const createTx = await poolsManager.createPool(mainConfig); - const createReceipt = await createTx.wait(); - const event = createReceipt.events?.find((event) => event.event === "LimitedPoolCreated"); - const address = event?.args?.pool; - console.log("PoolAddress: ", address); - - const limitsConfig: LimitedTokenPool.LimitsConfigStruct = { - rewardTokenPrice: BILLIION, - interest: 0.1 * BILLIION, - interestRate: 30 * 60, - minDepositValue: 1, - minStakeValue: 1, - fastUnstakePenalty: 0, - unstakeLockPeriod: 0, - stakeLockPeriod: 1 * 60, - maxTotalStakeValue: ethers.utils.parseEther("100000000"), - maxStakePerUserValue: ethers.utils.parseEther("10000000"), - stakeLimitsMultiplier: 10 * BILLIION, - }; - - const configureLimitsTx = await poolsManager.configurePool(address, limitsConfig); - const configureLimitsReceipt = await configureLimitsTx.wait(); - console.log("configureLimitsReceipt", configureLimitsReceipt); -} - - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} - diff --git a/scripts/ecosystem/token_staking/deploy_hbr.ts b/scripts/ecosystem/token_staking/deploy_hbr.ts deleted file mode 100644 index 5b0aaafa..00000000 --- a/scripts/ecosystem/token_staking/deploy_hbr.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ethers } from "hardhat"; -import { ContractNames } from "../../../src"; -import { deploy, loadDeployment } from "@airdao/deployments/deploying"; -import { HBRToken__factory } from "../../../typechain-types"; - -async function main() { - const {chainId} = await ethers.provider.getNetwork(); - const [deployer] = await ethers.getSigners(); - - const multisig = loadDeployment(ContractNames.Ecosystem_LimitedTokenPoolsManagerMultisig, chainId, deployer); - - await deploy({ - contractName: ContractNames.Ecosystem_HBRToken, - artifactName: "HBRToken", - deployArgs: [multisig.address], - signer: deployer, - loadIfAlreadyDeployed: true, - }); -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} diff --git a/scripts/ecosystem/token_staking/deploy_limited_manager.ts b/scripts/ecosystem/token_staking/deploy_limited_manager.ts deleted file mode 100644 index 66a426bb..00000000 --- a/scripts/ecosystem/token_staking/deploy_limited_manager.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import { deploy, loadDeployment } from "@airdao/deployments/deploying"; - -import { ContractNames } from "../../../src"; - -import { - LimitedTokenPoolsManager__factory, - RewardsBank__factory, - LockKeeper__factory -} from "../../../typechain-types"; - -import { wrapProviderToError } from "../../../src/utils/AmbErrorProvider"; - -export async function main() { - const { chainId } = await ethers.provider.getNetwork(); - - const [deployer] = await ethers.getSigners(); - wrapProviderToError(deployer.provider!); - - const validatorSet = loadDeployment(ContractNames.ValidatorSet, chainId, deployer); - const multisig = loadDeployment(ContractNames.Ecosystem_LimitedTokenPoolsManagerMultisig, chainId, deployer); - - const rewardsBank = await deploy({ - contractName: ContractNames.Ecosystem_LimitedTokenPoolsManagerRewardsBank, - artifactName: "RewardsBank", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - }); - - const lockKeeper = await deploy({ - contractName: ContractNames.LockKeeper, - artifactName: "LockKeeper", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - isUpgradeableProxy: true, - }); - - console.log("deploying LimitedTokenPool Beacon"); - const limitedTokenPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - const limitedTokenPoolBeacon = await upgrades.deployBeacon(limitedTokenPoolFactory); - await limitedTokenPoolBeacon.deployed(); - console.log("LimitedTokenPool Beacon deployed to:", limitedTokenPoolBeacon.address); - - console.log("deploying TokenPoolsManager"); - const poolsManager = await deploy({ - contractName: ContractNames.Ecosystem_LimitedTokenPoolsManager, - artifactName: "LimitedTokenPoolsManager", - deployArgs: [rewardsBank.address, lockKeeper.address, limitedTokenPoolBeacon.address], - signer: deployer, - loadIfAlreadyDeployed: true, - }); - - console.log("Grant poolsManager rewardsBank admin roles"); - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), poolsManager.address)).wait(); - - console.log("Grant multisig rewardsBank admin role"); - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - console.log("Grant multisig poolsManager admin role"); - await (await poolsManager.grantRole(await poolsManager.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - // on prod - multisig only - if (chainId != 16718) { - console.log("Add block listeners"); - await (await validatorSet.addBlockListener(poolsManager.address)).wait(); - } else { - console.log("Add block listeners calldata"); - const calldata2 = await validatorSet.populateTransaction.addBlockListener(poolsManager.address); - const multisigTx2 = await multisig.populateTransaction.submitTransaction(validatorSet.address, 0, calldata2.data!); - console.log(multisigTx2); - } - - if (chainId != 16718) return; // continue only on prod - - console.log("Revoking roles from deployer"); - - console.log("Revoke rewardsBank admin role from deployer"); - await (await rewardsBank.revokeRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - - console.log("Revoke poolsManager admin role from deployer"); - await (await poolsManager.revokeRole(await poolsManager.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - - console.log("Transfer ownership of upgradeable beacon to multisig"); - await (await limitedTokenPoolBeacon.transferOwnership(multisig.address)).wait(); - -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} diff --git a/scripts/ecosystem/token_staking/deploy_multisig.ts b/scripts/ecosystem/token_staking/deploy_multisig.ts index 6fc5e034..582a67b2 100644 --- a/scripts/ecosystem/token_staking/deploy_multisig.ts +++ b/scripts/ecosystem/token_staking/deploy_multisig.ts @@ -4,8 +4,8 @@ import { deployMultisig } from "../../utils/deployMultisig"; async function main() { const [deployer] = await ethers.getSigners(); - - await deployMultisig(ContractNames.Ecosystem_LimitedTokenPoolsManagerMultisig, deployer, "eco"); + const multisig = await deployMultisig(ContractNames.Ecosystem_LimitedTokenPoolsManagerMultisig, deployer, "eco"); + console.log("Multisig deployed to ", multisig.address); } diff --git a/scripts/ecosystem/token_staking/deploy_token_manager.ts b/scripts/ecosystem/token_staking/deploy_token_manager.ts deleted file mode 100644 index ee4a162b..00000000 --- a/scripts/ecosystem/token_staking/deploy_token_manager.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import { deploy, loadDeployment } from "@airdao/deployments/deploying"; - -import { ContractNames } from "../../../src"; - -import { - TokenPoolsManager__factory, - RewardsBank__factory, - LockKeeper__factory -} from "../../../typechain-types"; - -import { wrapProviderToError } from "../../../src/utils/AmbErrorProvider"; -import { deployMultisig } from "../../utils/deployMultisig"; - -export async function main() { - const { chainId } = await ethers.provider.getNetwork(); - - const [deployer] = await ethers.getSigners(); - wrapProviderToError(deployer.provider!); - - const validatorSet = loadDeployment(ContractNames.ValidatorSet, chainId, deployer); - const multisig = loadDeployment(ContractNames.Ecosystem_LimitedTokenPoolsManagerMultisig, chainId, deployer); - - const rewardsBank = await deploy({ - contractName: ContractNames.Ecosystem_TokenPoolsManagerRewardsBank, - artifactName: "RewardsBank", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - }); - - const lockKeeper = await deploy({ - contractName: ContractNames.LockKeeper, - artifactName: "LockKeeper", - deployArgs: [], - signer: deployer, - loadIfAlreadyDeployed: true, - isUpgradeableProxy: true, - }); - - console.log("deploying TokenPool Beacon"); - - const tokenPoolFactory = await ethers.getContractFactory("TokenPool"); - const tokenPoolBeacon = await upgrades.deployBeacon(tokenPoolFactory); - await tokenPoolBeacon.deployed(); - console.log("TokenPool Beacon deployed to:", tokenPoolBeacon.address); - - console.log("deploying TokenPoolsManager"); - const poolsManager = await deploy({ - contractName: ContractNames.Ecosystem_TokenPoolsManager, - artifactName: "TokenPoolsManager", - deployArgs: [rewardsBank.address, lockKeeper.address, tokenPoolBeacon.address], - signer: deployer, - loadIfAlreadyDeployed: true, - }); - - console.log("Grant poolsManager rewardsBank admin roles"); - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), poolsManager.address)).wait(); - - console.log("Grant multisig rewardsBank admin role"); - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - console.log("Grant multisig poolsManager admin role"); - await (await poolsManager.grantRole(await poolsManager.DEFAULT_ADMIN_ROLE(), multisig.address)).wait(); - - // on prod - multisig only - if (chainId != 16718) { - console.log("Add block listeners"); - await (await validatorSet.addBlockListener(poolsManager.address)).wait(); - } else { - console.log("Add block listeners calldata"); - const calldata2 = await validatorSet.populateTransaction.addBlockListener(poolsManager.address); - const multisigTx2 = await multisig.populateTransaction.submitTransaction(validatorSet.address, 0, calldata2.data!); - console.log(multisigTx2); - } - - if (chainId != 16718) return; // continue only on prod - - console.log("Revoking roles from deployer"); - - console.log("Revoke rewardsBank admin role from deployer"); - await (await rewardsBank.revokeRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - - console.log("Revoke poolsManager admin role from deployer"); - await (await poolsManager.revokeRole(await poolsManager.DEFAULT_ADMIN_ROLE(), deployer.address)).wait(); - -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} diff --git a/scripts/ecosystem/token_staking/update_limited_beacon.ts b/scripts/ecosystem/token_staking/update_limited_beacon.ts deleted file mode 100644 index e09b14b5..00000000 --- a/scripts/ecosystem/token_staking/update_limited_beacon.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import { ContractNames } from "../../../src"; -import { loadDeployment } from "@airdao/deployments/deploying"; - -async function main() { - const {chainId} = await ethers.provider.getNetwork(); - const [deployer] = await ethers.getSigners(); - - console.log("Getting beacon address"); - const limitedTokenPoolManager = loadDeployment(ContractNames.Ecosystem_LimitedTokenPoolsManager, chainId, deployer); - const beacon = await limitedTokenPoolManager.limitedTokenPoolBeacon(); - console.log("Beacon address:", beacon); - - console.log("Upgrading LimitedTokenPool Beacon"); - const limitedTokenPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - await upgrades.upgradeBeacon(beacon, limitedTokenPoolFactory); - limitedTokenPoolFactory.attach(beacon); - console.log("LimitedTokenPool Beacon upgraded"); - -} - -if (require.main === module) { - main().catch((error) => { - console.error(error); - process.exitCode = 1; - }); -} diff --git a/test/staking/LiquidNodesManager.ts b/test/staking/LiquidNodesManager.ts deleted file mode 100644 index 0eca5124..00000000 --- a/test/staking/LiquidNodesManager.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { loadFixture, setBalance } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers, upgrades } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { LiquidNodesManager, - RewardsBank__factory, - TEST_ValidatorSet, - Treasury__factory, - RewardsBank, - Treasury -} from "../../typechain-types"; -import { expect } from "chai"; - -const nodeStake = 1000; -const maxNodeCount = 10; - -describe("LiquidNodesManager", function () { - let nodeManager: LiquidNodesManager; - let validatorSet: TEST_ValidatorSet; - let rewardsBank: RewardsBank; - let treasury: Treasury; - let treasuryFee: Treasury; - let owner: SignerWithAddress; - let addr1: SignerWithAddress; - let addr2: SignerWithAddress; - let backend: SignerWithAddress; - - async function deploy() { - const [owner, addr1, addr2] = await ethers.getSigners(); - const backend = owner; - - const validatorSetFactory = await ethers.getContractFactory("TEST_ValidatorSet"); - const validatorSet = (await upgrades.deployProxy( - validatorSetFactory, - [owner.address, 10, 2]) - ) as TEST_ValidatorSet; - - const rewardsBankNode = await new RewardsBank__factory(owner).deploy(); - const rewardsBankPool = await new RewardsBank__factory(owner).deploy(); - const treasury = await new Treasury__factory(owner).deploy(owner.address, 0); - const treasuryFee = await new Treasury__factory(owner).deploy(owner.address, 0.1 * 10000); - - - const nodeManagerFactory = await ethers.getContractFactory("LiquidNodesManager"); - const nodeManager = (await upgrades.deployProxy(nodeManagerFactory, [ - validatorSet.address, - rewardsBankNode.address, - treasury.address, - treasuryFee.address, - nodeStake, - maxNodeCount, - ])) as LiquidNodesManager; - - await nodeManager.grantRole(await nodeManager.POOL_ROLE(), owner.address); - await nodeManager.grantRole(await nodeManager.BACKEND_ROLE(), owner.address); - await rewardsBankPool.grantRole(await rewardsBankNode.DEFAULT_ADMIN_ROLE(), nodeManager.address); - await validatorSet.grantRole(await validatorSet.STAKING_MANAGER_ROLE(), nodeManager.address); - - - await setBalance(rewardsBankNode.address, ethers.utils.parseEther("1000")); - await setBalance(rewardsBankPool.address, ethers.utils.parseEther("1000")); - - const rewardsBank = rewardsBankNode; - - return { - nodeManager, - validatorSet, - rewardsBank, - treasury, - treasuryFee, - owner, - addr1, - addr2, - backend - }; - } - - beforeEach(async function () { - ( - { - nodeManager, - validatorSet, - rewardsBank, - treasury, - treasuryFee, - owner, - addr1, - addr2, - backend - } = await loadFixture(deploy) - ); - }); - - describe("Initialization", function () { - it("Should initialize with correct values", async function () { - expect(await nodeManager.validatorSet()).to.equal(validatorSet.address); - expect(await nodeManager.rewardsBank()).to.equal(rewardsBank.address); - expect(await nodeManager.treasury()).to.equal(treasury.address); - expect(await nodeManager.treasuryFee()).to.equal(treasuryFee.address); - expect(await nodeManager.nodeStake()).to.equal(nodeStake); - expect(await nodeManager.maxNodesCount()).to.equal(maxNodeCount); - expect(await nodeManager.getNodesCount()).to.equal(0); - }); - }); - - describe("Role management", function () { - it("Should grant and revoke roles correctly", async function () { - const poolRole = await nodeManager.POOL_ROLE(); - await nodeManager.grantRole(poolRole, addr1.address); - expect(await nodeManager.hasRole(poolRole, addr1.address)).to.be.true; - - await nodeManager.revokeRole(poolRole, addr1.address); - expect(await nodeManager.hasRole(poolRole, addr1.address)).to.be.false; - }); - }); - - describe("Node management", function () { - it("Should create one request", async function () { - expect(await nodeManager.connect(owner).stake({value: nodeStake})) - .to.emit(nodeManager, "AddNodeRequest") - .withArgs(1, 0, nodeStake);; - }); - - it("Should onboard one Node", async function () { - const result1 = await (await nodeManager.connect(owner).stake({value: nodeStake})).wait(); - if(!result1.events?.find((e) => e.event === "AddNodeRequest")) { - expect.fail("AddNodeRequest event not found"); - } - - const result2 = await(await nodeManager.connect(owner).onboardNode(1, addr1.address, 0)).wait(); - if (!result2.events?.find((e) => e.event === "NodeOnboarded")) { - expect.fail("NodeOnboarded event not found"); - } - if (result2.events?.find((e) => e.event === "AddNodeRequest")) { - expect.fail("AddNodeRequest event found"); - } - - expect(await nodeManager.getNodesCount()).to.equal(1); - expect(await nodeManager.nodes(0)).to.equal(addr1.address); - expect(await validatorSet.getNodeStake(addr1.address)).to.equal(nodeStake); - }); - - it("Should onboard two Nodes", async function () { - const result1 = await (await nodeManager.connect(owner).stake({value: nodeStake * 2})).wait(); - if(!result1.events?.find((e) => e.event === "AddNodeRequest")) { - expect.fail("AddNodeRequest event not found"); - } - - const result2 = await(await nodeManager.connect(owner).onboardNode(1, addr1.address, 0)).wait(); - if (!result2.events?.find((e) => e.event === "NodeOnboarded")) { - expect.fail("NodeOnboarded event not found"); - } - if (!result2.events?.find((e) => e.event === "AddNodeRequest")) { - expect.fail("AddNodeRequest event not found"); - } - expect(await nodeManager.getNodesCount()).to.equal(1); - expect(await nodeManager.nodes(0)).to.equal(addr1.address); - expect(await nodeManager.getNodeDeposit(addr1.address)).to.equal(nodeStake); - expect(await validatorSet.getNodeStake(addr1.address)).to.equal(nodeStake); - - const result3 = await (await nodeManager.connect(owner).onboardNode(2, addr2.address, 1)).wait(); - if (!result3.events?.find((e) => e.event === "NodeOnboarded")) { - expect.fail("NodeOnboarded event not found"); - } - if (result3.events?.find((e) => e.event === "AddNodeRequest")) { - expect.fail("AddNodeRequest event found"); - } - expect(await nodeManager.getNodesCount()).to.equal(2); - expect(await nodeManager.nodes(1)).to.equal(addr2.address); - expect(await nodeManager.getNodeDeposit(addr2.address)).to.equal(nodeStake); - expect(await validatorSet.getNodeStake(addr2.address)).to.equal(nodeStake); - }); - - it("Should fail to onboard node if not backend", async function () { - await nodeManager.connect(owner).stake({ value: nodeStake }); - await expect(nodeManager.connect(addr1).onboardNode(1, addr1.address, 0)).to.be.reverted; - }); - - it("Should fail to onboard node with invalid request", async function () { - expect(await nodeManager.connect(owner).stake({value: nodeStake})).to.emit(nodeManager, "AddNodeRequest"); - - await expect(nodeManager.connect(owner).onboardNode(3, addr1.address, 0)).to.be.revertedWith("Invalid request id"); - }); - - it("Should retire node on unstake", async function () { - expect(await nodeManager.connect(owner).stake({value: nodeStake})).to.emit(nodeManager, "AddNodeRequest"); - await nodeManager.connect(owner).onboardNode(1, addr1.address, 0); - - expect(await nodeManager.connect(owner).unstake(nodeStake)) - .to.emit(nodeManager, "NodeRetired") - .withArgs(0, addr1.address, nodeStake); - - expect(await nodeManager.getNodesCount()).to.equal(0); - }); - - it("Should fail to unstake more than available", async function () { - await nodeManager.connect(owner).stake({ value: nodeStake }); - await expect(nodeManager.connect(owner).unstake(nodeStake * 2)).to.be.reverted; - }); - }); - - describe("Upgrade", function () { - it("Should allow admin to upgrade", async function () { - const NewLiquidNodesManager = await ethers.getContractFactory("LiquidNodesManager"); - await expect(upgrades.upgradeProxy(nodeManager.address, NewLiquidNodesManager)).to.not.be.reverted; - }); - - it("Should not allow non-admin to upgrade", async function () { - const NewLiquidNodesManager = await ethers.getContractFactory("LiquidNodesManager", addr1); - await expect(upgrades.upgradeProxy(nodeManager.address, NewLiquidNodesManager)).to.be.reverted; - }); - }); - - describe("Miscellaneous", function () { - it("Should return correct free balance", async function () { - await nodeManager.connect(owner).stake({ value: nodeStake * 2 }); - await nodeManager.connect(backend).onboardNode(1, addr1.address, 0); - expect(await nodeManager.getFreeBalance()).to.equal(nodeStake); - }); - - it("Should return correct nodes array", async function () { - await nodeManager.connect(owner).stake({ value: nodeStake * 2 }); - await nodeManager.connect(backend).onboardNode(1, addr1.address, 0); - await nodeManager.connect(backend).onboardNode(2, addr2.address, 1); - const nodes = await nodeManager.getNodes(); - expect(nodes).to.deep.equal([addr1.address, addr2.address]); - }); - - it("Should handle report function", async function () { - await expect(nodeManager.report(addr1.address)).to.not.be.reverted; - }); - }); - -}); diff --git a/test/staking/LiquidPool.ts b/test/staking/LiquidPool.ts deleted file mode 100644 index 1f306db3..00000000 --- a/test/staking/LiquidPool.ts +++ /dev/null @@ -1,419 +0,0 @@ -import { loadFixture, setBalance, time } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers, upgrades } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { - AirBond, - AirBond__factory, - LiquidNodesManager, - LiquidPool, - RewardsBank__factory, - LockKeeper__factory, - LockKeeper, - StakingTiers, - StAMB, - StAMB__factory, - TEST_ValidatorSet, - Treasury__factory -} from "../../typechain-types"; -import { expect } from "chai"; - -const D1 = 60 * 60 * 24; -const BILLION = 1_000_000_000; - -const T = 20000000000; - -const nodeStake = ethers.utils.parseEther("500"); -const maxNodeCount = 10; - -const interest = 0.10 * BILLION; // 10% -const interestPeriod = D1; // 1 day -const minStakeValue = 1; -const lockPeriod = 30 * D1; // 30 days -const penalty = 0.10 * BILLION; // 10% - - -describe("LiquidPool", function () { - let liquidPool: LiquidPool; - let stAMB: StAMB; - let airBond: AirBond; - let stakingTiers: StakingTiers; - let lockKeeper: LockKeeper; - let owner: SignerWithAddress; - let addr1: SignerWithAddress; - - async function deploy() { - await time.setNextBlockTimestamp(T); - - const [owner, addr1] = await ethers.getSigners(); - - const validatorSetFactory = await ethers.getContractFactory("TEST_ValidatorSet"); - const validatorSet = (await upgrades.deployProxy(validatorSetFactory, [owner.address, 10, 2])) as TEST_ValidatorSet; - - const rewardsBankNode = await new RewardsBank__factory(owner).deploy(); - const rewardsBankPool = await new RewardsBank__factory(owner).deploy(); - const treasury = await new Treasury__factory(owner).deploy(owner.address, 0); - const treasuryFee = await new Treasury__factory(owner).deploy(owner.address, 0.1 * 10000); - const airBond = await new AirBond__factory(owner).deploy(owner.address); - - const lockKeeper = await new LockKeeper__factory(owner).deploy(); - - const stAMB = await new StAMB__factory(owner).deploy(); - - - const stakingTiersFactory = await ethers.getContractFactory("StakingTiers"); - const stakingTiers = await upgrades.deployProxy(stakingTiersFactory, [ - stAMB.address - ]) as StakingTiers; - - - const nodeManagerFactory = await ethers.getContractFactory("LiquidNodesManager"); - const nodeManager = (await upgrades.deployProxy(nodeManagerFactory, [ - validatorSet.address, - rewardsBankNode.address, - treasury.address, - treasuryFee.address, - nodeStake, - maxNodeCount, - ])) as LiquidNodesManager; - - const liquidPoolFactory = await ethers.getContractFactory("LiquidPool"); - const liquidPool = (await upgrades.deployProxy(liquidPoolFactory, [ - nodeManager.address, - rewardsBankPool.address, - stakingTiers.address, - lockKeeper.address, - airBond.address, - stAMB.address, - interest, - interestPeriod, - minStakeValue, - lockPeriod, - penalty - ])) as LiquidPool; - - - await stAMB.setLiquidPool(liquidPool.address); - await nodeManager.grantRole(await nodeManager.POOL_ROLE(), liquidPool.address); - - await rewardsBankNode.grantRole(await rewardsBankNode.DEFAULT_ADMIN_ROLE(), nodeManager.address); - await rewardsBankPool.grantRole(await rewardsBankPool.DEFAULT_ADMIN_ROLE(), liquidPool.address); - await validatorSet.grantRole(await validatorSet.STAKING_MANAGER_ROLE(), nodeManager.address); - - - await airBond.grantRole(await airBond.MINTER_ROLE(), owner.address); - await setBalance(rewardsBankNode.address, ethers.utils.parseEther("1000")); - await airBond.mint(rewardsBankNode.address, ethers.utils.parseEther("1000")); - await setBalance(rewardsBankPool.address, ethers.utils.parseEther("1000")); - await airBond.mint(rewardsBankPool.address, ethers.utils.parseEther("1000")); - - return { liquidPool, stAMB, airBond, stakingTiers, lockKeeper, owner, addr1 }; - } - - beforeEach(async function () { - ({ liquidPool, stAMB, airBond, stakingTiers, lockKeeper, owner, addr1 } = await loadFixture(deploy)); - }); - - it("should work", async function () { - const [A, B, C] = await ethers.getSigners(); - - - await liquidPool.connect(A).stake({ value: 15_000 }); - expect(await liquidPool.getStake(A.address)).to.be.equal(15_000); - expect(await liquidPool.totalRewards()).to.be.equal(15_000); - expect(await liquidPool.totalRewardsDebt()).to.be.equal(15_000); - expect(await liquidPool.rewardsDebt(A.address)).to.be.equal(15_000); - - await liquidPool.connect(B).stake({ value: 5_000 }); - expect(await liquidPool.getStake(B.address)).to.be.equal(5_000); - expect(await liquidPool.totalRewards()).to.be.equal(20_000); - expect(await liquidPool.totalRewardsDebt()).to.be.equal(20_000); - expect(await liquidPool.rewardsDebt(B.address)).to.be.equal(5_000); - - - await liquidPool.connect(C).stake({ value: 15_000 }); - expect(await liquidPool.getStake(C.address)).to.be.equal(15_000); - expect(await liquidPool.totalRewards()).to.be.equal(35_000); - expect(await liquidPool.totalRewardsDebt()).to.be.equal(35_000); - expect(await liquidPool.rewardsDebt(C.address)).to.be.equal(15_000); - - }); - - - - describe("stake", function () { - it("should work", async function () { - await expect(liquidPool.stake({ value: 50 })) - .to.changeEtherBalance(owner, -50); - - expect(await liquidPool.getTotalStAmb()).to.be.equal(50); - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - expect(await liquidPool.getStake(owner.address)).to.be.equal(50); - - await expect(liquidPool.stake({ value: 25 })) - .to.changeEtherBalance(owner, -25); - - expect(await liquidPool.getTotalStAmb()).to.be.equal(75); - expect(await liquidPool.getStake(owner.address)).to.be.equal(75); - }); - - it("should reject stakes below minStakeValue", async function () { - await expect(liquidPool.stake({ value: 0 })).to.be.revertedWith("Pool: stake value too low"); - }); - - it("should allow to stake from many addresses", async function () { - const testAddr1 = ethers.Wallet.createRandom().connect(ethers.provider); - setBalance(testAddr1.address, ethers.utils.parseEther("100")); - await expect(liquidPool.connect(testAddr1).stake({ value: 10 })).to.changeEtherBalance(testAddr1, -10); - expect(await liquidPool.getTotalStAmb()).to.be.equal(10); - expect(await liquidPool.getStake(testAddr1.address)).to.be.equal(10); - - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - - const testAddr2 = ethers.Wallet.createRandom().connect(ethers.provider); - setBalance(testAddr2.address, ethers.utils.parseEther("100")); - await expect(liquidPool.connect(testAddr2).stake({ value: 10 })).to.changeEtherBalance(testAddr2, -10); - expect(await liquidPool.getTotalStAmb()).to.be.equal(20); - expect(await liquidPool.getStake(testAddr2.address)).to.be.equal(10); - - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - - const testAddr3 = ethers.Wallet.createRandom().connect(ethers.provider); - setBalance(testAddr3.address, ethers.utils.parseEther("100")); - await expect(liquidPool.connect(testAddr3).stake({ value: 10 })).to.changeEtherBalance(testAddr3, -10); - expect(await liquidPool.getTotalStAmb()).to.be.equal(30); - expect(await liquidPool.getStake(testAddr3.address)).to.be.equal(10); - - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - }); - }); - - it("Test strange unstake case", async function () { - await stakingTiers.setBonus(owner.address, 100); // can unstake with rewards in 100% amb - await stakingTiers.setBonus(addr1.address, 100); // can unstake with rewards in 100% amb - await expect(await liquidPool.stake({value: 1000})).to.changeEtherBalance(owner, -1000); - expect(await liquidPool.getStake(owner.address)).to.be.equal(1000); - expect(await liquidPool.getTotalStAmb()).to.be.equal(1000); - - await time.increase(D1); - await liquidPool.onBlock(); - - expect(await liquidPool.totalRewards()).to.be.equal(1100); - expect(await liquidPool.getClaimAmount(owner.address)).to.be.equal(100); - - await expect(await liquidPool.connect(addr1).stake({value: 1000})).to.changeEtherBalance(addr1, -1000); - expect(await liquidPool.getStake(addr1.address)).to.be.equal(1000); - expect(await liquidPool.getTotalStAmb()).to.be.equal(2000); - - await time.increase(D1); - await liquidPool.onBlock(); - - expect(await liquidPool.getClaimAmount(addr1.address)).to.be.equal(100); - expect(await liquidPool.getClaimAmount(owner.address)).to.be.equal(200); - - await expect(await liquidPool.unstake(500, 100)).to.changeEtherBalance(owner, 200); //expecting to get rewards in amb - expect(await liquidPool.getClaimAmount(owner.address)).to.be.equal(0); - expect(await liquidPool.getStake(owner.address)).to.be.equal(500); - expect(await liquidPool.getTotalStAmb()).to.be.equal(1500); - - await expect(await liquidPool.unstake(500, 100)).to.changeEtherBalance(owner, 0); //expecting to get zero rewards - expect(await liquidPool.getClaimAmount(owner.address)).to.be.equal(0); - expect(await liquidPool.getStake(owner.address)).to.be.equal(0); - expect(await liquidPool.getTotalStAmb()).to.be.equal(1000); - - await expect(await liquidPool.connect(addr1).unstake(500, 100)).to.changeEtherBalance(addr1, 100); //expecting to get rewards in amb - expect(await liquidPool.getClaimAmount(addr1.address)).to.be.equal(0); - expect(await liquidPool.getStake(addr1.address)).to.be.equal(500); - expect(await liquidPool.getTotalStAmb()).to.be.equal(500); - - await expect(await liquidPool.connect(addr1).unstake(500, 100)).to.changeEtherBalance(addr1, 0); //expecting to get rewards in amb - expect(await liquidPool.getClaimAmount(addr1.address)).to.be.equal(0); - expect(await liquidPool.getStake(addr1.address)).to.be.equal(0); - expect(await liquidPool.getTotalStAmb()).to.be.equal(0); - - await liquidPool.stake({value: 1000}); - }); - - - describe("unstake", function () { - beforeEach(async function () { - await liquidPool.stake({ value: 100 }); - await stakingTiers.setBonus(owner.address, 100); // can unstake with rewards in 100% amb - }); - - - it("should work (no rewards, with delay)", async function () { - await expect(liquidPool.unstake(100, 100)).to.emit(lockKeeper, "Locked"); - }); - - it("should work (no rewards, with delay, several unstakes)", async function () { - await expect(liquidPool.unstake(50, 100)).to.emit(lockKeeper, "Locked"); - await expect(liquidPool.unstake(50, 100)).to.emit(lockKeeper, "Locked"); - }); - - - it("should work (no rewards, with delay, twice)", async function () { - await expect(liquidPool.unstake(50, 100)).to.emit(lockKeeper, "Locked"); - await expect(liquidPool.unstake(50, 100)).to.emit(lockKeeper, "Locked"); - }); - - it("should work (claim rewards, with delay)", async function () { - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.eq(10); - - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(10); - - await expect(liquidPool.unstake(100, 100)).to.emit(lockKeeper, "Locked"); - }); - - it("should work (no rewards, without delay)", async function () { - //the penalty is 10% of the stake - await expect(liquidPool.unstakeFast(100, 100)).to.changeEtherBalance(owner, 90); - - expect(await liquidPool.getTotalStAmb()).to.be.equal(0); - expect(await liquidPool.getStake(owner.address)).to.be.equal(0); - }); - - it("should work (claim rewards, without delay)", async function () { - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.eq(10); - - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(10); - - // the penalty is 10% of the stake - await expect(() => liquidPool.unstakeFast(100, 100)).to.changeEtherBalance(owner, 100); - - expect(await liquidPool.getTotalStAmb()).to.be.equal(0); - expect(await liquidPool.getStake(owner.address)).to.be.equal(0); - }); - - it("should show 0 rewards after unstake", async function () { - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.eq(10); - - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(10); - - await expect(liquidPool.unstake(100, 100)).to.emit(lockKeeper, "Locked"); - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(0); - }); - - it("should reject unstaking more then staked", async function () { - await expect(liquidPool.unstake(1000, 75)).to.be.revertedWith("Sender has not enough tokens"); - }); - }); - - - describe("claimRewards", function () { - beforeEach(async function () { - await liquidPool.stake({ value: 100 }); - await stakingTiers.setBonus(owner.address, 100); // can unstake with rewards in 100% amb - - // increase time by 1 day and call interest => rewards should increase by 10% - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.eq(10); - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(10); - }); - - it("should work (100% amb)", async function () { - await expect(liquidPool.claimRewards(100)) - .to.changeEtherBalance(owner, 10); - expect(await airBond.balanceOf(owner.address)).to.eq(0); - - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(0); - }); - - it("should work (50% amb)", async function () { - await expect(liquidPool.claimRewards(50)) - .to.changeEtherBalance(owner, 5); - expect(await airBond.balanceOf(owner.address)).to.eq(5); - }); - - it("should work (0% amb)", async function () { - await expect(liquidPool.claimRewards(0)) - .to.changeEtherBalance(owner, 0); - expect(await airBond.balanceOf(owner.address)).to.eq(10); - }); - - it("shouldn't work (146% amb)", async function () { - await expect(liquidPool.claimRewards(146)).to.be.revertedWith("Invalid desired coeff"); - }); - - it("shouldn't work when user doesn't have desired tier", async function () { - await stakingTiers.setBonus(owner.address, 0); // without bonus user tier is 25 - expect(await stakingTiers.calculateTier(owner.address)).to.be.equal(25); - - await expect(liquidPool.claimRewards(100)).to.be.revertedWith("User tier is too low"); - }); - - it("claim without rewards should do nothing", async function () { - await expect(liquidPool.claimRewards(100)) - .to.changeEtherBalance(owner, 10); - - expect(await liquidPool.getClaimAmount(owner.address)).to.eq(0); - - await expect(liquidPool.claimRewards(100)) - .to.changeEtherBalance(owner, 0); - }); - - }); - - - describe("setInterest", function () { - it("should work", async function () { - await liquidPool.setInterest(1000, 2 * D1); - expect(await liquidPool.interest()).to.be.equal(1000); - expect(await liquidPool.interestPeriod()).to.be.equal(2 * D1); - }); - - it("should revert if interest is too high", async function () { - await expect(liquidPool.setInterest(BILLION + 1, 2 * D1)).to.be.reverted; - }); - - it("should revert if not admin", async function () { - await expect(liquidPool.connect(addr1).setInterest(1000, 2 * D1)).to.be.reverted; - }); - }); - - describe("tryInterest", function () { - it("should work", async function () { - await liquidPool.stake({ value: 100 }); - await liquidPool.connect(addr1).stake({ value: 900 }); - - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.be.equal(100); - }); - - it("should do nothing if called too early", async function () { - await liquidPool.stake({ value: 100 }); - await liquidPool.connect(addr1).stake({ value: 900 }); - - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - }); - - it("should do nothing if there is no stakes", async function () { - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - await time.increase(D1); - await liquidPool.onBlock(); - expect(await liquidPool.getTotalRewards()).to.be.equal(0); - }); - - }); - -}); diff --git a/test/staking/token/LimitedTokenPool.ts b/test/staking/token/LimitedTokenPool.ts deleted file mode 100644 index c54ba0d5..00000000 --- a/test/staking/token/LimitedTokenPool.ts +++ /dev/null @@ -1,553 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { - RewardsBank, - AirBond, - LimitedTokenPool, - RewardsBank__factory, - AirBond__factory, - LockKeeper__factory, - LockKeeper, -} from "../../../typechain-types"; - -const D1 = 24 * 60 * 60; -const BILLION = 1_000_000_000; - -import { expect } from "chai"; - -describe("LimitedTokenPool", function () { - let owner: SignerWithAddress; - let user1: SignerWithAddress; - let user2: SignerWithAddress; - let limitedPool : LimitedTokenPool; - let rewardsBank: RewardsBank; - let lockKeeper: LockKeeper; - let limitsMultiplierToken: AirBond; - let profitableToken: AirBond; - - - async function deploy() { - const [owner, user1, user2] = await ethers.getSigners(); - - const rewardsBank = await new RewardsBank__factory(owner).deploy(); - const limitsMultiplierToken = await new AirBond__factory(owner).deploy(owner.address); - const profitableToken = await new AirBond__factory(owner).deploy(owner.address); - const lockKeeper = await new LockKeeper__factory(owner).deploy(); - - const limitedPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "Test Deposited Pool", - limitsMultiplierToken: limitsMultiplierToken.address, - profitableToken: profitableToken.address, - rewardToken: profitableToken.address, - }; - - const limitsConfig: LimitedTokenPool.LimitsConfigStruct = { - rewardTokenPrice: BILLION, // 1:1 ratio - interest: 0.10 * BILLION, // 10% - interestRate: D1, // 1 day - minDepositValue: 10, - minStakeValue: 10, - fastUnstakePenalty: 0.10 * BILLION, // 10% - unstakeLockPeriod: D1, // 1 day - stakeLockPeriod: D1, // 1 day - maxTotalStakeValue: ethers.utils.parseEther("1000000"), - maxStakePerUserValue: ethers.utils.parseEther("100000"), - stakeLimitsMultiplier: 2 * BILLION, // 2x - }; - - const limitedPool = (await upgrades.deployProxy(limitedPoolFactory, [ - rewardsBank.address, - lockKeeper.address, - mainConfig - ])) as LimitedTokenPool; - - await limitedPool.setLimitsConfig(limitsConfig); - - await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), limitedPool.address); - await limitsMultiplierToken.grantRole(await limitsMultiplierToken.MINTER_ROLE(), owner.address); - await profitableToken.grantRole(await profitableToken.MINTER_ROLE(), owner.address); - - // Mint tokens for testing - const mintAmount = ethers.utils.parseEther("1000000"); - await limitsMultiplierToken.mint(owner.address, mintAmount); - await profitableToken.mint(owner.address, mintAmount); - await profitableToken.mint(rewardsBank.address, mintAmount); - - // Approve tokens for testing - await limitsMultiplierToken.approve(limitedPool.address, mintAmount); - await profitableToken.approve(limitedPool.address, mintAmount); - - return { owner, user1, user2, limitedPool, rewardsBank, lockKeeper, limitsMultiplierToken, profitableToken}; - } - - beforeEach(async function () { - ({ owner, user1, user2, limitedPool, rewardsBank, lockKeeper, limitsMultiplierToken, profitableToken } = await loadFixture(deploy)); - }); - - describe("Initialization", function () { - it("Should initialize with correct main config", async function () { - const config = await limitedPool.mainConfig(); - expect(config.name).to.equal("Test Deposited Pool"); - expect(config.limitsMultiplierToken).to.equal(limitsMultiplierToken.address); - expect(config.profitableToken).to.equal(profitableToken.address); - expect(config.rewardToken).to.equal(profitableToken.address); - }); - - it("Should initialize with correct limits config", async function () { - const limits = await limitedPool.limitsConfig(); - expect(limits.rewardTokenPrice).to.equal(BILLION); - expect(limits.interest).to.equal(0.10 * BILLION); - expect(limits.interestRate).to.equal(D1); - expect(limits.minDepositValue).to.equal(10); - expect(limits.minStakeValue).to.equal(10); - expect(limits.fastUnstakePenalty).to.equal(0.10 * BILLION); - expect(limits.unstakeLockPeriod).to.equal(D1); - expect(limits.stakeLockPeriod).to.equal(D1); - expect(limits.maxTotalStakeValue).to.equal(ethers.utils.parseEther("1000000")); - expect(limits.maxStakePerUserValue).to.equal(ethers.utils.parseEther("100000")); - expect(limits.stakeLimitsMultiplier).to.equal(2 * BILLION); - }); - }); - - describe("Deposit", function () { - it("Should allow deposit", async function () { - const depositAmount = ethers.utils.parseEther("100"); - await expect(limitedPool.deposit(depositAmount)) - .to.emit(limitedPool, "Deposited") - .withArgs(owner.address, depositAmount); - - const info = await limitedPool.info(); - expect(info.totalDeposit).to.equal(depositAmount); - - const deposit = await limitedPool.getDeposit(owner.address); - expect(deposit).to.equal(depositAmount); - }); - - it("Should not allow deposit below minimum", async function () { - const depositAmount = 1; - await expect(limitedPool.deposit(depositAmount)).to.be.revertedWith("Pool: deposit value is too low"); - }); - }); - - describe("Withdrawal", function () { - beforeEach(async function () { - await limitedPool.deposit(ethers.utils.parseEther("1000")); - }); - - it("Should allow withdrawal", async function () { - const withdrawAmount = ethers.utils.parseEther("500"); - await expect(limitedPool.withdraw(withdrawAmount)) - .to.emit(limitedPool, "Withdrawn") - .withArgs(owner.address, withdrawAmount); - - const info = await limitedPool.info(); - expect(info.totalDeposit).to.equal(ethers.utils.parseEther("500")); - - const deposit = await limitedPool.getDeposit(owner.address); - expect(deposit).to.equal(ethers.utils.parseEther("500")); - }); - - it("Should not allow withdrawal more than deposited", async function () { - const withdrawAmount = ethers.utils.parseEther("1001"); - await expect(limitedPool.withdraw(withdrawAmount)).to.be.revertedWith("Not enough deposit"); - }); - - it("Should not allow withdrawal that would violate stake limits", async function () { - await limitedPool.stake(ethers.utils.parseEther("500")); - await expect(limitedPool.withdraw(ethers.utils.parseEther("751"))) - .to.be.revertedWith("Pool: user max stake value exceeded"); - }); - }); - - describe("Stake", function () { - beforeEach(async function () { - // Deposit before staking - await limitedPool.deposit(ethers.utils.parseEther("1000")); - }); - - it("Should allow staking", async function () { - const stakeAmount = ethers.utils.parseEther("100"); - await limitedPool.stake(stakeAmount); - - const info = await limitedPool.info(); - expect(info.totalStake).to.equal(stakeAmount); - - const stake = await limitedPool.getStake(owner.address); - expect(stake).to.equal(stakeAmount); - }); - - it("Should not allow staking below minimum", async function () { - const stakeAmount = 1; - await expect(limitedPool.stake(stakeAmount)).to.be.revertedWith("Pool: stake value is too low"); - }); - - it("Should not allow staking above user limit", async function () { - const stakeAmount = ethers.utils.parseEther("2001"); - await expect(limitedPool.stake(stakeAmount)).to.be.revertedWith("Pool: user max stake value exceeded"); - }); - - it("Should not allow staking above total pool limit", async function () { - const limits= await limitedPool.limitsConfig(); - const updatedLimits = { - ...limits, - maxTotalStakeValue: ethers.utils.parseEther("100"), - maxStakePerUserValue: ethers.utils.parseEther("100") - }; - await limitedPool.setLimitsConfig(updatedLimits); - const stakeAmount = ethers.utils.parseEther("101"); - await expect(limitedPool.stake(stakeAmount)).to.be.revertedWith("Pool: max stake value exceeded"); - }); - }); - - describe("Unstake", function () { - const stakeAmount = ethers.utils.parseEther("100"); - - beforeEach(async function () { - await limitedPool.deposit(ethers.utils.parseEther("1000")); - await limitedPool.stake(stakeAmount); - await time.increase(D1); - }); - - it("Should allow unstaking", async function () { - await expect(limitedPool.unstake(stakeAmount)) - .to.emit(lockKeeper, "Locked"); - - const info = await limitedPool.info(); - expect(info.totalStake).to.equal(0); - - const stake = await limitedPool.getStake(owner.address); - expect(stake).to.equal(0); - }); - - it("Should not allow unstaking more than staked", async function () { - await expect(limitedPool.unstake(stakeAmount.add(1))).to.be.revertedWith("Not enough stake"); - }); - - it("Should not allow unstaking before stake lock period", async function () { - const limits = await limitedPool.limitsConfig(); - const updatedLimits = { - ...limits, - stakeLockPeriod: ethers.BigNumber.from(D1 * 2) - }; - await limitedPool.setLimitsConfig(updatedLimits); - await limitedPool.stake(stakeAmount); - await time.increase(D1 / 2); - await expect(limitedPool.unstake(stakeAmount)).to.be.revertedWith("Stake is locked"); - }); - }); - - describe("Fast Unstake", function () { - const stakeAmount = ethers.utils.parseEther("100"); - - beforeEach(async function () { - await limitedPool.deposit(ethers.utils.parseEther("1000")); - await limitedPool.stake(stakeAmount); - await time.increase(D1); - }); - - it("Should allow fast unstaking with penalty", async function () { - const balanceBefore = await profitableToken.balanceOf(owner.address); - await limitedPool.unstakeFast(stakeAmount); - const balanceAfter = await profitableToken.balanceOf(owner.address); - - const expectedReturn = stakeAmount.mul(90).div(100); // 90% due to 10% penalty - expect(balanceAfter.sub(balanceBefore)).to.equal(expectedReturn); - - const info = await limitedPool.info(); - expect(info.totalStake).to.equal(0); - }); - }); - - describe("Rewards", function () { - const stakeAmount = 1000; - - beforeEach(async function () { - await limitedPool.deposit(ethers.utils.parseEther("2000")); - await limitedPool.stake(stakeAmount); - }); - - it("Should calculate rewards correctly", async function () { - await time.increase(D1); - await limitedPool.onBlock(); - - const rewards = await limitedPool.getUserRewards(owner.address); - const expectedRewards = stakeAmount * 0.1; // 10% interest - expect(rewards).to.equal(expectedRewards); - }); - - it("Should allow claiming rewards", async function () { - await time.increase(D1); - await limitedPool.onBlock(); - - const balanceBefore = await profitableToken.balanceOf(owner.address); - await limitedPool.claim(); - const balanceAfter = await profitableToken.balanceOf(owner.address); - - const expectedRewards = stakeAmount * 0.1; // 10% interest - expect(balanceAfter.sub(balanceBefore)).to.equal(expectedRewards); - }); - }); - - describe("Edge cases", function () { - it("Should handle multiple deposits and stakes correctly", async function () { - const limits = await limitedPool.limitsConfig(); - const updatedLimits = { - ...limits, - stakeLockPeriod: 0, - }; - await limitedPool.setLimitsConfig(updatedLimits); - const depositAmount = ethers.utils.parseEther("1000"); - const stakeAmount = ethers.utils.parseEther("500"); - - await limitedPool.deposit(depositAmount); - await limitedPool.stake(stakeAmount); - await limitedPool.deposit(depositAmount); - await limitedPool.stake(stakeAmount); - - const info = await limitedPool.info(); - expect(info.totalDeposit).to.equal(depositAmount.mul(2)); - expect(info.totalStake).to.equal(stakeAmount.mul(2)); - - const deposit = await limitedPool.getDeposit(owner.address); - const stake = await limitedPool.getStake(owner.address); - expect(deposit).to.equal(depositAmount.mul(2)); - expect(stake).to.equal(stakeAmount.mul(2)); - }); - - it("Should handle rewards correctly after multiple stakes and unstakes", async function () { - const limits = await limitedPool.limitsConfig(); - const updatedLimits = { - ...limits, - stakeLockPeriod: 0, - }; - await limitedPool.setLimitsConfig(updatedLimits); - const depositAmount = ethers.utils.parseEther("2000"); - const stakeAmount = ethers.utils.parseEther("500"); - - await limitedPool.deposit(depositAmount); - await limitedPool.stake(stakeAmount); - await time.increase(D1 / 2); - await limitedPool.stake(stakeAmount); - await time.increase(D1 / 2); - await limitedPool.unstake(stakeAmount); - - await limitedPool.onBlock(); - - const rewards = await limitedPool.getUserRewards(owner.address); - // Expected rewards calculation is complex due to different staking times - expect(rewards).to.be.gt(0); - }); - - it("Should not allow actions when pool is deactivated", async function () { - await limitedPool.deactivate(); - - await expect(limitedPool.deposit(ethers.utils.parseEther("100"))).to.be.revertedWith("Pool is not active"); - await expect(limitedPool.stake(ethers.utils.parseEther("100"))).to.be.revertedWith("Pool is not active"); - }); - }); - - - describe("Interest calculation", function () { - beforeEach(async function () { - await limitedPool.deposit(ethers.utils.parseEther("1000")); - await limitedPool.stake(500); - }); - - it("Should calculate interest correctly over multiple periods", async function () { - for (let i = 0; i < 5; i++) { - await time.increase(D1); - await limitedPool.onBlock(); - } - - const rewards = await limitedPool.getUserRewards(owner.address); - //const expectedRewards = ethers.utils.parseEther("500").mul(10).div(100).mul(5); // 10% interest for 5 days - const expectedRewards = 500 * 0.1 * 5; // 10% interest for 5 days - expect(rewards).to.be.closeTo(expectedRewards, "100"); // Allow small rounding error - }); - - it("Should not add interest if called too frequently", async function () { - await limitedPool.onBlock(); - const infoBefore = await limitedPool.info(); - - await time.increase(D1 / 2); // Half a day - await limitedPool.onBlock(); - const infoAfter = await limitedPool.info(); - - expect(infoAfter.totalRewards).to.equal(infoBefore.totalRewards); - }); - }); - - describe("Multiple users", function () { - beforeEach(async function () { - // Setup for multiple users - await limitsMultiplierToken.transfer(user1.address, ethers.utils.parseEther("1000")); - await limitsMultiplierToken.transfer(user2.address, ethers.utils.parseEther("1000")); - await profitableToken.transfer(user1.address, ethers.utils.parseEther("1000")); - await profitableToken.transfer(user2.address, ethers.utils.parseEther("1000")); - - await limitsMultiplierToken.connect(user1).approve(limitedPool.address, ethers.utils.parseEther("1000")); - await limitsMultiplierToken.connect(user2).approve(limitedPool.address, ethers.utils.parseEther("1000")); - await profitableToken.connect(user1).approve(limitedPool.address, ethers.utils.parseEther("1000")); - await profitableToken.connect(user2).approve(limitedPool.address, ethers.utils.parseEther("1000")); - }); - - it("Should handle deposits and stakes from multiple users correctly", async function () { - await limitedPool.connect(user1).deposit(ethers.utils.parseEther("500")); - await limitedPool.connect(user2).deposit(ethers.utils.parseEther("300")); - await limitedPool.connect(user1).stake(ethers.utils.parseEther("200")); - await limitedPool.connect(user2).stake(ethers.utils.parseEther("100")); - - const depositUser1 = await limitedPool.getDeposit(user1.address); - const stakeUser1 = await limitedPool.getStake(user1.address); - const depositUser2 = await limitedPool.getDeposit(user2.address); - const stakeUser2 = await limitedPool.getStake(user2.address); - - expect(depositUser1).to.equal(ethers.utils.parseEther("500")); - expect(stakeUser1).to.equal(ethers.utils.parseEther("200")); - expect(depositUser2).to.equal(ethers.utils.parseEther("300")); - expect(stakeUser2).to.equal(ethers.utils.parseEther("100")); - - const poolInfo = await limitedPool.info(); - expect(poolInfo.totalDeposit).to.equal(ethers.utils.parseEther("800")); - expect(poolInfo.totalStake).to.equal(ethers.utils.parseEther("300")); - }); - - it("Should distribute rewards correctly among multiple users", async function () { - await limitedPool.connect(user1).deposit(ethers.utils.parseEther("500")); - await limitedPool.connect(user2).deposit(ethers.utils.parseEther("500")); - await limitedPool.connect(user1).stake(ethers.utils.parseEther("300")); - await limitedPool.connect(user2).stake(ethers.utils.parseEther("200")); - - await time.increase(D1); - await limitedPool.onBlock(); - - const rewardsUser1 = await limitedPool.getUserRewards(user1.address); - const rewardsUser2 = await limitedPool.getUserRewards(user2.address); - - // User1 should have 60% of the rewards, User2 40% - expect(rewardsUser1).to.be.closeTo( - ethers.utils.parseEther("30"), // 10% of 300 - ethers.utils.parseEther("0.1") - ); - expect(rewardsUser2).to.be.closeTo( - ethers.utils.parseEther("20"), // 10% of 200 - ethers.utils.parseEther("0.1") - ); - }); - }); - - describe("Safety checks", function () { - it("Should not allow initialization twice", async function () { - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "Test Deposited Pool", - limitsMultiplierToken: limitsMultiplierToken.address, - profitableToken: profitableToken.address, - rewardToken: profitableToken.address, - }; - - await expect(limitedPool.initialize(rewardsBank.address, lockKeeper.address, mainConfig)) - .to.be.revertedWith("Initializable: contract is already initialized"); - }); - - it("Should only allow admin to change configurations", async function () { - const limits = await limitedPool.limitsConfig(); - const updatedLimits = { - ...limits, - rewardTokenPrice: BILLION * 2 - }; - await expect(limitedPool.connect(user1).setLimitsConfig(updatedLimits)) - .to.be.revertedWith("AccessControl: account " + user1.address.toLowerCase() + " is missing role 0x0000000000000000000000000000000000000000000000000000000000000000"); - }); - - it("Should handle zero stakes and deposits correctly", async function () { - await expect(limitedPool.stake(0)).to.be.revertedWith("Pool: stake value is too low"); - await expect(limitedPool.deposit(0)).to.be.revertedWith("Pool: deposit value is too low"); - }); - }); - - describe("Native token handling", function () { - it("Should handle native token deposits if configured", async function () { - // Deploy a new pool with ETH as deposit token - const limitedPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "ETH Deposited Pool", - limitsMultiplierToken: ethers.constants.AddressZero, // ETH - profitableToken: profitableToken.address, - rewardToken: profitableToken.address, - }; - - const ethPool = (await upgrades.deployProxy(limitedPoolFactory, [ - rewardsBank.address, - lockKeeper.address, - mainConfig - ])) as LimitedTokenPool; - - await ethPool.setLimitsConfig({ - rewardTokenPrice: BILLION, - interest: 0.10 * BILLION, - interestRate: D1, - minDepositValue: ethers.utils.parseEther("0.1"), - minStakeValue: ethers.utils.parseEther("0.1"), - fastUnstakePenalty: 0.10 * BILLION, - unstakeLockPeriod: D1, - stakeLockPeriod: D1, - maxTotalStakeValue: ethers.utils.parseEther("1000"), - maxStakePerUserValue: ethers.utils.parseEther("100"), - stakeLimitsMultiplier: 2 * BILLION, - }); - - const depositAmount = ethers.utils.parseEther("1"); - await expect(ethPool.deposit(depositAmount, { value: depositAmount })) - .to.emit(ethPool, "Deposited") - .withArgs(owner.address, depositAmount); - - const info = await ethPool.info(); - expect(info.totalDeposit).to.equal(depositAmount); - }); - - it("Should handle native token stakes if configured", async function () { - // Deploy a new pool with ETH as profitable token - const limitedPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "ETH Stake Pool", - limitsMultiplierToken: limitsMultiplierToken.address, - profitableToken: ethers.constants.AddressZero, // ETH - rewardToken: profitableToken.address, - }; - - const ethPool = (await upgrades.deployProxy(limitedPoolFactory, [ - rewardsBank.address, - lockKeeper.address, - mainConfig - ])) as LimitedTokenPool; - - await ethPool.setLimitsConfig({ - rewardTokenPrice: BILLION, - interest: 0.10 * BILLION, - interestRate: D1, - minDepositValue: ethers.utils.parseEther("0.1"), - minStakeValue: ethers.utils.parseEther("0.1"), - fastUnstakePenalty: 0.10 * BILLION, - unstakeLockPeriod: D1, - stakeLockPeriod: D1, - maxTotalStakeValue: ethers.utils.parseEther("1000"), - maxStakePerUserValue: ethers.utils.parseEther("100"), - stakeLimitsMultiplier: 2 * BILLION, - }); - - // First deposit some tokens - await limitsMultiplierToken.approve(ethPool.address, ethers.utils.parseEther("10")); - await ethPool.deposit(ethers.utils.parseEther("10")); - - const stakeAmount = ethers.utils.parseEther("1"); - await ethPool.stake(stakeAmount, { value: stakeAmount }); - - const info = await ethPool.info(); - expect(info.totalStake).to.equal(stakeAmount); - }); - }); -}); diff --git a/test/staking/token/LimitedTokenPoolsManager.ts b/test/staking/token/LimitedTokenPoolsManager.ts deleted file mode 100644 index 861a5014..00000000 --- a/test/staking/token/LimitedTokenPoolsManager.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers, upgrades } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { - LimitedTokenPoolsManager, - RewardsBank, - AirBond__factory, - LimitedTokenPool, - RewardsBank__factory, - LimitedTokenPoolsManager__factory, - LockKeeper__factory, - LockKeeper, -} from "../../../typechain-types"; - -import LimitedTokenPoolJson from "../../../artifacts/contracts/staking/token/LimitedTokenPool.sol/LimitedTokenPool.json"; - -import { expect } from "chai"; - -describe("LimitedTokenPoolsManager", function () { - let poolsManager: LimitedTokenPoolsManager; - let rewardsBank: RewardsBank; - let tokenAddr: string; - let owner: SignerWithAddress; - let lockKeeper: LockKeeper; - - async function deploy() { - const [owner] = await ethers.getSigners(); - - const rewardsBank = await new RewardsBank__factory(owner).deploy(); - const airBond = await new AirBond__factory(owner).deploy(owner.address); - - const limitedTokenPoolFactory = await ethers.getContractFactory("LimitedTokenPool"); - const limitedTokenPoolBeacon = await upgrades.deployBeacon(limitedTokenPoolFactory); - - const lockKeeper = await new LockKeeper__factory(owner).deploy(); - - const poolsManager = await new LimitedTokenPoolsManager__factory(owner) - .deploy(rewardsBank.address, lockKeeper.address, limitedTokenPoolBeacon.address); - - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), poolsManager.address)).wait(); - const tokenAddr = airBond.address; - - return { poolsManager, rewardsBank, lockKeeper, tokenAddr, owner }; - } - - beforeEach(async function () { - ({ poolsManager, rewardsBank, lockKeeper, tokenAddr, owner } = await loadFixture(deploy)); - }); - - describe("LimitedTokenPool Management", function () { - it("Should allow the owner to create a limited token pool and set limits", async function () { - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "TestPool", - limitsMultiplierToken: tokenAddr, - profitableToken: tokenAddr, - rewardToken: tokenAddr, - }; - - const tx = await poolsManager.createPool(mainConfig); - const receipt = await tx.wait(); - const poolAddress = receipt.events![4].args![0]; - - expect(await poolsManager.pools(0)).to.equal(poolAddress); - - const limitsConfig: LimitedTokenPool.LimitsConfigStruct = { - rewardTokenPrice: ethers.utils.parseUnits("1", 9), // 1 BILLION - interest: ethers.utils.parseUnits("0.1", 9), // 10% - interestRate: 24 * 60 * 60, // 24 hours - minDepositValue: ethers.utils.parseEther("10"), - minStakeValue: ethers.utils.parseEther("10"), - fastUnstakePenalty: ethers.utils.parseUnits("0.1", 9), // 10% - unstakeLockPeriod: 24 * 60 * 60, // 24 hours - stakeLockPeriod: 24 * 60 * 60, // 24 hours - maxTotalStakeValue: ethers.utils.parseEther("1000000"), - maxStakePerUserValue: ethers.utils.parseEther("100000"), - stakeLimitsMultiplier: ethers.utils.parseUnits("2", 9), // 2x - }; - - await poolsManager.configurePool(poolAddress, limitsConfig); - - const proxyPool = new ethers.Contract(poolAddress, LimitedTokenPoolJson.abi, owner); - const updatedConfig = await proxyPool.limitsConfig(); - - expect(updatedConfig.rewardTokenPrice).to.equal(limitsConfig.rewardTokenPrice); - expect(updatedConfig.interest).to.equal(limitsConfig.interest); - expect(updatedConfig.interestRate).to.equal(limitsConfig.interestRate); - expect(updatedConfig.minDepositValue).to.equal(limitsConfig.minDepositValue); - expect(updatedConfig.minStakeValue).to.equal(limitsConfig.minStakeValue); - expect(updatedConfig.fastUnstakePenalty).to.equal(limitsConfig.fastUnstakePenalty); - expect(updatedConfig.unstakeLockPeriod).to.equal(limitsConfig.unstakeLockPeriod); - expect(updatedConfig.stakeLockPeriod).to.equal(limitsConfig.stakeLockPeriod); - expect(updatedConfig.maxTotalStakeValue).to.equal(limitsConfig.maxTotalStakeValue); - expect(updatedConfig.maxStakePerUserValue).to.equal(limitsConfig.maxStakePerUserValue); - expect(updatedConfig.stakeLimitsMultiplier).to.equal(limitsConfig.stakeLimitsMultiplier); - }); - - it("Should activate and deactivate a limited token pool", async function () { - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "TestPool", - limitsMultiplierToken: tokenAddr, - profitableToken: tokenAddr, - rewardToken: tokenAddr, - }; - - const tx = await poolsManager.createPool(mainConfig); - const receipt = await tx.wait(); - console.log(receipt.events); - const poolAddress = receipt.events![4].args![0]; - - const proxyPool = new ethers.Contract(poolAddress, LimitedTokenPoolJson.abi, owner); - expect(await proxyPool.active()).to.equal(true); - await poolsManager.deactivatePool(poolAddress); - expect(await proxyPool.active()).to.equal(false); - await poolsManager.activatePool(poolAddress); - expect(await proxyPool.active()).to.equal(true); - }); - - it("Should allow updating limited token pool parameters", async function () { - const mainConfig: LimitedTokenPool.MainConfigStruct = { - name: "TestPool", - limitsMultiplierToken: tokenAddr, - profitableToken: tokenAddr, - rewardToken: tokenAddr, - }; - - const tx = await poolsManager.createPool(mainConfig); - const receipt = await tx.wait(); - const poolAddress = receipt.events![4].args![0]; - - const initialLimitsConfig: LimitedTokenPool.LimitsConfigStruct = { - rewardTokenPrice: ethers.utils.parseUnits("1", 9), - interest: ethers.utils.parseUnits("0.1", 9), - interestRate: 24 * 60 * 60, - minDepositValue: ethers.utils.parseEther("10"), - minStakeValue: ethers.utils.parseEther("10"), - fastUnstakePenalty: ethers.utils.parseUnits("0.1", 9), - unstakeLockPeriod: 24 * 60 * 60, - stakeLockPeriod: 24 * 60 * 60, - maxTotalStakeValue: ethers.utils.parseEther("1000000"), - maxStakePerUserValue: ethers.utils.parseEther("100000"), - stakeLimitsMultiplier: ethers.utils.parseUnits("2", 9), - }; - - await poolsManager.configurePool(poolAddress, initialLimitsConfig); - - const proxyPool = new ethers.Contract(poolAddress, LimitedTokenPoolJson.abi, owner); - - const newLimitsConfig: LimitedTokenPool.LimitsConfigStruct = { - rewardTokenPrice: ethers.utils.parseUnits("2", 9), - interest: ethers.utils.parseUnits("0.2", 9), - interestRate: 48 * 60 * 60, - minDepositValue: ethers.utils.parseEther("20"), - minStakeValue: ethers.utils.parseEther("20"), - fastUnstakePenalty: ethers.utils.parseUnits("0.2", 9), - unstakeLockPeriod: 48 * 60 * 60, - stakeLockPeriod: 48 * 60 * 60, - maxTotalStakeValue: ethers.utils.parseEther("2000000"), - maxStakePerUserValue: ethers.utils.parseEther("200000"), - stakeLimitsMultiplier: ethers.utils.parseUnits("3", 9), - }; - - await poolsManager.configurePool(poolAddress, newLimitsConfig); - const updatedConfig = await proxyPool.limitsConfig(); - - expect(updatedConfig.rewardTokenPrice).to.equal(newLimitsConfig.rewardTokenPrice); - expect(updatedConfig.interest).to.equal(newLimitsConfig.interest); - expect(updatedConfig.interestRate).to.equal(newLimitsConfig.interestRate); - expect(updatedConfig.minDepositValue).to.equal(newLimitsConfig.minDepositValue); - expect(updatedConfig.minStakeValue).to.equal(newLimitsConfig.minStakeValue); - expect(updatedConfig.fastUnstakePenalty).to.equal(newLimitsConfig.fastUnstakePenalty); - expect(updatedConfig.unstakeLockPeriod).to.equal(newLimitsConfig.unstakeLockPeriod); - expect(updatedConfig.stakeLockPeriod).to.equal(newLimitsConfig.stakeLockPeriod); - expect(updatedConfig.maxTotalStakeValue).to.equal(newLimitsConfig.maxTotalStakeValue); - expect(updatedConfig.maxStakePerUserValue).to.equal(newLimitsConfig.maxStakePerUserValue); - expect(updatedConfig.stakeLimitsMultiplier).to.equal(newLimitsConfig.stakeLimitsMultiplier); - }); - }); -}); diff --git a/test/staking/token/TokenPool.ts b/test/staking/token/TokenPool.ts deleted file mode 100644 index d6ce8612..00000000 --- a/test/staking/token/TokenPool.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { ethers, upgrades } from "hardhat"; -import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { - RewardsBank, - AirBond, - TokenPool, - RewardsBank__factory, - AirBond__factory, - LockKeeper__factory, - LockKeeper, -} from "../../../typechain-types"; - -const D1 = 24 * 60 * 60; -const BILLION = 1000000000; - -import { expect } from "chai"; -describe("TokenPool", function () { - let owner: SignerWithAddress; - let tokenPool: TokenPool; - let rewardsBank: RewardsBank; - let lockKeeper: LockKeeper; - let token: AirBond; - - async function deploy() { - const [owner] = await ethers.getSigners(); - const rewardsBank = await new RewardsBank__factory(owner).deploy(); - const token = await new AirBond__factory(owner).deploy(owner.address); - const lockKeeper = await new LockKeeper__factory(owner).deploy(); - - const tokenPoolFactory = await ethers.getContractFactory("TokenPool"); - - const mainConfig: TokenPool.MainConfigStruct = { - token: token.address, - name: "Test", - rewardToken: token.address, - }; - - const limitsConfig: TokenPool.LimitsConfigStruct = { - minStakeValue: 10, - fastUnstakePenalty: 0.10 * BILLION, // 10% - interest: 0.10 * BILLION, // 10% - interestRate: D1, // 1 day - lockPeriod: D1, // 1 day - rewardTokenPrice: 1, - }; - - const tokenPool = (await upgrades.deployProxy(tokenPoolFactory, [rewardsBank.address, lockKeeper.address, mainConfig, limitsConfig])) as TokenPool; - - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), tokenPool.address)).wait(); - await (await token.grantRole(await token.MINTER_ROLE(), owner.address)).wait(); - - await token.mint(owner.address, 100000000000); - - return { owner, tokenPool, rewardsBank, lockKeeper, token }; - } - - beforeEach(async function () { - ({ owner, tokenPool, rewardsBank, lockKeeper, token } = await loadFixture(deploy)); - }); - - describe("Owner Methods", function () { - it("Should deactivate and activate the pool", async function () { - await tokenPool.deactivate(); - expect(await tokenPool.active()).to.equal(false); - - await tokenPool.activate(); - expect(await tokenPool.active()).to.equal(true); - }); - }); - - describe("Staking", function () { - beforeEach(async function () { - await token.approve(tokenPool.address, 1000000); - }); - - it("Should allow staking", async function () { - const stake = 1000; - await tokenPool.stake(stake); - const info = await tokenPool.info(); - expect(info.totalStake).to.equal(stake); - expect(await tokenPool.getStake(owner.address)).to.equal(stake); - }); - - it("Should not allow staking when pool is deactivated", async function () { - await tokenPool.deactivate(); - await expect(tokenPool.stake(1000)).to.be.revertedWith("Pool is not active"); - }); - - it("Should not allow staking below minimum stake value", async function () { - await expect(tokenPool.stake(1)).to.be.revertedWith("Pool: stake value is too low"); - }); - - }); - - describe("Unstaking", function () { - const stake = 1000; - - beforeEach(async function () { - await token.approve(tokenPool.address, 1000000000); - await tokenPool.stake(stake); - }); - - it("Should allow unstaking with rewards", async function () { - await time.increase(D1); - await tokenPool.onBlock(); - - await expect(await tokenPool.unstake(stake)).to.emit(lockKeeper, "Locked"); - const info = await tokenPool.info(); - expect(info.totalStake).to.equal(0); - expect(await tokenPool.getStake(owner.address)).to.equal(0); - }); - - it("Should allow fast unstaking with rewards", async function () { - await time.increase(D1); - await tokenPool.onBlock(); - - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.unstakeFast(stake); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(stake * 0.9); - }); - - it("Should allow unstaking without rewards", async function () { - await expect(tokenPool.unstake(stake)).to.emit(lockKeeper, "Locked"); - }); - - it("Should allow fast unstaking without rewards", async function () { - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.unstakeFast(stake); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(stake * 0.9); - }); - - it("Should not allow unstaking more than staked", async function () { - await expect(tokenPool.unstake(stake * 2)).to.be.revertedWith("Not enough stake"); - }); - - it("Should not allow fast unstaking more than staked", async function () { - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.unstakeFast(stake); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(stake * 0.9); - - }); - - it("Should allow unstaking when pool is deactivated", async function () { - await tokenPool.deactivate(); - await expect(tokenPool.unstake(stake)).to.emit(lockKeeper, "Locked"); - }); - - it("Should allow fast unstaking when pool is deactivated", async function () { - await tokenPool.deactivate(); - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.unstakeFast(stake); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(stake * 0.9); - }); - }); - - describe("Rewards", function () { - beforeEach(async function () { - await token.mint(owner.address, 100000000000); - await token.approve(tokenPool.address, 1000000); - await token.transfer(rewardsBank.address, 10000); - }); - - it("Should allow claiming rewards", async function () { - await tokenPool.stake(1000); - - // Wait for 1 day - await time.increase(D1); - await tokenPool.onBlock(); - - const expectedReward = 100; - const rewards = await tokenPool.getUserRewards(owner.address); - expect (rewards).to.equal(expectedReward); - - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.claim(); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(100); - }); - - it("Should allow claiming rewards when pool is deactivated", async function () { - await tokenPool.stake(1000); - - // Wait for 1 day - await time.increase(D1); - await tokenPool.onBlock(); - - await tokenPool.deactivate(); - - const expectedReward = 100; - const rewards = await tokenPool.getUserRewards(owner.address); - expect (rewards).to.equal(expectedReward); - - const balanceBefore = await token.balanceOf(owner.address); - await tokenPool.claim(); - const balanceAfter = await token.balanceOf(owner.address); - expect(balanceAfter.sub(balanceBefore)).to.equal(100); - }); - }); - - //TODO: Initialize for coverage - //TODO: Sets for coverage??? -}); - diff --git a/test/staking/token/TokenPoolsManager.ts b/test/staking/token/TokenPoolsManager.ts deleted file mode 100644 index 3d7332b1..00000000 --- a/test/staking/token/TokenPoolsManager.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { ethers, upgrades } from "hardhat"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; - -import { - TokenPoolsManager, - RewardsBank, - AirBond__factory, - TokenPool, - RewardsBank__factory, - TokenPoolsManager__factory, - LockKeeper__factory, - LockKeeper, -} from "../../../typechain-types"; - -import TokenPoolJson from "../../../artifacts/contracts/staking/token/TokenPool.sol/TokenPool.json"; - -import { expect } from "chai"; - -describe("PoolsManager", function () { - let poolsManager: TokenPoolsManager; - let rewardsBank: RewardsBank; - let tokenAddr: string; - let owner: SignerWithAddress; - let lockKeeper: LockKeeper; - - async function deploy() { - const [owner] = await ethers.getSigners(); - - const rewardsBank = await new RewardsBank__factory(owner).deploy(); - const airBond = await new AirBond__factory(owner).deploy(owner.address); - - const tokenPoolFactory = await ethers.getContractFactory("TokenPool"); - const tokenPoolBeacon = await upgrades.deployBeacon(tokenPoolFactory); - - const lockKeeper = await new LockKeeper__factory(owner).deploy(); - - const poolsManager = await new TokenPoolsManager__factory(owner) - .deploy(rewardsBank.address, lockKeeper.address, tokenPoolBeacon.address); - - await (await rewardsBank.grantRole(await rewardsBank.DEFAULT_ADMIN_ROLE(), poolsManager.address)).wait(); - const tokenAddr = airBond.address; - - return { poolsManager, rewardsBank, lockKeeper, tokenAddr, owner }; - } - - beforeEach(async function () { - ({ poolsManager, rewardsBank, lockKeeper, tokenAddr, owner } = await loadFixture(deploy)); - }); - - describe("TokenPool Management", function () { - it("Should allow the owner to create a token pool", async function () { - const mainConfig: TokenPool.MainConfigStruct = { - token: tokenAddr, - name: "TestPool", - rewardToken: tokenAddr, - }; - - const limitsConfig: TokenPool.LimitsConfigStruct = { - rewardTokenPrice: 1, - minStakeValue: 10, - fastUnstakePenalty: 100000, // 10% - interest: 100000, // 10% - interestRate: 24 * 60 * 60, // 24 hours - lockPeriod: 24 * 60 * 60, // 24 hours - }; - - const tx = await poolsManager.createPool(mainConfig, limitsConfig); - const receipt = await tx.wait(); - const poolAddress = receipt.events![4].args![0]; - - expect(await poolsManager.pools(0)).to.equal(poolAddress); - }); - - it("Should activate and deactivate a token pool", async function () { - const mainConfig: TokenPool.MainConfigStruct = { - token: tokenAddr, - name: "TestPool", - rewardToken: tokenAddr, - }; - - const limitsConfig: TokenPool.LimitsConfigStruct = { - rewardTokenPrice: 1, - minStakeValue: 10, - fastUnstakePenalty: 100000, // 10% - interest: 100000, // 10% - interestRate: 24 * 60 * 60, // 24 hours - lockPeriod: 24 * 60 * 60, // 24 hours - }; - - const tx = await poolsManager.createPool(mainConfig, limitsConfig); - const receipt = await tx.wait(); - const poolAddress = receipt.events![4].args![0]; - - const proxyPool = new ethers.Contract(poolAddress, TokenPoolJson.abi, owner); - expect(await proxyPool.active()).to.equal(true); - await poolsManager.deactivateTokenPool(poolAddress); - expect(await proxyPool.active()).to.equal(false); - await poolsManager.activateTokenPool(poolAddress); - expect(await proxyPool.active()).to.equal(true); - }); - - it("Should allow updating token pool parameters", async function () { - const mainConfig: TokenPool.MainConfigStruct = { - token: tokenAddr, - name: "TestPool", - rewardToken: tokenAddr, - }; - - const limitsConfig: TokenPool.LimitsConfigStruct = { - rewardTokenPrice: 1, - minStakeValue: 10, - fastUnstakePenalty: 100000, // 10% - interest: 100000, // 10% - interestRate: 24 * 60 * 60, // 24 hours - lockPeriod: 24 * 60 * 60, // 24 hours - }; - - const tx = await poolsManager.createPool(mainConfig, limitsConfig); - const receipt = await tx.wait(); - const poolAddress = receipt.events![4].args![0]; - const proxyPool = new ethers.Contract(poolAddress, TokenPoolJson.abi, owner); - - const newLimitsConfig: TokenPool.LimitsConfigStruct = { - rewardTokenPrice: 2, - minStakeValue: 20, - fastUnstakePenalty: 200000, // 20% - interest: 200000, // 20% - interestRate: 48 * 60 * 60, // 48 hours - lockPeriod: 48 * 60 * 60, // 48 hours - }; - - await poolsManager.configurePool(poolAddress, newLimitsConfig); - const updatedConfig = await proxyPool.limitsConfig(); - - expect(updatedConfig.rewardTokenPrice).to.equal(2); - expect(updatedConfig.minStakeValue).to.equal(20); - expect(updatedConfig.fastUnstakePenalty).to.equal(200000); - expect(updatedConfig.interest).to.equal(200000); - expect(updatedConfig.interestRate).to.equal(48 * 60 * 60); - expect(updatedConfig.lockPeriod).to.equal(48 * 60 * 60); - }); - }); -});