Skip to content

Commit

Permalink
chore: LiquidStone enables investor role checking by default
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasia committed Jan 27, 2025
1 parent fdaf685 commit 00e4706
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 7 deletions.
3 changes: 2 additions & 1 deletion packages/contracts/script/DeployLiquidMultiTokenVault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ contract DeployLiquidMultiTokenVault is TomlConfig {
redeemOptimizer: redeemOptimizer,
vaultStartTimestamp: startTimestamp,
redeemNoticePeriod: 1,
contextParams: contextParams
contextParams: contextParams,
shouldCheckInvestorRole: true
});

return vaultParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,15 @@ contract LiquidContinuousMultiTokenVault is
uint256 vaultStartTimestamp;
uint256 redeemNoticePeriod;
TripleRateContext.ContextParams contextParams;
bool shouldCheckInvestorRole;
}

IYieldStrategy public _yieldStrategy;
IRedeemOptimizer public _redeemOptimizer;
uint256 public _vaultStartTimestamp;

// [Jan-2025] added - must be after previous fields due to upgrading
bool public _shouldCheckInvestorRole = false;
bool public _shouldCheckInvestorRole = true;

uint256 private constant ZERO_REQUEST_ID = 0;

Expand Down Expand Up @@ -106,6 +107,7 @@ contract LiquidContinuousMultiTokenVault is
_yieldStrategy = vaultParams.yieldStrategy;
_redeemOptimizer = vaultParams.redeemOptimizer;
_vaultStartTimestamp = vaultParams.vaultStartTimestamp;
_shouldCheckInvestorRole = vaultParams.shouldCheckInvestorRole;

if (vaultParams.contextParams.frequency != 360 && vaultParams.contextParams.frequency != 365) {
revert LiquidContinuousMultiTokenVault__InvalidFrequency(vaultParams.contextParams.frequency);
Expand Down
1 change: 1 addition & 0 deletions packages/contracts/test/src/LiquidStoneNinetyDayTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ contract DeployLiquidStoneNinetyDay is DeployLiquidMultiTokenVault {
vaultParams.redeemNoticePeriod = 0;
vaultParams.contextParams.fullRateScaled = 10 * scale;
vaultParams.contextParams.initialReducedRate.interestRate = 0; // zero for less than tenor
vaultParams.shouldCheckInvestorRole = false;

return vaultParams;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ contract LiquidContinuousMultiTokenVaultTest is LiquidContinuousMultiTokenVaultT
address nonInvestorWallet = makeAddr("nonInvestorWallet");
address anyWallet = address(0); // any wallet is fine - not involved in validation

// enable investor checking
// ensure the investor check is enabled
vm.prank(_vaultAuth.operator);
_liquidVault.setShouldCheckInvestorRole(true);

Expand All @@ -310,8 +310,7 @@ contract LiquidContinuousMultiTokenVaultTest is LiquidContinuousMultiTokenVaultT
nonInvestorWallet
);

// ======================= deposits =======================
// function deposit(uint256 assets, address receiver) external returns (uint256 shares);
// ======================= deposits fail =======================
vm.prank(investorWallet);
vm.expectRevert(investorOnlyError);
liquidVault.deposit(anyParam.principal, nonInvestorWallet); // IMultiToken
Expand All @@ -324,7 +323,7 @@ contract LiquidContinuousMultiTokenVaultTest is LiquidContinuousMultiTokenVaultT
vm.expectRevert(investorOnlyError);
liquidVault.deposit(anyParam.principal, nonInvestorWallet, anyWallet); // IComponent

// ======================= redeems =======================
// ======================= redeems fail =======================
vm.prank(investorWallet);
vm.expectRevert(investorOnlyError);
liquidVault.redeemForDepositPeriod(anyParam.principal, anyWallet, nonInvestorWallet, anyParam.depositPeriod);
Expand All @@ -342,6 +341,16 @@ contract LiquidContinuousMultiTokenVaultTest is LiquidContinuousMultiTokenVaultT
vm.prank(investorWallet);
vm.expectRevert(investorOnlyError);
liquidVault.redeem(anyParam.principal, anyWallet, nonInvestorWallet); // IComponent

// ======================= grant access - succeeds =======================
// grant investor role
vm.startPrank(_vaultAuth.owner);
_liquidVault.grantRole(_liquidVault.INVESTOR_ROLE(), nonInvestorWallet);
vm.stopPrank();

// deposit should succeed (no revert)
vm.prank(investorWallet);
liquidVault.deposit(0, nonInvestorWallet); // IMultiToken
}

// Scenario: Calculating returns for a standard investment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ contract LiquidContinuousMultiTokenVaultUtilTest is LiquidContinuousMultiTokenVa
TestParamSet.TestParam memory testParams =
TestParamSet.TestParam({ principal: 2_000 * scale, depositPeriod: 11, redeemPeriod: 71 });

// whitelist alice as an investor
vm.startPrank(_vaultAuth.owner);
vaultProxy.grantRole(vaultProxy.INVESTOR_ROLE(), alice);
vm.stopPrank();

_warpToPeriod(vaultProxy, testParams.depositPeriod);

vm.startPrank(alice);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,11 @@ contract DeployAndLoadLiquidMultiTokenVault is DeployLiquidMultiTokenVault {
IERC20 asset = IERC20(vault.asset());
uint256 scale = 10 ** IERC20Metadata(vault.asset()).decimals();

// --------------------- gift user funds ---------------------
// --------------------- gift user funds & whitelist ---------------------

vm.startBroadcast(_owner.key());
asset.transfer(userWallet.addr(), 1_000_000 * scale);
vault.grantRole(vault.INVESTOR_ROLE(), userWallet.addr());
vm.stopBroadcast();

// --------------------- load deposits ---------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ abstract contract LiquidContinuousMultiTokenVaultTestBase is IMultiTokenVaultTes
DeployLiquidMultiTokenVault _deployVault = new DeployLiquidMultiTokenVault();
_liquidVault = _deployVault.run(_vaultAuth);

// disable the investor whitelist check - test users are already complex
// tested instead specifically in test__LiquidContinuousMultiTokenVault__AccountNotInvestorReverts
vm.prank(_vaultAuth.operator);
_liquidVault.setShouldCheckInvestorRole(false);

// warp to a "real time" time rather than block.timestamp=1
vm.warp(_liquidVault._vaultStartTimestamp() + 1);

Expand Down

0 comments on commit 00e4706

Please sign in to comment.