From 2ca1435228509986db92fa701e22e8ec9e2aeee3 Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:27:47 -0400 Subject: [PATCH] fix morpho swap rounding --- .../evm/morpho/MorphoERC4626SwapConnectors.cdc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cadence/contracts/connectors/evm/morpho/MorphoERC4626SwapConnectors.cdc b/cadence/contracts/connectors/evm/morpho/MorphoERC4626SwapConnectors.cdc index da1d287..4bcad36 100644 --- a/cadence/contracts/connectors/evm/morpho/MorphoERC4626SwapConnectors.cdc +++ b/cadence/contracts/connectors/evm/morpho/MorphoERC4626SwapConnectors.cdc @@ -178,10 +178,19 @@ access(all) contract MorphoERC4626SwapConnectors { } access(self) fun quoteRequiredSharesForAssets(desiredAssets: UFix64): {DeFiActions.Quote} { - let desiredAssetsEVM = FlowEVMBridgeUtils.convertCadenceAmountToERC20Amount( + let assetDecimals = FlowEVMBridgeUtils.getTokenDecimals(evmContractAddress: self.assetEVMAddress) + let desiredAssetsEVMFloor = FlowEVMBridgeUtils.convertCadenceAmountToERC20Amount( desiredAssets, erc20Address: self.assetEVMAddress ) + // Round up if the asset's EVM decimal precision is less than Cadence's 8 decimals. + // Truncation would cause the returned shares to produce less than desiredAssets when + // redeemed (since redeem is floor-rounding). Ceiling the EVM amount ensures the shares + // from previewWithdraw(ceil) will produce >= desiredAssets on redemption. + let desiredAssetsFloorBack = EVMAmountUtils.toCadenceOut(desiredAssetsEVMFloor, decimals: assetDecimals) + let desiredAssetsEVM = desiredAssetsFloorBack < desiredAssets + ? desiredAssetsEVMFloor + 1 + : desiredAssetsEVMFloor if let requiredSharesEVM = ERC4626Utils.previewWithdraw(vault: self.vaultEVMAddress, assets: desiredAssetsEVM) { if !self.canServiceRedemption(assetsEVM: desiredAssetsEVM) {