Skip to content

Commit fc9735d

Browse files
committed
emit Transfer event on flow create/delete and units changing from/to 0
1 parent a5bf3a6 commit fc9735d

File tree

5 files changed

+31
-0
lines changed

5 files changed

+31
-0
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,13 @@ 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+
}
462+
456463
_requireAvailableBalance(flowVars.token, flowVars.sender, currentContext);
457464
}
458465

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,14 @@ contract GeneralDistributionAgreementV1 is AgreementBase, TokenMonad, IGeneralDi
801801
return true;
802802
}
803803

804+
function tokenEmitZeroTransfer(ISuperfluidToken superToken, address from, address to) external {
805+
if (superToken.isPool(this, msg.sender) == false) {
806+
revert GDA_ONLY_SUPER_TOKEN_POOL();
807+
}
808+
809+
superToken.emitZeroTransfer(from, to);
810+
}
811+
804812
//////////////////////////////////////////////////////////////////////////////////////////////////////
805813
// TokenMonad interface
806814
//////////////////////////////////////////////////////////////////////////////////////////////////////

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,11 @@ contract SuperfluidPool is ISuperfluidPool, BeaconProxiable {
453453
_membersData[memberAddr] = _pdPoolMemberToMemberData(pdPoolMember, claimedValue);
454454
assert(GDA.appendIndexUpdateByPool(superToken, p, t));
455455
}
456+
457+
if (oldUnits == 0 && newUnits != 0 || oldUnits != 0 && newUnits == 0) {
458+
GDA.tokenEmitZeroTransfer(superToken, memberAddr, address(0));
459+
}
460+
456461
emit MemberUnitsUpdated(superToken, memberAddr, oldUnits, newUnits);
457462
}
458463

packages/ethereum-contracts/contracts/interfaces/superfluid/ISuperfluidToken.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,4 +431,11 @@ interface ISuperfluidToken {
431431
uint256 rewardAmount,
432432
uint256 bailoutAmount
433433
);
434+
435+
/**
436+
* @dev Emit an ERC20.Transfer event with zero amount, helps indexers track token holders.
437+
* @param from The address from which the transfer is happening
438+
* @param to The address to which the transfer is happening
439+
*/
440+
function emitZeroTransfer(address from, address to) external;
434441
}

packages/ethereum-contracts/contracts/superfluid/SuperfluidToken.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ abstract contract SuperfluidToken is ISuperfluidToken
376376
);
377377
}
378378

379+
function emitZeroTransfer(address from, address to) external onlyAgreement {
380+
emit IERC20.Transfer(from, to, 0);
381+
}
382+
379383
/**************************************************************************
380384
* Modifiers
381385
*************************************************************************/

0 commit comments

Comments
 (0)