Skip to content
This repository was archived by the owner on Mar 1, 2024. It is now read-only.

Commit b6e7800

Browse files
authored
Merge pull request #345 from maticnetwork/pre-upgrade
Pre upgrade
2 parents 3874b5b + 43d77c9 commit b6e7800

File tree

16 files changed

+151
-82
lines changed

16 files changed

+151
-82
lines changed

contracts/root/IRootChain.sol

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ pragma solidity ^0.5.2;
44
interface IRootChain {
55
function slash() external;
66

7-
function submitHeaderBlock(bytes calldata data, uint[3][] calldata sigs)
7+
function submitHeaderBlock(bytes calldata data, bytes calldata sigs)
8+
external;
9+
10+
function submitCheckpoint(bytes calldata data, uint[3][] calldata sigs)
811
external;
912

1013
function getLastChildBlock() external view returns (uint256);

contracts/root/RootChain.sol

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ contract RootChain is RootChainStorage, IRootChain {
2020
_;
2121
}
2222

23-
function submitHeaderBlock(bytes calldata data, uint[3][] calldata sigs) external {
23+
function submitHeaderBlock(bytes calldata data, bytes calldata sigs) external {
24+
revert();
25+
}
26+
27+
function submitCheckpoint(bytes calldata data, uint[3][] calldata sigs) external {
2428
(address proposer, uint256 start, uint256 end, bytes32 rootHash, bytes32 accountHash, uint256 _borChainID) = abi
2529
.decode(data, (address, uint256, uint256, bytes32, bytes32, uint256));
2630
require(CHAINID == _borChainID, "Invalid bor chain id");

contracts/staking/EventsHub.sol

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ contract EventsHub is Initializable {
2727
_;
2828
}
2929

30+
modifier onlyStakeManager() {
31+
require(registry.getStakeManagerAddress() == msg.sender,
32+
"Invalid sender, not stake manager");
33+
_;
34+
}
35+
3036
function initialize(Registry _registry) external initializer {
3137
registry = _registry;
3238
}
@@ -48,4 +54,18 @@ contract EventsHub is Initializable {
4854
) public onlyValidatorContract(validatorId) {
4955
emit ShareBurnedWithId(validatorId, user, amount, tokens, burnId);
5056
}
57+
58+
event RewardParams(
59+
uint256 rewardDecreasePerCheckpoint,
60+
uint256 maxRewardedCheckpoints,
61+
uint256 checkpointRewardDelta
62+
);
63+
64+
function logRewardParams(
65+
uint256 rewardDecreasePerCheckpoint,
66+
uint256 maxRewardedCheckpoints,
67+
uint256 checkpointRewardDelta
68+
) public onlyStakeManager {
69+
emit RewardParams(rewardDecreasePerCheckpoint, maxRewardedCheckpoints, checkpointRewardDelta);
70+
}
5171
}

contracts/staking/stakeManager/IStakeManager.sol

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,13 @@ contract IStakeManager {
6464
function withdrawDelegatorsReward(uint256 validatorId) public returns(uint256);
6565

6666
function delegatorsReward(uint256 validatorId) public view returns(uint256);
67+
68+
function dethroneAndStake(
69+
address auctionUser,
70+
uint256 heimdallFee,
71+
uint256 validatorId,
72+
uint256 auctionAmount,
73+
bool acceptDelegation,
74+
bytes calldata signerPubkey
75+
) external;
6776
}

contracts/staking/stakeManager/StakeManager.sol

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {StakeManagerStorage} from "./StakeManagerStorage.sol";
2121
import {StakeManagerStorageExtension} from "./StakeManagerStorageExtension.sol";
2222
import {IGovernance} from "../../common/governance/IGovernance.sol";
2323
import {Initializable} from "../../common/mixin/Initializable.sol";
24-
import {ValidatorAuction} from "./ValidatorAuction.sol";
24+
import {StakeManagerExtension} from "./StakeManagerExtension.sol";
2525

2626
contract StakeManager is
2727
StakeManagerStorage,
@@ -78,10 +78,10 @@ contract StakeManager is
7878
address _validatorShareFactory,
7979
address _governance,
8080
address _owner,
81-
address _auctionImplementation
81+
address _extensionCode
8282
) external initializer {
83-
require(isContract(_auctionImplementation), "auction impl incorrect");
84-
auctionImplementation = _auctionImplementation;
83+
require(isContract(_extensionCode), "auction impl incorrect");
84+
extensionCode = _extensionCode;
8585
governance = IGovernance(_governance);
8686
registry = _registry;
8787
rootChain = _rootchain;
@@ -209,7 +209,7 @@ contract StakeManager is
209209
}
210210

211211
function updateCheckPointBlockInterval(uint256 _blocks) public onlyGovernance {
212-
require(_blocks != 0, "incorrect value");
212+
require(_blocks != 0);
213213
checkPointBlockInterval = _blocks;
214214
}
215215

@@ -221,29 +221,31 @@ contract StakeManager is
221221

222222
function updateCheckpointRewardParams(
223223
uint256 _rewardDecreasePerCheckpoint,
224-
uint256 _maxSkippedCheckpoints,
224+
uint256 _maxRewardedCheckpoints,
225225
uint256 _checkpointRewardDelta
226226
) public onlyGovernance {
227-
require(_maxSkippedCheckpoints.mul(_rewardDecreasePerCheckpoint) <= CHK_REWARD_PRECISION);
228-
require(_checkpointRewardDelta <= CHK_REWARD_PRECISION);
229-
230-
rewardDecreasePerCheckpoint = _rewardDecreasePerCheckpoint;
231-
maxSkippedCheckpoints = _maxSkippedCheckpoints;
232-
checkpointRewardDelta = _checkpointRewardDelta;
227+
delegatedFwd(
228+
extensionCode,
229+
abi.encodeWithSelector(
230+
StakeManagerExtension(extensionCode).updateCheckpointRewardParams.selector,
231+
_rewardDecreasePerCheckpoint,
232+
_maxRewardedCheckpoints,
233+
_checkpointRewardDelta
234+
)
235+
);
233236
}
234237

235238
// New implementation upgrade
236239

237240
function migrateValidatorsData(uint256 validatorIdFrom, uint256 validatorIdTo) public onlyOwner {
238-
for (uint256 i = validatorIdFrom; i < validatorIdTo; ++i) {
239-
ValidatorShare contractAddress = ValidatorShare(validators[i].contractAddress);
240-
if (contractAddress != ValidatorShare(0)) {
241-
validators[i].delegatorsReward = contractAddress.validatorRewards_deprecated().add(INITIALIZED_AMOUNT);
242-
validators[i].delegatedAmount = contractAddress.activeAmount_deprecated();
243-
validators[i].commissionRate = contractAddress.commissionRate_deprecated();
244-
validators[i].reward = validators[i].reward.add(INITIALIZED_AMOUNT);
245-
}
246-
}
241+
delegatedFwd(
242+
extensionCode,
243+
abi.encodeWithSelector(
244+
StakeManagerExtension(extensionCode).migrateValidatorsData.selector,
245+
validatorIdFrom,
246+
validatorIdTo
247+
)
248+
);
247249
}
248250

249251
function insertSigners(address[] memory _signers) public onlyOwner {
@@ -254,7 +256,7 @@ contract StakeManager is
254256
@dev Users must exit before this update or all funds may get lost
255257
*/
256258
function updateValidatorContractAddress(uint256 validatorId, address newContractAddress) public onlyGovernance {
257-
require(IValidatorShare(newContractAddress).owner() == address(this), "Not stakeManager");
259+
require(IValidatorShare(newContractAddress).owner() == address(this));
258260
validators[validatorId].contractAddress = newContractAddress;
259261
}
260262

@@ -294,7 +296,7 @@ contract StakeManager is
294296
uint256 amount
295297
) external onlyGovernance {
296298
address contractAddr = validators[validatorId].contractAddress;
297-
require(contractAddr != address(0x0), "not validator");
299+
require(contractAddr != address(0x0));
298300
IValidatorShare(contractAddr).drain(tokenAddr, destination, amount);
299301
}
300302

@@ -306,10 +308,10 @@ contract StakeManager is
306308
address _NFTContract,
307309
address _stakingLogger,
308310
address _validatorShareFactory,
309-
address _auctionImplementation
311+
address _extensionCode
310312
) external onlyGovernance {
311-
require(isContract(_auctionImplementation), "auction impl incorrect");
312-
auctionImplementation = _auctionImplementation;
313+
require(isContract(_extensionCode));
314+
extensionCode = _extensionCode;
313315
NFTContract = StakingNFT(_NFTContract);
314316
logger = StakingInfo(_stakingLogger);
315317
validatorShareFactory = ValidatorShareFactory(_validatorShareFactory);
@@ -353,9 +355,9 @@ contract StakeManager is
353355
bytes calldata _signerPubkey
354356
) external onlyWhenUnlocked {
355357
delegatedFwd(
356-
auctionImplementation,
358+
extensionCode,
357359
abi.encodeWithSelector(
358-
ValidatorAuction(auctionImplementation).startAuction.selector,
360+
StakeManagerExtension(extensionCode).startAuction.selector,
359361
validatorId,
360362
amount,
361363
_acceptDelegation,
@@ -369,9 +371,9 @@ contract StakeManager is
369371
uint256 heimdallFee /** for new validator */
370372
) external onlyWhenUnlocked {
371373
delegatedFwd(
372-
auctionImplementation,
374+
extensionCode,
373375
abi.encodeWithSelector(
374-
ValidatorAuction(auctionImplementation).confirmAuctionBid.selector,
376+
StakeManagerExtension(extensionCode).confirmAuctionBid.selector,
375377
validatorId,
376378
heimdallFee,
377379
address(this)
@@ -397,7 +399,7 @@ contract StakeManager is
397399
}
398400

399401
function unstake(uint256 validatorId) external onlyStaker(validatorId) {
400-
require(validatorAuction[validatorId].amount == 0, "Wait for auction completion");
402+
require(validatorAuction[validatorId].amount == 0);
401403

402404
Status status = validators[validatorId].status;
403405
require(
@@ -786,7 +788,7 @@ contract StakeManager is
786788
uint256 amount,
787789
uint256 deactivationEpoch,
788790
uint256 _currentEpoch
789-
) private view returns (bool) {
791+
) private pure returns (bool) {
790792
return (amount > 0 && (deactivationEpoch == 0 || deactivationEpoch > _currentEpoch) && status == Status.Active);
791793
}
792794

@@ -819,7 +821,7 @@ contract StakeManager is
819821

820822
uint256 targetBlockInterval = checkPointBlockInterval;
821823
uint256 ckpReward = CHECKPOINT_REWARD;
822-
uint256 fullIntervals = Math.min(blockInterval / targetBlockInterval, maxSkippedCheckpoints);
824+
uint256 fullIntervals = Math.min(blockInterval / targetBlockInterval, maxRewardedCheckpoints);
823825

824826
// only apply to full checkpoints
825827
if (fullIntervals > 0 && fullIntervals != prevBlockInterval) {
@@ -963,7 +965,7 @@ contract StakeManager is
963965
uint256 validatorStakePower,
964966
uint256 currentRewardPerStake,
965967
uint256 initialRewardPerStake
966-
) private returns (uint256) {
968+
) private pure returns (uint256) {
967969
uint256 eligibleReward = currentRewardPerStake - initialRewardPerStake;
968970
return eligibleReward.mul(validatorStakePower).div(REWARD_PRECISION);
969971
}

contracts/staking/stakeManager/ValidatorAuction.sol renamed to contracts/staking/stakeManager/StakeManagerExtension.sol

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@ import {IERC20} from "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";
44
import {SafeMath} from "openzeppelin-solidity/contracts/math/SafeMath.sol";
55
import {Registry} from "../../common/Registry.sol";
66
import {GovernanceLockable} from "../../common/mixin/GovernanceLockable.sol";
7-
import {RootChainable} from "../../common/mixin/RootChainable.sol";
8-
import {StakingInfo} from "../StakingInfo.sol";
9-
import {StakingNFT} from "./StakingNFT.sol";
10-
import {StakeManager} from "./StakeManager.sol";
7+
import {IStakeManager} from "./IStakeManager.sol";
118
import {StakeManagerStorage} from "./StakeManagerStorage.sol";
129
import {StakeManagerStorageExtension} from "./StakeManagerStorageExtension.sol";
1310
import {Math} from "openzeppelin-solidity/contracts/math/Math.sol";
1411
import {Initializable} from "../../common/mixin/Initializable.sol";
12+
import {EventsHub} from "../EventsHub.sol";
13+
import {ValidatorShare} from "../validatorShare/ValidatorShare.sol";
1514

16-
contract ValidatorAuction is StakeManagerStorage, Initializable, StakeManagerStorageExtension {
15+
contract StakeManagerExtension is StakeManagerStorage, Initializable, StakeManagerStorageExtension {
1716
using SafeMath for uint256;
1817

1918
constructor() public GovernanceLockable(address(0x0)) {}
@@ -82,7 +81,7 @@ contract ValidatorAuction is StakeManagerStorage, Initializable, StakeManagerSto
8281
function confirmAuctionBid(
8382
uint256 validatorId,
8483
uint256 heimdallFee, /** for new validator */
85-
StakeManager stakeManager
84+
IStakeManager stakeManager
8685
) external {
8786
Auction storage auction = validatorAuction[validatorId];
8887
address auctionUser = auction.user;
@@ -125,4 +124,41 @@ contract ValidatorAuction is StakeManagerStorage, Initializable, StakeManagerSto
125124
delete validatorAuction[validatorId];
126125
validatorAuction[validatorId].startEpoch = startEpoch;
127126
}
127+
128+
function migrateValidatorsData(uint256 validatorIdFrom, uint256 validatorIdTo) external {
129+
for (uint256 i = validatorIdFrom; i < validatorIdTo; ++i) {
130+
ValidatorShare contractAddress = ValidatorShare(validators[i].contractAddress);
131+
if (contractAddress != ValidatorShare(0)) {
132+
validators[i].delegatorsReward = contractAddress.validatorRewards_deprecated().add(INITIALIZED_AMOUNT);
133+
validators[i].delegatedAmount = contractAddress.activeAmount_deprecated();
134+
validators[i].commissionRate = contractAddress.commissionRate_deprecated();
135+
}
136+
137+
validators[i].reward = validators[i].reward.add(INITIALIZED_AMOUNT);
138+
}
139+
}
140+
141+
function updateCheckpointRewardParams(
142+
uint256 _rewardDecreasePerCheckpoint,
143+
uint256 _maxRewardedCheckpoints,
144+
uint256 _checkpointRewardDelta
145+
) external {
146+
require(_maxRewardedCheckpoints.mul(_rewardDecreasePerCheckpoint) <= CHK_REWARD_PRECISION);
147+
require(_checkpointRewardDelta <= CHK_REWARD_PRECISION);
148+
149+
rewardDecreasePerCheckpoint = _rewardDecreasePerCheckpoint;
150+
maxRewardedCheckpoints = _maxRewardedCheckpoints;
151+
checkpointRewardDelta = _checkpointRewardDelta;
152+
153+
_getOrCacheEventsHub().logRewardParams(_rewardDecreasePerCheckpoint, _maxRewardedCheckpoints, _checkpointRewardDelta);
154+
}
155+
156+
function _getOrCacheEventsHub() private returns(EventsHub) {
157+
EventsHub _eventsHub = EventsHub(eventsHub);
158+
if (_eventsHub == EventsHub(0x0)) {
159+
_eventsHub = EventsHub(Registry(registry).contractMap(keccak256("eventsHub")));
160+
eventsHub = address(_eventsHub);
161+
}
162+
return _eventsHub;
163+
}
128164
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
pragma solidity 0.5.17;
22

33
contract StakeManagerStorageExtension {
4+
address public eventsHub;
45
uint256 public rewardPerStake;
5-
address public auctionImplementation;
6+
address public extensionCode;
67
address[] public signers;
78

89
uint256 constant CHK_REWARD_PRECISION = 100;
910
uint256 public prevBlockInterval;
1011
// how much less reward per skipped checkpoint, 0 - 100%
1112
uint256 public rewardDecreasePerCheckpoint;
12-
// how many skipped checkpoints to reward
13-
uint256 public maxSkippedCheckpoints;
13+
// how many checkpoints to reward
14+
uint256 public maxRewardedCheckpoints;
1415
// increase / decrease value for faster or slower checkpoints, 0 - 100%
1516
uint256 public checkpointRewardDelta;
1617
}

contracts/staking/validatorShare/ValidatorShare.sol

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ import {OwnableLockable} from "../../common/mixin/OwnableLockable.sol";
99
import {IStakeManager} from "../stakeManager/IStakeManager.sol";
1010
import {IValidatorShare} from "./IValidatorShare.sol";
1111
import {Initializable} from "../../common/mixin/Initializable.sol";
12-
import {ValidatorShareStorageExtension} from "./ValidatorShareStorageExtension.sol";
1312

14-
contract ValidatorShare is IValidatorShare, ERC20NonTradable, OwnableLockable, Initializable, ValidatorShareStorageExtension {
13+
contract ValidatorShare is IValidatorShare, ERC20NonTradable, OwnableLockable, Initializable {
14+
struct DelegatorUnbond {
15+
uint256 shares;
16+
uint256 withdrawEpoch;
17+
}
18+
1519
uint256 constant EXCHANGE_RATE_PRECISION = 100;
1620
// maximum matic possible, even if rate will be 1 and all matic will be staken in one go, it will result in 10 ^ 58 shares
1721
uint256 constant EXCHANGE_RATE_HIGH_PRECISION = 10**29;
@@ -26,9 +30,9 @@ contract ValidatorShare is IValidatorShare, ERC20NonTradable, OwnableLockable, I
2630
uint256 public minAmount;
2731

2832
uint256 public totalStake_deprecated;
33+
uint256 public rewardPerShare;
2934
uint256 public activeAmount_deprecated;
3035

31-
uint256 public rewardPerShare;
3236
bool public delegation;
3337

3438
uint256 public withdrawPool;
@@ -38,6 +42,11 @@ contract ValidatorShare is IValidatorShare, ERC20NonTradable, OwnableLockable, I
3842
mapping(address => DelegatorUnbond) public unbonds;
3943
mapping(address => uint256) public initalRewardPerShare;
4044

45+
mapping(address => uint256) public unbondNonces;
46+
mapping(address => mapping(uint256 => DelegatorUnbond)) public unbonds_new;
47+
48+
EventsHub public eventsHub;
49+
4150
// onlyOwner will prevent this contract from initializing, since it's owner is going to be 0x0 address
4251
function initialize(
4352
uint256 _validatorId,

contracts/staking/validatorShare/ValidatorShareStorageExtension.sol

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)