Skip to content

Commit

Permalink
fix: refactor staking test and bump up initial time
Browse files Browse the repository at this point in the history
  • Loading branch information
0xPrimata committed Sep 5, 2024
1 parent 74185f5 commit dc712ff
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 122 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,20 +59,18 @@ contract MovementStaking is MovementStakingStorage, IMovementStaking, BaseStakin
EnumerableSet.AddressSet storage custodians = custodiansByDomain[domain];
for (uint256 j = 0; j < custodians.length(); j++) {
address custodian = custodians.at(j);

// for every delegatee of the attester
EnumerableSet.AddressSet storage delegatees = delegatorsByAttesterByDomain[domain][
attester
];
// _rollOverAttester(domain, 0, custodian, attester);
EnumerableSet.AddressSet storage delegatees = delegatorsByAttesterByDomain[domain][attester];
for (uint256 k = 0; k < delegatees.length(); k++) {
// todo: can this be replaced with _rollOverAttester?
address delegatee = delegatees.at(k);

// get the genesis stake for the attester
uint256 attesterStake = getStakeAtEpoch(domain, 0, custodian, delegatee, attester);

// roll over the genesis stake to the current epoch
_addStake(domain, getCurrentEpoch(domain), custodian, delegatee, attester, attesterStake);

emit AttesterEpochRolledOver(attester, delegatee, getCurrentEpoch(domain), custodian, attesterStake, 0);
}
}
}
Expand Down Expand Up @@ -340,9 +338,12 @@ contract MovementStaking is MovementStakingStorage, IMovementStaking, BaseStakin
// treat this attester as a potential delegator
// we need to roll over the stake for wherever this attester is delegating

// for every delegatee of the attester
EnumerableSet.AddressSet storage delegatees = delegatorsByAttesterByDomain[domain][attester];

// for everywhere this attester is delegating (using the reverse mapping)
for (uint256 i = 0; i < attestersByDelegatorByDomain[domain][attester].length(); i++) {
address delegatee = attestersByDelegatorByDomain[domain][attester].at(i);
for (uint256 i = 0; i < delegatees.length(); i++) {
address delegatee = delegatees.at(i);

// the amount of stake rolled over is stake[currentEpoch] - unstake[nextEpoch]
uint256 stakeAmount = getStakeAtEpoch(domain, epochNumber, custodian, delegatee, attester);
Expand All @@ -356,7 +357,7 @@ contract MovementStaking is MovementStakingStorage, IMovementStaking, BaseStakin

// the unstake is then paid out
// note: this is the only place this takes place
// there's not risk of double payout, so long as rollOverattester is only called once per epoch
// there's not risk of double payout, so long as rollOverAttester is only called once per epoch
// this should be guaranteed by the implementation, but we may want to create a withdrawal mapping to ensure this
_payAttester(address(this), attester, custodian, unstakeAmount);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,51 +4,59 @@ pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "../../src/staking/MovementStaking.sol";
import "../../src/token/MOVEToken.sol";
import { TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";

contract MovementStakingTest is Test {
function testInitialize() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);
}
MOVEToken public moveToken;
MovementStaking public staking;
ProxyAdmin public admin;
string public moveSignature = "initialize(string,string)";
string public stakingSignature = "initialize(address)";

function testCannotInitializeTwice() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();
function setUp() public {
MOVEToken moveTokenImplementation = new MOVEToken();
MovementStaking stakingImplementation = new MovementStaking();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);
// Contract MCRTest is the admin
admin = new ProxyAdmin(address(this));

// Deploy proxies
TransparentUpgradeableProxy moveProxy = new TransparentUpgradeableProxy(
address(moveTokenImplementation), address(admin), abi.encodeWithSignature(moveSignature, "Move Token", "MOVE")
);
TransparentUpgradeableProxy stakingProxy = new TransparentUpgradeableProxy(
address(stakingImplementation),
address(admin),
abi.encodeWithSignature(
stakingSignature, IMintableToken(address(moveProxy))
)
);
moveToken = MOVEToken(address(moveProxy));
staking = MovementStaking(address(stakingProxy));
}

function testCannotInitializeTwice() public {
// Attempt to initialize again should fail
vm.expectRevert(0xf92ee8a9);
staking.initialize(moveToken);
}

function testRegister() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

function testRegister() public returns (address payable, address[] memory) {
// Register a new domain
vm.warp(block.timestamp + 10 seconds);
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);

assertEq(staking.getCurrentEpoch(domain), 0);
return (domain, custodians);
}

function testWhitelist() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Our whitelister
address whitelister = vm.addr(1);
Expand All @@ -65,18 +73,7 @@ contract MovementStakingTest is Test {
}

