@metamask-previews/transaction-pay-controller 19.0.0-preview-51571fe → 19.0.0-preview-27fa5d81d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,10 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Changed
11
-
12
- - Add route-based `confirmations_pay` strategy resolution ([#8282](https://github.com/MetaMask/core/pull/8282))
13
-
14
10
  ## [19.0.0]
15
11
 
16
12
  ### Added
@@ -200,10 +200,8 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
200
200
  const strategyCandidates = __classPrivateFieldGet(this, _TransactionPayController_getStrategies, "f")?.call(this, transaction) ??
201
201
  (__classPrivateFieldGet(this, _TransactionPayController_getStrategy, "f") ? [__classPrivateFieldGet(this, _TransactionPayController_getStrategy, "f").call(this, transaction)] : []);
202
202
  const validStrategies = strategyCandidates.filter((strategy) => (0, constants_1.isTransactionPayStrategy)(strategy));
203
- if (validStrategies.length) {
204
- return validStrategies;
205
- }
206
- const paymentToken = this.state.transactionData[transaction.id]?.paymentToken;
207
- return (0, feature_flags_1.getStrategyOrder)(this.messenger, paymentToken?.chainId, paymentToken?.address, transaction.type);
203
+ return validStrategies.length
204
+ ? validStrategies
205
+ : (0, feature_flags_1.getStrategyOrder)(this.messenger);
208
206
  };
209
207
  //# sourceMappingURL=TransactionPayController.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAkBP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CA8FlE"}
1
+ {"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAkBP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CAoFlE"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAkBP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CA8FlE"}
1
+ {"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IAkBP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CAoFlE"}
@@ -197,10 +197,8 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
197
197
  const strategyCandidates = __classPrivateFieldGet(this, _TransactionPayController_getStrategies, "f")?.call(this, transaction) ??
198
198
  (__classPrivateFieldGet(this, _TransactionPayController_getStrategy, "f") ? [__classPrivateFieldGet(this, _TransactionPayController_getStrategy, "f").call(this, transaction)] : []);
199
199
  const validStrategies = strategyCandidates.filter((strategy) => isTransactionPayStrategy(strategy));
200
- if (validStrategies.length) {
201
- return validStrategies;
202
- }
203
- const paymentToken = this.state.transactionData[transaction.id]?.paymentToken;
204
- return getStrategyOrder(this.messenger, paymentToken?.chainId, paymentToken?.address, transaction.type);
200
+ return validStrategies.length
201
+ ? validStrategies
202
+ : getStrategyOrder(this.messenger);
205
203
  };
206
204
  //# sourceMappingURL=TransactionPayController.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;;;AAK3D,OAAO,EAAE,iBAAiB,EAAE,0CAAsC;AAClE,OAAO,EAAE,kBAAkB,EAAE,2CAAuC;AACpE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACvB,wBAAoB;AACrB,OAAO,EAAE,cAAc,EAAE,qCAAiC;AAW1D,OAAO,EAAE,gBAAgB,EAAE,kCAA8B;AACzD,OAAO,EAAE,YAAY,EAAE,2BAAuB;AAC9C,OAAO,EAAE,mBAAmB,EAAE,mCAA+B;AAC7D,OAAO,EAAE,sBAAsB,EAAE,gCAA4B;AAE7D,MAAM,yBAAyB,GAAG;IAChC,0BAA0B;IAC1B,aAAa;IACb,sBAAsB;IACtB,mBAAmB;IACnB,oBAAoB;CACZ,CAAC;AAEX,MAAM,aAAa,GAAiD;IAClE,eAAe,EAAE;QACf,sBAAsB,EAAE,KAAK;QAC7B,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,GAAkC,EAAE,CAAC,CAAC;IAC5D,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,OAAO,wBAAyB,SAAQ,cAI7C;IAWC,YAAY,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GAC2B;QAChC,KAAK,CAAC;YACJ,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,KAAK,EAAE;SAC1C,CAAC,CAAC;;QAtBI,qEAA4D;QAE5D,wDAEmB;QAEnB,0DAEqB;QAgB5B,uBAAA,IAAI,sDAA6B,wBAAwB,MAAA,CAAC;QAC1D,uBAAA,IAAI,yCAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,2CAAkB,aAAa,MAAA,CAAC;QAEpC,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,sBAAsB,CACpB,SAAS,EACT,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EACtC,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;QAEF,kCAAkC;QAClC,IAAI,cAAc,CAAC;YACjB,aAAa,EAAE,uBAAA,IAAI,gGAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,SAAS;YACT,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAqB,EACrB,QAAmC;QAEnC,uBAAA,IAAI,4FAAuB,MAA3B,IAAI,EAAwB,aAAa,EAAE,CAAC,eAAe,EAAE,EAAE;YAC7D,MAAM,MAAM,GAAG;gBACb,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;gBACxD,QAAQ,EAAE,eAAe,CAAC,QAAQ;aACnC,CAAC;YAEF,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEjB,eAAe,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACjD,eAAe,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YACjD,eAAe,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;YACjE,eAAe,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAkC;QACnD,kBAAkB,CAAC,OAAO,EAAE;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAiC;QACjD,iBAAiB,CAAC,OAAO,EAAE;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAkD;QAErD,OAAO,uBAAA,IAAI,0DAA0B,MAA9B,IAAI,EAA2B,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,WAA4B;QACtC,OAAO,uBAAA,IAAI,gGAA2B,MAA/B,IAAI,EAA4B,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;CAkFF;oVAhFwB,aAAqB;IAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,OAAO,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,6GAGC,aAAqB,EACrB,EAAqD;IAErD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QAClC,IAAI,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,oBAAoB,GAAG,OAAO,EAAE,YAAY,CAAC;QACnD,MAAM,cAAc,GAAG,OAAO,EAAE,MAAM,CAAC;QACvC,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;QACjD,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;QAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,eAAe,CAAC,aAAa,CAAC,GAAG;gBAC/B,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,CAAC;QAEZ,MAAM,qBAAqB,GACzB,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE;YAC1C,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAE;YAC9C,OAAO,CAAC,YAAY,EAAE,OAAO,KAAK,oBAAoB,EAAE,OAAO,CAAC;QAElE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC;QAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;QACnE,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;QAEvE,IACE,qBAAqB;YACrB,cAAc;YACd,eAAe;YACf,kBAAkB,EAClB,CAAC;YACD,mBAAmB,CAAC,aAAa,EAAE,OAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAErE,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,kBAAkB,EAAE,CAAC;QACvB,YAAY,CAAC;YACX,aAAa,EAAE,uBAAA,IAAI,gGAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;YAC1D,aAAa;YACb,qBAAqB,EAAE,uBAAA,IAAI,4FAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC,qHAGC,WAA4B;IAE5B,MAAM,kBAAkB,GACtB,uBAAA,IAAI,+CAAe,EAAE,KAArB,IAAI,EAAkB,WAAW,CAAC;QAClC,CAAC,uBAAA,IAAI,6CAAa,CAAC,CAAC,CAAC,CAAC,uBAAA,IAAI,6CAAa,MAAjB,IAAI,EAAc,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAC/C,CAAC,QAAQ,EAAsC,EAAE,CAC/C,wBAAwB,CAAC,QAAQ,CAAC,CACrC,CAAC;IAEF,OAAO,eAAe,CAAC,MAAM;QAC3B,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n return validStrategies.length\n ? validStrategies\n : getStrategyOrder(this.messenger);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isEIP7702Chain = exports.getAssetsUnifyStateFeature = exports.getSlippage = exports.getGasBuffer = exports.getFallbackGas = exports.getRelayPollingTimeout = exports.getRelayPollingInterval = exports.getRelayOriginGasOverhead = exports.isRelayExecuteEnabled = exports.getPayStrategiesConfig = exports.getFeatureFlags = exports.getStrategy = exports.getStrategyOrder = exports.DEFAULT_STRATEGY_ORDER = exports.DEFAULT_ACROSS_API_BASE = exports.DEFAULT_SLIPPAGE = exports.DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = exports.DEFAULT_RELAY_QUOTE_URL = exports.DEFAULT_RELAY_EXECUTE_URL = exports.DEFAULT_FALLBACK_GAS_MAX = exports.DEFAULT_FALLBACK_GAS_ESTIMATE = exports.DEFAULT_GAS_BUFFER = void 0;
3
+ exports.isEIP7702Chain = exports.getAssetsUnifyStateFeature = exports.getSlippage = exports.getGasBuffer = exports.getFallbackGas = exports.getRelayPollingTimeout = exports.getRelayPollingInterval = exports.getRelayOriginGasOverhead = exports.isRelayExecuteEnabled = exports.getPayStrategiesConfig = exports.getFeatureFlags = exports.getStrategyOrder = exports.DEFAULT_STRATEGY_ORDER = exports.DEFAULT_ACROSS_API_BASE = exports.DEFAULT_SLIPPAGE = exports.DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = exports.DEFAULT_RELAY_QUOTE_URL = exports.DEFAULT_RELAY_EXECUTE_URL = exports.DEFAULT_FALLBACK_GAS_MAX = exports.DEFAULT_FALLBACK_GAS_ESTIMATE = exports.DEFAULT_GAS_BUFFER = void 0;
4
4
  const utils_1 = require("@metamask/utils");
5
5
  const lodash_1 = require("lodash");
6
6
  const constants_1 = require("../constants.cjs");
@@ -19,158 +19,24 @@ exports.DEFAULT_STRATEGY_ORDER = [
19
19
  constants_1.TransactionPayStrategy.Relay,
20
20
  constants_1.TransactionPayStrategy.Across,
21
21
  ];
22
- function normalizeHex(value) {
23
- return value?.toLowerCase();
24
- }
25
- function normalizeStrategy(strategy) {
26
- if (typeof strategy !== 'string') {
27
- return undefined;
28
- }
29
- const normalizedStrategy = strategy.toLowerCase();
30
- return (0, constants_1.isTransactionPayStrategy)(normalizedStrategy)
31
- ? normalizedStrategy
32
- : undefined;
33
- }
34
- function normalizeStrategyList(strategies) {
35
- if (!Array.isArray(strategies)) {
36
- return [];
37
- }
38
- return (0, lodash_1.uniq)(strategies
39
- .map((strategy) => normalizeStrategy(strategy))
40
- .filter((strategy) => strategy !== undefined));
41
- }
42
- function normalizeStrategyOverride(override) {
43
- const chains = Object.entries(override?.chains ?? {}).reduce((result, [chainId, strategies]) => {
44
- const normalizedStrategies = normalizeStrategyList(strategies);
45
- if (normalizedStrategies.length) {
46
- result[normalizeHex(chainId)] = normalizedStrategies;
47
- }
48
- return result;
49
- }, {});
50
- const tokens = Object.entries(override?.tokens ?? {}).reduce((result, [chainId, tokenOverrides]) => {
51
- const normalizedTokenOverrides = Object.entries(tokenOverrides ?? {}).reduce((tokenResult, [tokenAddress, strategies]) => {
52
- const normalizedStrategies = normalizeStrategyList(strategies);
53
- if (normalizedStrategies.length) {
54
- tokenResult[normalizeHex(tokenAddress)] = normalizedStrategies;
55
- }
56
- return tokenResult;
57
- }, {});
58
- if (Object.keys(normalizedTokenOverrides).length) {
59
- result[normalizeHex(chainId)] = normalizedTokenOverrides;
60
- }
61
- return result;
62
- }, {});
63
- const defaultStrategies = normalizeStrategyList(override?.default);
64
- return {
65
- chains,
66
- default: defaultStrategies.length ? defaultStrategies : undefined,
67
- tokens,
68
- };
69
- }
70
- function normalizeStrategyRoutingConfig(featureFlags) {
71
- const strategyOrder = normalizeStrategyList(featureFlags.strategyOrder);
72
- return {
73
- payStrategies: {
74
- across: {
75
- enabled: featureFlags.payStrategies?.across?.enabled ?? false,
76
- },
77
- relay: {
78
- enabled: featureFlags.payStrategies?.relay?.enabled ?? true,
79
- },
80
- },
81
- strategyOverrides: {
82
- default: featureFlags.strategyOverrides?.default
83
- ? normalizeStrategyOverride(featureFlags.strategyOverrides.default)
84
- : undefined,
85
- transactionTypes: Object.entries(featureFlags.strategyOverrides?.transactionTypes ?? {}).reduce((result, [type, override]) => {
86
- result[type] = normalizeStrategyOverride(override);
87
- return result;
88
- }, {}),
89
- },
90
- strategyOrder: strategyOrder.length > 0 ? strategyOrder : [...exports.DEFAULT_STRATEGY_ORDER],
91
- };
92
- }
93
- function getStrategyRoutingConfig(messenger) {
94
- const state = messenger.call('RemoteFeatureFlagController:getState');
95
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay;
96
- return normalizeStrategyRoutingConfig(featureFlags ?? {});
97
- }
98
- function filterEnabledStrategies(strategies, routingConfig) {
99
- return strategies.filter((strategy) => {
100
- if (strategy === constants_1.TransactionPayStrategy.Across) {
101
- return routingConfig.payStrategies.across.enabled;
102
- }
103
- if (strategy === constants_1.TransactionPayStrategy.Relay) {
104
- return routingConfig.payStrategies.relay.enabled;
105
- }
106
- return true;
107
- });
108
- }
109
- function getTokenOverrideStrategies(override, normalizedChainId, normalizedTokenAddress) {
110
- if (!override || !normalizedChainId || !normalizedTokenAddress) {
111
- return undefined;
112
- }
113
- return override.tokens[normalizedChainId]?.[normalizedTokenAddress];
114
- }
115
- function getChainOverrideStrategies(override, normalizedChainId) {
116
- if (!override || !normalizedChainId) {
117
- return undefined;
118
- }
119
- return override.chains[normalizedChainId];
120
- }
121
- function getDefaultOverrideStrategies(override) {
122
- return override?.default;
123
- }
124
22
  /**
125
- * Get ordered list of strategies to try for a route.
23
+ * Get ordered list of strategies to try.
126
24
  *
127
25
  * @param messenger - Controller messenger.
128
- * @param chainId - Optional chain ID used to match route overrides.
129
- * @param tokenAddress - Optional token address used to match route overrides.
130
- * @param transactionType - Optional transaction type used to match route
131
- * overrides.
132
26
  * @returns Ordered strategy list.
133
27
  */
134
- function getStrategyOrder(messenger, chainId, tokenAddress, transactionType) {
135
- const routingConfig = getStrategyRoutingConfig(messenger);
136
- const normalizedChainId = normalizeHex(chainId);
137
- const normalizedTokenAddress = normalizeHex(tokenAddress);
138
- const transactionTypeOverride = transactionType
139
- ? routingConfig.strategyOverrides.transactionTypes[transactionType]
140
- : undefined;
141
- const candidates = [
142
- getTokenOverrideStrategies(transactionTypeOverride, normalizedChainId, normalizedTokenAddress),
143
- getChainOverrideStrategies(transactionTypeOverride, normalizedChainId),
144
- getTokenOverrideStrategies(routingConfig.strategyOverrides.default, normalizedChainId, normalizedTokenAddress),
145
- getChainOverrideStrategies(routingConfig.strategyOverrides.default, normalizedChainId),
146
- getDefaultOverrideStrategies(transactionTypeOverride),
147
- getDefaultOverrideStrategies(routingConfig.strategyOverrides.default),
148
- ];
149
- // Overrides are authoritative. Once a route matches a specific override
150
- // scope, disabled strategies do not inherit candidates from lower-precedence
151
- // scopes.
152
- for (const strategies of candidates) {
153
- if (strategies) {
154
- return filterEnabledStrategies(strategies, routingConfig);
155
- }
28
+ function getStrategyOrder(messenger) {
29
+ const { strategyOrder: strategyPriority } = getFeatureFlagsRaw(messenger);
30
+ if (!Array.isArray(strategyPriority)) {
31
+ return [...exports.DEFAULT_STRATEGY_ORDER];
32
+ }
33
+ const validStrategyPriority = (0, lodash_1.uniq)(strategyPriority.filter((strategy) => (0, constants_1.isTransactionPayStrategy)(strategy)));
34
+ if (!validStrategyPriority.length) {
35
+ return [...exports.DEFAULT_STRATEGY_ORDER];
156
36
  }
157
- return filterEnabledStrategies(routingConfig.strategyOrder, routingConfig);
37
+ return validStrategyPriority;
158
38
  }
159
39
  exports.getStrategyOrder = getStrategyOrder;
160
- /**
161
- * Get the preferred strategy for a route.
162
- *
163
- * @param messenger - Controller messenger.
164
- * @param chainId - Optional chain ID used to match route overrides.
165
- * @param tokenAddress - Optional token address used to match route overrides.
166
- * @param transactionType - Optional transaction type used to match route
167
- * overrides.
168
- * @returns The preferred strategy, if any.
169
- */
170
- function getStrategy(messenger, chainId, tokenAddress, transactionType) {
171
- return getStrategyOrder(messenger, chainId, tokenAddress, transactionType)[0];
172
- }
173
- exports.getStrategy = getStrategy;
174
40
  /**
175
41
  * Get feature flags related to the controller.
176
42
  *
@@ -178,8 +44,7 @@ exports.getStrategy = getStrategy;
178
44
  * @returns Feature flags.
179
45
  */
180
46
  function getFeatureFlags(messenger) {
181
- const state = messenger.call('RemoteFeatureFlagController:getState');
182
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
47
+ const featureFlags = getFeatureFlagsRaw(messenger);
183
48
  const estimate = featureFlags.relayFallbackGas?.estimate ?? exports.DEFAULT_FALLBACK_GAS_ESTIMATE;
184
49
  const max = featureFlags.relayFallbackGas?.max ?? exports.DEFAULT_FALLBACK_GAS_MAX;
185
50
  const relayExecuteUrl = featureFlags.relayExecuteUrl ?? exports.DEFAULT_RELAY_EXECUTE_URL;
@@ -207,8 +72,7 @@ exports.getFeatureFlags = getFeatureFlags;
207
72
  * @returns Pay Strategies configuration.
208
73
  */
209
74
  function getPayStrategiesConfig(messenger) {
210
- const state = messenger.call('RemoteFeatureFlagController:getState');
211
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
75
+ const featureFlags = getFeatureFlagsRaw(messenger);
212
76
  const payStrategies = featureFlags.payStrategies ?? {};
213
77
  const acrossRaw = payStrategies.across ?? {};
214
78
  const relayRaw = payStrategies.relay ?? {};
@@ -236,8 +100,7 @@ exports.getPayStrategiesConfig = getPayStrategiesConfig;
236
100
  * @returns True if the execute flow is enabled.
237
101
  */
238
102
  function isRelayExecuteEnabled(messenger) {
239
- const state = messenger.call('RemoteFeatureFlagController:getState');
240
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
103
+ const featureFlags = getFeatureFlagsRaw(messenger);
241
104
  return featureFlags.payStrategies?.relay?.executeEnabled ?? false;
242
105
  }
243
106
  exports.isRelayExecuteEnabled = isRelayExecuteEnabled;
@@ -249,8 +112,7 @@ exports.isRelayExecuteEnabled = isRelayExecuteEnabled;
249
112
  * @returns Origin gas overhead as a decimal string.
250
113
  */
251
114
  function getRelayOriginGasOverhead(messenger) {
252
- const state = messenger.call('RemoteFeatureFlagController:getState');
253
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
115
+ const featureFlags = getFeatureFlagsRaw(messenger);
254
116
  return (featureFlags.payStrategies?.relay?.originGasOverhead ??
255
117
  exports.DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD);
256
118
  }
@@ -263,8 +125,7 @@ exports.getRelayOriginGasOverhead = getRelayOriginGasOverhead;
263
125
  * @returns Polling interval in milliseconds.
264
126
  */
265
127
  function getRelayPollingInterval(messenger) {
266
- const state = messenger.call('RemoteFeatureFlagController:getState');
267
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
128
+ const featureFlags = getFeatureFlagsRaw(messenger);
268
129
  return (featureFlags.payStrategies?.relay?.pollingInterval ?? constants_2.RELAY_POLLING_INTERVAL);
269
130
  }
270
131
  exports.getRelayPollingInterval = getRelayPollingInterval;
@@ -276,8 +137,7 @@ exports.getRelayPollingInterval = getRelayPollingInterval;
276
137
  * @returns Polling timeout in milliseconds, or undefined when not configured.
277
138
  */
278
139
  function getRelayPollingTimeout(messenger) {
279
- const state = messenger.call('RemoteFeatureFlagController:getState');
280
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
140
+ const featureFlags = getFeatureFlagsRaw(messenger);
281
141
  return featureFlags.payStrategies?.relay?.pollingTimeout;
282
142
  }
283
143
  exports.getRelayPollingTimeout = getRelayPollingTimeout;
@@ -299,8 +159,7 @@ exports.getFallbackGas = getFallbackGas;
299
159
  * @returns Gas buffer value.
300
160
  */
301
161
  function getGasBuffer(messenger, chainId) {
302
- const state = messenger.call('RemoteFeatureFlagController:getState');
303
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
162
+ const featureFlags = getFeatureFlagsRaw(messenger);
304
163
  return (featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??
305
164
  featureFlags.gasBuffer?.default ??
306
165
  exports.DEFAULT_GAS_BUFFER);
@@ -316,8 +175,7 @@ exports.getGasBuffer = getGasBuffer;
316
175
  * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).
317
176
  */
318
177
  function getSlippage(messenger, chainId, tokenAddress) {
319
- const state = messenger.call('RemoteFeatureFlagController:getState');
320
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
178
+ const featureFlags = getFeatureFlagsRaw(messenger);
321
179
  const { slippageTokens } = featureFlags;
322
180
  const tokenMap = getCaseInsensitive(slippageTokens, chainId);
323
181
  const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);
@@ -377,4 +235,14 @@ function isEIP7702Chain(messenger, chainId) {
377
235
  return supportedChains.some((supported) => supported.toLowerCase() === chainId.toLowerCase());
378
236
  }
379
237
  exports.isEIP7702Chain = isEIP7702Chain;
238
+ /**
239
+ * Get the raw feature flags from the remote feature flag controller.
240
+ *
241
+ * @param messenger - Controller messenger.
242
+ * @returns Raw feature flags.
243
+ */
244
+ function getFeatureFlagsRaw(messenger) {
245
+ const state = messenger.call('RemoteFeatureFlagController:getState');
246
+ return state.remoteFeatureFlags.confirmations_pay ?? {};
247
+ }
380
248
  //# sourceMappingURL=feature-flags.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { uniq } from 'lodash';\n\nimport { isTransactionPayStrategy, TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport {\n RELAY_EXECUTE_URL,\n RELAY_POLLING_INTERVAL,\n RELAY_QUOTE_URL,\n} from '../strategy/relay/constants';\nimport type { TransactionPayControllerMessenger } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\ntype StrategyOrder = TransactionPayStrategy[];\n\nexport const DEFAULT_GAS_BUFFER = 1.0;\nexport const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;\nexport const DEFAULT_FALLBACK_GAS_MAX = 1500000;\nexport const DEFAULT_RELAY_EXECUTE_URL = RELAY_EXECUTE_URL;\nexport const DEFAULT_RELAY_QUOTE_URL = RELAY_QUOTE_URL;\nexport const DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = '300000';\nexport const DEFAULT_SLIPPAGE = 0.005;\nexport const DEFAULT_ACROSS_API_BASE = 'https://app.across.to/api';\nexport const DEFAULT_STRATEGY_ORDER: StrategyOrder = [\n TransactionPayStrategy.Relay,\n TransactionPayStrategy.Across,\n];\n\ntype FeatureFlagsRaw = {\n gasBuffer?: {\n default?: number;\n perChainConfig?: Record<\n Hex,\n {\n name?: string;\n buffer?: number;\n }\n >;\n };\n relayDisabledGasStationChains?: Hex[];\n relayExecuteUrl?: string;\n relayFallbackGas?: {\n estimate?: number;\n max?: number;\n };\n relayQuoteUrl?: string;\n slippage?: number;\n slippageTokens?: Record<Hex, Record<Hex, number>>;\n strategyOrder?: string[];\n strategyOverrides?: StrategyOverridesRaw;\n payStrategies?: PayStrategiesConfigRaw;\n};\n\ntype StrategyOverrideRaw = {\n default?: unknown;\n chains?: Record<string, unknown>;\n tokens?: Record<string, Record<string, unknown>>;\n};\n\ntype StrategyOverridesRaw = {\n default?: StrategyOverrideRaw;\n transactionTypes?: Record<string, StrategyOverrideRaw>;\n};\n\ntype StrategyOverride = {\n chains: Record<Hex, TransactionPayStrategy[]>;\n default?: TransactionPayStrategy[];\n tokens: Record<Hex, Record<Hex, TransactionPayStrategy[]>>;\n};\n\ntype StrategyOverrides = {\n default?: StrategyOverride;\n transactionTypes: Record<string, StrategyOverride>;\n};\n\ntype StrategyRoutingConfig = {\n payStrategies: {\n across: {\n enabled: boolean;\n };\n relay: {\n enabled: boolean;\n };\n };\n strategyOverrides: StrategyOverrides;\n strategyOrder: TransactionPayStrategy[];\n};\n\nexport type FeatureFlags = {\n relayDisabledGasStationChains: Hex[];\n relayExecuteUrl: string;\n relayFallbackGas: {\n estimate: number;\n max: number;\n };\n relayQuoteUrl: string;\n slippage: number;\n};\n\nexport type AcrossConfigRaw = {\n apiBase?: string;\n enabled?: boolean;\n fallbackGas?: {\n estimate?: number;\n max?: number;\n };\n};\n\nexport type AcrossConfig = {\n apiBase: string;\n enabled: boolean;\n fallbackGas: {\n estimate: number;\n max: number;\n };\n};\n\nexport type PayStrategiesConfigRaw = {\n across?: AcrossConfigRaw;\n relay?: {\n enabled?: boolean;\n executeEnabled?: boolean;\n originGasOverhead?: string;\n pollingInterval?: number;\n pollingTimeout?: number;\n };\n};\n\nexport type PayStrategiesConfig = {\n across: AcrossConfig;\n relay: {\n enabled: boolean;\n };\n};\n\nfunction normalizeHex(value: string | undefined): Hex | undefined {\n return value?.toLowerCase() as Hex | undefined;\n}\n\nfunction normalizeStrategy(\n strategy: unknown,\n): TransactionPayStrategy | undefined {\n if (typeof strategy !== 'string') {\n return undefined;\n }\n\n const normalizedStrategy = strategy.toLowerCase() as TransactionPayStrategy;\n\n return isTransactionPayStrategy(normalizedStrategy)\n ? normalizedStrategy\n : undefined;\n}\n\nfunction normalizeStrategyList(strategies: unknown): TransactionPayStrategy[] {\n if (!Array.isArray(strategies)) {\n return [];\n }\n\n return uniq(\n strategies\n .map((strategy) => normalizeStrategy(strategy))\n .filter(\n (strategy): strategy is TransactionPayStrategy =>\n strategy !== undefined,\n ),\n );\n}\n\nfunction normalizeStrategyOverride(\n override: StrategyOverrideRaw | undefined,\n): StrategyOverride {\n const chains = Object.entries(override?.chains ?? {}).reduce<\n Record<Hex, TransactionPayStrategy[]>\n >((result, [chainId, strategies]) => {\n const normalizedStrategies = normalizeStrategyList(strategies);\n\n if (normalizedStrategies.length) {\n result[normalizeHex(chainId) as Hex] = normalizedStrategies;\n }\n\n return result;\n }, {});\n\n const tokens = Object.entries(override?.tokens ?? {}).reduce<\n Record<Hex, Record<Hex, TransactionPayStrategy[]>>\n >((result, [chainId, tokenOverrides]) => {\n const normalizedTokenOverrides = Object.entries(\n tokenOverrides ?? {},\n ).reduce<Record<Hex, TransactionPayStrategy[]>>(\n (tokenResult, [tokenAddress, strategies]) => {\n const normalizedStrategies = normalizeStrategyList(strategies);\n\n if (normalizedStrategies.length) {\n tokenResult[normalizeHex(tokenAddress) as Hex] = normalizedStrategies;\n }\n\n return tokenResult;\n },\n {},\n );\n\n if (Object.keys(normalizedTokenOverrides).length) {\n result[normalizeHex(chainId) as Hex] = normalizedTokenOverrides;\n }\n\n return result;\n }, {});\n\n const defaultStrategies = normalizeStrategyList(override?.default);\n\n return {\n chains,\n default: defaultStrategies.length ? defaultStrategies : undefined,\n tokens,\n };\n}\n\nfunction normalizeStrategyRoutingConfig(\n featureFlags: FeatureFlagsRaw,\n): StrategyRoutingConfig {\n const strategyOrder = normalizeStrategyList(featureFlags.strategyOrder);\n\n return {\n payStrategies: {\n across: {\n enabled: featureFlags.payStrategies?.across?.enabled ?? false,\n },\n relay: {\n enabled: featureFlags.payStrategies?.relay?.enabled ?? true,\n },\n },\n strategyOverrides: {\n default: featureFlags.strategyOverrides?.default\n ? normalizeStrategyOverride(featureFlags.strategyOverrides.default)\n : undefined,\n transactionTypes: Object.entries(\n featureFlags.strategyOverrides?.transactionTypes ?? {},\n ).reduce<Record<string, StrategyOverride>>((result, [type, override]) => {\n result[type] = normalizeStrategyOverride(override);\n return result;\n }, {}),\n },\n strategyOrder:\n strategyOrder.length > 0 ? strategyOrder : [...DEFAULT_STRATEGY_ORDER],\n };\n}\n\nfunction getStrategyRoutingConfig(\n messenger: TransactionPayControllerMessenger,\n): StrategyRoutingConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags = state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined;\n\n return normalizeStrategyRoutingConfig(featureFlags ?? {});\n}\n\nfunction filterEnabledStrategies(\n strategies: readonly TransactionPayStrategy[],\n routingConfig: StrategyRoutingConfig,\n): TransactionPayStrategy[] {\n return strategies.filter((strategy) => {\n if (strategy === TransactionPayStrategy.Across) {\n return routingConfig.payStrategies.across.enabled;\n }\n\n if (strategy === TransactionPayStrategy.Relay) {\n return routingConfig.payStrategies.relay.enabled;\n }\n\n return true;\n });\n}\n\nfunction getTokenOverrideStrategies(\n override: StrategyOverride | undefined,\n normalizedChainId: Hex | undefined,\n normalizedTokenAddress: Hex | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n if (!override || !normalizedChainId || !normalizedTokenAddress) {\n return undefined;\n }\n\n return override.tokens[normalizedChainId]?.[normalizedTokenAddress];\n}\n\nfunction getChainOverrideStrategies(\n override: StrategyOverride | undefined,\n normalizedChainId: Hex | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n if (!override || !normalizedChainId) {\n return undefined;\n }\n\n return override.chains[normalizedChainId];\n}\n\nfunction getDefaultOverrideStrategies(\n override: StrategyOverride | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n return override?.default;\n}\n\n/**\n * Get ordered list of strategies to try for a route.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Optional chain ID used to match route overrides.\n * @param tokenAddress - Optional token address used to match route overrides.\n * @param transactionType - Optional transaction type used to match route\n * overrides.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n): StrategyOrder {\n const routingConfig = getStrategyRoutingConfig(messenger);\n const normalizedChainId = normalizeHex(chainId);\n const normalizedTokenAddress = normalizeHex(tokenAddress);\n const transactionTypeOverride = transactionType\n ? routingConfig.strategyOverrides.transactionTypes[transactionType]\n : undefined;\n\n const candidates: (readonly TransactionPayStrategy[] | undefined)[] = [\n getTokenOverrideStrategies(\n transactionTypeOverride,\n normalizedChainId,\n normalizedTokenAddress,\n ),\n getChainOverrideStrategies(transactionTypeOverride, normalizedChainId),\n getTokenOverrideStrategies(\n routingConfig.strategyOverrides.default,\n normalizedChainId,\n normalizedTokenAddress,\n ),\n getChainOverrideStrategies(\n routingConfig.strategyOverrides.default,\n normalizedChainId,\n ),\n getDefaultOverrideStrategies(transactionTypeOverride),\n getDefaultOverrideStrategies(routingConfig.strategyOverrides.default),\n ];\n\n // Overrides are authoritative. Once a route matches a specific override\n // scope, disabled strategies do not inherit candidates from lower-precedence\n // scopes.\n for (const strategies of candidates) {\n if (strategies) {\n return filterEnabledStrategies(strategies, routingConfig);\n }\n }\n\n return filterEnabledStrategies(routingConfig.strategyOrder, routingConfig);\n}\n\n/**\n * Get the preferred strategy for a route.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Optional chain ID used to match route overrides.\n * @param tokenAddress - Optional token address used to match route overrides.\n * @param transactionType - Optional transaction type used to match route\n * overrides.\n * @returns The preferred strategy, if any.\n */\nexport function getStrategy(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n): TransactionPayStrategy | undefined {\n return getStrategyOrder(messenger, chainId, tokenAddress, transactionType)[0];\n}\n\n/**\n * Get feature flags related to the controller.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nexport function getFeatureFlags(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n\n const estimate =\n featureFlags.relayFallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE;\n\n const max = featureFlags.relayFallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX;\n\n const relayExecuteUrl =\n featureFlags.relayExecuteUrl ?? DEFAULT_RELAY_EXECUTE_URL;\n\n const relayQuoteUrl = featureFlags.relayQuoteUrl ?? DEFAULT_RELAY_QUOTE_URL;\n\n const relayDisabledGasStationChains =\n featureFlags.relayDisabledGasStationChains ?? [];\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n\n const result: FeatureFlags = {\n relayDisabledGasStationChains,\n relayExecuteUrl,\n relayFallbackGas: {\n estimate,\n max,\n },\n relayQuoteUrl,\n slippage,\n };\n\n log('Feature flags:', { raw: featureFlags, result });\n\n return result;\n}\n\n/**\n * Get Pay Strategies configuration.\n *\n * @param messenger - Controller messenger.\n * @returns Pay Strategies configuration.\n */\nexport function getPayStrategiesConfig(\n messenger: TransactionPayControllerMessenger,\n): PayStrategiesConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n const payStrategies = featureFlags.payStrategies ?? {};\n\n const acrossRaw = payStrategies.across ?? {};\n const relayRaw = payStrategies.relay ?? {};\n\n const across = {\n apiBase: acrossRaw.apiBase ?? DEFAULT_ACROSS_API_BASE,\n enabled: acrossRaw.enabled ?? false,\n fallbackGas: {\n estimate:\n acrossRaw.fallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE,\n max: acrossRaw.fallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX,\n },\n };\n\n const relay = {\n enabled: relayRaw.enabled ?? true,\n };\n\n return {\n across,\n relay,\n };\n}\n\n/**\n * Whether the Relay /execute gasless flow is enabled.\n *\n * @param messenger - Controller messenger.\n * @returns True if the execute flow is enabled.\n */\nexport function isRelayExecuteEnabled(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return featureFlags.payStrategies?.relay?.executeEnabled ?? false;\n}\n\n/**\n * Get the origin gas overhead to include in Relay quote requests\n * for EIP-7702 chains.\n *\n * @param messenger - Controller messenger.\n * @returns Origin gas overhead as a decimal string.\n */\nexport function getRelayOriginGasOverhead(\n messenger: TransactionPayControllerMessenger,\n): string {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return (\n featureFlags.payStrategies?.relay?.originGasOverhead ??\n DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD\n );\n}\n\n/**\n * Get the relay status polling interval in milliseconds.\n * Falls back to the constant default when not configured.\n *\n * @param messenger - Controller messenger.\n * @returns Polling interval in milliseconds.\n */\nexport function getRelayPollingInterval(\n messenger: TransactionPayControllerMessenger,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return (\n featureFlags.payStrategies?.relay?.pollingInterval ?? RELAY_POLLING_INTERVAL\n );\n}\n\n/**\n * Get the relay status polling timeout in milliseconds.\n * Returns 0 or undefined to indicate no timeout.\n *\n * @param messenger - Controller messenger.\n * @returns Polling timeout in milliseconds, or undefined when not configured.\n */\nexport function getRelayPollingTimeout(\n messenger: TransactionPayControllerMessenger,\n): number | undefined {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return featureFlags.payStrategies?.relay?.pollingTimeout;\n}\n\n/**\n * Get fallback gas limits for quote/submit flows.\n *\n * @param messenger - Controller messenger.\n * @returns Fallback gas limits.\n */\nexport function getFallbackGas(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags['relayFallbackGas'] {\n return getFeatureFlags(messenger).relayFallbackGas;\n}\n\n/**\n * Get the gas buffer value for a specific chain ID.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get gas buffer for.\n * @returns Gas buffer value.\n */\nexport function getGasBuffer(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n\n return (\n featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??\n featureFlags.gasBuffer?.default ??\n DEFAULT_GAS_BUFFER\n );\n}\n\n/**\n * Get the slippage value for a specific chain ID and token address.\n * Falls back to the general slippage feature flag, then the static default.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get slippage for.\n * @param tokenAddress - Token address to get slippage for.\n * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).\n */\nexport function getSlippage(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n tokenAddress: Hex,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n const { slippageTokens } = featureFlags;\n\n const tokenMap = getCaseInsensitive(slippageTokens, chainId);\n const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);\n\n if (tokenSlippage !== undefined) {\n log('Using token-specific slippage', {\n chainId,\n tokenAddress,\n slippage: tokenSlippage,\n });\n return tokenSlippage;\n }\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n log('Using default slippage', { chainId, tokenAddress, slippage });\n return slippage;\n}\n\n/**\n * Get the AssetsUnifyState feature flag state.\n *\n * @param messenger - Controller messenger.\n * @returns True if the assets unify state feature is enabled, false otherwise.\n */\nexport function getAssetsUnifyStateFeature(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const assetsUnifyState = state.remoteFeatureFlags.assetsUnifyState as\n | {\n enabled: boolean;\n featureVersion: string | null;\n }\n | undefined;\n\n const AssetsUnifyStateFeatureVersion = '1';\n\n return (\n Boolean(assetsUnifyState?.enabled) &&\n assetsUnifyState?.featureVersion === AssetsUnifyStateFeatureVersion\n );\n}\n\n/**\n * Get a value from a record using a case-insensitive key lookup.\n *\n * @param record - The record to search.\n * @param key - The key to look up (case-insensitive).\n * @returns The value if found, undefined otherwise.\n */\nfunction getCaseInsensitive<Value>(\n record: Record<string, Value> | undefined,\n key: string,\n): Value | undefined {\n if (!record) {\n return undefined;\n }\n\n const normalizedKey = key.toLowerCase();\n const entry = Object.entries(record).find(\n ([k]) => k.toLowerCase() === normalizedKey,\n );\n\n return entry?.[1];\n}\n\n/**\n * Checks if a chain supports EIP-7702.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to check.\n * @returns Whether the chain supports EIP-7702.\n */\nexport function isEIP7702Chain(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const eip7702Flags = state.remoteFeatureFlags.confirmations_eip_7702 as\n | { supportedChains?: Hex[] }\n | undefined;\n\n const supportedChains = eip7702Flags?.supportedChains ?? [];\n\n return supportedChains.some(\n (supported) => supported.toLowerCase() === chainId.toLowerCase(),\n );\n}\n"]}
1
+ {"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { uniq } from 'lodash';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { isTransactionPayStrategy, TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport {\n RELAY_EXECUTE_URL,\n RELAY_POLLING_INTERVAL,\n RELAY_QUOTE_URL,\n} from '../strategy/relay/constants';\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\ntype StrategyOrder = [TransactionPayStrategy, ...TransactionPayStrategy[]];\n\nexport const DEFAULT_GAS_BUFFER = 1.0;\nexport const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;\nexport const DEFAULT_FALLBACK_GAS_MAX = 1500000;\nexport const DEFAULT_RELAY_EXECUTE_URL = RELAY_EXECUTE_URL;\nexport const DEFAULT_RELAY_QUOTE_URL = RELAY_QUOTE_URL;\nexport const DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = '300000';\nexport const DEFAULT_SLIPPAGE = 0.005;\nexport const DEFAULT_ACROSS_API_BASE = 'https://app.across.to/api';\nexport const DEFAULT_STRATEGY_ORDER: StrategyOrder = [\n TransactionPayStrategy.Relay,\n TransactionPayStrategy.Across,\n];\n\ntype FeatureFlagsRaw = {\n gasBuffer?: {\n default?: number;\n perChainConfig?: Record<\n Hex,\n {\n name?: string;\n buffer?: number;\n }\n >;\n };\n relayDisabledGasStationChains?: Hex[];\n relayExecuteUrl?: string;\n relayFallbackGas?: {\n estimate?: number;\n max?: number;\n };\n relayQuoteUrl?: string;\n slippage?: number;\n slippageTokens?: Record<Hex, Record<Hex, number>>;\n strategyOrder?: string[];\n payStrategies?: PayStrategiesConfigRaw;\n};\n\nexport type FeatureFlags = {\n relayDisabledGasStationChains: Hex[];\n relayExecuteUrl: string;\n relayFallbackGas: {\n estimate: number;\n max: number;\n };\n relayQuoteUrl: string;\n slippage: number;\n};\n\nexport type AcrossConfigRaw = {\n apiBase?: string;\n enabled?: boolean;\n fallbackGas?: {\n estimate?: number;\n max?: number;\n };\n};\n\nexport type AcrossConfig = {\n apiBase: string;\n enabled: boolean;\n fallbackGas: {\n estimate: number;\n max: number;\n };\n};\n\nexport type PayStrategiesConfigRaw = {\n across?: AcrossConfigRaw;\n relay?: {\n enabled?: boolean;\n executeEnabled?: boolean;\n originGasOverhead?: string;\n pollingInterval?: number;\n pollingTimeout?: number;\n };\n};\n\nexport type PayStrategiesConfig = {\n across: AcrossConfig;\n relay: {\n enabled: boolean;\n };\n};\n\n/**\n * Get ordered list of strategies to try.\n *\n * @param messenger - Controller messenger.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n): StrategyOrder {\n const { strategyOrder: strategyPriority } = getFeatureFlagsRaw(messenger);\n\n if (!Array.isArray(strategyPriority)) {\n return [...DEFAULT_STRATEGY_ORDER];\n }\n\n const validStrategyPriority = uniq(\n strategyPriority.filter((strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n ),\n );\n\n if (!validStrategyPriority.length) {\n return [...DEFAULT_STRATEGY_ORDER];\n }\n\n return validStrategyPriority as StrategyOrder;\n}\n\n/**\n * Get feature flags related to the controller.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nexport function getFeatureFlags(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags {\n const featureFlags = getFeatureFlagsRaw(messenger);\n\n const estimate =\n featureFlags.relayFallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE;\n\n const max = featureFlags.relayFallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX;\n\n const relayExecuteUrl =\n featureFlags.relayExecuteUrl ?? DEFAULT_RELAY_EXECUTE_URL;\n\n const relayQuoteUrl = featureFlags.relayQuoteUrl ?? DEFAULT_RELAY_QUOTE_URL;\n\n const relayDisabledGasStationChains =\n featureFlags.relayDisabledGasStationChains ?? [];\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n\n const result: FeatureFlags = {\n relayDisabledGasStationChains,\n relayExecuteUrl,\n relayFallbackGas: {\n estimate,\n max,\n },\n relayQuoteUrl,\n slippage,\n };\n\n log('Feature flags:', { raw: featureFlags, result });\n\n return result;\n}\n\n/**\n * Get Pay Strategies configuration.\n *\n * @param messenger - Controller messenger.\n * @returns Pay Strategies configuration.\n */\nexport function getPayStrategiesConfig(\n messenger: TransactionPayControllerMessenger,\n): PayStrategiesConfig {\n const featureFlags = getFeatureFlagsRaw(messenger);\n const payStrategies = featureFlags.payStrategies ?? {};\n\n const acrossRaw = payStrategies.across ?? {};\n const relayRaw = payStrategies.relay ?? {};\n\n const across = {\n apiBase: acrossRaw.apiBase ?? DEFAULT_ACROSS_API_BASE,\n enabled: acrossRaw.enabled ?? false,\n fallbackGas: {\n estimate:\n acrossRaw.fallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE,\n max: acrossRaw.fallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX,\n },\n };\n\n const relay = {\n enabled: relayRaw.enabled ?? true,\n };\n\n return {\n across,\n relay,\n };\n}\n\n/**\n * Whether the Relay /execute gasless flow is enabled.\n *\n * @param messenger - Controller messenger.\n * @returns True if the execute flow is enabled.\n */\nexport function isRelayExecuteEnabled(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return featureFlags.payStrategies?.relay?.executeEnabled ?? false;\n}\n\n/**\n * Get the origin gas overhead to include in Relay quote requests\n * for EIP-7702 chains.\n *\n * @param messenger - Controller messenger.\n * @returns Origin gas overhead as a decimal string.\n */\nexport function getRelayOriginGasOverhead(\n messenger: TransactionPayControllerMessenger,\n): string {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return (\n featureFlags.payStrategies?.relay?.originGasOverhead ??\n DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD\n );\n}\n\n/**\n * Get the relay status polling interval in milliseconds.\n * Falls back to the constant default when not configured.\n *\n * @param messenger - Controller messenger.\n * @returns Polling interval in milliseconds.\n */\nexport function getRelayPollingInterval(\n messenger: TransactionPayControllerMessenger,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return (\n featureFlags.payStrategies?.relay?.pollingInterval ?? RELAY_POLLING_INTERVAL\n );\n}\n\n/**\n * Get the relay status polling timeout in milliseconds.\n * Returns 0 or undefined to indicate no timeout.\n *\n * @param messenger - Controller messenger.\n * @returns Polling timeout in milliseconds, or undefined when not configured.\n */\nexport function getRelayPollingTimeout(\n messenger: TransactionPayControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return featureFlags.payStrategies?.relay?.pollingTimeout;\n}\n\n/**\n * Get fallback gas limits for quote/submit flows.\n *\n * @param messenger - Controller messenger.\n * @returns Fallback gas limits.\n */\nexport function getFallbackGas(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags['relayFallbackGas'] {\n return getFeatureFlags(messenger).relayFallbackGas;\n}\n\n/**\n * Get the gas buffer value for a specific chain ID.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get gas buffer for.\n * @returns Gas buffer value.\n */\nexport function getGasBuffer(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n\n return (\n featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??\n featureFlags.gasBuffer?.default ??\n DEFAULT_GAS_BUFFER\n );\n}\n\n/**\n * Get the slippage value for a specific chain ID and token address.\n * Falls back to the general slippage feature flag, then the static default.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get slippage for.\n * @param tokenAddress - Token address to get slippage for.\n * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).\n */\nexport function getSlippage(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n tokenAddress: Hex,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n const { slippageTokens } = featureFlags;\n\n const tokenMap = getCaseInsensitive(slippageTokens, chainId);\n const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);\n\n if (tokenSlippage !== undefined) {\n log('Using token-specific slippage', {\n chainId,\n tokenAddress,\n slippage: tokenSlippage,\n });\n return tokenSlippage;\n }\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n log('Using default slippage', { chainId, tokenAddress, slippage });\n return slippage;\n}\n\n/**\n * Get the AssetsUnifyState feature flag state.\n *\n * @param messenger - Controller messenger.\n * @returns True if the assets unify state feature is enabled, false otherwise.\n */\nexport function getAssetsUnifyStateFeature(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const assetsUnifyState = state.remoteFeatureFlags.assetsUnifyState as\n | {\n enabled: boolean;\n featureVersion: string | null;\n }\n | undefined;\n\n const AssetsUnifyStateFeatureVersion = '1';\n\n return (\n Boolean(assetsUnifyState?.enabled) &&\n assetsUnifyState?.featureVersion === AssetsUnifyStateFeatureVersion\n );\n}\n\n/**\n * Get a value from a record using a case-insensitive key lookup.\n *\n * @param record - The record to search.\n * @param key - The key to look up (case-insensitive).\n * @returns The value if found, undefined otherwise.\n */\nfunction getCaseInsensitive<Value>(\n record: Record<string, Value> | undefined,\n key: string,\n): Value | undefined {\n if (!record) {\n return undefined;\n }\n\n const normalizedKey = key.toLowerCase();\n const entry = Object.entries(record).find(\n ([k]) => k.toLowerCase() === normalizedKey,\n );\n\n return entry?.[1];\n}\n\n/**\n * Checks if a chain supports EIP-7702.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to check.\n * @returns Whether the chain supports EIP-7702.\n */\nexport function isEIP7702Chain(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const eip7702Flags = state.remoteFeatureFlags.confirmations_eip_7702 as\n | { supportedChains?: Hex[] }\n | undefined;\n\n const supportedChains = eip7702Flags?.supportedChains ?? [];\n\n return supportedChains.some(\n (supported) => supported.toLowerCase() === chainId.toLowerCase(),\n );\n}\n\n/**\n * Get the raw feature flags from the remote feature flag controller.\n *\n * @param messenger - Controller messenger.\n * @returns Raw feature flags.\n */\nfunction getFeatureFlagsRaw(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlagsRaw {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n return (state.remoteFeatureFlags.confirmations_pay as FeatureFlagsRaw) ?? {};\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { Hex } from "@metamask/utils";
2
+ import type { TransactionPayControllerMessenger } from "../index.cjs";
2
3
  import { TransactionPayStrategy } from "../constants.cjs";
3
- import type { TransactionPayControllerMessenger } from "../types.cjs";
4
- type StrategyOrder = TransactionPayStrategy[];
4
+ type StrategyOrder = [TransactionPayStrategy, ...TransactionPayStrategy[]];
5
5
  export declare const DEFAULT_GAS_BUFFER = 1;
6
6
  export declare const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;
7
7
  export declare const DEFAULT_FALLBACK_GAS_MAX = 1500000;
@@ -54,27 +54,12 @@ export type PayStrategiesConfig = {
54
54
  };
55
55
  };
56
56
  /**
57
- * Get ordered list of strategies to try for a route.
57
+ * Get ordered list of strategies to try.
58
58
  *
59
59
  * @param messenger - Controller messenger.
60
- * @param chainId - Optional chain ID used to match route overrides.
61
- * @param tokenAddress - Optional token address used to match route overrides.
62
- * @param transactionType - Optional transaction type used to match route
63
- * overrides.
64
60
  * @returns Ordered strategy list.
65
61
  */
66
- export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): StrategyOrder;
67
- /**
68
- * Get the preferred strategy for a route.
69
- *
70
- * @param messenger - Controller messenger.
71
- * @param chainId - Optional chain ID used to match route overrides.
72
- * @param tokenAddress - Optional token address used to match route overrides.
73
- * @param transactionType - Optional transaction type used to match route
74
- * overrides.
75
- * @returns The preferred strategy, if any.
76
- */
77
- export declare function getStrategy(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): TransactionPayStrategy | undefined;
62
+ export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger): StrategyOrder;
78
63
  /**
79
64
  * Get feature flags related to the controller.
80
65
  *
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { Hex } from "@metamask/utils";
2
+ import type { TransactionPayControllerMessenger } from "../index.mjs";
2
3
  import { TransactionPayStrategy } from "../constants.mjs";
3
- import type { TransactionPayControllerMessenger } from "../types.mjs";
4
- type StrategyOrder = TransactionPayStrategy[];
4
+ type StrategyOrder = [TransactionPayStrategy, ...TransactionPayStrategy[]];
5
5
  export declare const DEFAULT_GAS_BUFFER = 1;
6
6
  export declare const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;
7
7
  export declare const DEFAULT_FALLBACK_GAS_MAX = 1500000;
@@ -54,27 +54,12 @@ export type PayStrategiesConfig = {
54
54
  };
55
55
  };
56
56
  /**
57
- * Get ordered list of strategies to try for a route.
57
+ * Get ordered list of strategies to try.
58
58
  *
59
59
  * @param messenger - Controller messenger.
60
- * @param chainId - Optional chain ID used to match route overrides.
61
- * @param tokenAddress - Optional token address used to match route overrides.
62
- * @param transactionType - Optional transaction type used to match route
63
- * overrides.
64
60
  * @returns Ordered strategy list.
65
61
  */
66
- export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): StrategyOrder;
67
- /**
68
- * Get the preferred strategy for a route.
69
- *
70
- * @param messenger - Controller messenger.
71
- * @param chainId - Optional chain ID used to match route overrides.
72
- * @param tokenAddress - Optional token address used to match route overrides.
73
- * @param transactionType - Optional transaction type used to match route
74
- * overrides.
75
- * @returns The preferred strategy, if any.
76
- */
77
- export declare function getStrategy(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): TransactionPayStrategy | undefined;
62
+ export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger): StrategyOrder;
78
63
  /**
79
64
  * Get feature flags related to the controller.
80
65
  *
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
@@ -17,155 +17,22 @@ export const DEFAULT_STRATEGY_ORDER = [
17
17
  TransactionPayStrategy.Relay,
18
18
  TransactionPayStrategy.Across,
19
19
  ];
20
- function normalizeHex(value) {
21
- return value?.toLowerCase();
22
- }
23
- function normalizeStrategy(strategy) {
24
- if (typeof strategy !== 'string') {
25
- return undefined;
26
- }
27
- const normalizedStrategy = strategy.toLowerCase();
28
- return isTransactionPayStrategy(normalizedStrategy)
29
- ? normalizedStrategy
30
- : undefined;
31
- }
32
- function normalizeStrategyList(strategies) {
33
- if (!Array.isArray(strategies)) {
34
- return [];
35
- }
36
- return uniq(strategies
37
- .map((strategy) => normalizeStrategy(strategy))
38
- .filter((strategy) => strategy !== undefined));
39
- }
40
- function normalizeStrategyOverride(override) {
41
- const chains = Object.entries(override?.chains ?? {}).reduce((result, [chainId, strategies]) => {
42
- const normalizedStrategies = normalizeStrategyList(strategies);
43
- if (normalizedStrategies.length) {
44
- result[normalizeHex(chainId)] = normalizedStrategies;
45
- }
46
- return result;
47
- }, {});
48
- const tokens = Object.entries(override?.tokens ?? {}).reduce((result, [chainId, tokenOverrides]) => {
49
- const normalizedTokenOverrides = Object.entries(tokenOverrides ?? {}).reduce((tokenResult, [tokenAddress, strategies]) => {
50
- const normalizedStrategies = normalizeStrategyList(strategies);
51
- if (normalizedStrategies.length) {
52
- tokenResult[normalizeHex(tokenAddress)] = normalizedStrategies;
53
- }
54
- return tokenResult;
55
- }, {});
56
- if (Object.keys(normalizedTokenOverrides).length) {
57
- result[normalizeHex(chainId)] = normalizedTokenOverrides;
58
- }
59
- return result;
60
- }, {});
61
- const defaultStrategies = normalizeStrategyList(override?.default);
62
- return {
63
- chains,
64
- default: defaultStrategies.length ? defaultStrategies : undefined,
65
- tokens,
66
- };
67
- }
68
- function normalizeStrategyRoutingConfig(featureFlags) {
69
- const strategyOrder = normalizeStrategyList(featureFlags.strategyOrder);
70
- return {
71
- payStrategies: {
72
- across: {
73
- enabled: featureFlags.payStrategies?.across?.enabled ?? false,
74
- },
75
- relay: {
76
- enabled: featureFlags.payStrategies?.relay?.enabled ?? true,
77
- },
78
- },
79
- strategyOverrides: {
80
- default: featureFlags.strategyOverrides?.default
81
- ? normalizeStrategyOverride(featureFlags.strategyOverrides.default)
82
- : undefined,
83
- transactionTypes: Object.entries(featureFlags.strategyOverrides?.transactionTypes ?? {}).reduce((result, [type, override]) => {
84
- result[type] = normalizeStrategyOverride(override);
85
- return result;
86
- }, {}),
87
- },
88
- strategyOrder: strategyOrder.length > 0 ? strategyOrder : [...DEFAULT_STRATEGY_ORDER],
89
- };
90
- }
91
- function getStrategyRoutingConfig(messenger) {
92
- const state = messenger.call('RemoteFeatureFlagController:getState');
93
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay;
94
- return normalizeStrategyRoutingConfig(featureFlags ?? {});
95
- }
96
- function filterEnabledStrategies(strategies, routingConfig) {
97
- return strategies.filter((strategy) => {
98
- if (strategy === TransactionPayStrategy.Across) {
99
- return routingConfig.payStrategies.across.enabled;
100
- }
101
- if (strategy === TransactionPayStrategy.Relay) {
102
- return routingConfig.payStrategies.relay.enabled;
103
- }
104
- return true;
105
- });
106
- }
107
- function getTokenOverrideStrategies(override, normalizedChainId, normalizedTokenAddress) {
108
- if (!override || !normalizedChainId || !normalizedTokenAddress) {
109
- return undefined;
110
- }
111
- return override.tokens[normalizedChainId]?.[normalizedTokenAddress];
112
- }
113
- function getChainOverrideStrategies(override, normalizedChainId) {
114
- if (!override || !normalizedChainId) {
115
- return undefined;
116
- }
117
- return override.chains[normalizedChainId];
118
- }
119
- function getDefaultOverrideStrategies(override) {
120
- return override?.default;
121
- }
122
20
  /**
123
- * Get ordered list of strategies to try for a route.
21
+ * Get ordered list of strategies to try.
124
22
  *
125
23
  * @param messenger - Controller messenger.
126
- * @param chainId - Optional chain ID used to match route overrides.
127
- * @param tokenAddress - Optional token address used to match route overrides.
128
- * @param transactionType - Optional transaction type used to match route
129
- * overrides.
130
24
  * @returns Ordered strategy list.
131
25
  */
132
- export function getStrategyOrder(messenger, chainId, tokenAddress, transactionType) {
133
- const routingConfig = getStrategyRoutingConfig(messenger);
134
- const normalizedChainId = normalizeHex(chainId);
135
- const normalizedTokenAddress = normalizeHex(tokenAddress);
136
- const transactionTypeOverride = transactionType
137
- ? routingConfig.strategyOverrides.transactionTypes[transactionType]
138
- : undefined;
139
- const candidates = [
140
- getTokenOverrideStrategies(transactionTypeOverride, normalizedChainId, normalizedTokenAddress),
141
- getChainOverrideStrategies(transactionTypeOverride, normalizedChainId),
142
- getTokenOverrideStrategies(routingConfig.strategyOverrides.default, normalizedChainId, normalizedTokenAddress),
143
- getChainOverrideStrategies(routingConfig.strategyOverrides.default, normalizedChainId),
144
- getDefaultOverrideStrategies(transactionTypeOverride),
145
- getDefaultOverrideStrategies(routingConfig.strategyOverrides.default),
146
- ];
147
- // Overrides are authoritative. Once a route matches a specific override
148
- // scope, disabled strategies do not inherit candidates from lower-precedence
149
- // scopes.
150
- for (const strategies of candidates) {
151
- if (strategies) {
152
- return filterEnabledStrategies(strategies, routingConfig);
153
- }
26
+ export function getStrategyOrder(messenger) {
27
+ const { strategyOrder: strategyPriority } = getFeatureFlagsRaw(messenger);
28
+ if (!Array.isArray(strategyPriority)) {
29
+ return [...DEFAULT_STRATEGY_ORDER];
154
30
  }
155
- return filterEnabledStrategies(routingConfig.strategyOrder, routingConfig);
156
- }
157
- /**
158
- * Get the preferred strategy for a route.
159
- *
160
- * @param messenger - Controller messenger.
161
- * @param chainId - Optional chain ID used to match route overrides.
162
- * @param tokenAddress - Optional token address used to match route overrides.
163
- * @param transactionType - Optional transaction type used to match route
164
- * overrides.
165
- * @returns The preferred strategy, if any.
166
- */
167
- export function getStrategy(messenger, chainId, tokenAddress, transactionType) {
168
- return getStrategyOrder(messenger, chainId, tokenAddress, transactionType)[0];
31
+ const validStrategyPriority = uniq(strategyPriority.filter((strategy) => isTransactionPayStrategy(strategy)));
32
+ if (!validStrategyPriority.length) {
33
+ return [...DEFAULT_STRATEGY_ORDER];
34
+ }
35
+ return validStrategyPriority;
169
36
  }
170
37
  /**
171
38
  * Get feature flags related to the controller.
@@ -174,8 +41,7 @@ export function getStrategy(messenger, chainId, tokenAddress, transactionType) {
174
41
  * @returns Feature flags.
175
42
  */
176
43
  export function getFeatureFlags(messenger) {
177
- const state = messenger.call('RemoteFeatureFlagController:getState');
178
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
44
+ const featureFlags = getFeatureFlagsRaw(messenger);
179
45
  const estimate = featureFlags.relayFallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE;
180
46
  const max = featureFlags.relayFallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX;
181
47
  const relayExecuteUrl = featureFlags.relayExecuteUrl ?? DEFAULT_RELAY_EXECUTE_URL;
@@ -202,8 +68,7 @@ export function getFeatureFlags(messenger) {
202
68
  * @returns Pay Strategies configuration.
203
69
  */
204
70
  export function getPayStrategiesConfig(messenger) {
205
- const state = messenger.call('RemoteFeatureFlagController:getState');
206
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
71
+ const featureFlags = getFeatureFlagsRaw(messenger);
207
72
  const payStrategies = featureFlags.payStrategies ?? {};
208
73
  const acrossRaw = payStrategies.across ?? {};
209
74
  const relayRaw = payStrategies.relay ?? {};
@@ -230,8 +95,7 @@ export function getPayStrategiesConfig(messenger) {
230
95
  * @returns True if the execute flow is enabled.
231
96
  */
232
97
  export function isRelayExecuteEnabled(messenger) {
233
- const state = messenger.call('RemoteFeatureFlagController:getState');
234
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
98
+ const featureFlags = getFeatureFlagsRaw(messenger);
235
99
  return featureFlags.payStrategies?.relay?.executeEnabled ?? false;
236
100
  }
237
101
  /**
@@ -242,8 +106,7 @@ export function isRelayExecuteEnabled(messenger) {
242
106
  * @returns Origin gas overhead as a decimal string.
243
107
  */
244
108
  export function getRelayOriginGasOverhead(messenger) {
245
- const state = messenger.call('RemoteFeatureFlagController:getState');
246
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
109
+ const featureFlags = getFeatureFlagsRaw(messenger);
247
110
  return (featureFlags.payStrategies?.relay?.originGasOverhead ??
248
111
  DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD);
249
112
  }
@@ -255,8 +118,7 @@ export function getRelayOriginGasOverhead(messenger) {
255
118
  * @returns Polling interval in milliseconds.
256
119
  */
257
120
  export function getRelayPollingInterval(messenger) {
258
- const state = messenger.call('RemoteFeatureFlagController:getState');
259
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
121
+ const featureFlags = getFeatureFlagsRaw(messenger);
260
122
  return (featureFlags.payStrategies?.relay?.pollingInterval ?? RELAY_POLLING_INTERVAL);
261
123
  }
262
124
  /**
@@ -267,8 +129,7 @@ export function getRelayPollingInterval(messenger) {
267
129
  * @returns Polling timeout in milliseconds, or undefined when not configured.
268
130
  */
269
131
  export function getRelayPollingTimeout(messenger) {
270
- const state = messenger.call('RemoteFeatureFlagController:getState');
271
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
132
+ const featureFlags = getFeatureFlagsRaw(messenger);
272
133
  return featureFlags.payStrategies?.relay?.pollingTimeout;
273
134
  }
274
135
  /**
@@ -288,8 +149,7 @@ export function getFallbackGas(messenger) {
288
149
  * @returns Gas buffer value.
289
150
  */
290
151
  export function getGasBuffer(messenger, chainId) {
291
- const state = messenger.call('RemoteFeatureFlagController:getState');
292
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
152
+ const featureFlags = getFeatureFlagsRaw(messenger);
293
153
  return (featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??
294
154
  featureFlags.gasBuffer?.default ??
295
155
  DEFAULT_GAS_BUFFER);
@@ -304,8 +164,7 @@ export function getGasBuffer(messenger, chainId) {
304
164
  * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).
305
165
  */
306
166
  export function getSlippage(messenger, chainId, tokenAddress) {
307
- const state = messenger.call('RemoteFeatureFlagController:getState');
308
- const featureFlags = state.remoteFeatureFlags?.confirmations_pay ?? {};
167
+ const featureFlags = getFeatureFlagsRaw(messenger);
309
168
  const { slippageTokens } = featureFlags;
310
169
  const tokenMap = getCaseInsensitive(slippageTokens, chainId);
311
170
  const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);
@@ -362,4 +221,14 @@ export function isEIP7702Chain(messenger, chainId) {
362
221
  const supportedChains = eip7702Flags?.supportedChains ?? [];
363
222
  return supportedChains.some((supported) => supported.toLowerCase() === chainId.toLowerCase());
364
223
  }
224
+ /**
225
+ * Get the raw feature flags from the remote feature flag controller.
226
+ *
227
+ * @param messenger - Controller messenger.
228
+ * @returns Raw feature flags.
229
+ */
230
+ function getFeatureFlagsRaw(messenger) {
231
+ const state = messenger.call('RemoteFeatureFlagController:getState');
232
+ return state.remoteFeatureFlags.confirmations_pay ?? {};
233
+ }
365
234
  //# sourceMappingURL=feature-flags.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { uniq } from 'lodash';\n\nimport { isTransactionPayStrategy, TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport {\n RELAY_EXECUTE_URL,\n RELAY_POLLING_INTERVAL,\n RELAY_QUOTE_URL,\n} from '../strategy/relay/constants';\nimport type { TransactionPayControllerMessenger } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\ntype StrategyOrder = TransactionPayStrategy[];\n\nexport const DEFAULT_GAS_BUFFER = 1.0;\nexport const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;\nexport const DEFAULT_FALLBACK_GAS_MAX = 1500000;\nexport const DEFAULT_RELAY_EXECUTE_URL = RELAY_EXECUTE_URL;\nexport const DEFAULT_RELAY_QUOTE_URL = RELAY_QUOTE_URL;\nexport const DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = '300000';\nexport const DEFAULT_SLIPPAGE = 0.005;\nexport const DEFAULT_ACROSS_API_BASE = 'https://app.across.to/api';\nexport const DEFAULT_STRATEGY_ORDER: StrategyOrder = [\n TransactionPayStrategy.Relay,\n TransactionPayStrategy.Across,\n];\n\ntype FeatureFlagsRaw = {\n gasBuffer?: {\n default?: number;\n perChainConfig?: Record<\n Hex,\n {\n name?: string;\n buffer?: number;\n }\n >;\n };\n relayDisabledGasStationChains?: Hex[];\n relayExecuteUrl?: string;\n relayFallbackGas?: {\n estimate?: number;\n max?: number;\n };\n relayQuoteUrl?: string;\n slippage?: number;\n slippageTokens?: Record<Hex, Record<Hex, number>>;\n strategyOrder?: string[];\n strategyOverrides?: StrategyOverridesRaw;\n payStrategies?: PayStrategiesConfigRaw;\n};\n\ntype StrategyOverrideRaw = {\n default?: unknown;\n chains?: Record<string, unknown>;\n tokens?: Record<string, Record<string, unknown>>;\n};\n\ntype StrategyOverridesRaw = {\n default?: StrategyOverrideRaw;\n transactionTypes?: Record<string, StrategyOverrideRaw>;\n};\n\ntype StrategyOverride = {\n chains: Record<Hex, TransactionPayStrategy[]>;\n default?: TransactionPayStrategy[];\n tokens: Record<Hex, Record<Hex, TransactionPayStrategy[]>>;\n};\n\ntype StrategyOverrides = {\n default?: StrategyOverride;\n transactionTypes: Record<string, StrategyOverride>;\n};\n\ntype StrategyRoutingConfig = {\n payStrategies: {\n across: {\n enabled: boolean;\n };\n relay: {\n enabled: boolean;\n };\n };\n strategyOverrides: StrategyOverrides;\n strategyOrder: TransactionPayStrategy[];\n};\n\nexport type FeatureFlags = {\n relayDisabledGasStationChains: Hex[];\n relayExecuteUrl: string;\n relayFallbackGas: {\n estimate: number;\n max: number;\n };\n relayQuoteUrl: string;\n slippage: number;\n};\n\nexport type AcrossConfigRaw = {\n apiBase?: string;\n enabled?: boolean;\n fallbackGas?: {\n estimate?: number;\n max?: number;\n };\n};\n\nexport type AcrossConfig = {\n apiBase: string;\n enabled: boolean;\n fallbackGas: {\n estimate: number;\n max: number;\n };\n};\n\nexport type PayStrategiesConfigRaw = {\n across?: AcrossConfigRaw;\n relay?: {\n enabled?: boolean;\n executeEnabled?: boolean;\n originGasOverhead?: string;\n pollingInterval?: number;\n pollingTimeout?: number;\n };\n};\n\nexport type PayStrategiesConfig = {\n across: AcrossConfig;\n relay: {\n enabled: boolean;\n };\n};\n\nfunction normalizeHex(value: string | undefined): Hex | undefined {\n return value?.toLowerCase() as Hex | undefined;\n}\n\nfunction normalizeStrategy(\n strategy: unknown,\n): TransactionPayStrategy | undefined {\n if (typeof strategy !== 'string') {\n return undefined;\n }\n\n const normalizedStrategy = strategy.toLowerCase() as TransactionPayStrategy;\n\n return isTransactionPayStrategy(normalizedStrategy)\n ? normalizedStrategy\n : undefined;\n}\n\nfunction normalizeStrategyList(strategies: unknown): TransactionPayStrategy[] {\n if (!Array.isArray(strategies)) {\n return [];\n }\n\n return uniq(\n strategies\n .map((strategy) => normalizeStrategy(strategy))\n .filter(\n (strategy): strategy is TransactionPayStrategy =>\n strategy !== undefined,\n ),\n );\n}\n\nfunction normalizeStrategyOverride(\n override: StrategyOverrideRaw | undefined,\n): StrategyOverride {\n const chains = Object.entries(override?.chains ?? {}).reduce<\n Record<Hex, TransactionPayStrategy[]>\n >((result, [chainId, strategies]) => {\n const normalizedStrategies = normalizeStrategyList(strategies);\n\n if (normalizedStrategies.length) {\n result[normalizeHex(chainId) as Hex] = normalizedStrategies;\n }\n\n return result;\n }, {});\n\n const tokens = Object.entries(override?.tokens ?? {}).reduce<\n Record<Hex, Record<Hex, TransactionPayStrategy[]>>\n >((result, [chainId, tokenOverrides]) => {\n const normalizedTokenOverrides = Object.entries(\n tokenOverrides ?? {},\n ).reduce<Record<Hex, TransactionPayStrategy[]>>(\n (tokenResult, [tokenAddress, strategies]) => {\n const normalizedStrategies = normalizeStrategyList(strategies);\n\n if (normalizedStrategies.length) {\n tokenResult[normalizeHex(tokenAddress) as Hex] = normalizedStrategies;\n }\n\n return tokenResult;\n },\n {},\n );\n\n if (Object.keys(normalizedTokenOverrides).length) {\n result[normalizeHex(chainId) as Hex] = normalizedTokenOverrides;\n }\n\n return result;\n }, {});\n\n const defaultStrategies = normalizeStrategyList(override?.default);\n\n return {\n chains,\n default: defaultStrategies.length ? defaultStrategies : undefined,\n tokens,\n };\n}\n\nfunction normalizeStrategyRoutingConfig(\n featureFlags: FeatureFlagsRaw,\n): StrategyRoutingConfig {\n const strategyOrder = normalizeStrategyList(featureFlags.strategyOrder);\n\n return {\n payStrategies: {\n across: {\n enabled: featureFlags.payStrategies?.across?.enabled ?? false,\n },\n relay: {\n enabled: featureFlags.payStrategies?.relay?.enabled ?? true,\n },\n },\n strategyOverrides: {\n default: featureFlags.strategyOverrides?.default\n ? normalizeStrategyOverride(featureFlags.strategyOverrides.default)\n : undefined,\n transactionTypes: Object.entries(\n featureFlags.strategyOverrides?.transactionTypes ?? {},\n ).reduce<Record<string, StrategyOverride>>((result, [type, override]) => {\n result[type] = normalizeStrategyOverride(override);\n return result;\n }, {}),\n },\n strategyOrder:\n strategyOrder.length > 0 ? strategyOrder : [...DEFAULT_STRATEGY_ORDER],\n };\n}\n\nfunction getStrategyRoutingConfig(\n messenger: TransactionPayControllerMessenger,\n): StrategyRoutingConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags = state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined;\n\n return normalizeStrategyRoutingConfig(featureFlags ?? {});\n}\n\nfunction filterEnabledStrategies(\n strategies: readonly TransactionPayStrategy[],\n routingConfig: StrategyRoutingConfig,\n): TransactionPayStrategy[] {\n return strategies.filter((strategy) => {\n if (strategy === TransactionPayStrategy.Across) {\n return routingConfig.payStrategies.across.enabled;\n }\n\n if (strategy === TransactionPayStrategy.Relay) {\n return routingConfig.payStrategies.relay.enabled;\n }\n\n return true;\n });\n}\n\nfunction getTokenOverrideStrategies(\n override: StrategyOverride | undefined,\n normalizedChainId: Hex | undefined,\n normalizedTokenAddress: Hex | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n if (!override || !normalizedChainId || !normalizedTokenAddress) {\n return undefined;\n }\n\n return override.tokens[normalizedChainId]?.[normalizedTokenAddress];\n}\n\nfunction getChainOverrideStrategies(\n override: StrategyOverride | undefined,\n normalizedChainId: Hex | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n if (!override || !normalizedChainId) {\n return undefined;\n }\n\n return override.chains[normalizedChainId];\n}\n\nfunction getDefaultOverrideStrategies(\n override: StrategyOverride | undefined,\n): readonly TransactionPayStrategy[] | undefined {\n return override?.default;\n}\n\n/**\n * Get ordered list of strategies to try for a route.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Optional chain ID used to match route overrides.\n * @param tokenAddress - Optional token address used to match route overrides.\n * @param transactionType - Optional transaction type used to match route\n * overrides.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n): StrategyOrder {\n const routingConfig = getStrategyRoutingConfig(messenger);\n const normalizedChainId = normalizeHex(chainId);\n const normalizedTokenAddress = normalizeHex(tokenAddress);\n const transactionTypeOverride = transactionType\n ? routingConfig.strategyOverrides.transactionTypes[transactionType]\n : undefined;\n\n const candidates: (readonly TransactionPayStrategy[] | undefined)[] = [\n getTokenOverrideStrategies(\n transactionTypeOverride,\n normalizedChainId,\n normalizedTokenAddress,\n ),\n getChainOverrideStrategies(transactionTypeOverride, normalizedChainId),\n getTokenOverrideStrategies(\n routingConfig.strategyOverrides.default,\n normalizedChainId,\n normalizedTokenAddress,\n ),\n getChainOverrideStrategies(\n routingConfig.strategyOverrides.default,\n normalizedChainId,\n ),\n getDefaultOverrideStrategies(transactionTypeOverride),\n getDefaultOverrideStrategies(routingConfig.strategyOverrides.default),\n ];\n\n // Overrides are authoritative. Once a route matches a specific override\n // scope, disabled strategies do not inherit candidates from lower-precedence\n // scopes.\n for (const strategies of candidates) {\n if (strategies) {\n return filterEnabledStrategies(strategies, routingConfig);\n }\n }\n\n return filterEnabledStrategies(routingConfig.strategyOrder, routingConfig);\n}\n\n/**\n * Get the preferred strategy for a route.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Optional chain ID used to match route overrides.\n * @param tokenAddress - Optional token address used to match route overrides.\n * @param transactionType - Optional transaction type used to match route\n * overrides.\n * @returns The preferred strategy, if any.\n */\nexport function getStrategy(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n): TransactionPayStrategy | undefined {\n return getStrategyOrder(messenger, chainId, tokenAddress, transactionType)[0];\n}\n\n/**\n * Get feature flags related to the controller.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nexport function getFeatureFlags(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n\n const estimate =\n featureFlags.relayFallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE;\n\n const max = featureFlags.relayFallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX;\n\n const relayExecuteUrl =\n featureFlags.relayExecuteUrl ?? DEFAULT_RELAY_EXECUTE_URL;\n\n const relayQuoteUrl = featureFlags.relayQuoteUrl ?? DEFAULT_RELAY_QUOTE_URL;\n\n const relayDisabledGasStationChains =\n featureFlags.relayDisabledGasStationChains ?? [];\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n\n const result: FeatureFlags = {\n relayDisabledGasStationChains,\n relayExecuteUrl,\n relayFallbackGas: {\n estimate,\n max,\n },\n relayQuoteUrl,\n slippage,\n };\n\n log('Feature flags:', { raw: featureFlags, result });\n\n return result;\n}\n\n/**\n * Get Pay Strategies configuration.\n *\n * @param messenger - Controller messenger.\n * @returns Pay Strategies configuration.\n */\nexport function getPayStrategiesConfig(\n messenger: TransactionPayControllerMessenger,\n): PayStrategiesConfig {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n const payStrategies = featureFlags.payStrategies ?? {};\n\n const acrossRaw = payStrategies.across ?? {};\n const relayRaw = payStrategies.relay ?? {};\n\n const across = {\n apiBase: acrossRaw.apiBase ?? DEFAULT_ACROSS_API_BASE,\n enabled: acrossRaw.enabled ?? false,\n fallbackGas: {\n estimate:\n acrossRaw.fallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE,\n max: acrossRaw.fallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX,\n },\n };\n\n const relay = {\n enabled: relayRaw.enabled ?? true,\n };\n\n return {\n across,\n relay,\n };\n}\n\n/**\n * Whether the Relay /execute gasless flow is enabled.\n *\n * @param messenger - Controller messenger.\n * @returns True if the execute flow is enabled.\n */\nexport function isRelayExecuteEnabled(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return featureFlags.payStrategies?.relay?.executeEnabled ?? false;\n}\n\n/**\n * Get the origin gas overhead to include in Relay quote requests\n * for EIP-7702 chains.\n *\n * @param messenger - Controller messenger.\n * @returns Origin gas overhead as a decimal string.\n */\nexport function getRelayOriginGasOverhead(\n messenger: TransactionPayControllerMessenger,\n): string {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return (\n featureFlags.payStrategies?.relay?.originGasOverhead ??\n DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD\n );\n}\n\n/**\n * Get the relay status polling interval in milliseconds.\n * Falls back to the constant default when not configured.\n *\n * @param messenger - Controller messenger.\n * @returns Polling interval in milliseconds.\n */\nexport function getRelayPollingInterval(\n messenger: TransactionPayControllerMessenger,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return (\n featureFlags.payStrategies?.relay?.pollingInterval ?? RELAY_POLLING_INTERVAL\n );\n}\n\n/**\n * Get the relay status polling timeout in milliseconds.\n * Returns 0 or undefined to indicate no timeout.\n *\n * @param messenger - Controller messenger.\n * @returns Polling timeout in milliseconds, or undefined when not configured.\n */\nexport function getRelayPollingTimeout(\n messenger: TransactionPayControllerMessenger,\n): number | undefined {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n return featureFlags.payStrategies?.relay?.pollingTimeout;\n}\n\n/**\n * Get fallback gas limits for quote/submit flows.\n *\n * @param messenger - Controller messenger.\n * @returns Fallback gas limits.\n */\nexport function getFallbackGas(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags['relayFallbackGas'] {\n return getFeatureFlags(messenger).relayFallbackGas;\n}\n\n/**\n * Get the gas buffer value for a specific chain ID.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get gas buffer for.\n * @returns Gas buffer value.\n */\nexport function getGasBuffer(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n\n return (\n featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??\n featureFlags.gasBuffer?.default ??\n DEFAULT_GAS_BUFFER\n );\n}\n\n/**\n * Get the slippage value for a specific chain ID and token address.\n * Falls back to the general slippage feature flag, then the static default.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get slippage for.\n * @param tokenAddress - Token address to get slippage for.\n * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).\n */\nexport function getSlippage(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n tokenAddress: Hex,\n): number {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags =\n (state.remoteFeatureFlags?.confirmations_pay as\n | FeatureFlagsRaw\n | undefined) ?? {};\n const { slippageTokens } = featureFlags;\n\n const tokenMap = getCaseInsensitive(slippageTokens, chainId);\n const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);\n\n if (tokenSlippage !== undefined) {\n log('Using token-specific slippage', {\n chainId,\n tokenAddress,\n slippage: tokenSlippage,\n });\n return tokenSlippage;\n }\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n log('Using default slippage', { chainId, tokenAddress, slippage });\n return slippage;\n}\n\n/**\n * Get the AssetsUnifyState feature flag state.\n *\n * @param messenger - Controller messenger.\n * @returns True if the assets unify state feature is enabled, false otherwise.\n */\nexport function getAssetsUnifyStateFeature(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const assetsUnifyState = state.remoteFeatureFlags.assetsUnifyState as\n | {\n enabled: boolean;\n featureVersion: string | null;\n }\n | undefined;\n\n const AssetsUnifyStateFeatureVersion = '1';\n\n return (\n Boolean(assetsUnifyState?.enabled) &&\n assetsUnifyState?.featureVersion === AssetsUnifyStateFeatureVersion\n );\n}\n\n/**\n * Get a value from a record using a case-insensitive key lookup.\n *\n * @param record - The record to search.\n * @param key - The key to look up (case-insensitive).\n * @returns The value if found, undefined otherwise.\n */\nfunction getCaseInsensitive<Value>(\n record: Record<string, Value> | undefined,\n key: string,\n): Value | undefined {\n if (!record) {\n return undefined;\n }\n\n const normalizedKey = key.toLowerCase();\n const entry = Object.entries(record).find(\n ([k]) => k.toLowerCase() === normalizedKey,\n );\n\n return entry?.[1];\n}\n\n/**\n * Checks if a chain supports EIP-7702.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to check.\n * @returns Whether the chain supports EIP-7702.\n */\nexport function isEIP7702Chain(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const eip7702Flags = state.remoteFeatureFlags.confirmations_eip_7702 as\n | { supportedChains?: Hex[] }\n | undefined;\n\n const supportedChains = eip7702Flags?.supportedChains ?? [];\n\n return supportedChains.some(\n (supported) => supported.toLowerCase() === chainId.toLowerCase(),\n );\n}\n"]}
1
+ {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { uniq } from 'lodash';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { isTransactionPayStrategy, TransactionPayStrategy } from '../constants';\nimport { projectLogger } from '../logger';\nimport {\n RELAY_EXECUTE_URL,\n RELAY_POLLING_INTERVAL,\n RELAY_QUOTE_URL,\n} from '../strategy/relay/constants';\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\ntype StrategyOrder = [TransactionPayStrategy, ...TransactionPayStrategy[]];\n\nexport const DEFAULT_GAS_BUFFER = 1.0;\nexport const DEFAULT_FALLBACK_GAS_ESTIMATE = 900000;\nexport const DEFAULT_FALLBACK_GAS_MAX = 1500000;\nexport const DEFAULT_RELAY_EXECUTE_URL = RELAY_EXECUTE_URL;\nexport const DEFAULT_RELAY_QUOTE_URL = RELAY_QUOTE_URL;\nexport const DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD = '300000';\nexport const DEFAULT_SLIPPAGE = 0.005;\nexport const DEFAULT_ACROSS_API_BASE = 'https://app.across.to/api';\nexport const DEFAULT_STRATEGY_ORDER: StrategyOrder = [\n TransactionPayStrategy.Relay,\n TransactionPayStrategy.Across,\n];\n\ntype FeatureFlagsRaw = {\n gasBuffer?: {\n default?: number;\n perChainConfig?: Record<\n Hex,\n {\n name?: string;\n buffer?: number;\n }\n >;\n };\n relayDisabledGasStationChains?: Hex[];\n relayExecuteUrl?: string;\n relayFallbackGas?: {\n estimate?: number;\n max?: number;\n };\n relayQuoteUrl?: string;\n slippage?: number;\n slippageTokens?: Record<Hex, Record<Hex, number>>;\n strategyOrder?: string[];\n payStrategies?: PayStrategiesConfigRaw;\n};\n\nexport type FeatureFlags = {\n relayDisabledGasStationChains: Hex[];\n relayExecuteUrl: string;\n relayFallbackGas: {\n estimate: number;\n max: number;\n };\n relayQuoteUrl: string;\n slippage: number;\n};\n\nexport type AcrossConfigRaw = {\n apiBase?: string;\n enabled?: boolean;\n fallbackGas?: {\n estimate?: number;\n max?: number;\n };\n};\n\nexport type AcrossConfig = {\n apiBase: string;\n enabled: boolean;\n fallbackGas: {\n estimate: number;\n max: number;\n };\n};\n\nexport type PayStrategiesConfigRaw = {\n across?: AcrossConfigRaw;\n relay?: {\n enabled?: boolean;\n executeEnabled?: boolean;\n originGasOverhead?: string;\n pollingInterval?: number;\n pollingTimeout?: number;\n };\n};\n\nexport type PayStrategiesConfig = {\n across: AcrossConfig;\n relay: {\n enabled: boolean;\n };\n};\n\n/**\n * Get ordered list of strategies to try.\n *\n * @param messenger - Controller messenger.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n): StrategyOrder {\n const { strategyOrder: strategyPriority } = getFeatureFlagsRaw(messenger);\n\n if (!Array.isArray(strategyPriority)) {\n return [...DEFAULT_STRATEGY_ORDER];\n }\n\n const validStrategyPriority = uniq(\n strategyPriority.filter((strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n ),\n );\n\n if (!validStrategyPriority.length) {\n return [...DEFAULT_STRATEGY_ORDER];\n }\n\n return validStrategyPriority as StrategyOrder;\n}\n\n/**\n * Get feature flags related to the controller.\n *\n * @param messenger - Controller messenger.\n * @returns Feature flags.\n */\nexport function getFeatureFlags(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags {\n const featureFlags = getFeatureFlagsRaw(messenger);\n\n const estimate =\n featureFlags.relayFallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE;\n\n const max = featureFlags.relayFallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX;\n\n const relayExecuteUrl =\n featureFlags.relayExecuteUrl ?? DEFAULT_RELAY_EXECUTE_URL;\n\n const relayQuoteUrl = featureFlags.relayQuoteUrl ?? DEFAULT_RELAY_QUOTE_URL;\n\n const relayDisabledGasStationChains =\n featureFlags.relayDisabledGasStationChains ?? [];\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n\n const result: FeatureFlags = {\n relayDisabledGasStationChains,\n relayExecuteUrl,\n relayFallbackGas: {\n estimate,\n max,\n },\n relayQuoteUrl,\n slippage,\n };\n\n log('Feature flags:', { raw: featureFlags, result });\n\n return result;\n}\n\n/**\n * Get Pay Strategies configuration.\n *\n * @param messenger - Controller messenger.\n * @returns Pay Strategies configuration.\n */\nexport function getPayStrategiesConfig(\n messenger: TransactionPayControllerMessenger,\n): PayStrategiesConfig {\n const featureFlags = getFeatureFlagsRaw(messenger);\n const payStrategies = featureFlags.payStrategies ?? {};\n\n const acrossRaw = payStrategies.across ?? {};\n const relayRaw = payStrategies.relay ?? {};\n\n const across = {\n apiBase: acrossRaw.apiBase ?? DEFAULT_ACROSS_API_BASE,\n enabled: acrossRaw.enabled ?? false,\n fallbackGas: {\n estimate:\n acrossRaw.fallbackGas?.estimate ?? DEFAULT_FALLBACK_GAS_ESTIMATE,\n max: acrossRaw.fallbackGas?.max ?? DEFAULT_FALLBACK_GAS_MAX,\n },\n };\n\n const relay = {\n enabled: relayRaw.enabled ?? true,\n };\n\n return {\n across,\n relay,\n };\n}\n\n/**\n * Whether the Relay /execute gasless flow is enabled.\n *\n * @param messenger - Controller messenger.\n * @returns True if the execute flow is enabled.\n */\nexport function isRelayExecuteEnabled(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return featureFlags.payStrategies?.relay?.executeEnabled ?? false;\n}\n\n/**\n * Get the origin gas overhead to include in Relay quote requests\n * for EIP-7702 chains.\n *\n * @param messenger - Controller messenger.\n * @returns Origin gas overhead as a decimal string.\n */\nexport function getRelayOriginGasOverhead(\n messenger: TransactionPayControllerMessenger,\n): string {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return (\n featureFlags.payStrategies?.relay?.originGasOverhead ??\n DEFAULT_RELAY_ORIGIN_GAS_OVERHEAD\n );\n}\n\n/**\n * Get the relay status polling interval in milliseconds.\n * Falls back to the constant default when not configured.\n *\n * @param messenger - Controller messenger.\n * @returns Polling interval in milliseconds.\n */\nexport function getRelayPollingInterval(\n messenger: TransactionPayControllerMessenger,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return (\n featureFlags.payStrategies?.relay?.pollingInterval ?? RELAY_POLLING_INTERVAL\n );\n}\n\n/**\n * Get the relay status polling timeout in milliseconds.\n * Returns 0 or undefined to indicate no timeout.\n *\n * @param messenger - Controller messenger.\n * @returns Polling timeout in milliseconds, or undefined when not configured.\n */\nexport function getRelayPollingTimeout(\n messenger: TransactionPayControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlagsRaw(messenger);\n return featureFlags.payStrategies?.relay?.pollingTimeout;\n}\n\n/**\n * Get fallback gas limits for quote/submit flows.\n *\n * @param messenger - Controller messenger.\n * @returns Fallback gas limits.\n */\nexport function getFallbackGas(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlags['relayFallbackGas'] {\n return getFeatureFlags(messenger).relayFallbackGas;\n}\n\n/**\n * Get the gas buffer value for a specific chain ID.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get gas buffer for.\n * @returns Gas buffer value.\n */\nexport function getGasBuffer(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n\n return (\n featureFlags.gasBuffer?.perChainConfig?.[chainId]?.buffer ??\n featureFlags.gasBuffer?.default ??\n DEFAULT_GAS_BUFFER\n );\n}\n\n/**\n * Get the slippage value for a specific chain ID and token address.\n * Falls back to the general slippage feature flag, then the static default.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to get slippage for.\n * @param tokenAddress - Token address to get slippage for.\n * @returns Slippage value as a decimal (e.g., 0.005 for 0.5%).\n */\nexport function getSlippage(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n tokenAddress: Hex,\n): number {\n const featureFlags = getFeatureFlagsRaw(messenger);\n const { slippageTokens } = featureFlags;\n\n const tokenMap = getCaseInsensitive(slippageTokens, chainId);\n const tokenSlippage = getCaseInsensitive(tokenMap, tokenAddress);\n\n if (tokenSlippage !== undefined) {\n log('Using token-specific slippage', {\n chainId,\n tokenAddress,\n slippage: tokenSlippage,\n });\n return tokenSlippage;\n }\n\n const slippage = featureFlags.slippage ?? DEFAULT_SLIPPAGE;\n log('Using default slippage', { chainId, tokenAddress, slippage });\n return slippage;\n}\n\n/**\n * Get the AssetsUnifyState feature flag state.\n *\n * @param messenger - Controller messenger.\n * @returns True if the assets unify state feature is enabled, false otherwise.\n */\nexport function getAssetsUnifyStateFeature(\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const assetsUnifyState = state.remoteFeatureFlags.assetsUnifyState as\n | {\n enabled: boolean;\n featureVersion: string | null;\n }\n | undefined;\n\n const AssetsUnifyStateFeatureVersion = '1';\n\n return (\n Boolean(assetsUnifyState?.enabled) &&\n assetsUnifyState?.featureVersion === AssetsUnifyStateFeatureVersion\n );\n}\n\n/**\n * Get a value from a record using a case-insensitive key lookup.\n *\n * @param record - The record to search.\n * @param key - The key to look up (case-insensitive).\n * @returns The value if found, undefined otherwise.\n */\nfunction getCaseInsensitive<Value>(\n record: Record<string, Value> | undefined,\n key: string,\n): Value | undefined {\n if (!record) {\n return undefined;\n }\n\n const normalizedKey = key.toLowerCase();\n const entry = Object.entries(record).find(\n ([k]) => k.toLowerCase() === normalizedKey,\n );\n\n return entry?.[1];\n}\n\n/**\n * Checks if a chain supports EIP-7702.\n *\n * @param messenger - Controller messenger.\n * @param chainId - Chain ID to check.\n * @returns Whether the chain supports EIP-7702.\n */\nexport function isEIP7702Chain(\n messenger: TransactionPayControllerMessenger,\n chainId: Hex,\n): boolean {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const eip7702Flags = state.remoteFeatureFlags.confirmations_eip_7702 as\n | { supportedChains?: Hex[] }\n | undefined;\n\n const supportedChains = eip7702Flags?.supportedChains ?? [];\n\n return supportedChains.some(\n (supported) => supported.toLowerCase() === chainId.toLowerCase(),\n );\n}\n\n/**\n * Get the raw feature flags from the remote feature flag controller.\n *\n * @param messenger - Controller messenger.\n * @returns Raw feature flags.\n */\nfunction getFeatureFlagsRaw(\n messenger: TransactionPayControllerMessenger,\n): FeatureFlagsRaw {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n return (state.remoteFeatureFlags.confirmations_pay as FeatureFlagsRaw) ?? {};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/transaction-pay-controller",
3
- "version": "19.0.0-preview-51571fe",
3
+ "version": "19.0.0-preview-27fa5d81d",
4
4
  "description": "Manages alternate payment strategies to provide required funds for transactions in MetaMask",
5
5
  "keywords": [
6
6
  "MetaMask",