From 17ed93e797e33d623ca540865297c8b3ce6356f7 Mon Sep 17 00:00:00 2001 From: Shriya Tyagi Date: Mon, 21 Aug 2023 17:38:34 +0530 Subject: [PATCH] Revert "feat: Update function calculations" This reverts commit ddaec8d11ac3243e9391ee7325ae0913dfb9ca60. --- .../connectors/basic-ERC4626/events.sol | 80 ++- .../mainnet/connectors/basic-ERC4626/main.sol | 574 +++++++++--------- 2 files changed, 310 insertions(+), 344 deletions(-) diff --git a/contracts/mainnet/connectors/basic-ERC4626/events.sol b/contracts/mainnet/connectors/basic-ERC4626/events.sol index 3590472e..1657f29c 100644 --- a/contracts/mainnet/connectors/basic-ERC4626/events.sol +++ b/contracts/mainnet/connectors/basic-ERC4626/events.sol @@ -1,42 +1,38 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -contract Events { - event LogDeposit( - address indexed token, - uint256 underlyingAmt, - uint256 minSharesPerToken, - uint256 sharesReceieved, - uint256 getId, - uint256 setId - ); - - event LogMint( - address indexed token, - uint256 shareAmt, - uint256 maxTokenPerShares, - uint256 underlyingTokenAmount, - uint256 getId, - uint256 setId - ); - - event LogWithdraw( - address indexed token, - uint256 underlyingAmt, - uint256 maxSharesPerToken, - uint256 sharedBurned, - address indexed to, - uint256 getId, - uint256 setId - ); - - event LogRedeem( - address indexed token, - uint256 shareAmt, - uint256 minTokenPerShares, - uint256 underlyingAmtReceieved, - address to, - uint256 getId, - uint256 setId - ); -} +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +contract Events { + event LogDeposit( + address indexed token, + uint256 underlyingAmt, + uint256 minSharesPerToken, + uint256 getId, + uint256 setId + ); + + event LogMint( + address indexed token, + uint256 shareAmt, + uint256 maxTokenPerShares, + uint256 getId, + uint256 setId + ); + + event LogWithdraw( + address indexed token, + uint256 underlyingAmt, + uint256 maxSharesPerToken, + address indexed to, + uint256 getId, + uint256 setId + ); + + event LogRedeem( + address indexed token, + uint256 shareAmt, + uint256 minTokenPerShares, + address to, + uint256 getId, + uint256 setId + ); +} diff --git a/contracts/mainnet/connectors/basic-ERC4626/main.sol b/contracts/mainnet/connectors/basic-ERC4626/main.sol index 128f1f23..3b128097 100644 --- a/contracts/mainnet/connectors/basic-ERC4626/main.sol +++ b/contracts/mainnet/connectors/basic-ERC4626/main.sol @@ -1,302 +1,272 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -/** - * @title Basic D. - * @dev Deposit, Mint, Withdraw, & Redeem from ERC4626 DSA. - */ - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { IERC4626 } from "./interface.sol"; -import { TokenInterface } from "../../common/interfaces.sol"; -import { DSMath } from "../../common/math.sol"; -import { Basic } from "../../common/basic.sol"; -import { Events } from "./events.sol"; - -abstract contract BasicConnector is Events, DSMath, Basic { - /** - * @dev Deposit underlying asset to ERC4626 Vault. - * @notice Mints vault shares by depositing exactly amount of underlying assets - * @param vaultToken ERC4626 Token address. - * @param underlyingAmt The amount of the underlying asset to deposit. (For max: `uint256(-1)`) - * @param minSharesPerToken The min share rate of deposit. Should always be in 18 decimals. - * @param getId ID to retrieve amt. - * @param setId ID stores the amount of tokens deposited. - */ - function deposit( - address vaultToken, - uint256 underlyingAmt, - uint256 minSharesPerToken, - uint256 getId, - uint256 setId - ) public returns (string memory _eventName, bytes memory _eventParam) { - uint256 _underlyingAmt = getUint(getId, underlyingAmt); - - IERC4626 vaultTokenContract = IERC4626(vaultToken); - TokenInterface _underlyingTokenContract = TokenInterface( - vaultTokenContract.asset() - ); - - _underlyingAmt = _underlyingAmt == uint256(-1) - ? _underlyingTokenContract.balanceOf(address(this)) - : _underlyingAmt; - - // Making sure that the underlying amount is always in 18 decimals. - uint256 _underlyingAmt18 = convertTo18( - _underlyingTokenContract.decimals(), - _underlyingAmt - ); - - uint256 _minShares = convert18ToDec( - vaultTokenContract.decimals(), - wmul(minSharesPerToken, _underlyingAmt18) // Returns final amount in the floor value of the two token decimals. - ); - - uint256 _initialVaultBal = vaultTokenContract.balanceOf(address(this)); - - approve(_underlyingTokenContract, vaultToken, _underlyingAmt); - vaultTokenContract.deposit(_underlyingAmt, address(this)); - - uint256 _sharesReceieved = sub( - vaultTokenContract.balanceOf(address(this)), - _initialVaultBal - ); - - require(_minShares <= _sharesReceieved, "Less shares received"); - - setUint(setId, _sharesReceieved); - - _eventName = "LogDeposit(address,uint256,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - vaultToken, - _underlyingAmt, - minSharesPerToken, - _sharesReceieved, - getId, - setId - ); - } - - /** - * @dev Mint underlying asset to ERC4626 Vault. - * @notice Mints vault shares by minting exactly amount of underlying assets - * @param vaultToken ERC4626 Token address. - * @param shareAmt The amount of the share to mint. (For max: `uint256(-1)`) - * @param maxTokenPerShares The max underyling token rate of mint. Always in 18 decimals. - * @param getId ID to retrieve amt. - * @param setId ID stores the amount of tokens minted. - */ - function mint( - address vaultToken, - uint256 shareAmt, - uint256 maxTokenPerShares, - uint256 getId, - uint256 setId - ) public returns (string memory _eventName, bytes memory _eventParam) { - uint256 _shareAmt = getUint(getId, shareAmt); - - IERC4626 vaultTokenContract = IERC4626(vaultToken); - TokenInterface underlyingTokenContract = TokenInterface( - vaultTokenContract.asset() - ); - - // In vault token decimals - _shareAmt = _shareAmt == uint256(-1) - ? vaultTokenContract.balanceOf(address(this)) - : _shareAmt; - - // In 18 decimals - maxTokenPerShares = convertTo18( - vaultTokenContract.decimals(), - wmul(maxTokenPerShares, _shareAmt) // Returns final amount in the vault token decimals. - ); - - // In token decimals - maxTokenPerShares = convert18ToDec( - underlyingTokenContract.decimals(), - maxTokenPerShares - ); - - // In token decimals - uint256 _underlyingTokenAmount = vaultTokenContract.previewMint( - _shareAmt - ); - - // In token decimals - uint256 _initalUnderlyingBal = underlyingTokenContract.balanceOf( - address(this) - ); - - approve(underlyingTokenContract, vaultToken, _underlyingTokenAmount); - - vaultTokenContract.mint(_shareAmt, address(this)); - - // In token decimals - uint256 _finalUnderlyingBal = underlyingTokenContract.balanceOf( - address(this) - ); - - require( - maxTokenPerShares >= sub(_initalUnderlyingBal, _finalUnderlyingBal), - "maxTokenPerShares-exceeds" - ); - - setUint(setId, _shareAmt); - - _eventName = "LogMint(address,uint256,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - vaultToken, - _shareAmt, - maxTokenPerShares, - _underlyingTokenAmount, - getId, - setId - ); - } - - /** - * @dev Withdraw underlying asset from ERC4626 Vault. - * @notice Withdraw vault shares with exactly amount of underlying assets - * @param vaultToken ERC4626 Token address. - * @param underlyingAmt The amount of the token to withdraw. (For max: `uint256(-1)`) - * @param maxSharesPerToken The max share rate of withdrawn amount. Always send in 18 decimals. - * @param to The address of receiver. - * @param getId ID to retrieve amt. - * @param setId ID stores the amount of tokens withdrawn. - */ - function withdraw( - address vaultToken, - uint256 underlyingAmt, - uint256 maxSharesPerToken, - address payable to, - uint256 getId, - uint256 setId - ) public returns (string memory _eventName, bytes memory _eventParam) { - uint256 _underlyingAmt = getUint(getId, underlyingAmt); - - IERC4626 vaultTokenContract = IERC4626(vaultToken); - TokenInterface underlyingTokenContract = TokenInterface( - vaultTokenContract.asset() - ); - - // In token decimals - _underlyingAmt = _underlyingAmt == uint256(-1) - ? underlyingTokenContract.balanceOf(address(this)) - : _underlyingAmt; - - // In 18 decimals - _underlyingAmt = convertTo18( - underlyingTokenContract.decimals(), - _underlyingAmt - ); - - // In vault token decimals - uint256 _maxShares = convert18ToDec( - vaultTokenContract.decimals(), - wmul(maxSharesPerToken, _underlyingAmt) // In 18 decimals - ); - - // In vault token decimals - uint256 _initialVaultBal = vaultTokenContract.balanceOf(to); - - vaultTokenContract.withdraw(_underlyingAmt, to, address(this)); - - // In vault token decimals - uint256 _finalVaultBal = vaultTokenContract.balanceOf(to); - - // In vault token decimals - uint256 _sharesBurned = sub(_initialVaultBal, _finalVaultBal); - - require(_maxShares >= _sharesBurned, "maxShares-exceeds"); - - setUint(setId, _underlyingAmt); - - _eventName = "LogWithdraw(address,uint256,uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - vaultToken, - _underlyingAmt, - maxSharesPerToken, - _sharesBurned, - to, - getId, - setId - ); - } - - /** - * @dev Redeem underlying asset from ERC4626 Vault. - * @notice Redeem vault shares with exactly amount of underlying assets - * @param vaultToken ERC4626 Token address. - * @param shareAmt The amount of the token to redeem. (For max: `uint256(-1)`) - * @param minTokenPerShares The min underlying token rate of withdraw. Always in 18 decimals. - * @param to The address of receiver. - * @param getId ID to retrieve amt. - * @param setId ID stores the amount of tokens redeem. - */ - - function redeem( - address vaultToken, - uint256 shareAmt, - uint256 minTokenPerShares, - address payable to, - uint256 getId, - uint256 setId - ) public returns (string memory _eventName, bytes memory _eventParam) { - uint256 _shareAmt = getUint(getId, shareAmt); - - IERC4626 vaultTokenContract = IERC4626(vaultToken); - TokenInterface underlyingTokenContract = TokenInterface( - vaultTokenContract.asset() - ); - - // In vault token decimals - _shareAmt = _shareAmt == uint256(-1) - ? vaultTokenContract.balanceOf(address(this)) - : _shareAmt; - - // In 18 decimals - _shareAmt = convertTo18(vaultTokenContract.decimals(), _shareAmt); - - // In token decimals - uint256 _minUnderlyingAmt = convert18ToDec( - underlyingTokenContract.decimals(), - wmul(minTokenPerShares, _shareAmt) // In 18 decimals - ); - - // In token decimals - uint256 _initalUnderlyingBal = underlyingTokenContract.balanceOf(to); - - vaultTokenContract.redeem(_shareAmt, to, address(this)); - - // In token decimals - uint256 _finalUnderlyingBal = underlyingTokenContract.balanceOf(to); - - // In token decimals - uint256 _underlyingAmtReceieved = sub( - _finalUnderlyingBal, - _initalUnderlyingBal - ); - - require( - _minUnderlyingAmt <= _underlyingAmtReceieved, - "_minUnderlyingAmt-exceeds" - ); - - setUint(setId, _shareAmt); - - _eventName = "LogRedeem(address,uint256,uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - vaultToken, - _shareAmt, - minTokenPerShares, - _underlyingAmtReceieved, - to, - getId, - setId - ); - } -} - -contract ConnectV2BasicERC4626 is BasicConnector { - string public constant name = "BASIC-ERC4626-v1.0"; -} +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +/** + * @title Basic D. + * @dev Deposit, Mint, Withdraw, & Redeem from ERC4626 DSA. + */ + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC4626 } from "./interface.sol"; +import { TokenInterface } from "../../common/interfaces.sol"; +import { DSMath } from "../../common/math.sol"; +import { Basic } from "../../common/basic.sol"; +import { Events } from "./events.sol"; + +abstract contract BasicConnector is Events, DSMath, Basic { + /** + * @dev Deposit underlying asset to ERC4626 Vault. + * @notice Mints vault shares by depositing exactly amount of underlying assets + * @param token ERC4626 Token address. + * @param underlyingAmt The amount of the underlying asset to deposit. (For max: `uint256(-1)`) + * @param minSharesPerToken The min share rate of deposit + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens deposited. + */ + + function deposit( + address token, + uint256 underlyingAmt, + uint256 minSharesPerToken, + uint256 getId, + uint256 setId + ) public returns (string memory _eventName, bytes memory _eventParam) { + uint256 _underlyingAmt = getUint(getId, underlyingAmt); + IERC4626 vaultTokenContract = IERC4626(token); + + address _underlyingToken = vaultTokenContract.asset(); + uint8 _vaultShareDecimal = vaultTokenContract.decimals(); + TokenInterface underlyingTokenContract = TokenInterface( + _underlyingToken + ); + + _underlyingAmt = _underlyingAmt == uint256(-1) + ? underlyingTokenContract.balanceOf(address(this)) + : _underlyingAmt; + + uint256 _minShares = convert18ToDec( + _vaultShareDecimal, + wmul(minSharesPerToken, _underlyingAmt) + ); + + uint256 _initialVaultBal = vaultTokenContract.balanceOf(address(this)); + + approve(underlyingTokenContract, token, _underlyingAmt); + vaultTokenContract.deposit(_underlyingAmt, address(this)); + + uint256 _finalVaultBal = vaultTokenContract.balanceOf(address(this)); + + require( + _minShares <= sub(_finalVaultBal, _initialVaultBal), + "minShares-exceeds" + ); + + setUint(setId, _underlyingAmt); + + _eventName = "LogDeposit(address,uint256,uint256,uint256,uint256)"; + _eventParam = abi.encode( + token, + _underlyingAmt, + minSharesPerToken, + getId, + setId + ); + } + + /** + * @dev Mint underlying asset to ERC4626 Vault. + * @notice Mints vault shares by minting exactly amount of underlying assets + * @param token ERC4626 Token address. + * @param shareAmt The amount of the share to mint. (For max: `uint256(-1)`) + * @param maxTokenPerShares The max underyling token rate of mint + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens minted. + */ + + function mint( + address token, + uint256 shareAmt, + uint256 maxTokenPerShares, + uint256 getId, + uint256 setId + ) public returns (string memory _eventName, bytes memory _eventParam) { + uint256 _shareAmt = getUint(getId, shareAmt); + IERC4626 vaultTokenContract = IERC4626(token); + + address _underlyingToken = vaultTokenContract.asset(); + uint8 _vaultShareDecimal = vaultTokenContract.decimals(); + TokenInterface underlyingTokenContract = TokenInterface( + _underlyingToken + ); + + _shareAmt = _shareAmt == uint256(-1) + ? vaultTokenContract.balanceOf(address(this)) + : _shareAmt; + + maxTokenPerShares = convertTo18( + _vaultShareDecimal, + wmul(maxTokenPerShares, _shareAmt) + ); + + uint256 _approveUnderlyingTokenAmount = vaultTokenContract.previewMint( + _shareAmt + ); + + uint256 _initalUnderlyingBal = IERC20(_underlyingToken).balanceOf( + address(this) + ); + + approve(underlyingTokenContract, token, _approveUnderlyingTokenAmount); + + vaultTokenContract.mint(_shareAmt, address(this)); + + uint256 _finalUnderlyingBal = IERC20(_underlyingToken).balanceOf( + address(this) + ); + + require( + maxTokenPerShares >= sub(_initalUnderlyingBal, _finalUnderlyingBal), + "maxTokenPerShares-exceeds" + ); + + setUint(setId, _shareAmt); + + _eventName = "LogMint(address,uint256,uint256,uint256,uint256)"; + _eventParam = abi.encode( + token, + _shareAmt, + maxTokenPerShares, + getId, + setId + ); + } + + /** + * @dev Withdraw underlying asset from ERC4626 Vault. + * @notice Withdraw vault shares with exactly amount of underlying assets + * @param token ERC4626 Token address. + * @param underlyingAmt The amount of the token to withdraw. (For max: `uint256(-1)`) + * @param maxSharesPerToken The max share rate of withdrawn amount. + * @param to The address of receiver. + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens withdrawn. + */ + + function withdraw( + address token, + uint256 underlyingAmt, + uint256 maxSharesPerToken, + address payable to, + uint256 getId, + uint256 setId + ) public returns (string memory _eventName, bytes memory _eventParam) { + uint256 _underlyingAmt = getUint(getId, underlyingAmt); + IERC4626 vaultTokenContract = IERC4626(token); + + address _underlyingToken = vaultTokenContract.asset(); + uint8 _vaultShareDecimal = vaultTokenContract.decimals(); + TokenInterface underlyingTokenContract = TokenInterface( + _underlyingToken + ); + + _underlyingAmt = _underlyingAmt == uint256(-1) + ? underlyingTokenContract.balanceOf(address(this)) + : _underlyingAmt; + + uint256 _maxShares = convert18ToDec( + _vaultShareDecimal, + wmul(maxSharesPerToken, _underlyingAmt) + ); + + uint256 _initialVaultBal = vaultTokenContract.balanceOf(to); + + vaultTokenContract.withdraw(_underlyingAmt, to, address(this)); + + uint256 _finalVaultBal = vaultTokenContract.balanceOf(to); + + require( + _maxShares >= sub(_finalVaultBal, _initialVaultBal), + "maxShares-exceeds" + ); + + setUint(setId, _underlyingAmt); + + _eventName = "LogWithdraw(address,uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + token, + _underlyingAmt, + maxSharesPerToken, + to, + getId, + setId + ); + } + + /** + * @dev Redeem underlying asset from ERC4626 Vault. + * @notice Redeem vault shares with exactly amount of underlying assets + * @param token ERC4626 Token address. + * @param shareAmt The amount of the token to redeem. (For max: `uint256(-1)`) + * @param minTokenPerShares The min underlying token rate of withdraw. + * @param to The address of receiver. + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of tokens redeem. + */ + + function redeem( + address token, + uint256 shareAmt, + uint256 minTokenPerShares, + address payable to, + uint256 getId, + uint256 setId + ) public returns (string memory _eventName, bytes memory _eventParam) { + uint256 _shareAmt = getUint(getId, shareAmt); + IERC4626 vaultTokenContract = IERC4626(token); + + address _underlyingToken = vaultTokenContract.asset(); + uint8 _vaultShareDecimal = vaultTokenContract.decimals(); + TokenInterface underlyingTokenContract = TokenInterface( + _underlyingToken + ); + + _shareAmt = _shareAmt == uint256(-1) + ? vaultTokenContract.balanceOf(address(this)) + : _shareAmt; + + uint256 _minUnderlyingAmt = convert18ToDec( + _vaultShareDecimal, + wmul(minTokenPerShares, _shareAmt) + ); + + uint256 _initalUnderlyingBal = IERC20(_underlyingToken).balanceOf( + to + ); + + vaultTokenContract.redeem(_shareAmt, to, address(this)); + + uint256 _finalUnderlyingBal = IERC20(_underlyingToken).balanceOf( + to + ); + + require( + _minUnderlyingAmt <= sub(_finalUnderlyingBal, _initalUnderlyingBal), + "_minUnderlyingAmt-exceeds" + ); + setUint(setId, _shareAmt); + + _eventName = "LogRedeem(address,uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + token, + _shareAmt, + minTokenPerShares, + to, + getId, + setId + ); + } +} + +contract ConnectV2BasicERC4626 is BasicConnector { + string public constant name = "BASIC-ERC4626-v1.0"; +}