Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
96f322e
Add _unstake and unstakeFor
rackstar Jul 22, 2024
c4e5c6d
Add unstakeFor unit tests + update unstake tests
rackstar Jul 22, 2024
27ba810
Replace Assessment requires with custom errors
rackstar Jul 22, 2024
8944569
Update Assessment unit tests
rackstar Jul 22, 2024
b261c19
Update IAssessment and relevant mocks
rackstar Jul 22, 2024
d73cadd
Add ITokenController Views and Mutative sections
rackstar Jul 22, 2024
8b323ed
TokenControllerGeneric add method name on revert for clarity
rackstar Jul 22, 2024
aec34e7
Add missing override modifier
rackstar Jul 30, 2024
b57cf7d
Add TokenController.withdrawNXM and new structs
rackstar Jul 25, 2024
4a65376
Update WithdrawNxmOptions struct and withdrawNXM params
rackstar Jul 30, 2024
31fd1bb
Change natspec to triple slash for consistency
rackstar Jul 30, 2024
8dfdb3e
Add _withdrawClaimAssessmentTokensForUser internal function
rackstar Jul 30, 2024
cf89de0
Always withdraw v1 claim assessment and v1 pooled staking rewards
rackstar Jul 30, 2024
ac54710
Add override modifier for added safety
rackstar Jul 30, 2024
7e9fde2
Add natspec comments to all TokeController external methods
rackstar Jul 31, 2024
1a0a6f6
Add named parameters to mappings
rackstar Jul 31, 2024
43388e3
Use _stakingPool to calculate stakingPool address from poolId
rackstar Jul 31, 2024
b4b5e34
User msg.sender for withdrawNXM
rackstar Jul 31, 2024
264141b
Drop withdrawNXM from ITokenController
rackstar Jul 31, 2024
389b3ee
Add and update TokenController mocks
rackstar Jul 31, 2024
a9e51c0
Fix TokenController unit test setup
rackstar Jul 31, 2024
bc0243c
Add TokenController.withdrawNXM unit tests
rackstar Jul 31, 2024
6695607
Add function name on revert unsupported PooledStakingGeneric
rackstar Jul 31, 2024
99c3d53
Update integration setup + add custom TokenController integration setup
rackstar Aug 1, 2024
8e376b5
Add TokenController.withdrawNXM integration tests
rackstar Aug 1, 2024
8043d3a
Remove labeled mapping params
rackstar Aug 6, 2024
564084b
Update ITokenStructs
rackstar Aug 6, 2024
d36f68e
Drop withdrawPendingRewards in favour of withdrawNXM
rackstar Aug 6, 2024
d97685a
Add Assessment.unstakeAllFor
rackstar Aug 6, 2024
d553219
Add unstakeAllFor unit tests
rackstar Aug 6, 2024
ba2f59f
Drop redundant isMember check on _withdrawRewards
rackstar Aug 6, 2024
bff967e
Update TokenController.withdrawNXM
rackstar Aug 6, 2024
a9f5920
Update withdrawNXM integration tests
rackstar Aug 6, 2024
1ac74bf
Drop withdrawNXM v1 NXM unit tests
rackstar Aug 6, 2024
af59545
Fix ITokenController struct docs
rackstar Aug 6, 2024
cb07232
Add missing stakingNFT.address constructor params
rackstar Aug 6, 2024
5e2d857
Remove withdraw-nxm for test
rackstar Aug 7, 2024
a826d2a
Fix stakingNFT slot
rackstar Aug 7, 2024
97f8382
Move stakingPoolNXMBalances to ITokenController Views section
rackstar Aug 7, 2024
2ee359f
Add async-sema as devDependency
rackstar Aug 7, 2024
eda1991
Add withdraw-nxm fork test
rackstar Aug 7, 2024
3621097
Update @nexusmutual/deployments to 2.7.1
rackstar Aug 8, 2024
63c6ff5
Add missing contracts to fork test
rackstar Aug 8, 2024
afb9b1d
Add missing stakingNFT constructor params
rackstar Aug 8, 2024
6f6c103
Hardcode 0 batchSize to assessment withdrawRewards to withdraw ALL
rackstar Aug 8, 2024
ec8aad3
Improve IAssessment function param names
rackstar Aug 8, 2024
73aa101
Use Promise.all and remove deprecated assert.equal
rackstar Aug 8, 2024
1e8a471
Update withdraw-nxm fork tests
rackstar Aug 8, 2024
6cd1e3b
Fix withdrawNXM integration tests
rackstar Aug 8, 2024
22e1d99
Add missing new lines
rackstar Aug 9, 2024
c37d784
Add withdrawNXM assessmentRewardsBatchSize param
rackstar Aug 9, 2024
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
22 changes: 20 additions & 2 deletions contracts/interfaces/IAssessment.sol
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ interface IAssessment {

function getVoteCountOfAssessor(address assessor) external view returns (uint);

function votesOf(address user, uint id) external view
function votesOf(address user, uint voteIndex) external view
returns (uint80 assessmentId, bool accepted, uint32 timestamp, uint96 stakedAmount);

function stakeOf(address user) external view
Expand All @@ -122,7 +122,7 @@ interface IAssessment {
uint8 silentEndingPeriodInDays
);

function hasAlreadyVotedOn(address voter, uint pollId) external view returns (bool);
function hasAlreadyVotedOn(address voter, uint assessmentId) external view returns (bool);


/* === MUTATIVE FUNCTIONS ==== */
Expand All @@ -131,6 +131,8 @@ interface IAssessment {

function unstake(uint96 amount, address to) external;

function unstakeAllFor(address staker) external;

function withdrawRewards(
address user,
uint104 batchSize
Expand Down Expand Up @@ -174,4 +176,20 @@ interface IAssessment {
event FraudProcessed(uint assessmentId, address assessor, Poll poll);
event FraudSubmitted(bytes32 root);

/* ========== ERRORS ========== */

error InvalidAmount(uint maxUnstakeAmount);
error StakeLockedForAssessment(uint lockupExpiry);
error StakeLockedForGovernance(uint lockupExpiry);
error NotMember(address nonMember);
error NoWithdrawableRewards();
error InvalidMerkleProof();

// Votes
error AssessmentIdsVotesLengthMismatch();
error AssessmentIdsIpfsLengthMismatch();
error AlreadyVoted();
error StakeRequired();
error VotingClosed();
error AcceptVoteRequired();
}
95 changes: 61 additions & 34 deletions contracts/interfaces/ITokenController.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,74 @@ interface ITokenController {
uint96 deadline;
}

struct WithdrawAssessment {
bool stake;
bool rewards;
}

/// @notice The stake deposit / rewards in a staking pool that will be withdrawn.
/// @dev Call StakingViewer.getToken to get tokenId / trancheId information
/// @param tokenId The ID of the token stake deposit / rewards that will be withrawn.
/// @param trancheIds An array of tranche IDs representing the tranches where the stake was deposited.
struct StakingPoolDeposit {
uint tokenId;
uint[] trancheIds;
}

/// @notice Represents the rewards distributed to a staking pool manager.
/// @dev Call StakingViewer.getManagerTokenRewardsByAddr to get poolId / trancheId information
/// @param poolId The ID of the pool managed by the manager.
/// @param trancheIds An array of tranche IDs representing the tranches where the manager rewards were distributed.
struct StakingPoolManagerReward {
uint poolId;
uint[] trancheIds;
}

/* ========== VIEWS ========== */

function token() external view returns (INXMToken);

function coverInfo(uint id) external view returns (
uint16 claimCount,
bool hasOpenClaim,
bool hasAcceptedClaim,
uint96 requestedPayoutAmount
);

function getLockReasons(address _of) external view returns (bytes32[] memory reasons);

function totalSupply() external view returns (uint);

function totalBalanceOf(address _of) external view returns (uint amount);

function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount);

function getTokenPrice() external view returns (uint tokenPrice);

function getPendingRewards(address member) external view returns (uint);

function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount);

function getWithdrawableCoverNotes(
address coverOwner
) external view returns (
uint[] memory coverIds,
bytes32[] memory lockReasons,
uint withdrawableAmount
);

function getStakingPoolManager(uint poolId) external view returns (address manager);

function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds);

