Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
b178459
Remove bonus reward shares from `depositTo`
shark0der Jul 30, 2024
d233253
Fix `extendDeposit` and remove bonus rewards shares
shark0der Jul 30, 2024
8f1de39
Fix reward shares supply handling in `setPoolFee`
shark0der Jul 30, 2024
d8745a2
Reduce `StakingPool` contract size
shark0der Jul 30, 2024
d4161c6
Add `StakingPool` and `Cover` reward share update function
shark0der Jul 30, 2024
6ff20a8
Remove forgotten hardhat console import
shark0der Jul 30, 2024
fb65afb
Add temporary staking test scripts
shark0der Jul 30, 2024
2cee3a1
Add staking fix fork test script
shark0der Jul 30, 2024
2c0a5a7
Fix unit tests
shark0der Jul 29, 2024
4a18df9
Fix integration tests
shark0der Jul 30, 2024
9bb51c0
Remove unused import
shark0der Jul 30, 2024
bd9251d
Restrict `updateStakingPoolsRewardShares` function call to swap contr…
shark0der Aug 5, 2024
66d40ce
Sort staking pool imports
shark0der Aug 6, 2024
95e618a
Remove unused staking pool constants
shark0der Aug 6, 2024
36dd78a
Remove reward bonus related constants from tests
shark0der Aug 6, 2024
3436fba
Add StakingPool rewards update fork test
shark0der Aug 8, 2024
3719ab7
Move staking products storage above constants and immutables
shark0der Aug 6, 2024
67f1204
Move staking pool ipfs metadata to StakingProducts
shark0der Aug 6, 2024
2b00017
Fix staking pool metadata-related tests
shark0der Aug 6, 2024
0da4532
Add staking pool metadata tests and cleanup staking pool unit tests
shark0der Aug 7, 2024
8731fda
Add _unstake and unstakeFor
rackstar Jul 22, 2024
6a4d66f
Add unstakeFor unit tests + update unstake tests
rackstar Jul 22, 2024
6156862
Replace Assessment requires with custom errors
rackstar Jul 22, 2024
bea71f1
Update Assessment unit tests
rackstar Jul 22, 2024
e949806
Update IAssessment and relevant mocks
rackstar Jul 22, 2024
890be15
Add ITokenController Views and Mutative sections
rackstar Jul 22, 2024
37dc270
TokenControllerGeneric add method name on revert for clarity
rackstar Jul 22, 2024
47ab919
Add missing override modifier
rackstar Jul 30, 2024
9ee7a07
Add TokenController.withdrawNXM and new structs
rackstar Jul 25, 2024
4db968b
Update WithdrawNxmOptions struct and withdrawNXM params
rackstar Jul 30, 2024
4bc88a0
Change natspec to triple slash for consistency
rackstar Jul 30, 2024
febba7c
Add _withdrawClaimAssessmentTokensForUser internal function
rackstar Jul 30, 2024
f9026d5
Always withdraw v1 claim assessment and v1 pooled staking rewards
rackstar Jul 30, 2024
0b82a99
Add override modifier for added safety
rackstar Jul 30, 2024
1023c35
Add natspec comments to all TokeController external methods
rackstar Jul 31, 2024
35368e6
Add named parameters to mappings
rackstar Jul 31, 2024
2a58c1b
Use _stakingPool to calculate stakingPool address from poolId
rackstar Jul 31, 2024
0c7dce8
User msg.sender for withdrawNXM
rackstar Jul 31, 2024
de86c5d
Drop withdrawNXM from ITokenController
rackstar Jul 31, 2024
fafcd5c
Add and update TokenController mocks
rackstar Jul 31, 2024
b7079d7
Fix TokenController unit test setup
rackstar Jul 31, 2024
227b6dc
Add TokenController.withdrawNXM unit tests
rackstar Jul 31, 2024
612f348
Add function name on revert unsupported PooledStakingGeneric
rackstar Jul 31, 2024
d558b60
Update integration setup + add custom TokenController integration setup
rackstar Aug 1, 2024
06c6af5
Add TokenController.withdrawNXM integration tests
rackstar Aug 1, 2024
0ccf700
Remove labeled mapping params
rackstar Aug 6, 2024
fecdc72
Update ITokenStructs
rackstar Aug 6, 2024
b17e229
Drop withdrawPendingRewards in favour of withdrawNXM
rackstar Aug 6, 2024
a35f446
Add Assessment.unstakeAllFor
rackstar Aug 6, 2024
6bbbb59
Add unstakeAllFor unit tests
rackstar Aug 6, 2024
226be23
Drop redundant isMember check on _withdrawRewards
rackstar Aug 6, 2024
f537642
Update TokenController.withdrawNXM
rackstar Aug 6, 2024
e1c5d9d
Update withdrawNXM integration tests
rackstar Aug 6, 2024
aa24386
Drop withdrawNXM v1 NXM unit tests
rackstar Aug 6, 2024
5221557
Fix ITokenController struct docs
rackstar Aug 6, 2024
598cf82
Add missing stakingNFT.address constructor params
rackstar Aug 6, 2024
9cee7c8
Remove withdraw-nxm for test
rackstar Aug 7, 2024
ceba691
Fix stakingNFT slot
rackstar Aug 7, 2024
54ee3d1
Move stakingPoolNXMBalances to ITokenController Views section
rackstar Aug 7, 2024
b971d07
Add async-sema as devDependency
rackstar Aug 7, 2024
0a8cf09
Add withdraw-nxm fork test
rackstar Aug 7, 2024
5ae1931
Update @nexusmutual/deployments to 2.7.1
rackstar Aug 8, 2024
d722cca
Add missing contracts to fork test
rackstar Aug 8, 2024
58c6090
Add missing stakingNFT constructor params
rackstar Aug 8, 2024
edb3bc0
Hardcode 0 batchSize to assessment withdrawRewards to withdraw ALL
rackstar Aug 8, 2024
7eb31f2
Improve IAssessment function param names
rackstar Aug 8, 2024
1d9ce93
Use Promise.all and remove deprecated assert.equal
rackstar Aug 8, 2024
abd4db9
Update withdraw-nxm fork tests
rackstar Aug 8, 2024
ae964ab
Fix withdrawNXM integration tests
rackstar Aug 8, 2024
8e408ac
Add missing new lines
rackstar Aug 9, 2024
fea86de
Add withdrawNXM assessmentRewardsBatchSize param
rackstar Aug 9, 2024
67150f5
Prevent burns in grace period
shark0der Aug 6, 2024
7087907
Add test for deallocations in grace period
shark0der Aug 9, 2024
33485ec
Add onlyTokenController modifier to unstakeAllFor + unit tests
rackstar Aug 16, 2024
d299b00
Add MAX_ACTIVE_TRANCHES constant to Cover contract
rackstar Aug 19, 2024
0692f72
Do not overwrite existing poolMetaData on setInitialMetadata
rackstar Aug 19, 2024
77a72dc
Fix Withdraw event param
rackstar Aug 19, 2024
7a120f5
Add ipfsHash validation
rackstar Aug 19, 2024
e62eed0
Fix tests add missing ipfsHash
rackstar Aug 19, 2024
7b9ae0b
Add missing view to getPoolMetadata
rackstar Aug 21, 2024
72a7b61
Add metadataIpfsHash field to Pool sturct + unit test
rackstar Aug 21, 2024
14377ef
Update package version to 2.8.0
rackstar Aug 21, 2024
f818eef
Merge pull request #1216 from NexusMutual/feat/add-metadataIpfsHash-t…
rackstar Aug 22, 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
23 changes: 21 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,21 @@ 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();
error OnlyTokenController();

