Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix retire cancelation #24

Merged
merged 5 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion contracts/consensus/IValidatorSet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
7 changes: 5 additions & 2 deletions contracts/consensus/ValidatorSet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -180,8 +183,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
Expand Down
2 changes: 1 addition & 1 deletion contracts/staking/BaseNodes_Manager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
43 changes: 32 additions & 11 deletions contracts/staking/ServerNodes_Manager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,14 @@ 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]);

// 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));
}

Expand Down Expand Up @@ -148,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 {
Expand All @@ -165,16 +176,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);
}

}
Expand Down Expand Up @@ -248,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 {
Expand All @@ -270,12 +282,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--;
}
}
Expand All @@ -296,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));
}
Expand Down
2 changes: 1 addition & 1 deletion contracts/staking/pools/LegacyPoolsNodes_Manager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
14 changes: 7 additions & 7 deletions deployments/16718.json
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,6 @@
"deployTx": "0x3f167d4ba9de22fc23cdf8d0378543e97a0fb9ba386776489edb804abfd9d6eb",
"fullyQualifiedName": "contracts/finance/Finance.sol:Finance"
},

"FinanceRevenue_Multisig": {
"address": "0x1A4D8ECc2277599d1Da5ffc43Ad91f5e81E79296",
"abi": [
Expand Down Expand Up @@ -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)",
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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)",
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -962,4 +962,4 @@
"fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy"
}
}
}
}
13 changes: 7 additions & 6 deletions deployments/22040.json
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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)",
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -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"
}
},
Expand Down Expand Up @@ -961,4 +962,4 @@
"fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy"
}
}
}
}
18 changes: 9 additions & 9 deletions deployments/30746.json
Original file line number Diff line number Diff line change
Expand Up @@ -488,13 +488,14 @@
"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()",
"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)",
Expand Down Expand Up @@ -529,7 +530,7 @@
"deployTx": "0x286eaea83658bc832aa10a194dc4a3e20d01b5d0f943b82460ccf6feae12194c",
"fullyQualifiedName": "contracts/consensus/ValidatorSet.sol:ValidatorSet",
"proxy": {
"implementation": "0xC54450028dAE52c1DC1bb9Dabe553457eABd4Aa3",
"implementation": "0x6C4eCd425e421259E63a65f9FDa121BeaeE877aA",
"fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy"
}
},
Expand Down Expand Up @@ -682,7 +683,7 @@
"deployTx": "0xdbd2ec84a558f17f8cf83d06cc72e850d9e0aac2ffc134899dec7f86404b4879",
"fullyQualifiedName": "contracts/staking/BaseNodes_Manager.sol:BaseNodes_Manager",
"proxy": {
"implementation": "0x130c0e94E79DbA9F8A63D6452210C89e5942130c",
"implementation": "0xACf183fB8C6382d7cB0D5e9832528AEafC151Fcf",
"fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy"
}
},
Expand Down Expand Up @@ -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)",
Expand Down Expand Up @@ -848,7 +850,7 @@
"deployTx": "0x9afda1b30db816a8f76295add9526ea7cd5ad86ed60bdf1fcaee72b2ce5db246",
"fullyQualifiedName": "contracts/staking/ServerNodes_Manager.sol:ServerNodes_Manager",
"proxy": {
"implementation": "0x13BAE98762100CD918f936dA98e186E9a88A5C1E",
"implementation": "0xb4de4aA27C9B0aa3f6A91639a572A430AD59700D",
"fullyQualifiedName": "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy"
}
},
Expand Down Expand Up @@ -927,13 +929,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",
Expand All @@ -959,8 +959,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"
}
}
}
}