function isStakingPoolManager(address member) external view returns (bool);

function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline);

function stakingPoolNXMBalances(uint poolId) external view returns (uint128 rewards, uint128 deposits);

/* ========== MUTATIVE FUNCTIONS ========== */

function withdrawCoverNote(
address _of,
uint[] calldata _coverIds,
Expand All @@ -53,26 +114,6 @@ interface ITokenController {

function withdrawClaimAssessmentTokens(address[] calldata users) external;

function getLockReasons(address _of) external view returns (bytes32[] memory reasons);

function totalSupply() external view returns (uint);

function totalBalanceOf(address _of) external view returns (uint amount);

function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount);

function getTokenPrice() external view returns (uint tokenPrice);

function token() external view returns (INXMToken);

function getStakingPoolManager(uint poolId) external view returns (address manager);

function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds);

function isStakingPoolManager(address member) external view returns (bool);

function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline);

function transferStakingPoolsOwnership(address from, address to) external;

function assignStakingPoolManager(uint poolId, address manager) external;
Expand All @@ -92,18 +133,4 @@ interface ITokenController {
function withdrawNXMStakeAndRewards(address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId) external;

function burnStakedNXM(uint amount, uint poolId) external;

function stakingPoolNXMBalances(uint poolId) external view returns(uint128 rewards, uint128 deposits);

function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount);

