Skip to content

Commit 1e49964

Browse files
committed
solve open TODOs
1 parent 886554a commit 1e49964

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,24 @@ interface ISuperToken is ISuperfluidToken, IERC20Metadata, IERC777, IERC20Permit
8282
*/
8383
function getYieldBackend() external view returns (address yieldBackend);
8484

85+
/**
86+
* @dev Yield backend enabled event
87+
* @param yieldBackend The address of the yield backend that was enabled
88+
* @param depositAmount The amount deposited to the yield backend
89+
*/
90+
event YieldBackendEnabled(
91+
address indexed yieldBackend,
92+
uint256 depositAmount
93+
);
94+
95+
/**
96+
* @dev Yield backend disabled event
97+
* @param yieldBackend The address of the yield backend that was disabled
98+
*/
99+
event YieldBackendDisabled(
100+
address indexed yieldBackend
101+
);
102+
85103
/**************************************************************************
86104
* Immutable variables
87105
*************************************************************************/

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ contract SuperToken is
8484
/// @dev ERC20 Nonces for EIP-2612 (permit)
8585
mapping(address account => uint256) internal _nonces;
8686

87-
// TODO: use a randomly located storage slot instead?
87+
/// @dev optional contract using the underlying asset to generate yield
8888
IYieldBackend internal _yieldBackend;
8989

9090
// NOTE: for future compatibility, these are reserved solidity slots
@@ -212,16 +212,17 @@ contract SuperToken is
212212
? address(this).balance
213213
: _underlyingToken.balanceOf(address(this));
214214
delegateCallChecked(address(_yieldBackend), abi.encodeCall(IYieldBackend.deposit, (depositAmount)));
215-
// TODO: emit event
215+
emit YieldBackendEnabled(address(_yieldBackend), depositAmount);
216216
}
217217

218218
// withdraws everything and removes allowances
219219
function disableYieldBackend() external onlyAdmin {
220220
require(address(_yieldBackend) != address(0), "yield backend not set");
221+
address oldYieldBackend = address(_yieldBackend);
221222
delegateCallChecked(address(_yieldBackend), abi.encodeCall(IYieldBackend.withdrawMax, ()));
222223
delegateCallChecked(address(_yieldBackend), abi.encodeCall(IYieldBackend.disable, ()));
223224
_yieldBackend = IYieldBackend(address(0));
224-
// TODO: emit event
225+
emit YieldBackendDisabled(oldYieldBackend);
225226
}
226227

227228
function getYieldBackend() external view returns (address) {
@@ -396,7 +397,6 @@ contract SuperToken is
396397

397398
if (spender != holder) {
398399
require(amount <= _allowances[holder][spender], "SuperToken: transfer amount exceeds allowance");
399-
// TODO: this triggers an `Approval` event, which shouldn't happen for transfers.
400400
_approve(holder, spender, _allowances[holder][spender] - amount, false);
401401
}
402402

@@ -767,7 +767,6 @@ contract SuperToken is
767767
{
768768
if (!_skipSelfMint) {
769769
if (address(_yieldBackend) != address(0)) {
770-
// TODO: shall we deposit all, or just the upgradeAmount?
771770
delegateCallChecked(address(_yieldBackend), abi.encodeCall(IYieldBackend.deposit, (amount)));
772771
}
773772

@@ -788,7 +787,6 @@ contract SuperToken is
788787

789788
if (address(_yieldBackend) != address(0)) {
790789
_skipSelfMint = true;
791-
// TODO: we may want to skip if enough underlying already in the contract
792790
delegateCallChecked(address(_yieldBackend), abi.encodeCall(IYieldBackend.withdraw, (amount)));
793791
_skipSelfMint = false;
794792
}

packages/ethereum-contracts/test/foundry/superfluid/yieldbackend/AaveYieldBackendIntegration.t.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pragma solidity ^0.8.23;
44
import { Test } from "forge-std/Test.sol";
55
import { AaveYieldBackend } from "../../../../contracts/superfluid/AaveYieldBackend.sol";
66
import { IERC20, ISuperfluid } from "../../../../contracts/interfaces/superfluid/ISuperfluid.sol";
7+
import { ISuperToken } from "../../../../contracts/interfaces/superfluid/ISuperToken.sol";
78
import { SuperToken } from "../../../../contracts/superfluid/SuperToken.sol";
89
import { IPool } from "aave-v3/src/contracts/interfaces/IPool.sol";
910

@@ -88,7 +89,11 @@ contract AaveYieldBackendIntegrationTest is Test {
8889
}
8990

9091
function _enableYieldBackend() public {
92+
uint256 underlyingBalanceBefore = IERC20(USDC).balanceOf(address(superToken));
93+
9194
vm.startPrank(ADMIN);
95+
vm.expectEmit(true, false, false, true);
96+
emit ISuperToken.YieldBackendEnabled(address(aaveBackend), underlyingBalanceBefore);
9297
superToken.enableYieldBackend(aaveBackend);
9398
vm.stopPrank();
9499
}
@@ -177,6 +182,8 @@ contract AaveYieldBackendIntegrationTest is Test {
177182
_enableYieldBackend();
178183

179184
vm.startPrank(ADMIN);
185+
vm.expectEmit(true, false, false, true);
186+
emit ISuperToken.YieldBackendDisabled(address(aaveBackend));
180187
superToken.disableYieldBackend();
181188
vm.stopPrank();
182189
assertEq(address(superToken.getYieldBackend()), address(0), "Yield backend mismatch");

0 commit comments

Comments
 (0)