From 36e3d9a0a3d695767fc2c13e34e553344d067b71 Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Mon, 21 Aug 2023 17:53:00 +0530
Subject: [PATCH] feat: Update function calculations

---
 .../connectors/basic-ERC4626/events.sol       |   6 +-
 .../mainnet/connectors/basic-ERC4626/main.sol | 176 ++++++++++--------
 2 files changed, 108 insertions(+), 74 deletions(-)

diff --git a/contracts/mainnet/connectors/basic-ERC4626/events.sol b/contracts/mainnet/connectors/basic-ERC4626/events.sol
index 1657f29c..e3117895 100644
--- a/contracts/mainnet/connectors/basic-ERC4626/events.sol
+++ b/contracts/mainnet/connectors/basic-ERC4626/events.sol
@@ -6,6 +6,7 @@ contract Events {
 		address indexed token,
 		uint256 underlyingAmt,
 		uint256 minSharesPerToken,
+		uint256 sharesReceieved,
 		uint256 getId,
 		uint256 setId
 	);
@@ -14,6 +15,7 @@ contract Events {
 		address indexed token,
 		uint256 shareAmt,
 		uint256 maxTokenPerShares,
+		uint256 underlyingTokenAmount,
 		uint256 getId,
 		uint256 setId
 	);
@@ -22,6 +24,7 @@ contract Events {
 		address indexed token,
 		uint256 underlyingAmt,
 		uint256 maxSharesPerToken,
+		uint256 sharedBurned,
 		address indexed to,
 		uint256 getId,
 		uint256 setId
@@ -31,8 +34,9 @@ contract Events {
 		address indexed token,
 		uint256 shareAmt,
 		uint256 minTokenPerShares,
+		uint256 underlyingAmtReceieved,
 		address to,
 		uint256 getId,
 		uint256 setId
 	);
-}
+}
\ No newline at end of file
diff --git a/contracts/mainnet/connectors/basic-ERC4626/main.sol b/contracts/mainnet/connectors/basic-ERC4626/main.sol
index 3b128097..be0f08cf 100644
--- a/contracts/mainnet/connectors/basic-ERC4626/main.sol
+++ b/contracts/mainnet/connectors/basic-ERC4626/main.sol
@@ -17,57 +17,61 @@ 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 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
+	 * @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 token,
+		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(token);
 