function getWithdrawableCoverNotes(
address coverOwner
) external view returns (
uint[] memory coverIds,
bytes32[] memory lockReasons,
uint withdrawableAmount
);

function getPendingRewards(address member) external view returns (uint);
}
11 changes: 9 additions & 2 deletions contracts/mocks/disposables/DisposableTokenController.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,15 @@ contract DisposableTokenController is TokenController {
address quotationDataAddress,
address claimsRewardAddress,
address stakingPoolFactoryAddress,
address tokenAddress
) TokenController(quotationDataAddress, claimsRewardAddress, stakingPoolFactoryAddress, tokenAddress) {}
address tokenAddress,
address stakingNFTAddress
) TokenController(
quotationDataAddress,
claimsRewardAddress,
stakingPoolFactoryAddress,
tokenAddress,
stakingNFTAddress
) {}

function initialize(
address payable _masterAddress,
Expand Down
32 changes: 18 additions & 14 deletions contracts/mocks/generic/AssessmentGeneric.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,54 +17,58 @@ contract AssessmentGeneric is IAssessment {
mapping(address => mapping(uint => bool)) public hasAlreadyVotedOn;

function getAssessmentsCount() external virtual view returns (uint) {
revert("Unsupported");
revert("getAssessmentsCount unsupported");
}

function getPoll(uint) external virtual view returns (Poll memory) {
revert("Unsupported");
revert("getPoll unsupported");
}

function getRewards(address) external pure returns (uint, uint, uint) {
revert("Unsupported");
function getRewards(address) external virtual view returns (uint, uint, uint) {
revert("getRewards unsupported");
}

function getVoteCountOfAssessor(address) external virtual view returns (uint) {
revert("Unsupported");
revert("getVoteCountOfAssessor unsupported");
}

function stake(uint96) external pure {
revert("Unsupported");
revert("stake unsupported");
}

function unstake(uint96, address) external pure {
revert("Unsupported");
revert("unstake unsupported");
}

function unstakeAllFor(address) external pure {
revert("unstakeFor unsupported");
}

function withdrawRewards(address, uint104) external virtual returns (uint, uint) {
revert("Unsupported");
revert("withdrawRewards unsupported");
}

function withdrawRewardsTo(address, uint104) external virtual returns (uint, uint) {
revert("Unsupported");
revert("withdrawRewardsTo unsupported");
}

function startAssessment(uint, uint) external virtual returns (uint) {
revert("Unsupported");
revert("startAssessment unsupported");
}

function castVotes(uint[] calldata, bool[] calldata, string[] calldata, uint96) external virtual pure {
revert("Unsupported");
revert("castVotes unsupported");
}

function submitFraud(bytes32) external pure {
revert("Unsupported");
revert("submitFraud unsupported");
}

function processFraud(uint256, bytes32[] calldata, address, uint256, uint96, uint16, uint256) external pure {
revert("Unsupported");
revert("processFraud unsupported");
}

function updateUintParameters(UintParams[] calldata, uint[] calldata) external pure {
revert("Unsupported");
revert("updateUintParameters unsupported");
}
}
24 changes: 12 additions & 12 deletions contracts/mocks/generic/PooledStakingGeneric.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,50 +7,50 @@ import "../../interfaces/IPooledStaking.sol";
contract PooledStakingGeneric is IPooledStaking {

function accumulateReward(address, uint) external virtual {
revert("Unsupported");
revert("accumulateReward unsupported");
}

function pushBurn(address, uint) external virtual {
revert("Unsupported");
revert("pushBurn unsupported");
}

function hasPendingActions() external virtual view returns (bool) {
revert("Unsupported");
revert("hasPendingActions unsupported");
}

function processPendingActions(uint) external virtual returns (bool) {
revert("Unsupported");
revert("processPendingActions unsupported");
}

function contractStake(address) external virtual view returns (uint) {
revert("Unsupported");
revert("contractStake unsupported");
}

function stakerReward(address) external virtual view returns (uint) {
revert("Unsupported");
revert("stakerReward unsupported");
}

function stakerDeposit(address) external virtual view returns (uint) {
revert("Unsupported");
revert("stakerDeposit unsupported");
}

function stakerContractStake(address, address) external virtual view returns (uint) {
revert("Unsupported");
revert("stakerContractStake unsupported");
}

function withdraw(uint) external virtual {
revert("Unsupported");
revert("withdraw unsupported");
}

function withdrawForUser(address) external virtual {
revert("Unsupported");
revert("withdrawForUser unsupported");
}

function stakerMaxWithdrawable(address) external virtual view returns (uint) {
revert("Unsupported");
revert("stakerMaxWithdrawable unsupported");
}

function withdrawReward(address) external virtual {
revert("Unsupported");
revert("withdrawReward unsupported");
}
}
Loading