diff --git a/src/NovaAdapterBase.sol b/src/NovaAdapterBase.sol index da3d369..b919733 100644 --- a/src/NovaAdapterBase.sol +++ b/src/NovaAdapterBase.sol @@ -8,46 +8,50 @@ import {SafeTransferLib} from "@solmate/utils/SafeTransferLib.sol"; abstract contract NovaAdapterBase is INovaAdapterBase { using SafeTransferLib for ERC20; - address immutable sDAI; - address immutable asset; + address immutable savings; + address immutable stable; - constructor(address _asset, address _sDAI) { - asset = _asset; - sDAI = _sDAI; + constructor(address _stable, address _savings) { + stable = _stable; + savings = _savings; } - function deposit(uint256 assets) external returns (bool, uint256) { - ERC20(asset).safeTransferFrom(msg.sender, address(this), assets); + function deposit(uint256 amountInStable) external returns (bool, uint256) { + ERC20(stable).safeTransferFrom( + msg.sender, + address(this), + amountInStable + ); - (, int256 sDaiOut) = _swap(int256(assets), true); - uint256 sDaiToTransfer = uint256(-sDaiOut); - ERC20(sDAI).safeTransfer(msg.sender, sDaiToTransfer); + (, int256 amountOutSavings) = _swap(int256(amountInStable), true); + uint256 amountOutSavingsToTransfer = uint256(-amountOutSavings); + ERC20(savings).safeTransfer(msg.sender, amountOutSavingsToTransfer); - return (true, sDaiToTransfer); + return (true, amountOutSavingsToTransfer); } function withdraw(uint256 shares) external returns (bool, uint256) { - ERC20(sDAI).safeTransferFrom(msg.sender, address(this), shares); + ERC20(savings).safeTransferFrom(msg.sender, address(this), shares); - (int256 assets, ) = _swap(int256(shares), false); - uint256 assetsToTransfer = uint256(-assets); - ERC20(asset).safeTransfer(msg.sender, assetsToTransfer); + (int256 amountOutStable, ) = _swap(int256(shares), false); + uint256 amountOutStableToTransfer = uint256(-amountOutStable); + ERC20(stable).safeTransfer(msg.sender, amountOutStableToTransfer); - return (true, assetsToTransfer); + return (true, amountOutStableToTransfer); } /** - * @notice Performs a swap operation between the stable asset and sDAI. + * @notice Performs a swap operation between the stable and savings. * @dev This function interacts with the pool to execute the swap. * @param amount The amount to be swapped. - * @param fromStableTosDai A boolean indicating the direction of the swap. - * - `true` for swapping from the stable asset to sDAI. - * - `false` for swapping from sDAI to the stable asset. + * @param fromStableToSavings A boolean indicating the direction of the swap. + * - `true` for swapping from the stable to savings. + * - `false` for swapping from savings to the stable. * @return amount0 The amount of token0 involved in the swap. * @return amount1 The amount of token1 involved in the swap. */ function _swap( int256 amount, - bool fromStableTosDai + bool fromStableToSavings ) internal virtual returns (int256, int256); } diff --git a/src/NovaVault.sol b/src/NovaVault.sol index acc5454..f6f141b 100644 --- a/src/NovaVault.sol +++ b/src/NovaVault.sol @@ -13,10 +13,10 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { using SafeTransferLib for ERC20; mapping(address => address) public _novaAdapters; - address immutable sDAI; + address immutable savings; - modifier onlyNonZero(address asset) { - if (asset == address(0)) { + modifier onlyNonZero(address stable) { + if (stable == address(0)) { revert Errors.INVALID_ADDRESS(); } _; @@ -29,11 +29,11 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { _; } constructor( - address _sDAI, + address _savings, address[] memory stables, address[] memory novaAdapters - ) Ownable() onlyNonZero(_sDAI) { - sDAI = _sDAI; + ) Ownable() onlyNonZero(_savings) { + savings = _savings; _approveNovaAdapters(stables, novaAdapters); } @@ -58,7 +58,7 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { revert Errors.ADAPTER_ALREADY_APPROVED(); } - address underlyingAsset = INovaAdapterBase(adapter).getAsset(); + address underlyingAsset = INovaAdapterBase(adapter).getStable(); if (underlyingAsset != stable) { revert Errors.INVALID_STABLE_TO_ADAPTER_MAPPING(); } @@ -76,7 +76,7 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { function deposit( address stable, - uint256 assets, + uint256 amounInStable, uint16 referral ) external @@ -86,22 +86,26 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { { address adapter = _novaAdapters[stable]; - ERC20(stable).safeTransferFrom(msg.sender, address(this), assets); - ERC20(stable).safeApprove(adapter, assets); + ERC20(stable).safeTransferFrom( + msg.sender, + address(this), + amounInStable + ); + ERC20(stable).safeApprove(adapter, amounInStable); (bool success, bytes memory data) = adapter.call( - abi.encodeWithSignature("deposit(uint256)", assets) + abi.encodeWithSignature("deposit(uint256)", amounInStable) ); - (bool successDeposit, uint256 sDaiAmount) = abi.decode( + (bool successDeposit, uint256 savingsAmount) = abi.decode( data, (bool, uint256) ); require(success && successDeposit, "Deposit failed"); - ERC20(sDAI).safeTransfer(msg.sender, sDaiAmount); + ERC20(savings).safeTransfer(msg.sender, savingsAmount); - emit Referral(referral, msg.sender, assets); - return (true, sDaiAmount); + emit Referral(referral, msg.sender, amounInStable); + return (true, savingsAmount); } function withdraw( @@ -116,21 +120,21 @@ contract NovaVault is INovaVault, Ownable, ReentrancyGuard { { address adapter = _novaAdapters[stable]; - ERC20(sDAI).safeTransferFrom(msg.sender, address(this), shares); - ERC20(sDAI).safeApprove(adapter, shares); + ERC20(savings).safeTransferFrom(msg.sender, address(this), shares); + ERC20(savings).safeApprove(adapter, shares); (bool success, bytes memory data) = adapter.call( abi.encodeWithSignature("withdraw(uint256)", shares) ); - (bool successWithdraw, uint256 assetsAmount) = abi.decode( + (bool successWithdraw, uint256 amountOutStable) = abi.decode( data, (bool, uint256) ); require(success && successWithdraw, "Withdraw failed"); - ERC20(stable).safeTransfer(msg.sender, assetsAmount); + ERC20(stable).safeTransfer(msg.sender, amountOutStable); emit Referral(referral, msg.sender, shares); - return (true, assetsAmount); + return (true, amountOutStable); } } diff --git a/src/adapters/NovaAdapterVeloCLPool.sol b/src/adapters/NovaAdapterVeloCLPool.sol index 3993f76..ff38a26 100644 --- a/src/adapters/NovaAdapterVeloCLPool.sol +++ b/src/adapters/NovaAdapterVeloCLPool.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; +pragma solidity 0.8.17; import {IVelodromeCLPool} from "../interfaces/IVelodromeCLPool.sol"; import {NovaAdapterBase} from "../NovaAdapterBase.sol"; @@ -16,20 +16,20 @@ contract NovaAdapterVeloCLPool is NovaAdapterBase { IVelodromeCLPool immutable veloPool; constructor( - address _asset, - address _sDAI, + address _stable, + address _savings, address _pool - ) NovaAdapterBase(_asset, _sDAI) { + ) NovaAdapterBase(_stable, _savings) { veloPool = IVelodromeCLPool(_pool); veloToken0 = veloPool.token0(); veloToken1 = veloPool.token1(); - if ((veloToken0 == asset) && (veloToken1 == sDAI)) { + if ((veloToken0 == stable) && (veloToken1 == savings)) { isStableFirst = true; - } else if ((veloToken0 == sDAI) && (veloToken1 == asset)) { + } else if ((veloToken0 == savings) && (veloToken1 == stable)) { isStableFirst = false; } else { - revert("Velodrome pool should be made of `_asset` and `sDAI`!"); + revert("Velodrome pool should be made of `_stable` and `savings`!"); } } @@ -50,15 +50,15 @@ contract NovaAdapterVeloCLPool is NovaAdapterBase { function _swap( int256 amount, - bool fromStableTosDai + bool fromStableToSavings ) internal override returns (int256, int256) { (uint160 sqrtPriceX96, , , , , ) = veloPool.slot0(); - uint160 num = fromStableTosDai ? 95 : 105; + uint160 num = fromStableToSavings ? 95 : 105; int256 sign = isStableFirst ? int256(1) : int256(-1); (int256 amount0, int256 amount1) = veloPool.swap( address(this), - fromStableTosDai, + fromStableToSavings, sign * amount, (num * sqrtPriceX96) / 100, "" @@ -67,7 +67,7 @@ contract NovaAdapterVeloCLPool is NovaAdapterBase { return (amount0, amount1); } - function getAsset() external view returns (address) { - return asset; + function getStable() external view returns (address) { + return stable; } } diff --git a/src/interfaces/INovaAdapterBase.sol b/src/interfaces/INovaAdapterBase.sol index b84c751..c762c34 100644 --- a/src/interfaces/INovaAdapterBase.sol +++ b/src/interfaces/INovaAdapterBase.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.17; interface INovaAdapterBase { - function getAsset() external view returns (address); - function deposit(uint256 assets) external returns (bool, uint256); + function getStable() external view returns (address); + function deposit(uint256 stable) external returns (bool, uint256); function withdraw(uint256 shares) external returns (bool, uint256); }