function testSimpleStaker() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// stake at the domain
address payable staker = payable(vm.addr(2));
Expand All @@ -94,18 +91,8 @@ contract MovementStakingTest is Test {
}

function testSimpleGenesisCeremony() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand All @@ -125,18 +112,8 @@ contract MovementStakingTest is Test {
}

function testSimpleRolloverEpoch() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand All @@ -152,7 +129,7 @@ contract MovementStakingTest is Test {

// rollover epoch
for (uint256 i = 0; i < 10; i++) {
vm.warp((i + 1) * 1 seconds);
vm.warp(block.timestamp +(i + 1) * 1 seconds);
uint256 epochBefore = staking.getCurrentEpoch(domain);
vm.prank(domain);
staking.rollOverEpoch();
Expand All @@ -170,18 +147,8 @@ contract MovementStakingTest is Test {
}

function testUnstakeRolloverEpoch() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand All @@ -195,7 +162,7 @@ contract MovementStakingTest is Test {
staking.acceptGenesisCeremony();

for (uint256 i = 0; i < 10; i++) {
vm.warp((i + 1) * 1 seconds);
vm.warp(block.timestamp +(i + 1) * 1 seconds);
uint256 epochBefore = staking.getCurrentEpoch(domain);

// unstake
Expand All @@ -220,18 +187,8 @@ contract MovementStakingTest is Test {
}

function testUnstakeAndStakeRolloverEpoch() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand All @@ -245,7 +202,7 @@ contract MovementStakingTest is Test {
staking.acceptGenesisCeremony();

for (uint256 i = 0; i < 10; i++) {
vm.warp((i + 1) * 1 seconds);
vm.warp(block.timestamp +(i + 1) * 1 seconds);
uint256 epochBefore = staking.getCurrentEpoch(domain);

// unstake
Expand Down Expand Up @@ -281,18 +238,8 @@ contract MovementStakingTest is Test {
}

function testUnstakeStakeAndSlashRolloverEpoch() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand All @@ -306,7 +253,7 @@ contract MovementStakingTest is Test {
staking.acceptGenesisCeremony();

for (uint256 i = 0; i < 5; i++) {
vm.warp((i + 1) * 1 seconds);
vm.warp(block.timestamp +(i + 1) * 1 seconds);
uint256 epochBefore = staking.getCurrentEpoch(domain);

// unstake
Expand Down Expand Up @@ -370,11 +317,6 @@ contract MovementStakingTest is Test {
}

function testHalbornReward() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a domain
address payable domain = payable(vm.addr(1));
Expand Down Expand Up @@ -437,18 +379,8 @@ contract MovementStakingTest is Test {
}

function testBasicDelegation() public {
MOVEToken moveToken = new MOVEToken();
moveToken.initialize();

MovementStaking staking = new MovementStaking();
staking.initialize(moveToken);

// Register a new staker
address payable domain = payable(vm.addr(1));
address[] memory custodians = new address[](1);
custodians[0] = address(moveToken);
vm.prank(domain);
staking.registerDomain(1 seconds, custodians);
(address payable domain, address[] memory custodians) = testRegister();

// genesis ceremony
address payable staker = payable(vm.addr(2));
Expand Down Expand Up @@ -484,7 +416,7 @@ contract MovementStakingTest is Test {
100
);

vm.warp(2 seconds);
vm.warp(block.timestamp +2 seconds);
vm.prank(domain);
staking.rollOverEpoch();
stake = staking.getStakeAtEpoch(
Expand All @@ -505,7 +437,7 @@ contract MovementStakingTest is Test {
// unstake the staker for themself
vm.prank(staker);
staking.unstake(domain, address(moveToken), 100);
vm.warp(3 seconds);
vm.warp(block.timestamp +3 seconds);
vm.prank(domain);
staking.rollOverEpoch();
stake = staking.getStakeAtEpoch(
Expand All @@ -515,6 +447,7 @@ contract MovementStakingTest is Test {
staker,
staker
);
// FAILS HERE
assertEq(stake, 0);
stake = staking.getAllStakeAtEpoch(
domain,
Expand All @@ -537,7 +470,7 @@ contract MovementStakingTest is Test {
// now have the delegator unstake
vm.prank(alice);
staking.unstakeWithDelegate(domain, address(moveToken), 100, staker);
vm.warp(4 seconds);
vm.warp(block.timestamp +4 seconds);
vm.prank(domain);
staking.rollOverEpoch();
stake = staking.getStakeAtEpoch(
Expand Down

0 comments on commit dc712ff

Please sign in to comment.