From 052bfd777f44bf3b0bdabaf76dfa3465a8a8acfc Mon Sep 17 00:00:00 2001 From: "lakonema2000@gmail" Date: Tue, 21 May 2024 02:31:35 +0200 Subject: [PATCH] added novavault and interfaces --- src/NovaVault.sol | 75 +++++++++++++++++++++++++++++ src/interfaces/INovaAdapterBase.sol | 10 ++++ src/interfaces/INovaVault.sol | 6 +++ src/librairies/Errors.sol | 11 +++++ 4 files changed, 102 insertions(+) create mode 100644 src/NovaVault.sol create mode 100644 src/interfaces/INovaAdapterBase.sol create mode 100644 src/interfaces/INovaVault.sol create mode 100644 src/librairies/Errors.sol diff --git a/src/NovaVault.sol b/src/NovaVault.sol new file mode 100644 index 0000000..246c6bd --- /dev/null +++ b/src/NovaVault.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Errors} from "./libraries/Errors.sol"; +import {INovaVault} from "./interfaces/INovaVault.sol"; +import {INovaAdapterBase} from "./interfaces/INovaAdapterBase.sol"; + +contract NovaVault is INovaVault { + mapping(address => address) public _novaAdapters; + + function constructor( + address[] calldata stables, + uint256[] calldata novaAdapters + ) { + _approveNovaAdapters(stables, novaAdapters); + } + + function _approveNovaAdapters( + address[] calldata stables, + address[] calldata novaAdapters, + ) internal { + require( + stables.length == novaAdapters.length, + Errors.MISMATCHING_ARRAYS_LENGTH + ); + for (uint256 i = 0; i < stables.length; i++) { + _approveAdapter(stables[i], novaAdapters[i]); + } + } + + function _approveAdapter( + address stable, + address adapter + ) internal { + require(stable != address(0), Errors.INVALID_ADDRESS); + + require( + _novaAdapters[stable] == address(0), + Errors.ADAPTER_ALREADY_APPROVED + ); + + ERC20 underlyingAsset = INovaAdapterBase(adapter).asset(); + require( + address(underlyingAsset) == stable, + Errors.INVALID_STABLE_TO_ADAPTER_MAPPING + ); + + _novaAdapters[stable] = adapter; + emit ApprovedAdapter(stable, adapter); + } + + function deposit(address stable, uint256 assets) external returns (bool , bytes memory) { + address addapter = _novaAdapters[stable]; + require( + addapter != address(0), + Errors.NO_ADAPTER_APPROVED + ); + (bool success, bytes memory data) = adapter.delegatecall( + abi.encodeWithSignature("deposit(uint256)", assets) + ); + return (sucess, data) + } + + function withdraw(address stable, uint256 shares) external returns (bool , bytes memory) { + address addapter = _novaAdapters[stable]; + require( + addapter != address(0), + Errors.NO_ADAPTER_APPROVED + ); + (bool success, bytes memory data) = adapter.delegatecall( + abi.encodeWithSignature("withdraw(uint256)", shares) + ); + return (sucess, data) + } +} \ No newline at end of file diff --git a/src/interfaces/INovaAdapterBase.sol b/src/interfaces/INovaAdapterBase.sol new file mode 100644 index 0000000..c677604 --- /dev/null +++ b/src/interfaces/INovaAdapterBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +interface INovaAdapterBase { + ERC20 asset; + + function deposit(uint256 assets) external returns (bool , uint256); + + function withdraw(uint256 shares) external returns (bool, uint256); +} \ No newline at end of file diff --git a/src/interfaces/INovaVault.sol b/src/interfaces/INovaVault.sol new file mode 100644 index 0000000..8ef3f91 --- /dev/null +++ b/src/interfaces/INovaVault.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +interface INovaVault { + event ApprovedAdapter(address stable, uint256 adapter; +} \ No newline at end of file diff --git a/src/librairies/Errors.sol b/src/librairies/Errors.sol new file mode 100644 index 0000000..687792e --- /dev/null +++ b/src/librairies/Errors.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: agpl-3.0 +pragma solidity ^0.8.13; + + +library Errors { + string public constant INVALID_ADDRESS = "1"; + string public constant ADAPTER_ALREADY_APPROVED = "2"; + string public constant MISMATCHING_ARRAYS_LENGTH = "3"; + string public constant INVALID_STABLE_TO_ADAPTER_MAPPING = "4"; + string public constant NO_ADAPTER_APPROVED = "5"; +} \ No newline at end of file