Skip to content

Commit 4d24a83

Browse files
committed
added access control tests for new SuperToken methods
1 parent 8f8ff4e commit 4d24a83

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

packages/ethereum-contracts/test/foundry/superfluid/SuperToken.t.sol

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ import { FoundrySuperfluidTester } from "../FoundrySuperfluidTester.t.sol";
1313
import { TestToken } from "../../../contracts/utils/TestToken.sol";
1414
import { TokenDeployerLibrary } from "../../../contracts/utils/SuperfluidFrameworkDeploymentSteps.t.sol";
1515
import { SuperTokenV1Library } from "../../../contracts/apps/SuperTokenV1Library.sol";
16+
import { IYieldBackend } from "../../../contracts/interfaces/superfluid/IYieldBackend.sol";
17+
18+
// Simple mock yield backend for testing access control
19+
contract MockYieldBackend is IYieldBackend {
20+
function enable() external {}
21+
function disable() external {}
22+
function deposit(uint256) external {}
23+
function withdraw(uint256) external {}
24+
function withdrawMax() external {}
25+
function withdrawSurplus(uint256) external {}
26+
}
1627

1728
contract SuperTokenIntegrationTest is FoundrySuperfluidTester {
1829
using SuperTokenV1Library for ISuperToken;
@@ -259,4 +270,62 @@ contract SuperTokenIntegrationTest is FoundrySuperfluidTester {
259270
assertEq(localSuperToken.nonces(permitSigner), 1, "Nonce should be incremented");
260271
assertEq(localSuperToken.allowance(permitSigner, spender), amount, "Allowance should be set");
261272
}
273+
274+
// ============ Helper for yield backend tests ============
275+
276+
/// @notice Helper to deploy a SuperToken with yield backend functionality enabled
277+
function _deploySuperTokenWithYieldBackendSupport(address admin) internal returns (SuperToken) {
278+
(TestToken localTestToken, ISuperToken localSuperToken) =
279+
sfDeployer.deployWrapperSuperToken("FTT", "FTT", 18, type(uint256).max, admin);
280+
281+
SuperToken newSuperTokenLogic =
282+
_helperDeploySuperTokenAndInitialize(localSuperToken, localTestToken, 18, "FTT", "FTT", admin);
283+
284+
address adminToUse = admin == address(0) ? address(sf.host) : admin;
285+
vm.startPrank(adminToUse);
286+
UUPSProxiable(address(localSuperToken)).updateCode(address(newSuperTokenLogic));
287+
vm.stopPrank();
288+
289+
return SuperToken(address(localSuperToken));
290+
}
291+
292+
// ============ Yield backend access control tests ============
293+
294+
function testOnlyAdminCanEnableYieldBackend() public {
295+
SuperToken localSuperToken = _deploySuperTokenWithYieldBackendSupport(admin);
296+
MockYieldBackend mockBackend = new MockYieldBackend();
297+
298+
vm.startPrank(alice);
299+
vm.expectRevert(ISuperToken.SUPER_TOKEN_ONLY_ADMIN.selector);
300+
localSuperToken.enableYieldBackend(IYieldBackend(address(mockBackend)));
301+
vm.stopPrank();
302+
}
303+
304+
function testOnlyAdminCanDisableYieldBackend() public {
305+
SuperToken localSuperToken = _deploySuperTokenWithYieldBackendSupport(admin);
306+
MockYieldBackend mockBackend = new MockYieldBackend();
307+
308+
vm.startPrank(admin);
309+
localSuperToken.enableYieldBackend(IYieldBackend(address(mockBackend)));
310+
vm.stopPrank();
311+
312+
vm.startPrank(alice);
313+
vm.expectRevert(ISuperToken.SUPER_TOKEN_ONLY_ADMIN.selector);
314+
localSuperToken.disableYieldBackend();
315+
vm.stopPrank();
316+
}
317+
318+
function testOnlyAdminCanWithdrawSurplusFromYieldBackend() public {
319+
SuperToken localSuperToken = _deploySuperTokenWithYieldBackendSupport(admin);
320+
MockYieldBackend mockBackend = new MockYieldBackend();
321+
322+
vm.startPrank(admin);
323+
localSuperToken.enableYieldBackend(IYieldBackend(address(mockBackend)));
324+
vm.stopPrank();
325+
326+
vm.startPrank(alice);
327+
vm.expectRevert(ISuperToken.SUPER_TOKEN_ONLY_ADMIN.selector);
328+
localSuperToken.withdrawSurplusFromYieldBackend();
329+
vm.stopPrank();
330+
}
262331
}

0 commit comments

Comments
 (0)