Skip to content

Commit 45f0d77

Browse files
committed
added tests
1 parent 39651f9 commit 45f0d77

File tree

3 files changed

+62
-10
lines changed

3 files changed

+62
-10
lines changed

packages/ethereum-contracts/contracts/agreements/ConstantFlowAgreementV1.sol

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,7 @@ contract ConstantFlowAgreementV1 is
453453
ctx, currentContext);
454454
}
455455

456-
if (
457-
oldFlowData.flowRate == 0 && flowParams.flowRate != 0 ||
458-
oldFlowData.flowRate != 0 && flowParams.flowRate == 0
459-
) {
460-
flowVars.token.emitZeroTransfer(flowVars.sender, flowVars.receiver);
461-
}
456+
flowVars.token.emitZeroTransfer(flowVars.sender, flowVars.receiver);
462457

463458
_requireAvailableBalance(flowVars.token, flowVars.sender, currentContext);
464459
}
@@ -599,6 +594,8 @@ contract ConstantFlowAgreementV1 is
599594
newCtx, currentContext);
600595
}
601596
}
597+
598+
flowVars.token.emitZeroTransfer(flowVars.sender, flowVars.receiver);
602599
}
603600

604601
/**************************************************************************

packages/ethereum-contracts/contracts/agreements/gdav1/SuperfluidPool.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ contract SuperfluidPool is ISuperfluidPool, BeaconProxiable {
455455
}
456456

457457
if (oldUnits == 0 && newUnits != 0 || oldUnits != 0 && newUnits == 0) {
458-
GDA.tokenEmitZeroTransfer(superToken, memberAddr, address(0));
458+
GDA.tokenEmitZeroTransfer(superToken, address(this), memberAddr);
459459
}
460460

461461
emit MemberUnitsUpdated(superToken, memberAddr, oldUnits, newUnits);

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

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
// SPDX-License-Identifier: AGPLv3
22
pragma solidity ^0.8.23;
33

4-
import { Test } from "forge-std/Test.sol";
4+
import { Test, console } from "forge-std/Test.sol";
55
import { UUPSProxy } from "../../../contracts/upgradability/UUPSProxy.sol";
66
import { UUPSProxiable } from "../../../contracts/upgradability/UUPSProxiable.sol";
7-
import { IERC20, ISuperToken, SuperToken }
7+
import { IERC20, ISuperToken, ISuperfluidPool, PoolConfig }
8+
from "../../../contracts/interfaces/superfluid/ISuperfluid.sol";
9+
import { SuperToken }
810
from "../../../contracts/superfluid/SuperToken.sol";
911
import { PoolAdminNFT, IPoolAdminNFT } from "../../../contracts/agreements/gdav1/PoolAdminNFT.sol";
1012
import { FoundrySuperfluidTester } from "../FoundrySuperfluidTester.t.sol";
1113
import { TestToken } from "../../../contracts/utils/TestToken.sol";
1214
import { TokenDeployerLibrary } from "../../../contracts/utils/SuperfluidFrameworkDeploymentSteps.t.sol";
15+
import { SuperTokenV1Library } from "../../../contracts/apps/SuperTokenV1Library.sol";
1316

1417
contract SuperTokenIntegrationTest is FoundrySuperfluidTester {
15-
constructor() FoundrySuperfluidTester(0) { }
18+
using SuperTokenV1Library for ISuperToken;
19+
20+
constructor() FoundrySuperfluidTester(1) { }
1621

1722
function setUp() public override {
1823
super.setUp();
@@ -254,4 +259,54 @@ contract SuperTokenIntegrationTest is FoundrySuperfluidTester {
254259
assertEq(localSuperToken.nonces(permitSigner), 1, "Nonce should be incremented");
255260
assertEq(localSuperToken.allowance(permitSigner, spender), amount, "Allowance should be set");
256261
}
262+
263+
// Verify zero Transfer events being emitted by CFA and GDA actions
264+
function testEmitZeroTransferEvent() public {
265+
vm.startPrank(admin);
266+
267+
// case 1: create flow
268+
vm.expectEmit(address(superToken));
269+
emit IERC20.Transfer(admin, alice, 0);
270+
superToken.createFlow(alice, 1);
271+
272+
// case 2: delete flow
273+
vm.expectEmit(address(superToken));
274+
emit IERC20.Transfer(admin, alice, 0);
275+
superToken.deleteFlow(admin, alice);
276+
277+
// create a pool for the next tests
278+
ISuperfluidPool pool = superToken.createPool(
279+
admin,
280+
PoolConfig({
281+
transferabilityForUnitsOwner: true,
282+
distributionFromAnyAddress: true
283+
})
284+
);
285+
286+
// case 3: assign pool units
287+
vm.expectEmit(address(superToken));
288+
emit IERC20.Transfer(address(pool), alice, 0);
289+
pool.updateMemberUnits(alice, 1);
290+
291+
vm.stopPrank();
292+
293+
// case 4: test pool token transfer
294+
vm.startPrank(alice);
295+
// This emits 2 Transfer events, because the sender's units toggle to 0 and the receiver units from 0
296+
vm.expectEmit(address(superToken));
297+
emit IERC20.Transfer(address(pool), alice, 0);
298+
vm.expectEmit(address(superToken));
299+
emit IERC20.Transfer(address(pool), bob, 0);
300+
IERC20(pool).transfer(bob, 1);
301+
302+
vm.stopPrank();
303+
304+
// case 5: remove pool units
305+
vm.startPrank(admin);
306+
vm.expectEmit(address(superToken));
307+
emit IERC20.Transfer(address(pool), bob, 0);
308+
pool.updateMemberUnits(bob, 0);
309+
310+
vm.stopPrank();
311+
}
257312
}

0 commit comments

Comments
 (0)