Skip to content

Commit 8ab52e1

Browse files
committed
renamed SparkYieldBackend to ERC4626YieldBackend
1 parent 5a615d8 commit 8ab52e1

File tree

3 files changed

+23
-85
lines changed

3 files changed

+23
-85
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { IPool } from "aave-v3/src/contracts/interfaces/IPool.sol";
77
import { IWETH } from "aave-v3/src/contracts/helpers/interfaces/IWETH.sol";
88

99
/**
10+
* @title a SuperToken yield backend for the Aave protocol.
1011
* Aave supports a simple deposit/withdraw workflow nicely matching the IYieldBackend interface.
1112
* Deposits are represented by transferrable aTokens.
1213
*

packages/ethereum-contracts/contracts/superfluid/SparkYieldBackend.sol renamed to packages/ethereum-contracts/contracts/superfluid/ERC4626YieldBackend.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { IYieldBackend } from "../interfaces/superfluid/IYieldBackend.sol";
55
import { IERC20, ISuperToken } from "../interfaces/superfluid/ISuperfluid.sol";
66
import { IERC4626 } from "@openzeppelin-v5/contracts/interfaces/IERC4626.sol";
77

8-
// Note: Spark Vaults on Base/Mainnet are ERC4626 compliant.
98

10-
contract SparkYieldBackend is IYieldBackend {
9+
/// @title A SuperToken yield backend for ERC4626 compliant vaults.
10+
contract ERC4626YieldBackend is IYieldBackend {
1111
IERC20 public immutable ASSET_TOKEN;
1212
IERC4626 public immutable VAULT;
1313
address public immutable SURPLUS_RECEIVER;

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

Lines changed: 20 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,8 @@ pragma solidity ^0.8.23;
33

44
import { Test } from "forge-std/Test.sol";
55
import { console } from "forge-std/console.sol";
6-
import {
7-
SparkYieldBackend
8-
} from "../../../contracts/superfluid/SparkYieldBackend.sol";
9-
import {
10-
IERC20,
11-
ISuperfluid
12-
} from "../../../contracts/interfaces/superfluid/ISuperfluid.sol";
6+
import { ERC4626YieldBackend } from "../../../contracts/superfluid/ERC4626YieldBackend.sol";
7+
import { IERC20, ISuperfluid } from "../../../contracts/interfaces/superfluid/ISuperfluid.sol";
138
import { SuperToken } from "../../../contracts/superfluid/SuperToken.sol";
149
import { IERC4626 } from "@openzeppelin-v5/contracts/interfaces/IERC4626.sol";
1510

@@ -34,9 +29,8 @@ contract SparkYieldBackendForkTest is Test {
3429
address internal constant USDCx = 0xD04383398dD2426297da660F9CCA3d439AF9ce1b;
3530
address internal constant USDC = 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913;
3631

37-
3832
SuperToken internal superToken;
39-
SparkYieldBackend internal sparkBackend;
33+
ERC4626YieldBackend internal sparkBackend;
4034
IERC20 internal underlyingToken;
4135
IERC4626 internal vault;
4236

@@ -49,22 +43,15 @@ contract SparkYieldBackendForkTest is Test {
4943

5044
superToken = SuperToken(USDCx);
5145

52-
sparkBackend = new SparkYieldBackend(vault, SURPLUS_RECEIVER);
46+
sparkBackend = new ERC4626YieldBackend(vault, SURPLUS_RECEIVER);
5347

54-
assertEq(
55-
address(sparkBackend.ASSET_TOKEN()),
56-
USDC,
57-
"Asset token mismatch"
58-
);
48+
assertEq(address(sparkBackend.ASSET_TOKEN()), USDC, "Asset token mismatch");
5949
assertEq(address(sparkBackend.VAULT()), SPARK_VAULT, "Vault mismatch");
6050

6151
// upgrade SuperToken to new logic (mocking upgrade to enable features if needed,
6252
// essentially ensuring we have a fresh state or compatible logic)
6353
// Note: SuperToken on Base might already be up to date, but we re-deploy logic for safety in test
64-
SuperToken newSuperTokenLogic = new SuperToken(
65-
ISuperfluid(superToken.getHost()),
66-
superToken.POOL_ADMIN_NFT()
67-
);
54+
SuperToken newSuperTokenLogic = new SuperToken(ISuperfluid(superToken.getHost()), superToken.POOL_ADMIN_NFT());
6855
vm.startPrank(address(superToken.getHost()));
6956
superToken.updateCode(address(newSuperTokenLogic));
7057
vm.stopPrank();
@@ -90,13 +77,9 @@ contract SparkYieldBackendForkTest is Test {
9077
// underlyingBalance + vaultAssets >= superToken.supply()
9178
uint256 underlyingBalance = IERC20(USDC).balanceOf(address(superToken));
9279
// vault balance is in shares, need to convert to assets
93-
uint256 vaultAssets = vault.convertToAssets(
94-
vault.balanceOf(address(superToken))
95-
);
80+
uint256 vaultAssets = vault.convertToAssets(vault.balanceOf(address(superToken)));
9681

97-
(uint256 superTokenNormalizedSupply, ) = superToken.toUnderlyingAmount(
98-
superToken.totalSupply()
99-
);
82+
(uint256 superTokenNormalizedSupply,) = superToken.toUnderlyingAmount(superToken.totalSupply());
10083

10184
// We use approx because of potential rounding/yield accruing differently per block
10285
// But assets should be >= supply
@@ -108,26 +91,14 @@ contract SparkYieldBackendForkTest is Test {
10891
}
10992

11093
function testSparkBackendDeployment() public view {
111-
assertEq(
112-
address(sparkBackend.ASSET_TOKEN()),
113-
USDC,
114-
"Asset token should be USDC"
115-
);
116-
assertEq(
117-
address(sparkBackend.VAULT()),
118-
SPARK_VAULT,
119-
"Vault address should match"
120-
);
94+
assertEq(address(sparkBackend.ASSET_TOKEN()), USDC, "Asset token should be USDC");
95+
assertEq(address(sparkBackend.VAULT()), SPARK_VAULT, "Vault address should match");
12196
}
12297

12398
function testEnableYieldBackend() public {
12499
_enableYieldBackend();
125100

126-
assertEq(
127-
address(superToken.getYieldBackend()),
128-
address(sparkBackend),
129-
"Yield backend mismatch"
130-
);
101+
assertEq(address(superToken.getYieldBackend()), address(sparkBackend), "Yield backend mismatch");
131102

132103
// For new deposits, we need to upgrade
133104
uint256 amount = 100 * 1e18;
@@ -136,18 +107,10 @@ contract SparkYieldBackendForkTest is Test {
136107
vm.stopPrank();
137108

138109
// the SuperToken should now have a zero USDC balance (all deposited)
139-
assertEq(
140-
IERC20(USDC).balanceOf(address(superToken)),
141-
0,
142-
"USDC balance should be zero"
143-
);
110+
assertEq(IERC20(USDC).balanceOf(address(superToken)), 0, "USDC balance should be zero");
144111

145112
// And non-zero vault balance
146-
assertGt(
147-
vault.balanceOf(address(superToken)),
148-
0,
149-
"Vault share balance should be non-zero"
150-
);
113+
assertGt(vault.balanceOf(address(superToken)), 0, "Vault share balance should be non-zero");
151114

152115
_verifyInvariants();
153116
}
@@ -163,23 +126,11 @@ contract SparkYieldBackendForkTest is Test {
163126
vm.startPrank(ADMIN);
164127
superToken.disableYieldBackend();
165128
vm.stopPrank();
166-
assertEq(
167-
address(superToken.getYieldBackend()),
168-
address(0),
169-
"Yield backend mismatch"
170-
);
129+
assertEq(address(superToken.getYieldBackend()), address(0), "Yield backend mismatch");
171130

172131
// the SuperToken should now have a non-zero USDC balance and a zero vault balance
173-
assertGt(
174-
IERC20(USDC).balanceOf(address(superToken)),
175-
0,
176-
"USDC balance should be non-zero"
177-
);
178-
assertEq(
179-
vault.balanceOf(address(superToken)),
180-
0,
181-
"Vault balance should be zero"
182-
);
132+
assertGt(IERC20(USDC).balanceOf(address(superToken)), 0, "USDC balance should be non-zero");
133+
assertEq(vault.balanceOf(address(superToken)), 0, "Vault balance should be zero");
183134

184135
_verifyInvariants();
185136
}
@@ -196,23 +147,15 @@ contract SparkYieldBackendForkTest is Test {
196147

197148
uint256 vaultSharesAfter = vault.balanceOf(address(superToken));
198149

199-
assertGt(
200-
vaultSharesAfter,
201-
vaultSharesBefore,
202-
"Vault shares should increase"
203-
);
150+
assertGt(vaultSharesAfter, vaultSharesBefore, "Vault shares should increase");
204151

205152
// downgrade
206153
vm.startPrank(ALICE);
207154
superToken.downgrade(amount);
208155
vm.stopPrank();
209156

210157
uint256 vaultSharesFinal = vault.balanceOf(address(superToken));
211-
assertLt(
212-
vaultSharesFinal,
213-
vaultSharesAfter,
214-
"Vault shares should decrease"
215-
);
158+
assertLt(vaultSharesFinal, vaultSharesAfter, "Vault shares should decrease");
216159

217160
_verifyInvariants();
218161
}
@@ -224,9 +167,7 @@ contract SparkYieldBackendForkTest is Test {
224167

225168
_enableYieldBackend();
226169

227-
uint256 receiverBalanceBefore = IERC20(USDC).balanceOf(
228-
SURPLUS_RECEIVER
229-
);
170+
uint256 receiverBalanceBefore = IERC20(USDC).balanceOf(SURPLUS_RECEIVER);
230171

231172
vm.startPrank(ADMIN);
232173
superToken.withdrawSurplusFromYieldBackend();
@@ -238,11 +179,7 @@ contract SparkYieldBackendForkTest is Test {
238179
console.log("Receiver balance after", receiverBalanceAfter);
239180
console.log("Diff", receiverBalanceAfter - receiverBalanceBefore);
240181

241-
assertGt(
242-
receiverBalanceAfter,
243-
receiverBalanceBefore,
244-
"Surplus should be withdrawn to receiver"
245-
);
182+
assertGt(receiverBalanceAfter, receiverBalanceBefore, "Surplus should be withdrawn to receiver");
246183
_verifyInvariants();
247184
}
248185
}

0 commit comments

Comments
 (0)