From f440f1a1dfe65c8b2e8eea9827850537be9a88a3 Mon Sep 17 00:00:00 2001 From: svin Date: Tue, 7 Nov 2023 17:25:59 +0200 Subject: [PATCH 1/5] Use rewardsBank instead of stakeManager as first field in Reward event --- contracts/consensus/IValidatorSet.sol | 2 +- contracts/consensus/ValidatorSet.sol | 4 ++-- contracts/staking/BaseNodes_Manager.sol | 2 +- contracts/staking/ServerNodes_Manager.sol | 6 +++--- .../staking/pools/LegacyPoolsNodes_Manager.sol | 2 +- deployments/30746.json | 16 +++++++--------- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/contracts/consensus/IValidatorSet.sol b/contracts/consensus/IValidatorSet.sol index dafe34d5..d0e37aef 100644 --- a/contracts/consensus/IValidatorSet.sol +++ b/contracts/consensus/IValidatorSet.sol @@ -6,6 +6,6 @@ interface IValidatorSet { function stake(address nodeAddress, uint amount) external; function unstake(address nodeAddress, uint amount) external; function getNodeStake(address nodeAddress) external view returns (uint); - function emitReward(address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount) external; + function emitReward(address rewardsBank, address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount) external; // function setAlwaysValidator(address nodeAddress, bool alwaysValidator) external; } diff --git a/contracts/consensus/ValidatorSet.sol b/contracts/consensus/ValidatorSet.sol index 46250d2e..77913258 100644 --- a/contracts/consensus/ValidatorSet.sol +++ b/contracts/consensus/ValidatorSet.sol @@ -180,8 +180,8 @@ contract ValidatorSet is UUPSUpgradeable, OnBlockNotifier, AccessControlEnumerab } - function emitReward(address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount) external onlyRole(STAKING_MANAGER_ROLE) { - emit Reward(msg.sender, nodeAddress, rewardReceiver, nodeOwner, tokenAddress, amount); + function emitReward(address rewardsBank, address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount) external onlyRole(STAKING_MANAGER_ROLE) { + emit Reward(rewardsBank, nodeAddress, rewardReceiver, nodeOwner, tokenAddress, amount); } // ADMIN METHODS diff --git a/contracts/staking/BaseNodes_Manager.sol b/contracts/staking/BaseNodes_Manager.sol index 743d797c..02766239 100644 --- a/contracts/staking/BaseNodes_Manager.sol +++ b/contracts/staking/BaseNodes_Manager.sol @@ -53,7 +53,7 @@ contract BaseNodes_Manager is UUPSUpgradeable, IStakeManager, AccessControlUpgra amount -= treasuryAmount; rewardsBank.withdrawAmb(payable(nodeAddress), amount); - validatorSet.emitReward(nodeAddress, nodeAddress, nodeAddress, address(0), amount); + validatorSet.emitReward(address(rewardsBank), nodeAddress, nodeAddress, nodeAddress, address(0), amount); } function report(address nodeAddress) external { diff --git a/contracts/staking/ServerNodes_Manager.sol b/contracts/staking/ServerNodes_Manager.sol index 2ca6500f..a72a90af 100644 --- a/contracts/staking/ServerNodes_Manager.sol +++ b/contracts/staking/ServerNodes_Manager.sol @@ -165,16 +165,16 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener if (stakeStruct.rewardsAddress == address(0)) { rewardsBank.withdrawAmb(payable(address(this)), nativeReward); _addStake(nodeAddress, nativeReward); - validatorSet.emitReward(nodeAddress, stakeStruct.ownerAddress, stakeStruct.ownerAddress, address(0), nativeReward); + validatorSet.emitReward(address(rewardsBank), nodeAddress, stakeStruct.ownerAddress, stakeStruct.ownerAddress, address(0), nativeReward); } else { rewardsBank.withdrawAmb(payable(stakeStruct.rewardsAddress), nativeReward); - validatorSet.emitReward(nodeAddress, stakeStruct.ownerAddress, stakeStruct.rewardsAddress, address(0), nativeReward); + validatorSet.emitReward(address(rewardsBank), nodeAddress, stakeStruct.ownerAddress, stakeStruct.rewardsAddress, address(0), nativeReward); } if (bondsReward > 0) { address bondsRewardsAddress = stakeStruct.rewardsAddress == address(0) ? stakeStruct.ownerAddress : stakeStruct.rewardsAddress; rewardsBank.withdrawErc20(airBond, bondsRewardsAddress, bondsReward); - validatorSet.emitReward(nodeAddress, stakeStruct.ownerAddress, bondsRewardsAddress, airBond, bondsReward); + validatorSet.emitReward(address(rewardsBank), nodeAddress, stakeStruct.ownerAddress, bondsRewardsAddress, airBond, bondsReward); } } diff --git a/contracts/staking/pools/LegacyPoolsNodes_Manager.sol b/contracts/staking/pools/LegacyPoolsNodes_Manager.sol index 0a3cddce..25a751a8 100644 --- a/contracts/staking/pools/LegacyPoolsNodes_Manager.sol +++ b/contracts/staking/pools/LegacyPoolsNodes_Manager.sol @@ -139,7 +139,7 @@ contract LegacyPoolsNodes_Manager is UUPSUpgradeable, OwnableUpgradeable, Pausab rewardsBank.withdrawAmb(payable(address(this)), amount); IPool(poolAddress).addReward{value: amount}(); - validatorSet.emitReward(nodeAddress, address(this), address(this), address(0), amount); + validatorSet.emitReward(address(rewardsBank), nodeAddress, address(this), address(this), address(0), amount); } function report(address nodeAddress) external { diff --git a/deployments/30746.json b/deployments/30746.json index 5d9cdddc..d2c60b69 100644 --- a/deployments/30746.json +++ b/deployments/30746.json @@ -494,7 +494,7 @@ "function addBlockListener(address listener)", "function baseReward() view returns (uint256)", "function changeTopStakesCount(uint256 newTopStakesCount)", - "function emitReward(address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", + "function emitReward(address rewardsBank, address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", "function finalizeChange()", "function getBlockListeners() view returns (address[])", "function getNodeStake(address nodeAddress) view returns (uint256)", @@ -529,7 +529,7 @@ "deployTx": "0x286eaea83658bc832aa10a194dc4a3e20d01b5d0f943b82460ccf6feae12194c", "fullyQualifiedName": "contracts/consensus/ValidatorSet.sol:ValidatorSet", "proxy": { - "implementation": "0xC54450028dAE52c1DC1bb9Dabe553457eABd4Aa3", + "implementation": "0x1D335E8B7787fB6c51F98713df5BCb56884FD023", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -682,7 +682,7 @@ "deployTx": "0xdbd2ec84a558f17f8cf83d06cc72e850d9e0aac2ffc134899dec7f86404b4879", "fullyQualifiedName": "contracts/staking/BaseNodes_Manager.sol:BaseNodes_Manager", "proxy": { - "implementation": "0x130c0e94E79DbA9F8A63D6452210C89e5942130c", + "implementation": "0xACf183fB8C6382d7cB0D5e9832528AEafC151Fcf", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -848,7 +848,7 @@ "deployTx": "0x9afda1b30db816a8f76295add9526ea7cd5ad86ed60bdf1fcaee72b2ce5db246", "fullyQualifiedName": "contracts/staking/ServerNodes_Manager.sol:ServerNodes_Manager", "proxy": { - "implementation": "0x13BAE98762100CD918f936dA98e186E9a88A5C1E", + "implementation": "0xfc277855999cF6452F9027BbdC1B56264A736E3A", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -927,13 +927,11 @@ "function addNodeRequest(uint256 stake, uint256 requestId, uint256 nodeId, uint8 role)", "function addNodeRequestResolved(uint256 requestId, uint256 status)", "function addPool(address pool)", - "function changeMinApolloDeposit(uint256 newMinApolloDeposit)", "function getDeposit(address nodeAddress) view returns (uint256)", "function getPools() view returns (address[])", "function importOldStakes(address[] addresses, address[] pools, uint256[] amounts)", - "function initialize(uint256 _minApolloDeposit, address _validatorSet, address _rewardsBank, address _treasury, address _poolsStore, address _apolloDepositStore, address _rolesEventEmitter, address _poolEventsEmitter)", + "function initialize(address _validatorSet, address _rewardsBank, address _treasury, address _poolsStore, address _apolloDepositStore, address _rolesEventEmitter, address _poolEventsEmitter)", "function isPool(address poolAddress) view returns (bool)", - "function minApolloDeposit() view returns (uint256)", "function nextId() returns (uint256)", "function node2pool(address) view returns (address)", "function onboard(address nodeAddress, uint8 nodeType) payable", @@ -959,8 +957,8 @@ "deployTx": "0x48693507f023a73650c4a24137a57eba99ca06e94698dffc576ab4c1471480fe", "fullyQualifiedName": "contracts/staking/pools/LegacyPoolsNodes_Manager.sol:LegacyPoolsNodes_Manager", "proxy": { - "implementation": "0x99B1A627604dB1479379c2c576dAFdC8AE4C546E", + "implementation": "0x7AAE5Af1787D5b0C33C93398c378912cf5e05a7E", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } } -} +} \ No newline at end of file From fe048f702e248985cd1a4d1701fedb8501d96baf Mon Sep 17 00:00:00 2001 From: svin Date: Tue, 7 Nov 2023 17:28:22 +0200 Subject: [PATCH 2/5] Re-register node in validator set if retire was canceled --- contracts/staking/ServerNodes_Manager.sol | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ServerNodes_Manager.sol b/contracts/staking/ServerNodes_Manager.sol index a72a90af..3b2c5895 100644 --- a/contracts/staking/ServerNodes_Manager.sol +++ b/contracts/staking/ServerNodes_Manager.sol @@ -117,7 +117,15 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener // unlock latest withdraw to stake function restake(address nodeAddress) public onlyNodeOwner(nodeAddress) whenNotPaused { uint canceledAmount = lockKeeper.cancelLock(lockedWithdraws[nodeAddress]); + _addStake(nodeAddress, canceledAmount); + + // re-register node if it was retired + if (stakes[nodeAddress].stake == 0) { + stakesList.push(nodeAddress); + onboardingWaitingList.push(nodeAddress); + } + emit StakeChanged(nodeAddress, msg.sender, int(canceledAmount)); } @@ -270,12 +278,20 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener for (uint i = 0; i < onboardingWaitingList.length; i++) { address nodeAddress = onboardingWaitingList[i]; - if (stakes[nodeAddress].timestampStake <= minTimestampForOnboarding) { - validatorSet.newStake(nodeAddress, stakes[nodeAddress].stake, false); + // remove node if stake == 0 + if (stakes[nodeAddress].stake == 0) { onboardingWaitingList[i] = onboardingWaitingList[onboardingWaitingList.length - 1]; onboardingWaitingList.pop(); + if (i != 0) i--; + } + + // register node in validator set if onboarding delay passed + else if (stakes[nodeAddress].timestampStake <= minTimestampForOnboarding) { + validatorSet.newStake(nodeAddress, stakes[nodeAddress].stake, false); + onboardingWaitingList[i] = onboardingWaitingList[onboardingWaitingList.length - 1]; + onboardingWaitingList.pop(); if (i != 0) i--; } } From c82b5575ab73d48e6bd20a695a2cbbef18ac86ea Mon Sep 17 00:00:00 2001 From: svin Date: Tue, 7 Nov 2023 17:30:00 +0200 Subject: [PATCH 3/5] Don't accept zero amounts in validatorSet --- contracts/consensus/ValidatorSet.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/consensus/ValidatorSet.sol b/contracts/consensus/ValidatorSet.sol index 77913258..91c868b1 100644 --- a/contracts/consensus/ValidatorSet.sol +++ b/contracts/consensus/ValidatorSet.sol @@ -134,6 +134,7 @@ contract ValidatorSet is UUPSUpgradeable, OnBlockNotifier, AccessControlEnumerab // STAKING POOL METHODS function newStake(address nodeAddress, uint amount, bool isAlwaysTop) external onlyRole(STAKING_MANAGER_ROLE) { + require(amount > 0, "amount must be > 0"); require(stakes[nodeAddress].amount == 0, "Already has stake"); stakes[nodeAddress] = Stake(amount, IStakeManager(msg.sender), isAlwaysTop); @@ -144,6 +145,7 @@ contract ValidatorSet is UUPSUpgradeable, OnBlockNotifier, AccessControlEnumerab } function stake(address nodeAddress, uint amount) external { + require(amount > 0, "amount must be > 0"); Stake storage stake = stakes[nodeAddress]; require(stake.amount > 0, "Stake doesn't exist"); require(address(stake.stakingContract) == msg.sender, "stakingContract must be the same"); @@ -158,6 +160,7 @@ contract ValidatorSet is UUPSUpgradeable, OnBlockNotifier, AccessControlEnumerab } function unstake(address nodeAddress, uint amount) external { + require(amount > 0, "amount must be > 0"); Stake storage stake = stakes[nodeAddress]; require(address(stake.stakingContract) == msg.sender, "stakingContract must be the same"); require(stake.amount >= amount, "amount bigger than stake"); From cb97e09fed6d38c5fac8b461928bb99187d7adf6 Mon Sep 17 00:00:00 2001 From: svin Date: Thu, 9 Nov 2023 17:51:37 +0200 Subject: [PATCH 4/5] Fix server nodes (if statement always false) --- contracts/staking/ServerNodes_Manager.sol | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/contracts/staking/ServerNodes_Manager.sol b/contracts/staking/ServerNodes_Manager.sol index 3b2c5895..cf10f557 100644 --- a/contracts/staking/ServerNodes_Manager.sol +++ b/contracts/staking/ServerNodes_Manager.sol @@ -118,13 +118,12 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener function restake(address nodeAddress) public onlyNodeOwner(nodeAddress) whenNotPaused { uint canceledAmount = lockKeeper.cancelLock(lockedWithdraws[nodeAddress]); - _addStake(nodeAddress, canceledAmount); - // re-register node if it was retired if (stakes[nodeAddress].stake == 0) { stakesList.push(nodeAddress); onboardingWaitingList.push(nodeAddress); } + _addStake(nodeAddress, canceledAmount); emit StakeChanged(nodeAddress, msg.sender, int(canceledAmount)); } @@ -156,6 +155,10 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener return result; } + function getOnboardingWaitingList() public view returns (address[] memory) { + return onboardingWaitingList; + } + // VALIDATOR SET METHODS function reward(address nodeAddress, uint amount) external { @@ -256,9 +259,10 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener function _addStake(address nodeAddress, uint amount) internal { stakes[nodeAddress].stake += amount; - // call validatorSet.stake() only when node already validator - if (validatorSet.getNodeStake(nodeAddress) > 0) - validatorSet.stake(nodeAddress, amount); + uint stakeInValidatorSet = validatorSet.getNodeStake(nodeAddress); + if (stakeInValidatorSet > 0) + // call validatorSet.stake() only when node is already validator + validatorSet.stake(nodeAddress, stakes[nodeAddress].stake - stakeInValidatorSet); } function _deleteStake(address nodeAddress) internal { @@ -286,7 +290,7 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener if (i != 0) i--; } - // register node in validator set if onboarding delay passed + // register node in validator set if onboarding delay passed else if (stakes[nodeAddress].timestampStake <= minTimestampForOnboarding) { validatorSet.newStake(nodeAddress, stakes[nodeAddress].stake, false); @@ -312,14 +316,15 @@ contract ServerNodes_Manager is UUPSUpgradeable, IStakeManager, IOnBlockListener function _addressToString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { - uint8 b = uint8(uint(uint160(x)) / (2**(8*(19 - i)))); + uint8 b = uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))); uint8 hi = (b / 16); uint8 lo = (b - 16 * hi); - s[2*i] = _char(hi); - s[2*i+1] = _char(lo); + s[2 * i] = _char(hi); + s[2 * i + 1] = _char(lo); } return string(s); } + function _char(uint8 b) internal pure returns (bytes1 c) { return bytes1(b + (b < 10 ? 0x30 : 0x57)); } From b6ea7aa151f37748a0192a50fb2a6a92ef5e4beb Mon Sep 17 00:00:00 2001 From: svin Date: Thu, 9 Nov 2023 17:59:12 +0200 Subject: [PATCH 5/5] Upgrade contracts (all networks) --- deployments/16718.json | 14 +++++++------- deployments/22040.json | 13 +++++++------ deployments/30746.json | 6 ++++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/deployments/16718.json b/deployments/16718.json index de6018e5..62b137c0 100644 --- a/deployments/16718.json +++ b/deployments/16718.json @@ -315,7 +315,6 @@ "deployTx": "0x3f167d4ba9de22fc23cdf8d0378543e97a0fb9ba386776489edb804abfd9d6eb", "fullyQualifiedName": "contracts/finance/Finance.sol:Finance" }, - "FinanceRevenue_Multisig": { "address": "0x1A4D8ECc2277599d1Da5ffc43Ad91f5e81E79296", "abi": [ @@ -495,7 +494,7 @@ "function addBlockListener(address listener)", "function baseReward() view returns (uint256)", "function changeTopStakesCount(uint256 newTopStakesCount)", - "function emitReward(address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", + "function emitReward(address rewardsBank, address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", "function finalizeChange()", "function getBlockListeners() view returns (address[])", "function getNodeStake(address nodeAddress) view returns (uint256)", @@ -530,7 +529,7 @@ "deployTx": "0x9ee8e13979f5ab5d8421cf6c5513d103fd91baab8dd81c3709702abbe1696ae7", "fullyQualifiedName": "contracts/consensus/ValidatorSet.sol:ValidatorSet", "proxy": { - "implementation": "0xac3298d5826F62150779B117Bd7661a642da9794", + "implementation": "0x2EaD8a10aB38b6F0e396151A24C5C6BaeAb3b72a", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -683,7 +682,7 @@ "deployTx": "0xff3bf6c402b8acc0cc907d707bc80bf769fa034f35675104301f5976d48124f1", "fullyQualifiedName": "contracts/staking/BaseNodes_Manager.sol:BaseNodes_Manager", "proxy": { - "implementation": "0xF510819762dcd580274149832d55234514645Aa8", + "implementation": "0x1cde89EE9654296dDA9c7a263E0475C1FECe232D", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -769,6 +768,7 @@ "function changeNodeOwner(address nodeAddress, address newOwnerAddress)", "function changeOnboardingDelay(uint256 newOnboardingDelay)", "function changeUnstakeLockTime(uint256 newUnstakeLockTime)", + "function getOnboardingWaitingList() view returns (address[])", "function getRoleAdmin(bytes32 role) view returns (bytes32)", "function getStakesList() view returns (address[])", "function getUserStakesList(address ownerAddress) view returns (address[] result)", @@ -805,7 +805,7 @@ "deployTx": "0xa89d74036f95e5bb606cc87540319311e2a7712fb34b5cb75e9d2aa4eca97750", "fullyQualifiedName": "contracts/staking/ServerNodes_Manager.sol:ServerNodes_Manager", "proxy": { - "implementation": "0x38EeF14Ee55fA78e656A295BAD0a45c447F4e170", + "implementation": "0x44079c827dBc6cD731CA22d12Db29310E249F9bC", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -914,7 +914,7 @@ "deployTx": "0xe7c8ae932f5305f4653f45c24fa7aca1aa3c0b83c5627130321086085a37ba0f", "fullyQualifiedName": "contracts/staking/pools/LegacyPoolsNodes_Manager.sol:LegacyPoolsNodes_Manager", "proxy": { - "implementation": "0x91D53681154daA58aB5a75D2Ff297e0876b7366d", + "implementation": "0xe2A4c8ba76D8e8F2A756a4B847D9082AF5ce0601", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -962,4 +962,4 @@ "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } } -} +} \ No newline at end of file diff --git a/deployments/22040.json b/deployments/22040.json index 87accac1..193e3cbb 100644 --- a/deployments/22040.json +++ b/deployments/22040.json @@ -494,7 +494,7 @@ "function addBlockListener(address listener)", "function baseReward() view returns (uint256)", "function changeTopStakesCount(uint256 newTopStakesCount)", - "function emitReward(address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", + "function emitReward(address rewardsBank, address nodeAddress, address nodeOwner, address rewardReceiver, address tokenAddress, uint256 amount)", "function finalizeChange()", "function getBlockListeners() view returns (address[])", "function getNodeStake(address nodeAddress) view returns (uint256)", @@ -529,7 +529,7 @@ "deployTx": "0x9e1df63f708c6b6cc348ed7c9ef8afd23a1062d38bfd328e36c215291ea61fad", "fullyQualifiedName": "contracts/consensus/ValidatorSet.sol:ValidatorSet", "proxy": { - "implementation": "0xBDc316826B77d198Eec93BC813F2796e7f26c2b3", + "implementation": "0x5a733c4cf22473fedAF0Dfd4020d0eC5C0B1Be04", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -682,7 +682,7 @@ "deployTx": "0x10c1978eb927e0e59791a30fa101c917c4921459268c1aa432d0149057427238", "fullyQualifiedName": "contracts/staking/BaseNodes_Manager.sol:BaseNodes_Manager", "proxy": { - "implementation": "0xe5A673b4BfCc7c6804185F35b94693b4CAfCF43c", + "implementation": "0xba8a3C15C2feaa0673de98F0cc468D5267A5c798", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -768,6 +768,7 @@ "function changeNodeOwner(address nodeAddress, address newOwnerAddress)", "function changeOnboardingDelay(uint256 newOnboardingDelay)", "function changeUnstakeLockTime(uint256 newUnstakeLockTime)", + "function getOnboardingWaitingList() view returns (address[])", "function getRoleAdmin(bytes32 role) view returns (bytes32)", "function getStakesList() view returns (address[])", "function getUserStakesList(address ownerAddress) view returns (address[] result)", @@ -804,7 +805,7 @@ "deployTx": "0xa7f9c2f0b9846005bd014faf75a0e312f13f901d0d2e81a81c9d3f10f50e6a52", "fullyQualifiedName": "contracts/staking/ServerNodes_Manager.sol:ServerNodes_Manager", "proxy": { - "implementation": "0x3a5633bAE0243bB360e25624DC6dFd241333B575", + "implementation": "0x8F80eB85E2288acf67407f317c9237c8bD1c1687", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -913,7 +914,7 @@ "deployTx": "0xd178130ffb89c3043a5a7bd34598eacd232fe68f99fd6c71de6bdf3ba0343537", "fullyQualifiedName": "contracts/staking/pools/LegacyPoolsNodes_Manager.sol:LegacyPoolsNodes_Manager", "proxy": { - "implementation": "0x5Fb2adefDC0cF350B87E6Ac31A66E3844afFcfD1", + "implementation": "0xA77Aa9b855638D566F087E3E40F05a0D8d5f6cF9", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -961,4 +962,4 @@ "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } } -} +} \ No newline at end of file diff --git a/deployments/30746.json b/deployments/30746.json index d2c60b69..b5ef70e6 100644 --- a/deployments/30746.json +++ b/deployments/30746.json @@ -488,6 +488,7 @@ "event Upgraded(address indexed implementation)", "event ValidatorSetFinalized(address[] newSet)", "function DEFAULT_ADMIN_ROLE() view returns (bytes32)", + "function FIX_removeFromTop(address nodeAddress)", "function REWARD_ORACLE_ROLE() view returns (bytes32)", "function STAKING_MANAGER_ROLE() view returns (bytes32)", "function _updateExternal()", @@ -529,7 +530,7 @@ "deployTx": "0x286eaea83658bc832aa10a194dc4a3e20d01b5d0f943b82460ccf6feae12194c", "fullyQualifiedName": "contracts/consensus/ValidatorSet.sol:ValidatorSet", "proxy": { - "implementation": "0x1D335E8B7787fB6c51F98713df5BCb56884FD023", + "implementation": "0x6C4eCd425e421259E63a65f9FDa121BeaeE877aA", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } }, @@ -812,6 +813,7 @@ "function changeNodeOwner(address nodeAddress, address newOwnerAddress)", "function changeOnboardingDelay(uint256 newOnboardingDelay)", "function changeUnstakeLockTime(uint256 newUnstakeLockTime)", + "function getOnboardingWaitingList() view returns (address[])", "function getRoleAdmin(bytes32 role) view returns (bytes32)", "function getStakesList() view returns (address[])", "function getUserStakesList(address ownerAddress) view returns (address[] result)", @@ -848,7 +850,7 @@ "deployTx": "0x9afda1b30db816a8f76295add9526ea7cd5ad86ed60bdf1fcaee72b2ce5db246", "fullyQualifiedName": "contracts/staking/ServerNodes_Manager.sol:ServerNodes_Manager", "proxy": { - "implementation": "0xfc277855999cF6452F9027BbdC1B56264A736E3A", + "implementation": "0xb4de4aA27C9B0aa3f6A91639a572A430AD59700D", "fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy" } },