Skip to content

Commit ec01367

Browse files
committed
Revert implementation to mvp, add tests
1 parent 166b8b9 commit ec01367

File tree

2 files changed

+150
-341
lines changed

2 files changed

+150
-341
lines changed

contracts/LiquidityHub.sol

Lines changed: 8 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -23,39 +23,14 @@ contract LiquidityHub is ERC4626Upgradeable, AccessControlUpgradeable {
2323
bytes32 public constant ASSETS_ADJUST_ROLE = "ASSETS_ADJUST_ROLE";
2424

2525
event TotalAssetsAdjustment(uint256 oldAssets, uint256 newAssets);
26-
event DepositRequest(address caller, address receiver, uint256 assets);
27-
event WithdrawRequest(address caller, address receiver, address owner, uint256 shares);
2826

2927
error ZeroAddress();
3028
error NotImplemented();
3129
error IncompatibleAssetsAndShares();
3230

33-
struct AdjustmentRecord {
34-
uint256 totalAssets;
35-
uint256 totalShares;
36-
}
37-
38-
struct PendingDeposit {
39-
uint256 assets;
40-
uint256 adjustmentId;
41-
}
42-
43-
struct PendingWithdraw {
44-
uint256 shares;
45-
uint256 adjustmentId;
46-
}
47-
4831
/// @custom:storage-location erc7201:sprinter.storage.LiquidityHub
4932
struct LiquidityHubStorage {
5033
uint256 totalAssets;
51-
uint256 totalShares;
52-
uint256 depositedAssets;
53-
uint256 burnedShares;
54-
uint256 releasedAssets;
55-
uint256 lastAdjustmentId;
56-
mapping(uint256 adjustmentId => AdjustmentRecord) adjustmentRecords;
57-
mapping(address receiver => PendingDeposit) pendingDeposits;
58-
mapping(address receiver => PendingWithdraw) pendingWithdrawals;
5934
}
6035

6136
bytes32 private constant StorageLocation = 0xb877bfaae1674461dd1960c90f24075e3de3265a91f6906fe128ab8da6ba1700;
@@ -86,20 +61,9 @@ contract LiquidityHub is ERC4626Upgradeable, AccessControlUpgradeable {
8661

8762
function adjustTotalAssets(uint256 amount, bool isIncrease) external onlyRole(ASSETS_ADJUST_ROLE) {
8863
LiquidityHubStorage storage $ = _getStorage();
89-
uint256 adjustmentId = ++$.lastAdjustmentId;
90-
AdjustmentRecord storage adjustmentRecord = $.adjustmentRecords[adjustmentId];
9164
uint256 assets = $.totalAssets;
9265
uint256 newAssets = isIncrease ? assets + amount : assets - amount;
93-
uint256 supplyShares = $.totalShares;
94-
uint256 mintingShares = _toShares($.depositedAssets, supplyShares, newAssets, Math.Rounding.Floor);
95-
uint256 releasingAssets = _toAssets($.burnedShares, supplyShares, newAssets, Math.Rounding.Floor);
96-
$.totalAssets = newAssets + $.depositedAssets - releasingAssets;
97-
$.totalShares = supplyShares + mintingShares - $.burnedShares;
98-
$.depositedAssets = 0;
99-
$.burnedShares = 0;
100-
$.releasedAssets += releasingAssets;
101-
adjustmentRecord.totalAssets = $.totalAssets;
102-
adjustmentRecord.totalShares = $.totalShares;
66+
$.totalAssets = newAssets;
10367
emit TotalAssetsAdjustment(assets, newAssets);
10468
}
10569

@@ -116,11 +80,11 @@ contract LiquidityHub is ERC4626Upgradeable, AccessControlUpgradeable {
11680
}
11781

11882
function totalSupply() public view virtual override(IERC20, ERC20Upgradeable) returns (uint256) {
119-
return _getStorage().totalShares;
83+
return IERC20(address(SHARES)).totalSupply();
12084
}
12185

12286
function balanceOf(address owner) public view virtual override(IERC20, ERC20Upgradeable) returns (uint256) {
123-
return IERC20(address(SHARES)).balanceOf(owner) + _simulateSettleDeposit(owner);
87+
return IERC20(address(SHARES)).balanceOf(owner);
12488
}
12589

12690
function transfer(address, uint256) public pure override(IERC20, ERC20Upgradeable) returns (bool) {
@@ -144,23 +108,6 @@ contract LiquidityHub is ERC4626Upgradeable, AccessControlUpgradeable {
144108
return _getStorage().totalAssets;
145109
}
146110

147-
function releasedAssets() external view returns (uint256) {
148-
return _getStorage().releasedAssets;
149-
}
150-
151-
function settle(address receiver) external {
152-
_settleDeposit(receiver, receiver);
153-
_settleWithdraw(receiver, receiver, receiver);
154-
}
155-
156-
function settleDeposit(address receiver) external {
157-
_settleDeposit(receiver, receiver);
158-
}
159-
160-
function settleWithdraw(address receiver) external {
161-
_settleWithdraw(receiver, receiver, receiver);
162-
}
163-
164111
function depositWithPermit(
165112
uint256 assets,
166113
address receiver,
@@ -233,89 +180,28 @@ contract LiquidityHub is ERC4626Upgradeable, AccessControlUpgradeable {
233180
SHARES.spendAllowance(owner, spender, value);
234181
}
235182

236-
function _deposit(address caller, address receiver, uint256 assets, uint256 /*shares*/) internal virtual override {
237-
_settleWithdraw(caller, caller, caller);
238-
_settleDeposit(caller, receiver);
183+
function _deposit(address caller, address receiver, uint256 assets, uint256 shares) internal virtual override {
239184
LiquidityHubStorage storage $ = _getStorage();
240185
SafeERC20.safeTransferFrom(IERC20(asset()), caller, address(LIQUIDITY_POOL), assets);
241-
PendingDeposit storage pendingDeposit = $.pendingDeposits[receiver];
242-
pendingDeposit.assets += assets;
243-
pendingDeposit.adjustmentId = $.lastAdjustmentId;
244-
$.depositedAssets += assets;
245-
LIQUIDITY_POOL.deposit();
246-
emit DepositRequest(caller, receiver, assets);
247-
}
248-
249-
function _simulateSettleDeposit(address receiver) internal view returns (uint256) {
250-
LiquidityHubStorage storage $ = _getStorage();
251-
PendingDeposit storage pendingDeposit = $.pendingDeposits[receiver];
252-
uint256 assets = pendingDeposit.assets;
253-
if (assets == 0) {
254-
return 0;
255-
}
256-
uint256 settleAdjustmentId = pendingDeposit.adjustmentId + 1;
257-
if (settleAdjustmentId > $.lastAdjustmentId) {
258-
return 0;
259-
}
260-
AdjustmentRecord memory adjustmentRecord = $.adjustmentRecords[settleAdjustmentId];
261-
uint256 shares = _toShares(
262-
assets, adjustmentRecord.totalShares, adjustmentRecord.totalAssets, Math.Rounding.Floor
263-
);
264-
return shares;
265-
}
266-
267-
function _settleDeposit(address caller, address receiver) internal {
268-
uint256 shares = _simulateSettleDeposit(receiver);
269-
if (shares == 0) {
270-
return;
271-
}
272-
PendingDeposit storage pendingDeposit = _getStorage().pendingDeposits[receiver];
273-
uint256 assets = pendingDeposit.assets;
274-
pendingDeposit.assets = 0;
275-
pendingDeposit.adjustmentId = 0;
276186
_mint(receiver, shares);
187+
$.totalAssets += assets;
188+
LIQUIDITY_POOL.deposit();
277189
emit Deposit(caller, receiver, assets, shares);
278190
}
279191

280192
function _withdraw(
281193
address caller,
282194
address receiver,
283195
address owner,
284-
uint256 /*assets*/,
196+
uint256 assets,
285197
uint256 shares
286198
) internal virtual override {
287-
_settleDeposit(caller, owner);
288-
_settleWithdraw(caller, receiver, owner);
289199
LiquidityHubStorage storage $ = _getStorage();
290200
if (caller != owner) {
291201
_spendAllowance(owner, caller, shares);
292202
}
293-
PendingWithdraw storage pendingWithdraw = $.pendingWithdrawals[receiver];
294-
pendingWithdraw.shares += shares;
295-
pendingWithdraw.adjustmentId = $.lastAdjustmentId;
296-
$.burnedShares += shares;
203+
$.totalAssets -= assets;
297204
_burn(owner, shares);
298-
emit WithdrawRequest(caller, receiver, owner, shares);
299-
}
300-
301-
function _settleWithdraw(address caller, address receiver, address owner) internal {
302-
LiquidityHubStorage storage $ = _getStorage();
303-
PendingWithdraw storage pendingWithdraw = $.pendingWithdrawals[receiver];
304-
uint256 shares = pendingWithdraw.shares;
305-
if (shares == 0) {
306-
return;
307-
}
308-
uint256 settleAdjustmentId = pendingWithdraw.adjustmentId + 1;
309-
if (settleAdjustmentId > $.lastAdjustmentId) {
310-
return;
311-
}
312-
pendingWithdraw.shares = 0;
313-
pendingWithdraw.adjustmentId = 0;
314-
AdjustmentRecord memory adjustmentRecord = $.adjustmentRecords[settleAdjustmentId];
315-
uint256 assets = _toAssets(
316-
shares, adjustmentRecord.totalShares, adjustmentRecord.totalAssets, Math.Rounding.Floor
317-
);
318-
$.releasedAssets -= assets;
319205
LIQUIDITY_POOL.withdraw(receiver, assets);
320206
emit Withdraw(caller, receiver, owner, assets, shares);
321207
}

0 commit comments

Comments
 (0)