@@ -13,6 +13,17 @@ import { FoundrySuperfluidTester } from "../FoundrySuperfluidTester.t.sol";
1313import { TestToken } from "../../../contracts/utils/TestToken.sol " ;
1414import { TokenDeployerLibrary } from "../../../contracts/utils/SuperfluidFrameworkDeploymentSteps.t.sol " ;
1515import { 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
1728contract 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