-		address _underlyingToken = vaultTokenContract.asset();
-		uint8 _vaultShareDecimal = vaultTokenContract.decimals();
-		TokenInterface underlyingTokenContract = TokenInterface(
-			_underlyingToken
+		IERC4626 vaultTokenContract = IERC4626(vaultToken);
+		TokenInterface _underlyingTokenContract = TokenInterface(
+			vaultTokenContract.asset()
 		);
 
 		_underlyingAmt = _underlyingAmt == uint256(-1)
-			? underlyingTokenContract.balanceOf(address(this))
+			? _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(
-			_vaultShareDecimal,
-			wmul(minSharesPerToken, _underlyingAmt)
+			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, token, _underlyingAmt);
+		approve(_underlyingTokenContract, vaultToken, _underlyingAmt);
 		vaultTokenContract.deposit(_underlyingAmt, address(this));
 
-		uint256 _finalVaultBal = vaultTokenContract.balanceOf(address(this));
-
-		require(
-			_minShares <= sub(_finalVaultBal, _initialVaultBal),
-			"minShares-exceeds"
+		uint256 _sharesReceieved = sub(
+			vaultTokenContract.balanceOf(address(this)),
+			_initialVaultBal
 		);
 
-		setUint(setId, _underlyingAmt);
+		require(_minShares <= _sharesReceieved, "Less shares received");
 
-		_eventName = "LogDeposit(address,uint256,uint256,uint256,uint256)";
+		setUint(setId, _sharesReceieved);
+
+		_eventName = "LogDeposit(address,uint256,uint256,uint256,uint256,uint256)";
 		_eventParam = abi.encode(
-			token,
+			vaultToken,
 			_underlyingAmt,
 			minSharesPerToken,
+			_sharesReceieved,
 			getId,
 			setId
 		);
@@ -76,51 +80,59 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 	/**
 	 * @dev Mint underlying asset to ERC4626 Vault.
 	 * @notice Mints vault shares by minting exactly amount of underlying assets
-	 * @param token ERC4626 Token address.
+	 * @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
+	 * @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 token,
+		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(token);
 
-		address _underlyingToken = vaultTokenContract.asset();
-		uint8 _vaultShareDecimal = vaultTokenContract.decimals();
+		IERC4626 vaultTokenContract = IERC4626(vaultToken);
 		TokenInterface underlyingTokenContract = TokenInterface(
-			_underlyingToken
+			vaultTokenContract.asset()
 		);
 
+		// In vault token decimals
 		_shareAmt = _shareAmt == uint256(-1)
 			? vaultTokenContract.balanceOf(address(this))
 			: _shareAmt;
 
+		// In 18 decimals
 		maxTokenPerShares = convertTo18(
-			_vaultShareDecimal,
-			wmul(maxTokenPerShares, _shareAmt)
+			vaultTokenContract.decimals(),
+			wmul(maxTokenPerShares, _shareAmt) // Returns final amount in the vault token decimals.
 		);
 
-		uint256 _approveUnderlyingTokenAmount = vaultTokenContract.previewMint(
+		// In token decimals
+		maxTokenPerShares = convert18ToDec(
+			underlyingTokenContract.decimals(),
+			maxTokenPerShares
+		);
+
+		// In token decimals
+		uint256 _underlyingTokenAmount = vaultTokenContract.previewMint(
 			_shareAmt
 		);
 
-		uint256 _initalUnderlyingBal = IERC20(_underlyingToken).balanceOf(
+		// In token decimals
+		uint256 _initalUnderlyingBal = underlyingTokenContract.balanceOf(
 			address(this)
 		);
 
-		approve(underlyingTokenContract, token, _approveUnderlyingTokenAmount);
+		approve(underlyingTokenContract, vaultToken, _underlyingTokenAmount);
 
 		vaultTokenContract.mint(_shareAmt, address(this));
 
-		uint256 _finalUnderlyingBal = IERC20(_underlyingToken).balanceOf(
+		// In token decimals
+		uint256 _finalUnderlyingBal = underlyingTokenContract.balanceOf(
 			address(this)
 		);
 
@@ -131,11 +143,12 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 
 		setUint(setId, _shareAmt);
 
-		_eventName = "LogMint(address,uint256,uint256,uint256,uint256)";
+		_eventName = "LogMint(address,uint256,uint256,uint256,uint256,uint256)";
 		_eventParam = abi.encode(
-			token,
+			vaultToken,
 			_shareAmt,
 			maxTokenPerShares,
+			_underlyingTokenAmount,
 			getId,
 			setId
 		);
@@ -144,16 +157,15 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 	/**
 	 * @dev Withdraw underlying asset from ERC4626 Vault.
 	 * @notice Withdraw vault shares with exactly amount of underlying assets
-	 * @param token ERC4626 Token address.
+	 * @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.
+	 * @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 token,
+		address vaultToken,
 		uint256 underlyingAmt,
 		uint256 maxSharesPerToken,
 		address payable to,
@@ -161,41 +173,50 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 		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();
+		IERC4626 vaultTokenContract = IERC4626(vaultToken);
 		TokenInterface underlyingTokenContract = TokenInterface(
-			_underlyingToken
+			vaultTokenContract.asset()
 		);
 
+		// In token decimals
 		_underlyingAmt = _underlyingAmt == uint256(-1)
 			? underlyingTokenContract.balanceOf(address(this))
 			: _underlyingAmt;
 
-		uint256 _maxShares = convert18ToDec(
-			_vaultShareDecimal,
-			wmul(maxSharesPerToken, _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);
 
-		require(
-			_maxShares >= sub(_finalVaultBal, _initialVaultBal),
-			"maxShares-exceeds"
-		);
+		// In vault token decimals
+		uint256 _sharesBurned = sub(_initialVaultBal, _finalVaultBal);
+
+		require(_maxShares >= _sharesBurned, "maxShares-exceeds");
 
 		setUint(setId, _underlyingAmt);
 
-		_eventName = "LogWithdraw(address,uint256,uint256,address,uint256,uint256)";
+		_eventName = "LogWithdraw(address,uint256,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(
-			token,
+			vaultToken,
 			_underlyingAmt,
 			maxSharesPerToken,
+			_sharesBurned,
 			to,
 			getId,
 			setId
@@ -205,16 +226,16 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 	/**
 	 * @dev Redeem underlying asset from ERC4626 Vault.
 	 * @notice Redeem vault shares with exactly amount of underlying assets
-	 * @param token ERC4626 Token address.
+	 * @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.
+	 * @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 token,
+		address vaultToken,
 		uint256 shareAmt,
 		uint256 minTokenPerShares,
 		address payable to,
@@ -222,44 +243,53 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 		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();
+		IERC4626 vaultTokenContract = IERC4626(vaultToken);
 		TokenInterface underlyingTokenContract = TokenInterface(
-			_underlyingToken
+			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(
-			_vaultShareDecimal,
-			wmul(minTokenPerShares, _shareAmt)
-		);
-				
-		uint256 _initalUnderlyingBal = IERC20(_underlyingToken).balanceOf(
-			to
+			underlyingTokenContract.decimals(),
+			wmul(minTokenPerShares, _shareAmt) // In 18 decimals
 		);
 
+		// In token decimals
+		uint256 _initalUnderlyingBal = underlyingTokenContract.balanceOf(to);
+
 		vaultTokenContract.redeem(_shareAmt, to, address(this));
 
-		uint256 _finalUnderlyingBal = IERC20(_underlyingToken).balanceOf(
-			to
+		// In token decimals
+		uint256 _finalUnderlyingBal = underlyingTokenContract.balanceOf(to);
+
+		// In token decimals
+		uint256 _underlyingAmtReceieved = sub(
+			_finalUnderlyingBal,
+			_initalUnderlyingBal
 		);
 
 		require(
-			_minUnderlyingAmt <= sub(_finalUnderlyingBal, _initalUnderlyingBal),
+			_minUnderlyingAmt <= _underlyingAmtReceieved,
 			"_minUnderlyingAmt-exceeds"
 		);
+
 		setUint(setId, _shareAmt);
 
-		_eventName = "LogRedeem(address,uint256,uint256,address,uint256,uint256)";
+		_eventName = "LogRedeem(address,uint256,uint256,uint256,address,uint256,uint256)";
 		_eventParam = abi.encode(
-			token,
+			vaultToken,
 			_shareAmt,
 			minTokenPerShares,
+			_underlyingAmtReceieved,
 			to,
 			getId,
 			setId
@@ -269,4 +299,4 @@ abstract contract BasicConnector is Events, DSMath, Basic {
 
 contract ConnectV2BasicERC4626 is BasicConnector {
 	string public constant name = "BASIC-ERC4626-v1.0";
-}
+}
\ No newline at end of file