From caece4b1748cedc191539484978a4648def9d055 Mon Sep 17 00:00:00 2001 From: Jeroen Offerijns Date: Wed, 21 Aug 2024 11:46:29 +0200 Subject: [PATCH] WIP fully async vault --- src/ControlledAsyncDeposits.sol | 8 +++++--- src/FullyAsyncVault.sol | 15 +++++++++++++++ src/TimelockedAsyncWithdrawals.sol | 8 +++++--- 3 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 src/FullyAsyncVault.sol diff --git a/src/ControlledAsyncDeposits.sol b/src/ControlledAsyncDeposits.sol index 03666c9..0a6f4e4 100644 --- a/src/ControlledAsyncDeposits.sol +++ b/src/ControlledAsyncDeposits.sol @@ -18,7 +18,7 @@ import {ERC20} from "solmate/tokens/ERC20.sol"; * To allow partial claims, the deposit and mint functions would need to allow for pro rata claims. * Conversions between claimable assets/shares should be checked for rounding safety. */ -contract ControlledAsyncDeposits is BaseERC7540, IERC7540Deposit { +abstract contract BaseControlledAsyncDeposits is BaseERC7540, IERC7540Deposit { uint256 internal _totalPendingAssets; mapping(address => PendingDeposit) internal _pendingDeposit; mapping(address => ClaimableDeposit) internal _claimableDeposit; @@ -32,8 +32,6 @@ contract ControlledAsyncDeposits is BaseERC7540, IERC7540Deposit { uint256 shares; } - constructor(ERC20 _asset, string memory _name, string memory _symbol) BaseERC7540(_asset, _name, _symbol) {} - function totalAssets() public view override returns (uint256) { // total assets pending redemption must be removed from the reported total assets // otherwise pending assets would be treated as yield for outstanding shares @@ -142,3 +140,7 @@ contract ControlledAsyncDeposits is BaseERC7540, IERC7540Deposit { return interfaceId == type(IERC7540Deposit).interfaceId || super.supportsInterface(interfaceId); } } + +contract ControlledAsyncDeposits is BaseControlledAsyncDeposits { + constructor(ERC20 _asset, string memory _name, string memory _symbol) BaseERC7540(_asset, _name, _symbol) {} +} diff --git a/src/FullyAsyncVault.sol b/src/FullyAsyncVault.sol new file mode 100644 index 0000000..34f34ef --- /dev/null +++ b/src/FullyAsyncVault.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.15; + +import {BaseERC7540} from "src/BaseERC7540.sol"; +import {BaseControlledAsyncDeposits} from "src/ControlledAsyncDeposits.sol"; +import {BaseTimelockedAsyncWithdrawals} from "src/TimelockedAsyncWithdrawals.sol"; +import {ERC20} from "solmate/tokens/ERC20.sol"; + +contract FullyAsyncVault is BaseControlledAsyncDeposits, BaseTimelockedAsyncWithdrawals { + constructor(ERC20 _asset, string memory _name, string memory _symbol) + BaseControlledAsyncDeposits() + BaseTimelockedAsyncWithdrawals() + BaseERC7540(_asset, _name, _symbol) + {} +} diff --git a/src/TimelockedAsyncWithdrawals.sol b/src/TimelockedAsyncWithdrawals.sol index 78c73cc..5849069 100644 --- a/src/TimelockedAsyncWithdrawals.sol +++ b/src/TimelockedAsyncWithdrawals.sol @@ -21,7 +21,7 @@ import {ERC20} from "solmate/tokens/ERC20.sol"; * To allow partial claims, the redeem and withdraw functions would need to allow for pro rata claims. * Conversions between claimable assets/shares should be checked for rounding safety. */ -contract TimelockedAsyncWithdrawals is BaseERC7540, IERC7540Redeem { +abstract contract BaseTimelockedAsyncWithdrawals is BaseERC7540, IERC7540Redeem { uint32 public constant TIMELOCK = 3 days; uint256 internal _totalPendingApproxAssets; @@ -33,8 +33,6 @@ contract TimelockedAsyncWithdrawals is BaseERC7540, IERC7540Redeem { uint32 claimableTimestamp; } - constructor(ERC20 _asset, string memory _name, string memory _symbol) BaseERC7540(_asset, _name, _symbol) {} - function totalAssets() public view override returns (uint256) { return ERC20(asset).balanceOf(address(this)) - _totalPendingApproxAssets; } @@ -149,3 +147,7 @@ contract TimelockedAsyncWithdrawals is BaseERC7540, IERC7540Redeem { return interfaceId == type(IERC7540Redeem).interfaceId || super.supportsInterface(interfaceId); } } + +contract TimelockedAsyncWithdrawals is BaseTimelockedAsyncWithdrawals { + constructor(ERC20 _asset, string memory _name, string memory _symbol) BaseERC7540(_asset, _name, _symbol) {} +}