Skip to content

Commit 8450616

Browse files
test(strategy): from 50% to 80% coverage
1 parent 7b67779 commit 8450616

File tree

2 files changed

+144
-16
lines changed

2 files changed

+144
-16
lines changed

src/interfaces/IBasedAppManager.sol

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ interface IBasedAppManager {
4747

4848
function updateDelegatedBalance(address receiver, uint32 percentage) external;
4949

50-
function removeDelegatedBalance(address receiver) external;
50+
function removeDelegatedBalance(
51+
address receiver
52+
) external;
5153

5254
function registerService(
5355
address owner,
@@ -59,9 +61,13 @@ interface IBasedAppManager {
5961

6062
function addTokensToService(address serviceAddress, address[] calldata tokens) external;
6163

62-
function getServiceTokens(address serviceAddress) external view returns (address[] memory);
64+
function getServiceTokens(
65+
address serviceAddress
66+
) external view returns (address[] memory);
6367

64-
function createStrategy(uint32 fee) external returns (uint256 strategyId);
68+
function createStrategy(
69+
uint32 fee
70+
) external returns (uint256 strategyId);
6571

6672
function optInToService(
6773
uint256 strategyId,
@@ -78,7 +84,9 @@ interface IBasedAppManager {
7884

7985
function finalizeWithdrawal(uint256 strategyId, IERC20 token) external;
8086

81-
function depositETH(uint256 strategyId) external payable;
87+
function depositETH(
88+
uint256 strategyId
89+
) external payable;
8290

8391
function fastWithdrawETH(uint256 strategyId, uint256 amount) external;
8492

@@ -109,5 +117,7 @@ interface IBasedAppManager {
109117

110118
function proposeFeeUpdate(uint256 strategyId, uint32 proposedFee) external;
111119

112-
function finalizeFeeUpdate(uint256 strategyId) external;
113-
}
120+
function finalizeFeeUpdate(
121+
uint256 strategyId
122+
) external;
123+
}

test/BasedAppManager.t.sol

Lines changed: 128 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
2525
address SERVICE1 = makeAddr("Service1");
2626
address SERVICE2 = makeAddr("Service2");
2727

28+
uint256 STRATEGY1 = 1;
29+
uint32 STRATEGY1_INITIAL_FEE = 5;
30+
uint32 STRATEGY1_UPDATE_FEE = 10;
31+
address ERC20_ADDRESS1 = address(erc20mock);
32+
address ERC20_ADDRESS2 = address(erc20mock2);
33+
2834
address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
2935

3036
uint256 constant INITIAL_USER1_BALANCE_ERC20 = 1000 * 10 ** 18;
@@ -268,7 +274,7 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
268274
vm.stopPrank();
269275
}
270276

271-
function testRemoveDelgateBalanceAndComputeTotal() public {
277+
function testRemoveDelegatedBalanceAndComputeTotal() public {
272278
testUpdateTotalDelegatedPercentage(100, 200);
273279
vm.startPrank(USER1);
274280
proxiedManager.removeDelegatedBalance(RECEIVER);
@@ -305,15 +311,15 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
305311

306312
function testCreateStrategy() public {
307313
vm.startPrank(USER1);
308-
uint256 strategyId1 = proxiedManager.createStrategy(5);
314+
uint256 strategyId1 = proxiedManager.createStrategy(STRATEGY1_INITIAL_FEE);
309315
proxiedManager.createStrategy(100);
310316
proxiedManager.createStrategy(1000);
311317
uint256 strategyId4 = proxiedManager.createStrategy(10_000);
312318
assertEq(strategyId1, 1, "Strategy id 1 was saved correctly");
313319
assertEq(strategyId4, 4, "Strategy id 4 was saved correctly");
314320
(address owner, uint32 delegationFeeOnRewards,,) = proxiedManager.strategies(strategyId1);
315321
assertEq(owner, USER1, "Strategy owner");
316-
assertEq(delegationFeeOnRewards, 5, "Strategy fee");
322+
assertEq(delegationFeeOnRewards, STRATEGY1_INITIAL_FEE, "Strategy fee");
317323
vm.stopPrank();
318324
}
319325

@@ -333,7 +339,7 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
333339

334340
function testCreateStrategyAndSingleDeposit() public {
335341
vm.startPrank(USER1);
336-
uint256 strategyId = proxiedManager.createStrategy(1);
342+
uint256 strategyId = proxiedManager.createStrategy(STRATEGY1_INITIAL_FEE);
337343
erc20mock.approve(address(proxiedManager), 200_000);
338344
proxiedManager.depositERC20(strategyId, erc20mock, 100_000);
339345

@@ -347,7 +353,7 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
347353

348354
function testCreateStrategyAndMultipleDeposits() public {
349355
vm.startPrank(USER1);
350-
uint256 strategyId = proxiedManager.createStrategy(1);
356+
uint256 strategyId = proxiedManager.createStrategy(STRATEGY1_INITIAL_FEE);
351357
uint256 strategyId2 = proxiedManager.createStrategy(100);
352358
erc20mock.approve(address(proxiedManager), 200_000);
353359
proxiedManager.depositERC20(strategyId, erc20mock, 100_000);
@@ -373,7 +379,7 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
373379

374380
function testCreateStrategyAndSingleDepositAndSingleWithdrawal() public {
375381
vm.startPrank(USER1);
376-
uint256 strategyId = proxiedManager.createStrategy(1);
382+
uint256 strategyId = proxiedManager.createStrategy(STRATEGY1_INITIAL_FEE);
377383
erc20mock.approve(address(proxiedManager), 200_000);
378384
proxiedManager.depositERC20(strategyId, erc20mock, 100_000);
379385

@@ -394,7 +400,7 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
394400

395401
function testCreateStrategyAndSingleDepositAndMultipleFastWithdrawals() public {
396402
vm.startPrank(USER1);
397-
uint256 strategyId = proxiedManager.createStrategy(1);
403+
uint256 strategyId = proxiedManager.createStrategy(STRATEGY1_INITIAL_FEE);
398404
erc20mock.approve(address(proxiedManager), 200_000);
399405
proxiedManager.depositERC20(strategyId, erc20mock, 100_000);
400406
assertEq(
@@ -422,12 +428,12 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
422428
address[] memory tokensInput = new address[](1);
423429
tokensInput[0] = address(erc20mock);
424430
uint32[] memory obligationPercentagesInput = new uint32[](1);
425-
obligationPercentagesInput[0] = 10_000; // 100%
431+
obligationPercentagesInput[0] = 9000; // 90%
426432
proxiedManager.optInToService(1, SERVICE1, tokensInput, obligationPercentagesInput);
427433
uint256 strategyId = proxiedManager.accountServiceStrategy(USER1, SERVICE1);
428434
assertEq(strategyId, 1, "Strategy id");
429435
uint256 obligationPercentage = proxiedManager.obligations(strategyId, SERVICE1, address(erc20mock));
430-
assertEq(obligationPercentage, 10_000, "Obligation percentage");
436+
assertEq(obligationPercentage, 9000, "Obligation percentage");
431437
uint256 usedTokens = proxiedManager.usedTokens(strategyId, address(erc20mock));
432438
assertEq(usedTokens, 1, "Used tokens");
433439
uint32 numberOfObligations = proxiedManager.obligationsCounter(strategyId, SERVICE1);
@@ -623,7 +629,119 @@ contract BasedAppManagerTest is Test, OwnableUpgradeable {
623629
vm.stopPrank();
624630
}
625631

626-
function testUpdateStrategy() public {}
632+
function testFastUpdateObligation() public {
633+
testStrategyOptInToService();
634+
vm.startPrank(USER1);
635+
uint32 strategyId = 1;
636+
proxiedManager.fastUpdateObligation(strategyId, SERVICE1, address(erc20mock), 10_000);
637+
uint256 obligationPercentage = proxiedManager.obligations(strategyId, SERVICE1, address(erc20mock));
638+
assertEq(obligationPercentage, 10_000, "Obligation percentage");
639+
uint256 usedTokens = proxiedManager.usedTokens(strategyId, address(erc20mock));
640+
assertEq(usedTokens, 1, "Used tokens");
641+
uint32 numberOfObligations = proxiedManager.obligationsCounter(strategyId, SERVICE1);
642+
assertEq(numberOfObligations, 1, "Number of obligations");
643+
vm.stopPrank();
644+
}
645+
646+
function testStrategyFeeUpdateOnInitialLimit() public {
647+
testStrategyOptInToService();
648+
vm.startPrank(USER1);
649+
proxiedManager.proposeFeeUpdate(STRATEGY1, 20);
650+
(address owner, uint32 fee, uint32 feeProposed, uint256 feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
651+
assertEq(owner, USER1, "Strategy owner");
652+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
653+
assertEq(feeProposed, 20, "Strategy fee proposed");
654+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
655+
vm.warp(block.timestamp + 7 days);
656+
proxiedManager.finalizeFeeUpdate(STRATEGY1);
657+
(owner, fee, feeProposed, feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
658+
assertEq(owner, USER1, "Strategy owner");
659+
assertEq(fee, 20, "Strategy fee");
660+
assertEq(feeProposed, 0, "Strategy fee proposed");
661+
assertEq(feeUpdateTime, 0, "Strategy fee update time");
662+
vm.stopPrank();
663+
}
664+
665+
function testStrategyFeeUpdateOnFinalTimeLimit() public {
666+
testStrategyOptInToService();
667+
vm.startPrank(USER1);
668+
proxiedManager.proposeFeeUpdate(STRATEGY1, 20);
669+
(address owner, uint32 fee, uint32 feeProposed, uint256 feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
670+
assertEq(owner, USER1, "Strategy owner");
671+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
672+
assertEq(feeProposed, 20, "Strategy fee proposed");
673+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
674+
vm.warp(block.timestamp + 7 days + 1 days);
675+
proxiedManager.finalizeFeeUpdate(STRATEGY1);
676+
(owner, fee, feeProposed, feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
677+
assertEq(owner, USER1, "Strategy owner");
678+
assertEq(fee, 20, "Strategy fee");
679+
assertEq(feeProposed, 0, "Strategy fee proposed");
680+
assertEq(feeUpdateTime, 0, "Strategy fee update time");
681+
vm.stopPrank();
682+
}
683+
684+
function testStrategyFeeUpdateTooLate() public {
685+
testStrategyOptInToService();
686+
vm.startPrank(USER1);
687+
proxiedManager.proposeFeeUpdate(STRATEGY1, 20);
688+
(address owner, uint32 fee, uint32 feeProposed, uint256 feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
689+
assertEq(owner, USER1, "Strategy owner");
690+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
691+
assertEq(feeProposed, 20, "Strategy fee proposed");
692+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
693+
vm.warp(block.timestamp + 7 days + 1 days + 1 seconds);
694+
vm.expectRevert("Fee update expired");
695+
proxiedManager.finalizeFeeUpdate(STRATEGY1);
696+
(owner, fee, feeProposed, feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
697+
assertEq(owner, USER1, "Strategy owner");
698+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
699+
assertEq(feeProposed, 20, "Strategy fee proposed");
700+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
701+
vm.stopPrank();
702+
}
703+
704+
function testStrategyFeeUpdateTooEarly() public {
705+
testStrategyOptInToService();
706+
vm.startPrank(USER1);
707+
proxiedManager.proposeFeeUpdate(STRATEGY1, 20);
708+
(address owner, uint32 fee, uint32 feeProposed, uint256 feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
709+
assertEq(owner, USER1, "Strategy owner");
710+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
711+
assertEq(feeProposed, 20, "Strategy fee proposed");
712+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
713+
vm.warp(block.timestamp + 7 days - 1 seconds);
714+
vm.expectRevert("Timelock not passed");
715+
proxiedManager.finalizeFeeUpdate(STRATEGY1);
716+
(owner, fee, feeProposed, feeUpdateTime) = proxiedManager.strategies(STRATEGY1);
717+
assertEq(owner, USER1, "Strategy owner");
718+
assertEq(fee, STRATEGY1_INITIAL_FEE, "Strategy fee");
719+
assertEq(feeProposed, 20, "Strategy fee proposed");
720+
assertEq(feeUpdateTime, 604_801, "Strategy fee update time");
721+
vm.stopPrank();
722+
}
723+
724+
function testUpdateStrategyObligationFinalize() public {
725+
testStrategyOptInToService();
726+
vm.startPrank(USER1);
727+
proxiedManager.proposeUpdateObligation(STRATEGY1, SERVICE1, address(erc20mock), 1000);
728+
(uint32 percentage, uint256 requestTime) =
729+
proxiedManager.obligationRequests(STRATEGY1, SERVICE1, address(erc20mock));
730+
uint32 oldPercentage = proxiedManager.obligations(STRATEGY1, SERVICE1, address(erc20mock));
731+
assertEq(oldPercentage, 9000, "Obligation percentage proposed");
732+
assertEq(percentage, 1000, "Obligation percentage proposed");
733+
assertEq(requestTime, 1, "Obligation update time");
734+
vm.warp(block.timestamp + 7 days);
735+
proxiedManager.finalizeUpdateObligation(STRATEGY1, SERVICE1, address(erc20mock));
736+
(percentage, requestTime) = proxiedManager.obligationRequests(STRATEGY1, SERVICE1, address(erc20mock));
737+
assertEq(percentage, 1000, "Obligation percentage proposed");
738+
assertEq(requestTime, 1, "Obligation update time");
739+
uint32 newPercentage = proxiedManager.obligations(STRATEGY1, SERVICE1, address(erc20mock));
740+
assertEq(newPercentage, 1000, "Obligation new percentage");
741+
vm.stopPrank();
742+
}
743+
744+
// todo check update removal obligation
627745

628746
// ********************
629747
// ** Section: bApps **

0 commit comments

Comments
 (0)