@metamask/transaction-pay-controller 21.1.0 → 22.0.0

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/dist/TransactionPayController.cjs +5 -3
  3. package/dist/TransactionPayController.cjs.map +1 -1
  4. package/dist/TransactionPayController.d.cts.map +1 -1
  5. package/dist/TransactionPayController.d.mts.map +1 -1
  6. package/dist/TransactionPayController.mjs +6 -4
  7. package/dist/TransactionPayController.mjs.map +1 -1
  8. package/dist/tests/messenger-mock.d.cts +1 -1
  9. package/dist/tests/messenger-mock.d.mts +1 -1
  10. package/dist/types.cjs.map +1 -1
  11. package/dist/types.d.cts +5 -4
  12. package/dist/types.d.cts.map +1 -1
  13. package/dist/types.d.mts +5 -4
  14. package/dist/types.d.mts.map +1 -1
  15. package/dist/types.mjs.map +1 -1
  16. package/dist/utils/feature-flags.cjs +6 -1
  17. package/dist/utils/feature-flags.cjs.map +1 -1
  18. package/dist/utils/feature-flags.d.cts +2 -1
  19. package/dist/utils/feature-flags.d.cts.map +1 -1
  20. package/dist/utils/feature-flags.d.mts +2 -1
  21. package/dist/utils/feature-flags.d.mts.map +1 -1
  22. package/dist/utils/feature-flags.mjs +6 -1
  23. package/dist/utils/feature-flags.mjs.map +1 -1
  24. package/dist/utils/quotes.cjs +1 -1
  25. package/dist/utils/quotes.cjs.map +1 -1
  26. package/dist/utils/quotes.mjs +1 -1
  27. package/dist/utils/quotes.mjs.map +1 -1
  28. package/dist/utils/required-tokens.cjs +24 -2
  29. package/dist/utils/required-tokens.cjs.map +1 -1
  30. package/dist/utils/required-tokens.d.cts.map +1 -1
  31. package/dist/utils/required-tokens.d.mts.map +1 -1
  32. package/dist/utils/required-tokens.mjs +24 -2
  33. package/dist/utils/required-tokens.mjs.map +1 -1
  34. package/dist/utils/transaction.cjs +37 -4
  35. package/dist/utils/transaction.cjs.map +1 -1
  36. package/dist/utils/transaction.d.cts +12 -3
  37. package/dist/utils/transaction.d.cts.map +1 -1
  38. package/dist/utils/transaction.d.mts +12 -3
  39. package/dist/utils/transaction.d.mts.map +1 -1
  40. package/dist/utils/transaction.mjs +34 -2
  41. package/dist/utils/transaction.mjs.map +1 -1
  42. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4JA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,aAAa;IACb,iBAAiB;IACjB,eAAe;CAChB,CAAC","sourcesContent":["import type { AssetsControllerGetStateForTransactionPayAction } from '@metamask/assets-controller';\nimport type {\n CurrencyRateControllerGetStateAction,\n TokenBalancesControllerGetStateAction,\n} from '@metamask/assets-controllers';\nimport type { TokenRatesControllerGetStateAction } from '@metamask/assets-controllers';\nimport type { TokensControllerGetStateAction } from '@metamask/assets-controllers';\nimport type { AccountTrackerControllerGetStateAction } from '@metamask/assets-controllers';\nimport type { ControllerStateChangeEvent } from '@metamask/base-controller';\nimport type { ControllerGetStateAction } from '@metamask/base-controller';\nimport type { BridgeControllerFetchQuotesAction } from '@metamask/bridge-controller';\nimport type { BridgeStatusControllerStateChangeEvent } from '@metamask/bridge-status-controller';\nimport type {\n BridgeStatusControllerGetStateAction,\n BridgeStatusControllerSubmitTxAction,\n} from '@metamask/bridge-status-controller';\nimport type { GetGasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerSignTypedMessageAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { NetworkControllerFindNetworkClientIdByChainIdAction } from '@metamask/network-controller';\nimport type { NetworkControllerGetNetworkClientByIdAction } from '@metamask/network-controller';\nimport type { Quote as RampsQuote } from '@metamask/ramps-controller';\nimport type {\n RampsControllerGetOrderAction,\n RampsControllerGetQuotesAction,\n RampsControllerGetStateAction,\n RampsControllerSetSelectedTokenAction,\n} from '@metamask/ramps-controller';\nimport type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';\nimport type {\n AuthorizationList,\n TransactionControllerAddTransactionBatchAction,\n TransactionControllerEstimateGasAction,\n TransactionControllerEstimateGasBatchAction,\n TransactionControllerUnapprovedTransactionAddedEvent,\n} from '@metamask/transaction-controller';\nimport type {\n BatchTransaction,\n TransactionControllerAddTransactionAction,\n TransactionControllerGetGasFeeTokensAction,\n TransactionControllerGetStateAction,\n TransactionControllerStateChangeEvent,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport type { CONTROLLER_NAME, TransactionPayStrategy } from './constants';\nimport type { TransactionPayControllerMethodActions } from './TransactionPayController-method-action-types';\n\nexport type AllowedActions =\n | AccountTrackerControllerGetStateAction\n | AssetsControllerGetStateForTransactionPayAction\n | BridgeControllerFetchQuotesAction\n | BridgeStatusControllerGetStateAction\n | BridgeStatusControllerSubmitTxAction\n | CurrencyRateControllerGetStateAction\n | GetGasFeeState\n | KeyringControllerGetStateAction\n | KeyringControllerSignTypedMessageAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerGetNetworkClientByIdAction\n | RampsControllerGetOrderAction\n | RampsControllerGetQuotesAction\n | RampsControllerGetStateAction\n | RampsControllerSetSelectedTokenAction\n | RemoteFeatureFlagControllerGetStateAction\n | TokenBalancesControllerGetStateAction\n | TokenRatesControllerGetStateAction\n | TokensControllerGetStateAction\n | TransactionControllerAddTransactionAction\n | TransactionControllerAddTransactionBatchAction\n | TransactionControllerEstimateGasAction\n | TransactionControllerEstimateGasBatchAction\n | TransactionControllerGetGasFeeTokensAction\n | TransactionControllerGetStateAction\n | TransactionControllerUpdateTransactionAction;\n\nexport type AllowedEvents =\n | BridgeStatusControllerStateChangeEvent\n | TransactionControllerStateChangeEvent\n | TransactionControllerUnapprovedTransactionAddedEvent;\n\nexport type TransactionPayControllerGetStateAction = ControllerGetStateAction<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState\n>;\n\n/** Configurable properties of a transaction. */\nexport type TransactionConfig = {\n /**\n * Whether the source of funds is HyperLiquid (HyperCore).\n * When true, the Relay strategy uses the HyperLiquid 2-step withdrawal\n * flow: (1) authorize nonce-mapping, (2) sendAsset to Relay solver.\n */\n isHyperliquidSource?: boolean;\n\n /** Whether the user has selected the maximum amount. */\n isMaxAmount?: boolean;\n\n /**\n * Whether this is a post-quote transaction.\n * When true, the paymentToken represents the destination token,\n * and the quote source is derived from the transaction's output token.\n */\n isPostQuote?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request. Use this for post-quote flows where the user's funds originate\n * from a smart contract account (e.g. Predict Safe proxy) so that refunds\n * go back to that account rather than the EOA.\n */\n refundTo?: Hex;\n\n /**\n * Optional address to override the default account used by the transaction.\n * When `isPostQuote` is true, used as the recipient of the MM Pay transfer.\n * When `isPostQuote` is false, it provides the funds and pays for gas.\n */\n accountOverride?: Hex;\n};\n\n/** Callback to update transaction config. */\nexport type TransactionConfigCallback = (config: TransactionConfig) => void;\n\n/** Callback to update fiat payment state. */\nexport type TransactionFiatPaymentCallback = (\n fiatPayment: TransactionFiatPayment,\n) => void;\n\nexport type TransactionPayControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState\n >;\n\nexport type TransactionPayControllerActions =\n | TransactionPayControllerGetStateAction\n | TransactionPayControllerMethodActions;\n\nexport type TransactionPayControllerEvents =\n TransactionPayControllerStateChangeEvent;\n\nexport type TransactionPayControllerMessenger = Messenger<\n typeof CONTROLLER_NAME,\n TransactionPayControllerActions | AllowedActions,\n TransactionPayControllerEvents | AllowedEvents\n>;\n\n/**\n * Keyring types that support EIP-7702 authorization signing.\n * Hardware wallets, snap keyrings, and custody keyrings are excluded.\n */\nexport const KEYRING_TYPES_SUPPORTING_7702: `${KeyringTypes}`[] = [\n 'HD Key Tree',\n 'Simple Key Pair',\n 'Money Keyring',\n];\n\n/** Options for the TransactionPayController. */\nexport type TransactionPayControllerOptions = {\n /** Callback to convert a transaction into a redeem delegation. */\n getDelegationTransaction: GetDelegationTransactionCallback;\n\n /** Callback to select the PayStrategy for a transaction. */\n getStrategy?: (transaction: TransactionMeta) => TransactionPayStrategy;\n\n /** Callback to select ordered PayStrategies for a transaction. */\n getStrategies?: (transaction: TransactionMeta) => TransactionPayStrategy[];\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Initial state of the controller. */\n state?: Partial<TransactionPayControllerState>;\n};\n\n/** State of the TransactionPayController. */\nexport type TransactionPayControllerState = {\n /** State relating to each transaction, keyed by transaction ID. */\n transactionData: Record<string, TransactionData>;\n};\n\n/** State relating to a single transaction. */\nexport type TransactionData = {\n /** Fiat payment method state. */\n fiatPayment?: TransactionFiatPayment;\n\n /** Whether quotes are currently being retrieved. */\n isLoading: boolean;\n\n /** Whether the user has selected the maximum amount. */\n isMaxAmount?: boolean;\n\n /**\n * Whether this is a post-quote transaction.\n * When true, the paymentToken represents the destination token,\n * and the quote source is derived from the transaction's output token.\n * Used when funds need to be moved after a transaction completes\n * (e.g., bridging output to a different token/chain).\n */\n isPostQuote?: boolean;\n\n /** Whether the source of funds is HyperLiquid (HyperCore). */\n isHyperliquidSource?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request.\n */\n refundTo?: Hex;\n\n /**\n * Optional address to override the default account used by the transaction.\n * When `isPostQuote` is true, used as the recipient of the MM Pay transfer.\n * When `isPostQuote` is false, it provides the funds and pays for gas.\n */\n accountOverride?: Hex;\n\n /**\n * Token selected for the transaction.\n * - For standard flows (isPostQuote=false): This is the SOURCE/payment token\n * - For post-quote flows (isPostQuote=true): This is the DESTINATION token\n */\n paymentToken?: TransactionPaymentToken;\n\n /** Quotes retrieved for the transaction. */\n quotes?: TransactionPayQuote<Json>[];\n\n /** Timestamp of when quotes were last updated. */\n quotesLastUpdated?: number;\n\n /** Amounts of payment token required for each required token. */\n sourceAmounts?: TransactionPaySourceAmount[];\n\n /** Tokens required by the transaction. */\n tokens: TransactionPayRequiredToken[];\n\n /** Calculated totals for the transaction. */\n totals?: TransactionPayTotals;\n};\n\n/** Fiat payment state stored per transaction. */\nexport type TransactionFiatPayment = {\n /** Entered fiat amount for the selected payment method. */\n amountFiat?: string;\n\n /** Order identifier in normalized format (/providers/{provider}/orders/{id}). */\n orderId?: string;\n\n /** The ramps quote received from the ramps provider. */\n rampsQuote?: RampsQuote;\n\n /** Selected fiat payment method ID. */\n selectedPaymentMethodId?: string;\n};\n\n/** A token required by a transaction. */\nexport type TransactionPayRequiredToken = {\n /** Address of the required token. */\n address: Hex;\n\n /** Whether to allow quotes that return less than the minimum amount requested. */\n allowUnderMinimum: boolean;\n\n /** Amount required in the selected currency. */\n amountFiat: string;\n\n /** Amount required in a human-readable format factoring token decimals. */\n amountHuman: string;\n\n /** Amount required in atomic format without factoring token decimals. */\n amountRaw: string;\n\n /** Amount required in USD. */\n amountUsd: string;\n\n /** Balance of the required token in the selected currency. */\n balanceFiat: string;\n\n /** Balance of the required token in a human-readable format factoring token decimals. */\n balanceHuman: string;\n\n /** Balance of the required token in atomic format without factoring token decimals. */\n balanceRaw: string;\n\n /** Balance of the required token in USD. */\n balanceUsd: string;\n\n /** Chain ID of the required token. */\n chainId: Hex;\n\n /** Decimals of the required token. */\n decimals: number;\n\n /** Whether to skip transfer of this token if balance is already sufficient. */\n skipIfBalance: boolean;\n\n /** Symbol of the required token. */\n symbol: string;\n};\n\n/** Amount of payment token required by a required token. */\nexport type TransactionPaySourceAmount = {\n /** Amount of payment token required in the selected currency. */\n sourceAmountHuman: string;\n\n /** Amount of payment token required in atomic format without factoring token decimals. */\n sourceAmountRaw: string;\n\n /** Balance of the source token in atomic format (for post-quote flows). */\n sourceBalanceRaw?: string;\n\n /** Chain ID of the source token (for post-quote flows). */\n sourceChainId?: Hex;\n\n /** Address of the source token (for post-quote flows). */\n sourceTokenAddress?: Hex;\n\n /** Address of the target token. */\n targetTokenAddress: Hex;\n};\n\n/** Source token used to pay for required tokens. */\nexport type TransactionPaymentToken = {\n /** Address of the payment token. */\n address: Hex;\n\n /** Balance of the payment token in the selected currency. */\n balanceFiat: string;\n\n /** Balance of the payment token in a human-readable format factoring token decimals. */\n balanceHuman: string;\n\n /** Balance of the payment token in atomic format without factoring token decimals. */\n balanceRaw: string;\n\n /** Balance of the payment token in USD. */\n balanceUsd: string;\n\n /** Chain ID of the payment token. */\n chainId: Hex;\n\n /** Decimals of the payment token. */\n decimals: number;\n\n /** Symbol of the payment token. */\n symbol: string;\n};\n\n/** Callback to update state for a single transaction. */\nexport type UpdateTransactionDataCallback = (\n /** ID of the transaction to update. */\n transactionId: string,\n /** Function that receives a draft of the transaction data to update. */\n fn: (data: Draft<TransactionData>) => void,\n) => void;\n\n/** Conversion rates from the native currency to other currencies. */\nexport type FiatRates = {\n /** Conversion rate for the native currency to the selected fiat currency. */\n fiatRate: string;\n\n /** Conversion rate for the native currency to USD. */\n usdRate: string;\n};\n\n/** Request for a quote to retrieve a required token. */\nexport type QuoteRequest = {\n /** Address of the user's account. */\n from: Hex;\n\n /** Whether the transaction is a maximum amount transaction. */\n isMaxAmount?: boolean;\n\n /** Whether this is a post-quote flow. */\n isPostQuote?: boolean;\n\n /** Whether the source of funds is HyperLiquid (HyperCore). */\n isHyperliquidSource?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request.\n */\n refundTo?: Hex;\n\n /** Balance of the source token in atomic format without factoring token decimals. */\n sourceBalanceRaw: string;\n\n /** Chain ID of the source token. */\n sourceChainId: Hex;\n\n /** Address of the source token. */\n sourceTokenAddress: Hex;\n\n /** Amount of the required token in atomic format without factoring token decimals. */\n sourceTokenAmount: string;\n\n /** Minimum amount required of the target token in atomic format without factoring token decimals. */\n targetAmountMinimum: string;\n\n /** Chain ID of the target token. */\n targetChainId: Hex;\n\n /** Address of the target token. */\n targetTokenAddress: Hex;\n};\n\n/** Fees associated with a transaction pay quote. */\nexport type TransactionPayFees = {\n /** Whether a gas fee token is used to pay source network fees. */\n isSourceGasFeeToken?: boolean;\n\n /** Whether a gas fee token is used to pay target network fees. */\n isTargetGasFeeToken?: boolean;\n\n /** Fee charged by MetaMask. */\n metaMask: FiatValue;\n\n /** Fee charged by the quote provider. */\n provider: FiatValue;\n\n /** Fee charged by fiat on-ramp provider (breakdown of the provider total). */\n providerFiat?: FiatValue;\n\n /** Network fee for transactions on the source network. */\n sourceNetwork: {\n estimate: Amount;\n max: Amount;\n };\n\n /** Network fee for transactions on the target network. */\n targetNetwork: FiatValue;\n};\n\n/** Quote returned to retrieve a required token using the payment token. */\nexport type TransactionPayQuote<OriginalQuote> = {\n /** Additional amount provided by the quote beyond the minimum requested. */\n dust: FiatValue;\n\n /** Duration estimated for the transaction to complete in seconds. */\n estimatedDuration: number;\n\n /** Fees associated with the transaction pay quote. */\n fees: TransactionPayFees;\n\n /** Raw quote data returned by the provider. */\n original: OriginalQuote;\n\n /** Associated quote request. */\n request: QuoteRequest;\n\n /** Amount of source token required. */\n sourceAmount: Amount;\n\n /** Name of the strategy used to retrieve the quote. */\n strategy: TransactionPayStrategy;\n\n /** Amount of target token provided. */\n targetAmount: FiatValue;\n};\n\n/** Request to get quotes for a transaction. */\nexport type PayStrategyGetQuotesRequest = {\n /** Whether the account supports EIP-7702 authorization signing. */\n accountSupports7702: boolean;\n\n /** Selected fiat payment method ID, if applicable. */\n fiatPaymentMethod?: string;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quote requests for required tokens. */\n requests: QuoteRequest[];\n\n /**\n * Signal that aborts when a newer quote request supersedes this one.\n * Strategies that perform their own network IO should forward this to\n * their fetch calls so cancelled requests release network resources.\n */\n signal?: AbortSignal;\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to submit quotes for a transaction. */\nexport type PayStrategyExecuteRequest<OriginalRequest> = {\n /** Whether the account supports EIP-7702 authorization signing. */\n accountSupports7702: boolean;\n\n /** Callback to determine if the transaction is a smart transaction. */\n isSmartTransaction: (chainId: Hex) => boolean;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes to be submitted. */\n quotes: TransactionPayQuote<OriginalRequest>[];\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to get batch transactions for quotes. */\nexport type PayStrategyGetBatchRequest<OriginalQuote> = {\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes for required tokens. */\n quotes: TransactionPayQuote<OriginalQuote>[];\n\n /** Signal that aborts when a newer quote request supersedes this one. */\n signal?: AbortSignal;\n};\n\n/** Request to check whether retrieved quotes can be executed by a strategy. */\nexport type PayStrategyCheckQuoteSupportRequest<OriginalQuote> = {\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes returned by the strategy. */\n quotes: TransactionPayQuote<OriginalQuote>[];\n\n /** Signal that aborts when a newer quote request supersedes this one. */\n signal?: AbortSignal;\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to get refresh interval for a specific strategy. */\nexport type PayStrategyGetRefreshIntervalRequest = {\n /** Chain ID of the source or payment token. */\n chainId: Hex;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n};\n\n/** Strategy used to obtain required tokens for a transaction. */\nexport type PayStrategy<OriginalQuote> = {\n /**\n * Check if the strategy supports the given request.\n * Defaults to true if not implemented.\n */\n supports?: (\n request: PayStrategyGetQuotesRequest,\n ) => boolean | Promise<boolean>;\n\n /** Retrieve quotes for required tokens. */\n getQuotes: (\n request: PayStrategyGetQuotesRequest,\n ) => Promise<TransactionPayQuote<OriginalQuote>[]>;\n\n /**\n * Check if the returned quotes are supported after provider quote\n * construction and gas planning.\n *\n * Use this for limitations that are only knowable once quote metadata is\n * available, such as whether execution will require an EIP-7702\n * authorization list.\n */\n checkQuoteSupport?: (\n request: PayStrategyCheckQuoteSupportRequest<OriginalQuote>,\n ) => boolean | Promise<boolean>;\n\n /** Retrieve batch transactions for quotes, if supported by the strategy. */\n getBatchTransactions?: (\n request: PayStrategyGetBatchRequest<OriginalQuote>,\n ) => Promise<BatchTransaction[]>;\n\n /**\n * Retrieve refresh interval for the strategy, if applicable.\n * Defaults to 30 seconds.\n */\n getRefreshInterval?: (\n request: PayStrategyGetRefreshIntervalRequest,\n ) => Promise<number | undefined>;\n\n /** Execute or submit the quotes to obtain required tokens. */\n execute: (request: PayStrategyExecuteRequest<OriginalQuote>) => Promise<{\n transactionHash?: Hex;\n }>;\n};\n\n/** Single fiat value in alternate currencies. */\nexport type FiatValue = {\n /** Value in the selected fiat currency. */\n fiat: string;\n\n /** Value in USD. */\n usd: string;\n};\n\n/** Calculated totals for a target transaction and all quotes. */\nexport type TransactionPayTotals = {\n /** Total estimated duration for the target transaction and all quotes. */\n estimatedDuration: number;\n\n /** Total fees for the target transaction and all quotes. */\n fees: TransactionPayFees;\n\n /** Total amount of source token required. */\n sourceAmount: Amount;\n\n /** Total amount of target token provided. */\n targetAmount: FiatValue;\n\n /** Overall total cost for the target transaction and all quotes. */\n total: FiatValue;\n};\n\n/** Request to update the payment token for a transaction. */\nexport type UpdatePaymentTokenRequest = {\n /** ID of the transaction to update. */\n transactionId: string;\n\n /** Address of the new payment token. */\n tokenAddress: Hex;\n\n /** Chain ID of the new payment token. */\n chainId: Hex;\n};\n\n/** Request to update fiat payment state for a transaction. */\nexport type UpdateFiatPaymentRequest = {\n /** ID of the transaction to update. */\n transactionId: string;\n\n /** Callback to mutate fiat payment state. */\n callback: TransactionFiatPaymentCallback;\n};\n\n/** Callback to convert a transaction to a redeem delegation. */\nexport type GetDelegationTransactionCallback = ({\n transaction,\n}: {\n transaction: TransactionMeta;\n}) => Promise<{\n authorizationList?: AuthorizationList;\n data: Hex;\n to: Hex;\n value: Hex;\n}>;\n\n/** Single amount in alternate formats. */\nexport type Amount = FiatValue & {\n /** Amount in human-readable format factoring token decimals. */\n human: string;\n\n /** Amount in atomic format without factoring token decimals. */\n raw: string;\n};\n"]}
1
+ {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwKA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,aAAa;IACb,iBAAiB;IACjB,eAAe;CAChB,CAAC","sourcesContent":["import type {\n AssetsControllerGetStateForTransactionPayAction,\n AssetsControllerStateChangeEvent,\n} from '@metamask/assets-controller';\nimport type {\n CurrencyRateControllerGetStateAction,\n CurrencyRateStateChange,\n TokenBalancesControllerGetStateAction,\n} from '@metamask/assets-controllers';\nimport type { TokenRatesControllerGetStateAction } from '@metamask/assets-controllers';\nimport type { TokenRatesControllerStateChangeEvent } from '@metamask/assets-controllers';\nimport type {\n TokensControllerGetStateAction,\n TokensControllerStateChangeEvent,\n} from '@metamask/assets-controllers';\nimport type { AccountTrackerControllerGetStateAction } from '@metamask/assets-controllers';\nimport type { ControllerStateChangeEvent } from '@metamask/base-controller';\nimport type { ControllerGetStateAction } from '@metamask/base-controller';\nimport type { BridgeControllerFetchQuotesAction } from '@metamask/bridge-controller';\nimport type { BridgeStatusControllerStateChangeEvent } from '@metamask/bridge-status-controller';\nimport type {\n BridgeStatusControllerGetStateAction,\n BridgeStatusControllerSubmitTxAction,\n} from '@metamask/bridge-status-controller';\nimport type { GetGasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerSignTypedMessageAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type { NetworkControllerFindNetworkClientIdByChainIdAction } from '@metamask/network-controller';\nimport type { NetworkControllerGetNetworkClientByIdAction } from '@metamask/network-controller';\nimport type { Quote as RampsQuote } from '@metamask/ramps-controller';\nimport type {\n RampsControllerGetOrderAction,\n RampsControllerGetQuotesAction,\n RampsControllerGetStateAction,\n RampsControllerSetSelectedTokenAction,\n} from '@metamask/ramps-controller';\nimport type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';\nimport type {\n AuthorizationList,\n TransactionControllerAddTransactionBatchAction,\n TransactionControllerEstimateGasAction,\n TransactionControllerEstimateGasBatchAction,\n TransactionControllerUnapprovedTransactionAddedEvent,\n} from '@metamask/transaction-controller';\nimport type {\n BatchTransaction,\n TransactionControllerAddTransactionAction,\n TransactionControllerGetGasFeeTokensAction,\n TransactionControllerGetStateAction,\n TransactionControllerStateChangeEvent,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex, Json } from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport type { CONTROLLER_NAME, TransactionPayStrategy } from './constants';\nimport type { TransactionPayControllerMethodActions } from './TransactionPayController-method-action-types';\n\nexport type AllowedActions =\n | AccountTrackerControllerGetStateAction\n | AssetsControllerGetStateForTransactionPayAction\n | BridgeControllerFetchQuotesAction\n | BridgeStatusControllerGetStateAction\n | BridgeStatusControllerSubmitTxAction\n | CurrencyRateControllerGetStateAction\n | GetGasFeeState\n | KeyringControllerGetStateAction\n | KeyringControllerSignTypedMessageAction\n | NetworkControllerFindNetworkClientIdByChainIdAction\n | NetworkControllerGetNetworkClientByIdAction\n | RampsControllerGetOrderAction\n | RampsControllerGetQuotesAction\n | RampsControllerGetStateAction\n | RampsControllerSetSelectedTokenAction\n | RemoteFeatureFlagControllerGetStateAction\n | TokenBalancesControllerGetStateAction\n | TokenRatesControllerGetStateAction\n | TokensControllerGetStateAction\n | TransactionControllerAddTransactionAction\n | TransactionControllerAddTransactionBatchAction\n | TransactionControllerEstimateGasAction\n | TransactionControllerEstimateGasBatchAction\n | TransactionControllerGetGasFeeTokensAction\n | TransactionControllerGetStateAction\n | TransactionControllerUpdateTransactionAction;\n\nexport type AllowedEvents =\n | AssetsControllerStateChangeEvent\n | BridgeStatusControllerStateChangeEvent\n | CurrencyRateStateChange\n | TokenRatesControllerStateChangeEvent\n | TokensControllerStateChangeEvent\n | TransactionControllerStateChangeEvent\n | TransactionControllerUnapprovedTransactionAddedEvent;\n\nexport type TransactionPayControllerGetStateAction = ControllerGetStateAction<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState\n>;\n\n/** Configurable properties of a transaction. */\nexport type TransactionConfig = {\n /**\n * Whether the source of funds is HyperLiquid (HyperCore).\n * When true, the Relay strategy uses the HyperLiquid 2-step withdrawal\n * flow: (1) authorize nonce-mapping, (2) sendAsset to Relay solver.\n */\n isHyperliquidSource?: boolean;\n\n /** Whether the user has selected the maximum amount. */\n isMaxAmount?: boolean;\n\n /**\n * Whether this is a post-quote transaction.\n * When true, the paymentToken represents the destination token,\n * and the quote source is derived from the transaction's output token.\n */\n isPostQuote?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request. Use this for post-quote flows where the user's funds originate\n * from a smart contract account (e.g. Predict Safe proxy) so that refunds\n * go back to that account rather than the EOA.\n */\n refundTo?: Hex;\n\n /**\n * Optional address to override the default account used by the transaction.\n * When `isPostQuote` is true, used as the recipient of the MM Pay transfer.\n * When `isPostQuote` is false, it provides the funds and pays for gas.\n */\n accountOverride?: Hex;\n};\n\n/** Callback to update transaction config. */\nexport type TransactionConfigCallback = (config: TransactionConfig) => void;\n\n/** Callback to update fiat payment state. */\nexport type TransactionFiatPaymentCallback = (\n fiatPayment: TransactionFiatPayment,\n) => void;\n\nexport type TransactionPayControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState\n >;\n\nexport type TransactionPayControllerActions =\n | TransactionPayControllerGetStateAction\n | TransactionPayControllerMethodActions;\n\nexport type TransactionPayControllerEvents =\n TransactionPayControllerStateChangeEvent;\n\nexport type TransactionPayControllerMessenger = Messenger<\n typeof CONTROLLER_NAME,\n TransactionPayControllerActions | AllowedActions,\n TransactionPayControllerEvents | AllowedEvents\n>;\n\n/**\n * Keyring types that support EIP-7702 authorization signing.\n * Hardware wallets, snap keyrings, and custody keyrings are excluded.\n */\nexport const KEYRING_TYPES_SUPPORTING_7702: `${KeyringTypes}`[] = [\n 'HD Key Tree',\n 'Simple Key Pair',\n 'Money Keyring',\n];\n\n/** Options for the TransactionPayController. */\nexport type TransactionPayControllerOptions = {\n /** Callback to convert a transaction into a redeem delegation. */\n getDelegationTransaction: GetDelegationTransactionCallback;\n\n /** Callback to select the PayStrategy for a transaction. */\n getStrategy?: (transaction: TransactionMeta) => TransactionPayStrategy;\n\n /** Callback to select ordered PayStrategies for a transaction. */\n getStrategies?: (transaction: TransactionMeta) => TransactionPayStrategy[];\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Initial state of the controller. */\n state?: Partial<TransactionPayControllerState>;\n};\n\n/** State of the TransactionPayController. */\nexport type TransactionPayControllerState = {\n /** State relating to each transaction, keyed by transaction ID. */\n transactionData: Record<string, TransactionData>;\n};\n\n/** State relating to a single transaction. */\nexport type TransactionData = {\n /** Fiat payment method state. */\n fiatPayment?: TransactionFiatPayment;\n\n /** Whether quotes are currently being retrieved. */\n isLoading: boolean;\n\n /** Whether the user has selected the maximum amount. */\n isMaxAmount?: boolean;\n\n /**\n * Whether this is a post-quote transaction.\n * When true, the paymentToken represents the destination token,\n * and the quote source is derived from the transaction's output token.\n * Used when funds need to be moved after a transaction completes\n * (e.g., bridging output to a different token/chain).\n */\n isPostQuote?: boolean;\n\n /** Whether the source of funds is HyperLiquid (HyperCore). */\n isHyperliquidSource?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request.\n */\n refundTo?: Hex;\n\n /**\n * Optional address to override the default account used by the transaction.\n * When `isPostQuote` is true, used as the recipient of the MM Pay transfer.\n * When `isPostQuote` is false, it provides the funds and pays for gas.\n */\n accountOverride?: Hex;\n\n /**\n * Token selected for the transaction.\n * - For standard flows (isPostQuote=false): This is the SOURCE/payment token\n * - For post-quote flows (isPostQuote=true): This is the DESTINATION token\n */\n paymentToken?: TransactionPaymentToken;\n\n /** Quotes retrieved for the transaction. */\n quotes?: TransactionPayQuote<Json>[];\n\n /** Timestamp of when quotes were last updated. */\n quotesLastUpdated?: number;\n\n /** Amounts of payment token required for each required token. */\n sourceAmounts?: TransactionPaySourceAmount[];\n\n /** Tokens required by the transaction. */\n tokens: TransactionPayRequiredToken[];\n\n /** Calculated totals for the transaction. */\n totals?: TransactionPayTotals;\n};\n\n/** Fiat payment state stored per transaction. */\nexport type TransactionFiatPayment = {\n /** Entered fiat amount for the selected payment method. */\n amountFiat?: string;\n\n /** Order identifier in normalized format (/providers/{provider}/orders/{id}). */\n orderId?: string;\n\n /** The ramps quote received from the ramps provider. */\n rampsQuote?: RampsQuote;\n\n /** Selected fiat payment method ID. */\n selectedPaymentMethodId?: string;\n};\n\n/** A token required by a transaction. */\nexport type TransactionPayRequiredToken = {\n /** Address of the required token. */\n address: Hex;\n\n /** Whether to allow quotes that return less than the minimum amount requested. */\n allowUnderMinimum: boolean;\n\n /** Amount required in the selected currency. */\n amountFiat: string;\n\n /** Amount required in a human-readable format factoring token decimals. */\n amountHuman: string;\n\n /** Amount required in atomic format without factoring token decimals. */\n amountRaw: string;\n\n /** Amount required in USD. */\n amountUsd: string;\n\n /** Balance of the required token in the selected currency. */\n balanceFiat: string;\n\n /** Balance of the required token in a human-readable format factoring token decimals. */\n balanceHuman: string;\n\n /** Balance of the required token in atomic format without factoring token decimals. */\n balanceRaw: string;\n\n /** Balance of the required token in USD. */\n balanceUsd: string;\n\n /** Chain ID of the required token. */\n chainId: Hex;\n\n /** Decimals of the required token. */\n decimals: number;\n\n /** Whether to skip transfer of this token if balance is already sufficient. */\n skipIfBalance: boolean;\n\n /** Symbol of the required token. */\n symbol: string;\n};\n\n/** Amount of payment token required by a required token. */\nexport type TransactionPaySourceAmount = {\n /** Amount of payment token required in the selected currency. */\n sourceAmountHuman: string;\n\n /** Amount of payment token required in atomic format without factoring token decimals. */\n sourceAmountRaw: string;\n\n /** Balance of the source token in atomic format (for post-quote flows). */\n sourceBalanceRaw?: string;\n\n /** Chain ID of the source token (for post-quote flows). */\n sourceChainId?: Hex;\n\n /** Address of the source token (for post-quote flows). */\n sourceTokenAddress?: Hex;\n\n /** Address of the target token. */\n targetTokenAddress: Hex;\n};\n\n/** Source token used to pay for required tokens. */\nexport type TransactionPaymentToken = {\n /** Address of the payment token. */\n address: Hex;\n\n /** Balance of the payment token in the selected currency. */\n balanceFiat: string;\n\n /** Balance of the payment token in a human-readable format factoring token decimals. */\n balanceHuman: string;\n\n /** Balance of the payment token in atomic format without factoring token decimals. */\n balanceRaw: string;\n\n /** Balance of the payment token in USD. */\n balanceUsd: string;\n\n /** Chain ID of the payment token. */\n chainId: Hex;\n\n /** Decimals of the payment token. */\n decimals: number;\n\n /** Symbol of the payment token. */\n symbol: string;\n};\n\n/** Callback to update state for a single transaction. */\nexport type UpdateTransactionDataCallback = (\n /** ID of the transaction to update. */\n transactionId: string,\n /** Function that receives a draft of the transaction data to update. */\n fn: (data: Draft<TransactionData>) => void,\n) => void;\n\n/** Conversion rates from the native currency to other currencies. */\nexport type FiatRates = {\n /** Conversion rate for the native currency to the selected fiat currency. */\n fiatRate: string;\n\n /** Conversion rate for the native currency to USD. */\n usdRate: string;\n};\n\n/** Request for a quote to retrieve a required token. */\nexport type QuoteRequest = {\n /** Address of the user's account. */\n from: Hex;\n\n /** Whether the transaction is a maximum amount transaction. */\n isMaxAmount?: boolean;\n\n /** Whether this is a post-quote flow. */\n isPostQuote?: boolean;\n\n /** Whether the source of funds is HyperLiquid (HyperCore). */\n isHyperliquidSource?: boolean;\n\n /**\n * Optional address to receive refunds if the Relay transaction fails.\n * When set, overrides the default refund recipient (EOA) in the Relay quote\n * request.\n */\n refundTo?: Hex;\n\n /** Balance of the source token in atomic format without factoring token decimals. */\n sourceBalanceRaw: string;\n\n /** Chain ID of the source token. */\n sourceChainId: Hex;\n\n /** Address of the source token. */\n sourceTokenAddress: Hex;\n\n /** Amount of the required token in atomic format without factoring token decimals. */\n sourceTokenAmount: string;\n\n /** Minimum amount required of the target token in atomic format without factoring token decimals. */\n targetAmountMinimum: string;\n\n /** Chain ID of the target token. */\n targetChainId: Hex;\n\n /** Address of the target token. */\n targetTokenAddress: Hex;\n};\n\n/** Fees associated with a transaction pay quote. */\nexport type TransactionPayFees = {\n /** Whether a gas fee token is used to pay source network fees. */\n isSourceGasFeeToken?: boolean;\n\n /** Whether a gas fee token is used to pay target network fees. */\n isTargetGasFeeToken?: boolean;\n\n /** Fee charged by MetaMask. */\n metaMask: FiatValue;\n\n /** Fee charged by the quote provider. */\n provider: FiatValue;\n\n /** Fee charged by fiat on-ramp provider (breakdown of the provider total). */\n providerFiat?: FiatValue;\n\n /** Network fee for transactions on the source network. */\n sourceNetwork: {\n estimate: Amount;\n max: Amount;\n };\n\n /** Network fee for transactions on the target network. */\n targetNetwork: FiatValue;\n};\n\n/** Quote returned to retrieve a required token using the payment token. */\nexport type TransactionPayQuote<OriginalQuote> = {\n /** Additional amount provided by the quote beyond the minimum requested. */\n dust: FiatValue;\n\n /** Duration estimated for the transaction to complete in seconds. */\n estimatedDuration: number;\n\n /** Fees associated with the transaction pay quote. */\n fees: TransactionPayFees;\n\n /** Raw quote data returned by the provider. */\n original: OriginalQuote;\n\n /** Associated quote request. */\n request: QuoteRequest;\n\n /** Amount of source token required. */\n sourceAmount: Amount;\n\n /** Name of the strategy used to retrieve the quote. */\n strategy: TransactionPayStrategy;\n\n /** Amount of target token provided. */\n targetAmount: FiatValue;\n};\n\n/** Request to get quotes for a transaction. */\nexport type PayStrategyGetQuotesRequest = {\n /** Whether the account supports EIP-7702 authorization signing. */\n accountSupports7702: boolean;\n\n /** Selected fiat payment method ID, if applicable. */\n fiatPaymentMethod?: string;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quote requests for required tokens. */\n requests: QuoteRequest[];\n\n /**\n * Signal that aborts when a newer quote request supersedes this one.\n * Strategies that perform their own network IO should forward this to\n * their fetch calls so cancelled requests release network resources.\n */\n signal?: AbortSignal;\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to submit quotes for a transaction. */\nexport type PayStrategyExecuteRequest<OriginalRequest> = {\n /** Whether the account supports EIP-7702 authorization signing. */\n accountSupports7702: boolean;\n\n /** Callback to determine if the transaction is a smart transaction. */\n isSmartTransaction: (chainId: Hex) => boolean;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes to be submitted. */\n quotes: TransactionPayQuote<OriginalRequest>[];\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to get batch transactions for quotes. */\nexport type PayStrategyGetBatchRequest<OriginalQuote> = {\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes for required tokens. */\n quotes: TransactionPayQuote<OriginalQuote>[];\n\n /** Signal that aborts when a newer quote request supersedes this one. */\n signal?: AbortSignal;\n};\n\n/** Request to check whether retrieved quotes can be executed by a strategy. */\nexport type PayStrategyCheckQuoteSupportRequest<OriginalQuote> = {\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n\n /** Quotes returned by the strategy. */\n quotes: TransactionPayQuote<OriginalQuote>[];\n\n /** Signal that aborts when a newer quote request supersedes this one. */\n signal?: AbortSignal;\n\n /** Metadata of the original target transaction. */\n transaction: TransactionMeta;\n};\n\n/** Request to get refresh interval for a specific strategy. */\nexport type PayStrategyGetRefreshIntervalRequest = {\n /** Chain ID of the source or payment token. */\n chainId: Hex;\n\n /** Controller messenger. */\n messenger: TransactionPayControllerMessenger;\n};\n\n/** Strategy used to obtain required tokens for a transaction. */\nexport type PayStrategy<OriginalQuote> = {\n /**\n * Check if the strategy supports the given request.\n * Defaults to true if not implemented.\n */\n supports?: (\n request: PayStrategyGetQuotesRequest,\n ) => boolean | Promise<boolean>;\n\n /** Retrieve quotes for required tokens. */\n getQuotes: (\n request: PayStrategyGetQuotesRequest,\n ) => Promise<TransactionPayQuote<OriginalQuote>[]>;\n\n /**\n * Check if the returned quotes are supported after provider quote\n * construction and gas planning.\n *\n * Use this for limitations that are only knowable once quote metadata is\n * available, such as whether execution will require an EIP-7702\n * authorization list.\n */\n checkQuoteSupport?: (\n request: PayStrategyCheckQuoteSupportRequest<OriginalQuote>,\n ) => boolean | Promise<boolean>;\n\n /** Retrieve batch transactions for quotes, if supported by the strategy. */\n getBatchTransactions?: (\n request: PayStrategyGetBatchRequest<OriginalQuote>,\n ) => Promise<BatchTransaction[]>;\n\n /**\n * Retrieve refresh interval for the strategy, if applicable.\n * Defaults to 30 seconds.\n */\n getRefreshInterval?: (\n request: PayStrategyGetRefreshIntervalRequest,\n ) => Promise<number | undefined>;\n\n /** Execute or submit the quotes to obtain required tokens. */\n execute: (request: PayStrategyExecuteRequest<OriginalQuote>) => Promise<{\n transactionHash?: Hex;\n }>;\n};\n\n/** Single fiat value in alternate currencies. */\nexport type FiatValue = {\n /** Value in the selected fiat currency. */\n fiat: string;\n\n /** Value in USD. */\n usd: string;\n};\n\n/** Calculated totals for a target transaction and all quotes. */\nexport type TransactionPayTotals = {\n /** Total estimated duration for the target transaction and all quotes. */\n estimatedDuration: number;\n\n /** Total fees for the target transaction and all quotes. */\n fees: TransactionPayFees;\n\n /** Total amount of source token required. */\n sourceAmount: Amount;\n\n /** Total amount of target token provided. */\n targetAmount: FiatValue;\n\n /** Overall total cost for the target transaction and all quotes. */\n total: FiatValue;\n};\n\n/** Request to update the payment token for a transaction. */\nexport type UpdatePaymentTokenRequest = {\n /** ID of the transaction to update. */\n transactionId: string;\n\n /** Address of the new payment token. */\n tokenAddress: Hex;\n\n /** Chain ID of the new payment token. */\n chainId: Hex;\n};\n\n/** Request to update fiat payment state for a transaction. */\nexport type UpdateFiatPaymentRequest = {\n /** ID of the transaction to update. */\n transactionId: string;\n\n /** Callback to mutate fiat payment state. */\n callback: TransactionFiatPaymentCallback;\n};\n\n/** Callback to convert a transaction to a redeem delegation. */\nexport type GetDelegationTransactionCallback = ({\n transaction,\n}: {\n transaction: TransactionMeta;\n}) => Promise<{\n authorizationList?: AuthorizationList;\n data: Hex;\n to: Hex;\n value: Hex;\n}>;\n\n/** Single amount in alternate formats. */\nexport type Amount = FiatValue & {\n /** Amount in human-readable format factoring token decimals. */\n human: string;\n\n /** Amount in atomic format without factoring token decimals. */\n raw: string;\n};\n"]}
@@ -129,9 +129,14 @@ function getDefaultOverrideStrategies(override) {
129
129
  * @param tokenAddress - Optional token address used to match route overrides.
130
130
  * @param transactionType - Optional transaction type used to match route
131
131
  * overrides.
132
+ * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.
132
133
  * @returns Ordered strategy list.
133
134
  */
134
- function getStrategyOrder(messenger, chainId, tokenAddress, transactionType) {
135
+ function getStrategyOrder(messenger, chainId, tokenAddress, transactionType, fiatPaymentMethodId) {
136
+ // If fiat payment method is selected, use Fiat strategy only
137
+ if (fiatPaymentMethodId) {
138
+ return [constants_1.TransactionPayStrategy.Fiat];
139
+ }
135
140
  const routingConfig = getStrategyRoutingConfig(messenger);
136
141
  const normalizedChainId = normalizeHex(chainId);
137
142
  const normalizedTokenAddress = normalizeHex(tokenAddress);
@@ -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 gaslessEnabled?: 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?.gaslessEnabled ?? 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 { 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 gaslessEnabled?: 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 * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n fiatPaymentMethodId?: string,\n): StrategyOrder {\n // If fiat payment method is selected, use Fiat strategy only\n if (fiatPaymentMethodId) {\n return [TransactionPayStrategy.Fiat];\n }\n\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?.gaslessEnabled ?? 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"]}
@@ -61,9 +61,10 @@ export type PayStrategiesConfig = {
61
61
  * @param tokenAddress - Optional token address used to match route overrides.
62
62
  * @param transactionType - Optional transaction type used to match route
63
63
  * overrides.
64
+ * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.
64
65
  * @returns Ordered strategy list.
65
66
  */
66
- export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): StrategyOrder;
67
+ export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string, fiatPaymentMethodId?: string): StrategyOrder;
67
68
  /**
68
69
  * Get the preferred strategy for a route.
69
70
  *
@@ -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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"}
@@ -61,9 +61,10 @@ export type PayStrategiesConfig = {
61
61
  * @param tokenAddress - Optional token address used to match route overrides.
62
62
  * @param transactionType - Optional transaction type used to match route
63
63
  * overrides.
64
+ * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.
64
65
  * @returns Ordered strategy list.
65
66
  */
66
- export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string): StrategyOrder;
67
+ export declare function getStrategyOrder(messenger: TransactionPayControllerMessenger, chainId?: Hex, tokenAddress?: Hex, transactionType?: string, fiatPaymentMethodId?: string): StrategyOrder;
67
68
  /**
68
69
  * Get the preferred strategy for a route.
69
70
  *
@@ -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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"}
@@ -127,9 +127,14 @@ function getDefaultOverrideStrategies(override) {
127
127
  * @param tokenAddress - Optional token address used to match route overrides.
128
128
  * @param transactionType - Optional transaction type used to match route
129
129
  * overrides.
130
+ * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.
130
131
  * @returns Ordered strategy list.
131
132
  */
132
- export function getStrategyOrder(messenger, chainId, tokenAddress, transactionType) {
133
+ export function getStrategyOrder(messenger, chainId, tokenAddress, transactionType, fiatPaymentMethodId) {
134
+ // If fiat payment method is selected, use Fiat strategy only
135
+ if (fiatPaymentMethodId) {
136
+ return [TransactionPayStrategy.Fiat];
137
+ }
133
138
  const routingConfig = getStrategyRoutingConfig(messenger);
134
139
  const normalizedChainId = normalizeHex(chainId);
135
140
  const normalizedTokenAddress = normalizeHex(tokenAddress);
@@ -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 gaslessEnabled?: 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?.gaslessEnabled ?? 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 { 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 gaslessEnabled?: 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 * @param fiatPaymentMethodId - Optional fiat payment method ID used to match route overrides.\n * @returns Ordered strategy list.\n */\nexport function getStrategyOrder(\n messenger: TransactionPayControllerMessenger,\n chainId?: Hex,\n tokenAddress?: Hex,\n transactionType?: string,\n fiatPaymentMethodId?: string,\n): StrategyOrder {\n // If fiat payment method is selected, use Fiat strategy only\n if (fiatPaymentMethodId) {\n return [TransactionPayStrategy.Fiat];\n }\n\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?.gaslessEnabled ?? 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"]}
@@ -348,7 +348,7 @@ async function getQuotes(transaction, requests, isAccountEIP7702Compatible, getS
348
348
  transactionId,
349
349
  });
350
350
  });
351
- if (!requests?.length) {
351
+ if (!requests?.length && !fiatPaymentMethod) {
352
352
  return {
353
353
  batchTransactions: [],
354
354
  quotes: [],