// Votes
error AssessmentIdsVotesLengthMismatch();
error AssessmentIdsIpfsLengthMismatch();
error AlreadyVoted();
error StakeRequired();
error VotingClosed();
error AcceptVoteRequired();
}
3 changes: 3 additions & 0 deletions contracts/interfaces/ICover.sol
Original file line number Diff line number Diff line change
Expand Up @@ -173,4 +173,7 @@ interface ICover {
error CoverNotYetExpired(uint coverId);
error InsufficientCoverAmountAllocated();
error UnexpectedPoolId();

// TODO: remove me after the rewards update
error OnlySwapOperator();
}
19 changes: 15 additions & 4 deletions contracts/interfaces/IStakingPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,20 @@ interface IStakingPool {
uint128 rewardsShares;
}

struct WithdrawTrancheContext {
uint _firstActiveTrancheId;
uint _accNxmPerRewardsShare;
uint managerLockedInGovernanceUntil;
bool withdrawStake;
bool withdrawRewards;
address destination;
}

function initialize(
bool isPrivatePool,
uint initialPoolFee,
uint maxPoolFee,
uint _poolId,
string memory ipfsDescriptionHash
uint _poolId
) external;

function processExpirations(bool updateUntilCurrentTimestamp) external;
Expand Down Expand Up @@ -149,6 +157,11 @@ interface IStakingPool {
uint reductionRatio
) external view returns (uint[] memory trancheCapacities);

