From 07ba62007518aa89c056d54b6c870842aa2dc3b2 Mon Sep 17 00:00:00 2001 From: Martin Grabina Date: Fri, 27 Feb 2026 12:44:55 -0300 Subject: [PATCH 1/2] fix: swap beforeNetworkCosts/afterNetworkCosts for cow-sdk v7.3.8 upgrade cow-sdk v7.3.5+ (sdk-order-book v1.0.0, PR #800) fixed a naming bug where beforeNetworkCosts and afterNetworkCosts had inverted semantics for SELL orders. The API returns sellAmount already after network costs for SELL orders, but the old SDK labeled it as "before". Swaps all beforeNetworkCosts/afterNetworkCosts references to match the corrected semantics and bumps cow-sdk from 7.3.4 to 7.3.8. Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- .../Swap/helpers/cow/rates.helpers.ts | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 6415393245..1b5f22643e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@aave/react": "^0.8.2", "@amplitude/analytics-browser": "^2.13.0", "@bgd-labs/aave-address-book": "^4.44.22", - "@cowprotocol/cow-sdk": "7.3.4", + "@cowprotocol/cow-sdk": "7.3.8", "@cowprotocol/sdk-ethers-v5-adapter": "0.3.5", "@cowprotocol/sdk-flash-loans": "1.7.4", "@emotion/cache": "11.10.3", diff --git a/src/components/transactions/Swap/helpers/cow/rates.helpers.ts b/src/components/transactions/Swap/helpers/cow/rates.helpers.ts index a433249e5b..f0012d786e 100644 --- a/src/components/transactions/Swap/helpers/cow/rates.helpers.ts +++ b/src/components/transactions/Swap/helpers/cow/rates.helpers.ts @@ -194,17 +194,19 @@ export async function getCowProtocolSellRates({ if (invertedQuoteRoute) { // Calculate Amounts + // Note: beforeNetworkCosts/afterNetworkCosts were swapped in cow-sdk v7.3.5+ + // (sdk-order-book v1.0.0) to fix a naming bug where the semantics were inverted. const srcSpotAmount = side === 'sell' - ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString(); + ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString() + : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString(); const srcSpotUSD = BigNumber(destTokenPriceUsd) .multipliedBy(BigNumber(srcSpotAmount).dividedBy(10 ** destDecimals)) .toString(); const destSpotAmount = side === 'sell' - ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString(); + ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString() + : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString(); const destSpotUSD = BigNumber(srcTokenPriceUsd) .multipliedBy(BigNumber(destSpotAmount).dividedBy(10 ** srcDecimals)) .toString(); @@ -236,17 +238,19 @@ export async function getCowProtocolSellRates({ }; } else { // Calculate Amounts + // Note: beforeNetworkCosts/afterNetworkCosts were swapped in cow-sdk v7.3.5+ + // (sdk-order-book v1.0.0) to fix a naming bug where the semantics were inverted. const srcSpotAmount = orderBookQuote.quoteResults.orderToSign.kind === OrderKind.SELL - ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString(); + ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString() + : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString(); const srcSpotUSD = BigNumber(srcTokenPriceUsd) .multipliedBy(BigNumber(srcSpotAmount).dividedBy(10 ** srcDecimals)) .toString(); const destSpotAmount = orderBookQuote.quoteResults.orderToSign.kind === OrderKind.SELL - ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString(); + ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString() + : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString(); const destSpotUSD = BigNumber(destTokenPriceUsd) .multipliedBy(BigNumber(destSpotAmount).dividedBy(10 ** destDecimals)) .toString(); From a9729ee0f0df18a2aedf0706a1b2236c1640c7cd Mon Sep 17 00:00:00 2001 From: Martin Grabina Date: Fri, 27 Feb 2026 12:53:35 -0300 Subject: [PATCH 2/2] fix: only swap network cost fields for SELL orders, update lockfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The naming bug in cow-sdk only affected SELL order semantics — BUY orders had correct field mapping in both old and new SDK. After correcting only SELL, both order kinds resolve to the same fields (beforeNetworkCosts for src, afterNetworkCosts for dest), so the ternaries are removed. Also regenerates yarn.lock for cow-sdk 7.3.8. Co-Authored-By: Claude Opus 4.6 --- .../Swap/helpers/cow/rates.helpers.ts | 26 ++---- yarn.lock | 93 ++++++++++++++++--- 2 files changed, 91 insertions(+), 28 deletions(-) diff --git a/src/components/transactions/Swap/helpers/cow/rates.helpers.ts b/src/components/transactions/Swap/helpers/cow/rates.helpers.ts index f0012d786e..3343ad5afc 100644 --- a/src/components/transactions/Swap/helpers/cow/rates.helpers.ts +++ b/src/components/transactions/Swap/helpers/cow/rates.helpers.ts @@ -194,19 +194,16 @@ export async function getCowProtocolSellRates({ if (invertedQuoteRoute) { // Calculate Amounts - // Note: beforeNetworkCosts/afterNetworkCosts were swapped in cow-sdk v7.3.5+ - // (sdk-order-book v1.0.0) to fix a naming bug where the semantics were inverted. + // cow-sdk v7.3.5+ (sdk-order-book v1.0.0) fixed a naming bug where + // beforeNetworkCosts/afterNetworkCosts were inverted for SELL orders. + // After the fix, both SELL and BUY resolve to the same fields. const srcSpotAmount = - side === 'sell' - ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString(); + orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString(); const srcSpotUSD = BigNumber(destTokenPriceUsd) .multipliedBy(BigNumber(srcSpotAmount).dividedBy(10 ** destDecimals)) .toString(); const destSpotAmount = - side === 'sell' - ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString(); + orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString(); const destSpotUSD = BigNumber(srcTokenPriceUsd) .multipliedBy(BigNumber(destSpotAmount).dividedBy(10 ** srcDecimals)) .toString(); @@ -238,19 +235,16 @@ export async function getCowProtocolSellRates({ }; } else { // Calculate Amounts - // Note: beforeNetworkCosts/afterNetworkCosts were swapped in cow-sdk v7.3.5+ - // (sdk-order-book v1.0.0) to fix a naming bug where the semantics were inverted. + // cow-sdk v7.3.5+ (sdk-order-book v1.0.0) fixed a naming bug where + // beforeNetworkCosts/afterNetworkCosts were inverted for SELL orders. + // After the fix, both SELL and BUY resolve to the same fields. const srcSpotAmount = - orderBookQuote.quoteResults.orderToSign.kind === OrderKind.SELL - ? orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.sellAmount.toString(); + orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.sellAmount.toString(); const srcSpotUSD = BigNumber(srcTokenPriceUsd) .multipliedBy(BigNumber(srcSpotAmount).dividedBy(10 ** srcDecimals)) .toString(); const destSpotAmount = - orderBookQuote.quoteResults.orderToSign.kind === OrderKind.SELL - ? orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString() - : orderBookQuote.quoteResults.amountsAndCosts.beforeNetworkCosts.buyAmount.toString(); + orderBookQuote.quoteResults.amountsAndCosts.afterNetworkCosts.buyAmount.toString(); const destSpotUSD = BigNumber(destTokenPriceUsd) .multipliedBy(BigNumber(destSpotAmount).dividedBy(10 ** destDecimals)) .toString(); diff --git a/yarn.lock b/yarn.lock index a30c2701d3..88f2b0e236 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1390,18 +1390,18 @@ dependencies: chalk "^4.1.0" -"@cowprotocol/cow-sdk@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@cowprotocol/cow-sdk/-/cow-sdk-7.3.4.tgz#cdc4bb406cf3b21094fca9cc89e36cf3408af772" - integrity sha512-3ckIwrG7UV8jwe2D0UL7h9hLJDyS9cYJEEToFqMcarO1GcPUH8VA8p0g5XCy0MM8Kcp14kXA/aZ1seUPS8c15Q== - dependencies: - "@cowprotocol/sdk-app-data" "4.6.2" - "@cowprotocol/sdk-common" "0.5.4" - "@cowprotocol/sdk-config" "0.7.3" - "@cowprotocol/sdk-contracts-ts" "1.4.2" - "@cowprotocol/sdk-order-book" "0.6.3" - "@cowprotocol/sdk-order-signing" "0.1.30" - "@cowprotocol/sdk-trading" "0.10.0" +"@cowprotocol/cow-sdk@7.3.8": + version "7.3.8" + resolved "https://registry.yarnpkg.com/@cowprotocol/cow-sdk/-/cow-sdk-7.3.8.tgz#b5911a709bc096e6f0bcd8bd87dc97fe600de616" + integrity sha512-ziY6vnvRYMqKfnOyONO8IabKTlVyCVsu5Iw84TyZKrx3BAjDIcuwFdlYxNVNXxyn3NPHru6t7NSJjrptSqZLLA== + dependencies: + "@cowprotocol/sdk-app-data" "4.6.5" + "@cowprotocol/sdk-common" "0.6.2" + "@cowprotocol/sdk-config" "0.8.1" + "@cowprotocol/sdk-contracts-ts" "1.6.1" + "@cowprotocol/sdk-order-book" "1.0.0" + "@cowprotocol/sdk-order-signing" "0.1.34" + "@cowprotocol/sdk-trading" "1.0.0" "@cowprotocol/sdk-app-data@4.6.2": version "4.6.2" @@ -1415,6 +1415,18 @@ json-stringify-deterministic "^1.0.8" multiformats "^9.6.4" +"@cowprotocol/sdk-app-data@4.6.5": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-app-data/-/sdk-app-data-4.6.5.tgz#b202913b0593214e2012f2e570bb73699e630a8b" + integrity sha512-0ww6vtJ13SOoHA8YIX/DXzswteYnD1w7McQO/t4TsYGXIhrfwSj1aV5hBscp+Nkyvrh9CSwGQfBWWMs2BhPq9g== + dependencies: + "@cowprotocol/sdk-common" "0.6.2" + ajv "^8.11.0" + cross-fetch "^3.1.5" + ipfs-only-hash "^4.0.0" + json-stringify-deterministic "^1.0.8" + multiformats "^9.6.4" + "@cowprotocol/sdk-common@0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-common/-/sdk-common-0.5.4.tgz#4792030fee1297d33c70afd027c87bbbbb06197b" @@ -1422,6 +1434,13 @@ dependencies: "@cowprotocol/sdk-config" "0.7.3" +"@cowprotocol/sdk-common@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-common/-/sdk-common-0.6.2.tgz#21738c0b7c7100eb8bbd99bd7b98b0c429dba6ee" + integrity sha512-zoifb8uzi1b8jQh7SidMx3iqRIlL+eu38MzmGIOtcO10oDNEgu8ved479baLdclu+uXb0soutOjAYLj0TAIEFA== + dependencies: + "@cowprotocol/sdk-config" "0.8.1" + "@cowprotocol/sdk-config@0.7.3": version "0.7.3" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-config/-/sdk-config-0.7.3.tgz#e60f599e535629fcb1f2fc3c1ead982bb9bc0b0d" @@ -1430,6 +1449,14 @@ exponential-backoff "^3.1.1" limiter "^2.1.0" +"@cowprotocol/sdk-config@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-config/-/sdk-config-0.8.1.tgz#90515cfba8c6dfdb172b665882779b082396efcc" + integrity sha512-gKrILavzbIYkvju0Ko58KAw5b+YM6RN7MYfk7qND9RkGi1E99gHOgfgwp9hWvNhlXf2V/ltM0INl5OV2tQuMKg== + dependencies: + exponential-backoff "^3.1.1" + limiter "^2.1.0" + "@cowprotocol/sdk-contracts-ts@1.4.2": version "1.4.2" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-contracts-ts/-/sdk-contracts-ts-1.4.2.tgz#f90729e9dfe5680da88955771c7dac1fa3dc300b" @@ -1438,6 +1465,14 @@ "@cowprotocol/sdk-common" "0.5.4" "@cowprotocol/sdk-config" "0.7.3" +"@cowprotocol/sdk-contracts-ts@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-contracts-ts/-/sdk-contracts-ts-1.6.1.tgz#bfd2b493c58f6d5166c5484bfe69af3464e1658a" + integrity sha512-nKIYU0dI88pruZdflMwsdLm1xQWwJ+E+GXuBiIbisZEf632ONMFJKlF2d72d3xWP4rvRyeWjnek2K3K87QOSOg== + dependencies: + "@cowprotocol/sdk-common" "0.6.2" + "@cowprotocol/sdk-config" "0.8.1" + "@cowprotocol/sdk-ethers-v5-adapter@0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-ethers-v5-adapter/-/sdk-ethers-v5-adapter-0.3.5.tgz#0e72e734495f0aaa593b0073d09dcd5e6621ddc0" @@ -1468,6 +1503,17 @@ exponential-backoff "^3.1.2" limiter "^3.0.0" +"@cowprotocol/sdk-order-book@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-order-book/-/sdk-order-book-1.0.0.tgz#34dccaef736fbd97e6ec1a2d205cf07b027203a1" + integrity sha512-qDxiI/kJq6JjYkbjh8/u9X3N5h5kJvZ0F0+KN7snk4x0IjiYnb0I5ETXYFFkNsnko5qBGI9wVhvTfE6EHuqPjA== + dependencies: + "@cowprotocol/sdk-common" "0.6.2" + "@cowprotocol/sdk-config" "0.8.1" + cross-fetch "^3.2.0" + exponential-backoff "^3.1.2" + limiter "^3.0.0" + "@cowprotocol/sdk-order-signing@0.1.30": version "0.1.30" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-order-signing/-/sdk-order-signing-0.1.30.tgz#ff80e7d2a5f1da1ef42b74ec92ed937425193eb9" @@ -1478,6 +1524,16 @@ "@cowprotocol/sdk-contracts-ts" "1.4.2" "@cowprotocol/sdk-order-book" "0.6.3" +"@cowprotocol/sdk-order-signing@0.1.34": + version "0.1.34" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-order-signing/-/sdk-order-signing-0.1.34.tgz#cb191cdde04b508d98e5605d367985381a4322ea" + integrity sha512-jUnxoo2ovff15RZUgE+hefe5Enql/r8R9vhspRYAt7m5VW6/6CcI3G0/n2KV1wsiqssMEp/QB8HVlC1AtAQ6dg== + dependencies: + "@cowprotocol/sdk-common" "0.6.2" + "@cowprotocol/sdk-config" "0.8.1" + "@cowprotocol/sdk-contracts-ts" "1.6.1" + "@cowprotocol/sdk-order-book" "1.0.0" + "@cowprotocol/sdk-trading@0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-trading/-/sdk-trading-0.10.0.tgz#c88b8062b93d99d47f26cc3635f7ae230f8f46ae" @@ -1491,6 +1547,19 @@ "@cowprotocol/sdk-order-signing" "0.1.30" deepmerge "^4.3.1" +"@cowprotocol/sdk-trading@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cowprotocol/sdk-trading/-/sdk-trading-1.0.0.tgz#3739a8ee1ac793b963d0858fc1953bd394dd44cb" + integrity sha512-iQPA3Fv2eu9jlTD0/YKWGTm425JWhjveSpk9UVYWkK0tP3F/SIAg39DgZv/V3Kd34Z4cnNjRb5mIhFz1v+vVMA== + dependencies: + "@cowprotocol/sdk-app-data" "4.6.5" + "@cowprotocol/sdk-common" "0.6.2" + "@cowprotocol/sdk-config" "0.8.1" + "@cowprotocol/sdk-contracts-ts" "1.6.1" + "@cowprotocol/sdk-order-book" "1.0.0" + "@cowprotocol/sdk-order-signing" "0.1.34" + deepmerge "^4.3.1" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"