diff --git a/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts b/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts index f71190c0b0..02e591f453 100644 --- a/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts +++ b/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts @@ -1,9 +1,8 @@ +import { reportPermitWithDefaultSigner } from '@cowprotocol/common-utils' import { OrderClass } from '@cowprotocol/cow-sdk' -import { PERMIT_SIGNER, isSupportedPermitInfo } from '@cowprotocol/permit-utils' +import { isSupportedPermitInfo } from '@cowprotocol/permit-utils' import { Percent } from '@uniswap/sdk-core' -import * as Sentry from '@sentry/browser' - import { PriceImpact } from 'legacy/hooks/usePriceImpact' import { partialOrderUpdate } from 'legacy/state/orders/utils' import { signAndPostOrder } from 'legacy/utils/trade' @@ -13,6 +12,7 @@ import { PriceImpactDeclineError, TradeFlowContext } from 'modules/limitOrders/s import { LimitOrdersSettingsState } from 'modules/limitOrders/state/limitOrdersSettingsAtom' import { calculateLimitOrdersDeadline } from 'modules/limitOrders/utils/calculateLimitOrdersDeadline' import { handlePermit } from 'modules/permit' +import { appDataContainsPermitSigner } from 'modules/permit/utils/appDataContainsPermitSigner' import { presignOrderStep } from 'modules/swap/services/swapFlow/steps/presignOrderStep' import { addPendingOrderStep } from 'modules/trade/utils/addPendingOrderStep' import { SwapFlowAnalyticsContext, tradeFlowAnalytics } from 'modules/trade/utils/analytics' @@ -70,12 +70,8 @@ export async function tradeFlow( generatePermitHook, }) - if (postOrderParams.appData.fullAppData.includes(PERMIT_SIGNER.address)) { - // report this to sentry if we ever use the default signer in the permit - Sentry.captureException('User signed the permit using PERMIT_SIGNER instead of their account', { - tags: { errorType: 'permitWithDefaultSigner' }, - contexts: { params: { account } }, - }) + if (appDataContainsPermitSigner(postOrderParams.appData.fullAppData)) { + reportPermitWithDefaultSigner(postOrderParams) } logTradeFlow('LIMIT ORDER FLOW', 'STEP 3: send transaction') diff --git a/apps/cowswap-frontend/src/modules/permit/utils/appDataContainsPermitSigner.ts b/apps/cowswap-frontend/src/modules/permit/utils/appDataContainsPermitSigner.ts new file mode 100644 index 0000000000..2d9ae0a65d --- /dev/null +++ b/apps/cowswap-frontend/src/modules/permit/utils/appDataContainsPermitSigner.ts @@ -0,0 +1,11 @@ +import { PERMIT_SIGNER } from '@cowprotocol/permit-utils' + +export function appDataContainsPermitSigner(fullAppData: string | undefined): boolean { + if (!fullAppData) { + return false + } + + const signerAddressWithoutPrefix = PERMIT_SIGNER.address.slice(2).toLowerCase() + + return fullAppData.toLowerCase().includes(signerAddressWithoutPrefix) +} diff --git a/apps/cowswap-frontend/src/modules/swap/services/swapFlow/index.ts b/apps/cowswap-frontend/src/modules/swap/services/swapFlow/index.ts index a329f86e8d..967baa107d 100644 --- a/apps/cowswap-frontend/src/modules/swap/services/swapFlow/index.ts +++ b/apps/cowswap-frontend/src/modules/swap/services/swapFlow/index.ts @@ -1,3 +1,4 @@ +import { reportPermitWithDefaultSigner } from '@cowprotocol/common-utils' import { isSupportedPermitInfo } from '@cowprotocol/permit-utils' import { Percent } from '@uniswap/sdk-core' @@ -6,6 +7,7 @@ import { partialOrderUpdate } from 'legacy/state/orders/utils' import { signAndPostOrder } from 'legacy/utils/trade' import { handlePermit } from 'modules/permit' +import { appDataContainsPermitSigner } from 'modules/permit/utils/appDataContainsPermitSigner' import { addPendingOrderStep } from 'modules/trade/utils/addPendingOrderStep' import { tradeFlowAnalytics } from 'modules/trade/utils/analytics' import { logTradeFlow } from 'modules/trade/utils/logger' @@ -36,6 +38,11 @@ export async function swapFlow( permitInfo: input.permitInfo, generatePermitHook: input.generatePermitHook, }) + + if (appDataContainsPermitSigner(input.orderParams.appData.fullAppData)) { + reportPermitWithDefaultSigner(input.orderParams) + } + input.swapConfirmManager.permitSigned() logTradeFlow('SWAP FLOW', 'STEP 3: send transaction') diff --git a/libs/common-utils/src/index.ts b/libs/common-utils/src/index.ts index df46c8af6f..faa051e848 100644 --- a/libs/common-utils/src/index.ts +++ b/libs/common-utils/src/index.ts @@ -52,3 +52,4 @@ export * from './maxAmountSpend' export * from './getWrappedToken' export * from './capitalizeFirstLetter' export * from './jotai/atomWithPartialUpdate' +export * from './sentry' diff --git a/libs/common-utils/src/sentry.ts b/libs/common-utils/src/sentry.ts new file mode 100644 index 0000000000..7f6e0f7098 --- /dev/null +++ b/libs/common-utils/src/sentry.ts @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/browser' + +export function reportPermitWithDefaultSigner(params: Record): void { + // report this to sentry if we ever use the default signer in the permit + Sentry.captureException('User signed the permit using PERMIT_SIGNER instead of their account', { + tags: { errorType: 'permitWithDefaultSigner' }, + contexts: { params }, + }) +}