function updateRewardsShares(
uint trancheId,
uint[] calldata tokenIds
) external;

/* ========== EVENTS ========== */

event StakeDeposited(address indexed user, uint256 amount, uint256 trancheId, uint256 tokenId);
Expand All @@ -159,8 +172,6 @@ interface IStakingPool {

event PoolFeeChanged(address indexed manager, uint newFee);

event PoolDescriptionSet(string ipfsDescriptionHash);

event Withdraw(address indexed user, uint indexed tokenId, uint tranche, uint amountStakeWithdrawn, uint amountRewardsWithdrawn);

event StakeBurned(uint amount);
Expand Down
10 changes: 10 additions & 0 deletions contracts/interfaces/IStakingProducts.sol
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ interface IStakingProducts {
uint bumpedPriceUpdateTime
);

function getPoolManager(uint poolId) external view returns (address);

/* ============= PRICING FUNCTIONS ============= */

function getPremium(
Expand Down Expand Up @@ -117,6 +119,12 @@ interface IStakingProducts {

function changeStakingPoolFactoryOperator(address newOperator) external;

function setPoolMetadata(uint poolId, string memory ipfsHash) external;

function getPoolMetadata(uint poolId) external view returns (string memory ipfsHash);

function setInitialMetadata(string[] calldata ipfsHashes) external;

/* ============= EVENTS ============= */

event ProductUpdated(uint productId, uint8 targetWeight, uint96 targetPrice);
Expand All @@ -143,4 +151,6 @@ interface IStakingProducts {
error InvalidProductType();
error TargetPriceBelowGlobalMinPriceRatio();

// IPFS
error IpfsHashRequired();
}
1 change: 1 addition & 0 deletions contracts/interfaces/IStakingViewer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface IStakingViewer {
uint maxPoolFee;
uint activeStake;
uint currentAPY;
string metadataIpfsHash;
}

struct StakingProduct {
Expand Down
28 changes: 27 additions & 1 deletion contracts/interfaces/ISwapOperator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
pragma solidity >=0.5.0;

import "../external/cow/GPv2Order.sol";
import "../interfaces/IPool.sol";
import "../external/enzyme/IEnzymeFundValueCalculatorRouter.sol";
import "./ICowSettlement.sol";
import "./INXMMaster.sol";
import "./IPool.sol";
import "./IWeth.sol";

interface ISwapOperator {

Expand All @@ -21,6 +25,28 @@ interface ISwapOperator {

function orderInProgress() external view returns (bool);

function currentOrderUID() external view returns (bytes memory);

/* ========== IMMUTABLES ========== */

function cowSettlement() external view returns (ICowSettlement);

function cowVaultRelayer() external view returns (address);

function master() external view returns (INXMMaster);

function swapController() external view returns (address);

function weth() external view returns (IWeth);

function domainSeparator() external view returns (bytes32);

function enzymeV4VaultProxyAddress() external view returns (address);

function enzymeFundValueCalculatorRouter() external view returns (IEnzymeFundValueCalculatorRouter);

function minPoolEth() external view returns (uint);

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

function placeOrder(GPv2Order.Data calldata order, bytes calldata orderUID) external;
Expand Down
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);
}
43 changes: 2 additions & 41 deletions contracts/mocks/SafeTracker/STMockSwapOperator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,8 @@

pragma solidity ^0.8.18;

import "../../interfaces/ISwapOperator.sol";
import "../generic/SwapOperatorGeneric.sol";

contract STMockSwapOperator is ISwapOperator {
contract STMockSwapOperator is SwapOperatorGeneric {

function requestAsset(address, uint) external virtual pure {
revert("Unsupported");
}

function transferRequestedAsset(address, uint) external virtual pure {
revert("Unsupported");
}

function getDigest(GPv2Order.Data calldata) external virtual view returns (bytes32) {
revert("Unsupported");
}

function getUID(GPv2Order.Data calldata) external virtual view returns (bytes memory) {
revert("Unsupported");
}

function orderInProgress() external virtual pure returns (bool) {
revert("Unsupported");
}

function placeOrder(GPv2Order.Data calldata, bytes calldata) external virtual {
revert("Unsupported");
}

function closeOrder(GPv2Order.Data calldata) external virtual {
revert("Unsupported");
}

function swapEnzymeVaultShareForETH(uint, uint) external virtual {
revert("Unsupported");
}

function swapETHForEnzymeVaultShare(uint, uint) external virtual {
revert("Unsupported");
}

function recoverAsset(address, address) external virtual {
revert("Unsupported");
}
}
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
Loading
Loading