@metamask/smart-transactions-controller 22.5.0 → 22.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"SmartTransactionsController.mjs","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { hexlify } from '@ethersproject/bytes';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n query,\n safelyExecute,\n ChainId,\n isSafeDynamicKey,\n type TraceCallback,\n} from '@metamask/controller-utils';\nimport type { ErrorReportingServiceCaptureExceptionAction } from '@metamask/error-reporting-service';\nimport EthQuery from '@metamask/eth-query';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n RemoteFeatureFlagControllerGetStateAction,\n RemoteFeatureFlagControllerStateChangeEvent,\n} from '@metamask/remote-feature-flag-controller';\nimport type {\n TransactionControllerGetNonceLockAction,\n TransactionControllerGetTransactionsAction,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS,\n MetaMetricsEventCategory,\n MetaMetricsEventName,\n SmartTransactionsTraceName,\n} from './constants';\nimport {\n getSmartTransactionsFeatureFlags,\n getSmartTransactionsFeatureFlagsForChain,\n} from './featureFlags/feature-flags';\nimport { validateSmartTransactionsFeatureFlags } from './featureFlags/validators';\nimport type {\n Fees,\n IndividualTxFees,\n SignedCanceledTransaction,\n SignedTransaction,\n SignedTransactionWithMetadata,\n SmartTransaction,\n SmartTransactionsStatus,\n UnsignedTransaction,\n MetaMetricsProps,\n FeatureFlags,\n ClientId,\n} from './types';\nimport { APIType, SmartTransactionStatuses } from './types';\nimport {\n calculateStatus,\n getAPIRequestURL,\n handleFetch,\n incrementNonceInHex,\n isSmartTransactionCancellable,\n isSmartTransactionPending,\n getTxHash,\n getSmartTransactionMetricsProperties,\n getSmartTransactionMetricsSensitiveProperties,\n shouldMarkRegularTransactionsAsFailed,\n markRegularTransactionsAsFailed,\n} from './utils';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\nconst ETH_QUERY_ERROR_MSG =\n '`ethQuery` is not defined on SmartTransactionsController';\n\n/**\n * The name of the {@link SmartTransactionsController}\n */\nconst controllerName = 'SmartTransactionsController';\n\nconst controllerMetadata: StateMetadata<SmartTransactionsControllerState> = {\n smartTransactionsState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\ntype FeeEstimates = {\n approvalTxFees: IndividualTxFees | null;\n tradeTxFees: IndividualTxFees | null;\n};\n\nexport type SmartTransactionsControllerState = {\n smartTransactionsState: {\n smartTransactions: Record<Hex, SmartTransaction[]>;\n userOptIn: boolean | null;\n userOptInV2: boolean | null;\n liveness: boolean | null;\n fees: FeeEstimates;\n feesByChainId: Record<Hex, FeeEstimates>;\n livenessByChainId: Record<Hex, boolean>;\n };\n};\n\n/**\n * Get the default {@link SmartTransactionsController} state.\n *\n * @returns The default {@link SmartTransactionsController} state.\n */\nexport function getDefaultSmartTransactionsControllerState(): SmartTransactionsControllerState {\n return {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: null,\n userOptInV2: null,\n fees: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n\n // TODO: set this to false once the clients are all refreshing the liveness state.\n liveness: true,\n livenessByChainId: {\n [ChainId.mainnet]: true,\n [ChainId.sepolia]: true,\n },\n feesByChainId: {\n [ChainId.mainnet]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n [ChainId.sepolia]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n },\n },\n };\n}\n\nexport type SmartTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\n/**\n * The actions that can be performed using the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerActions =\n SmartTransactionsControllerGetStateAction;\n\ntype AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | RemoteFeatureFlagControllerGetStateAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateTransactionAction\n | ErrorReportingServiceCaptureExceptionAction;\n\nexport type SmartTransactionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\nexport type SmartTransactionsControllerSmartTransactionEvent = {\n type: 'SmartTransactionsController:smartTransaction';\n payload: [SmartTransaction];\n};\n\nexport type SmartTransactionsControllerSmartTransactionConfirmationDoneEvent = {\n type: 'SmartTransactionsController:smartTransactionConfirmationDone';\n payload: [SmartTransaction];\n};\n\n/**\n * The events that {@link SmartTransactionsController} can emit.\n */\nexport type SmartTransactionsControllerEvents =\n | SmartTransactionsControllerStateChangeEvent\n | SmartTransactionsControllerSmartTransactionEvent\n | SmartTransactionsControllerSmartTransactionConfirmationDoneEvent;\n\ntype AllowedEvents =\n | NetworkControllerStateChangeEvent\n | RemoteFeatureFlagControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n SmartTransactionsControllerActions | AllowedActions,\n SmartTransactionsControllerEvents | AllowedEvents\n>;\n\ntype SmartTransactionsControllerOptions = {\n interval?: number;\n clientId: ClientId;\n chainId?: Hex;\n supportedChainIds?: Hex[];\n trackMetaMetricsEvent: (\n event: {\n event: MetaMetricsEventName;\n category: MetaMetricsEventCategory;\n properties?: ReturnType<typeof getSmartTransactionMetricsProperties>;\n sensitiveProperties?: ReturnType<\n typeof getSmartTransactionMetricsSensitiveProperties\n >;\n },\n options?: { metaMetricsId?: string } & Record<string, boolean>,\n ) => void;\n state?: Partial<SmartTransactionsControllerState>;\n messenger: SmartTransactionsControllerMessenger;\n getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n /**\n * @deprecated This option is ignored. Feature flags are now read directly\n * from RemoteFeatureFlagController via the messenger. This option will be\n * removed in a future version.\n */\n getFeatureFlags?: () => FeatureFlags;\n trace?: TraceCallback;\n};\n\nexport type SmartTransactionsControllerPollingInput = {\n chainIds: Hex[];\n};\n\nexport class SmartTransactionsController extends StaticIntervalPollingController<SmartTransactionsControllerPollingInput>()<\n typeof controllerName,\n SmartTransactionsControllerState,\n SmartTransactionsControllerMessenger\n> {\n #interval: number;\n\n #clientId: ClientId;\n\n #chainId: Hex;\n\n #supportedChainIds: Hex[];\n\n timeoutHandle?: NodeJS.Timeout;\n\n #ethQuery: EthQuery | undefined;\n\n readonly #trackMetaMetricsEvent: SmartTransactionsControllerOptions['trackMetaMetricsEvent'];\n\n readonly #getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n\n #trace: TraceCallback;\n\n /**\n * Validates the smart transactions feature flags from the remote feature flag controller\n * and reports any validation errors to Sentry via ErrorReportingService.\n * Does not report errors when flags are undefined (not yet fetched).\n */\n #validateAndReportFeatureFlags(): void {\n const remoteFeatureFlagControllerState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const rawFlags =\n remoteFeatureFlagControllerState?.remoteFeatureFlags\n ?.smartTransactionsNetworks;\n\n const { errors } = validateSmartTransactionsFeatureFlags(rawFlags);\n\n // Report each validation error to Sentry\n for (const error of errors) {\n this.messenger.call(\n 'ErrorReportingService:captureException',\n new Error(\n `[SmartTransactionsController] Feature flag validation failed: ${\n error.message\n }. Please check the SmartTransactionNetworks feature flag in Remote Config. Smart transactions are disabled for this network. Default disabled config: ${JSON.stringify(\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default,\n )}`,\n ),\n );\n }\n }\n\n /* istanbul ignore next */\n async #fetch(request: string, options?: RequestInit) {\n const fetchOptions = {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.#clientId && { 'X-Client-Id': this.#clientId }),\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor({\n interval = DEFAULT_INTERVAL,\n clientId,\n chainId: InitialChainId = ChainId.mainnet,\n supportedChainIds = [ChainId.mainnet, ChainId.sepolia],\n trackMetaMetricsEvent,\n state = {},\n messenger,\n getMetaMetricsProps,\n trace,\n }: SmartTransactionsControllerOptions) {\n super({\n name: controllerName,\n metadata: controllerMetadata,\n messenger,\n state: {\n ...getDefaultSmartTransactionsControllerState(),\n ...state,\n },\n });\n this.#interval = interval;\n this.#clientId = clientId;\n this.#chainId = InitialChainId;\n this.#supportedChainIds = supportedChainIds;\n this.setIntervalLength(interval);\n this.#ethQuery = undefined;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.#getMetaMetricsProps = getMetaMetricsProps;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n this.initializeSmartTransactionsForChainId();\n\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId },\n provider,\n } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n this.#chainId = chainId;\n this.#ethQuery = new EthQuery(provider);\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n },\n );\n\n this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) =>\n this.checkPoll(currentState),\n );\n\n // Validate feature flags on changes\n this.messenger.subscribe('RemoteFeatureFlagController:stateChange', () => {\n this.#validateAndReportFeatureFlags();\n });\n }\n\n async _executePoll({\n chainIds,\n }: SmartTransactionsControllerPollingInput): Promise<void> {\n // if this is going to be truly UI driven polling we shouldn't really reach here\n // with a networkClientId that is not supported, but for now I'll add a check in case\n // wondering if we should add some kind of predicate to the polling controller to check whether\n // we should poll or not\n const filteredChainIds = (chainIds ?? []).filter((chainId) =>\n this.#supportedChainIds.includes(chainId),\n );\n\n if (filteredChainIds.length === 0) {\n return Promise.resolve();\n }\n return this.updateSmartTransactions({ chainIds: filteredChainIds });\n }\n\n checkPoll({\n smartTransactionsState: { smartTransactions },\n }: SmartTransactionsControllerState) {\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n\n const pendingTransactions = smartTransactionsForAllChains?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.#supportedChainIds.includes(this.#chainId)) {\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[this.#chainId] =\n state.smartTransactionsState.smartTransactions[this.#chainId] ?? [];\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n if (interval) {\n this.#interval = interval;\n }\n\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n\n if (!this.#supportedChainIds.includes(this.#chainId)) {\n return;\n }\n\n this.timeoutHandle = setInterval(() => {\n safelyExecute(async () => this.updateSmartTransactions());\n }, this.#interval);\n await safelyExecute(async () => this.updateSmartTransactions());\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(optInState: boolean | null): void {\n this.update((state) => {\n state.smartTransactionsState.userOptInV2 = optInState;\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (updatedSmartTransaction.status === prevSmartTransaction?.status) {\n return; // If status hasn't changed, don't track it again.\n }\n\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxStatusUpdated,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(updatedSmartTransaction),\n sensitiveProperties: getSmartTransactionMetricsSensitiveProperties(\n updatedSmartTransaction,\n ),\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string, chainId?: Hex): boolean {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions =\n smartTransactions[chainId ?? this.#chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(\n smartTransaction: SmartTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ) {\n let ethQuery = this.#ethQuery;\n let chainId = this.#chainId;\n if (networkClientId) {\n const { configuration, provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n chainId = configuration.chainId;\n ethQuery = new EthQuery(provider);\n }\n\n this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n #updateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n }: {\n chainId: Hex;\n },\n ) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n\n if (currentIndex === -1) {\n return; // Smart transaction not found, don't update anything.\n }\n\n if (!isSafeDynamicKey(chainId)) {\n return;\n }\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId][currentIndex] = {\n ...state.smartTransactionsState.smartTransactions[chainId][\n currentIndex\n ],\n ...smartTransaction,\n };\n });\n }\n\n async #addMetaMetricsPropsToNewSmartTransaction(\n smartTransaction: SmartTransaction,\n ) {\n const metaMetricsProps = await this.#getMetaMetricsProps();\n smartTransaction.accountHardwareType =\n metaMetricsProps?.accountHardwareType;\n smartTransaction.accountType = metaMetricsProps?.accountType;\n smartTransaction.deviceModel = metaMetricsProps?.deviceModel;\n }\n\n async #createOrUpdateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n chainId,\n );\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n if (isNewSmartTransaction) {\n try {\n await this.#addMetaMetricsPropsToNewSmartTransaction(smartTransaction);\n } catch (error) {\n console.error(\n 'Failed to add metrics props to smart transaction:',\n error,\n );\n // Continue without metrics props\n }\n }\n\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions?.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions.concat(historifiedSmartTransaction);\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n nextSmartTransactions;\n });\n return;\n }\n\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n\n // We have to emit this event here, so a txHash is returned to the TransactionController once it's available.\n this.messenger.publish(\n `SmartTransactionsController:smartTransaction`,\n nextSmartTransaction,\n );\n\n const featureFlags = getSmartTransactionsFeatureFlagsForChain(\n getSmartTransactionsFeatureFlags(this.messenger),\n chainId,\n );\n\n if (\n shouldMarkRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n clientId: this.#clientId,\n featureFlags,\n })\n ) {\n markRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n getRegularTransactions: () =>\n this.messenger.call('TransactionController:getTransactions'),\n updateTransaction: (transactionMeta: TransactionMeta, note: string) =>\n this.messenger.call(\n 'TransactionController:updateTransaction',\n transactionMeta,\n note,\n ),\n });\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n await this.#confirmSmartTransaction(nextSmartTransaction, {\n chainId,\n ethQuery,\n });\n } else {\n this.#updateSmartTransaction(smartTransaction, {\n chainId,\n });\n }\n }\n\n async updateSmartTransactions(\n {\n chainIds,\n }: {\n chainIds: Hex[];\n } = {\n chainIds: this.#getChainIds(),\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n\n // Iterate over each chain group directly\n for (const [chainId, transactions] of Object.entries(smartTransactions)) {\n if (chainIds && !chainIds.includes(chainId as Hex)) {\n continue;\n }\n // Filter pending transactions and map them to the desired shape\n const pendingTransactions = transactions\n .filter(isSmartTransactionPending)\n .map((pendingSmartTransaction) => {\n // Use the transaction's chainId (from the key) to derive a networkClientId\n const networkClientIdToUse = this.#getNetworkClientId({\n chainId: chainId as Hex,\n });\n return {\n uuid: pendingSmartTransaction.uuid,\n networkClientId: networkClientIdToUse,\n chainId: pendingSmartTransaction.chainId as Hex, // same as the key, but explicit on the transaction\n };\n });\n\n if (pendingTransactions.length > 0) {\n // Since each group is per chain, all transactions share the same chainId.\n await this.fetchSmartTransactionsStatus(pendingTransactions);\n }\n }\n }\n\n async #confirmSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ) {\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt: {\n blockNumber: string;\n } | null = await query(ethQuery, 'getTransactionReceipt', [txHash]);\n\n if (transactionReceipt?.blockNumber) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmed,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(smartTransaction),\n sensitiveProperties:\n getSmartTransactionMetricsSensitiveProperties(smartTransaction),\n });\n this.#updateSmartTransaction(\n { ...smartTransaction, confirmed: true },\n {\n chainId,\n },\n );\n }\n } catch (error) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmationFailed,\n category: MetaMetricsEventCategory.Transactions,\n });\n console.error('confirm error', error);\n } finally {\n this.messenger.publish(\n `SmartTransactionsController:smartTransactionConfirmationDone`,\n smartTransaction,\n );\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n transactions: {\n uuid: string;\n networkClientId?: NetworkClientId;\n chainId: Hex;\n }[],\n ): Promise<Record<string, SmartTransactionsStatus>> {\n // Since transactions come from the same chain group, take the chainId from the first one.\n const { chainId } = transactions[0];\n\n // Build query parameters with all UUIDs\n const uuids = transactions.map((tx) => tx.uuid);\n const params = new URLSearchParams({ uuids: uuids.join(',') });\n\n // Get the ethQuery for the first transaction's networkClientId\n const ethQuery = this.#getEthQuery({\n networkClientId: transactions[0].networkClientId,\n });\n\n // Construct the URL and fetch the data\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n const data = (await this.#fetch(url)) as Record<\n string,\n SmartTransactionsStatus\n >;\n\n // Process each returned status\n for (const [uuid, stxStatus] of Object.entries(data)) {\n const matchingTx = transactions.find((tx) => tx.uuid === uuid);\n if (!matchingTx) {\n console.error(`No matching transaction found for uuid: ${uuid}`);\n continue;\n }\n\n const smartTransaction: SmartTransaction = {\n statusMetadata: stxStatus,\n status: calculateStatus(stxStatus),\n cancellable: isSmartTransactionCancellable(stxStatus),\n uuid,\n networkClientId: matchingTx.networkClientId,\n };\n\n await this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n return data;\n }\n\n async #addNonceToTransaction(\n transaction: UnsignedTransaction,\n networkClientId: NetworkClientId,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n transaction.from,\n networkClientId,\n );\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: null,\n tradeTxFees: null,\n };\n this.update((state) => {\n state.smartTransactionsState.fees = fees;\n });\n\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx?: UnsignedTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<Fees> {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const transactions: UnsignedTransaction[] = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.#addNonceToTransaction(approvalTx, selectedNetworkClientId);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else if (tradeTx.nonce) {\n unsignedTradeTransactionWithNonce = tradeTx;\n } else {\n unsignedTradeTransactionWithNonce = await this.#addNonceToTransaction(\n tradeTx,\n selectedNetworkClientId,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.GetFees },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n }),\n );\n let approvalTxFees: IndividualTxFees | null;\n let tradeTxFees: IndividualTxFees | null;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n approvalTxFees = null;\n tradeTxFees = data?.txs[0];\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.fees = {\n approvalTxFees,\n tradeTxFees,\n };\n }\n state.smartTransactionsState.feesByChainId[chainId] = {\n approvalTxFees,\n tradeTxFees,\n };\n });\n\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n transactionMeta,\n txParams,\n signedTransactions,\n signedCanceledTransactions = [],\n signedTransactionsWithMetadata,\n networkClientId,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions?: SignedCanceledTransaction[];\n signedTransactionsWithMetadata?: SignedTransactionWithMetadata[];\n transactionMeta?: TransactionMeta;\n txParams?: TransactionParams;\n networkClientId?: NetworkClientId;\n }) {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const ethQuery = this.#getEthQuery({\n networkClientId: selectedNetworkClientId,\n });\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.SubmitTransactions },\n async () =>\n await this.#fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n rawTxsWithMetadata: signedTransactionsWithMetadata,\n }),\n },\n ),\n );\n const time = Date.now();\n let preTxBalance;\n try {\n if (txParams?.from) {\n const preTxBalanceBN = await query(ethQuery, 'getBalance', [\n txParams.from,\n ]);\n preTxBalance = new BigNumber(preTxBalanceBN).toString(16);\n }\n } catch (error) {\n console.error('ethQuery.getBalance error:', error);\n }\n\n const requiresNonce = txParams && !txParams.nonce;\n let nonce;\n let nonceLock;\n let nonceDetails = {};\n\n // This should only happen for Swaps. Non-swaps transactions should already have a nonce\n if (requiresNonce) {\n try {\n nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n txParams.from,\n selectedNetworkClientId,\n );\n nonce = hexlify(nonceLock.nextNonce);\n nonceDetails = nonceLock.nonceDetails;\n txParams.nonce ??= nonce;\n } catch (error) {\n console.error('Failed to acquire nonce lock:', error);\n throw error;\n }\n }\n\n const txHashes = signedTransactions.map((tx) => getTxHash(tx));\n const submitTransactionResponse = {\n ...data,\n txHash: txHashes[txHashes.length - 1], // For backward compatibility - use the last tx hash\n txHashes,\n };\n\n try {\n await this.#createOrUpdateSmartTransaction(\n {\n chainId,\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: submitTransactionResponse.uuid,\n txHash: submitTransactionResponse.txHash,\n cancellable: true,\n type: transactionMeta?.type ?? 'swap',\n transactionId: transactionMeta?.id,\n networkClientId: selectedNetworkClientId,\n txHashes, // Add support for multiple transaction hashes\n },\n { chainId, ethQuery },\n );\n } catch (error) {\n console.error('Failed to create a smart transaction:', error);\n throw error;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n }\n\n return submitTransactionResponse;\n }\n\n #getChainId({\n networkClientId,\n }: { networkClientId?: NetworkClientId } = {}): Hex {\n if (networkClientId) {\n return this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n ).configuration.chainId;\n }\n\n return this.#chainId;\n }\n\n #getChainIds(): Hex[] {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return Object.keys(networkConfigurationsByChainId).filter(\n (chainId): chainId is Hex =>\n this.#supportedChainIds.includes(chainId as Hex),\n );\n }\n\n #getNetworkClientId({ chainId }: { chainId: string }): string {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return networkConfigurationsByChainId[chainId as Hex].rpcEndpoints[\n networkConfigurationsByChainId[chainId as Hex].defaultRpcEndpointIndex\n ].networkClientId;\n }\n\n #getEthQuery({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): EthQuery {\n if (networkClientId) {\n const { provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return new EthQuery(provider);\n }\n\n if (this.#ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n return this.#ethQuery;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(\n uuid: string,\n {\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<void> {\n const chainId = this.#getChainId({ networkClientId });\n await this.#trace(\n { name: SmartTransactionsTraceName.CancelTransaction },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n }),\n );\n }\n\n /**\n * Fetches the liveness status of Smart Transactions for a given chain.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID to fetch liveness for. Preferred over networkClientId.\n * @param options.networkClientId - The network client ID to derive chain ID from.\n * @returns A promise that resolves to the liveness status.\n */\n async fetchLiveness({\n networkClientId,\n chainId: chainIdArg,\n }: {\n /** @deprecated Use `chainId` instead. */\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): Promise<boolean> {\n // Use chainId directly if provided, otherwise derive from networkClientId\n const chainId = chainIdArg ?? this.#getChainId({ networkClientId });\n let liveness = false;\n try {\n const response = await this.#trace(\n { name: SmartTransactionsTraceName.FetchLiveness },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.LIVENESS, chainId)),\n );\n liveness = Boolean(response.smartTransactions);\n } catch (error) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.liveness = liveness;\n }\n state.smartTransactionsState.livenessByChainId[chainId] = liveness;\n });\n\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.#interval) {\n this.#interval = interval;\n }\n }\n\n #getCurrentSmartTransactions(): SmartTransaction[] {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n if (\n !smartTransactionsForAllChains ||\n smartTransactionsForAllChains.length === 0\n ) {\n return [];\n }\n return smartTransactionsForAllChains;\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n\n getSmartTransactionByMinedTxHash(\n txHash: string | undefined,\n ): SmartTransaction | undefined {\n if (!txHash) {\n return undefined;\n }\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.find((smartTransaction) => {\n return (\n smartTransaction.statusMetadata?.minedHash?.toLowerCase() ===\n txHash.toLowerCase()\n );\n });\n }\n\n wipeSmartTransactions({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork?: boolean;\n }): void {\n if (!address) {\n return;\n }\n const addressLowerCase = address.toLowerCase();\n if (ignoreNetwork) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n (Object.keys(smartTransactions) as Hex[]).forEach((chainId) => {\n this.#wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n });\n });\n } else {\n this.#wipeSmartTransactionsPerChainId({\n chainId: this.#chainId,\n addressLowerCase,\n });\n }\n }\n\n #wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n }: {\n chainId: Hex;\n addressLowerCase: string;\n }): void {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForSelectedChain: SmartTransaction[] =\n smartTransactions?.[chainId];\n if (\n !smartTransactionsForSelectedChain ||\n smartTransactionsForSelectedChain.length === 0\n ) {\n return;\n }\n const newSmartTransactionsForSelectedChain =\n smartTransactionsForSelectedChain.filter(\n (smartTransaction: SmartTransaction) =>\n smartTransaction.txParams?.from !== addressLowerCase,\n );\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n newSmartTransactionsForSelectedChain;\n });\n }\n}\n"]}
1
+ {"version":3,"file":"SmartTransactionsController.mjs","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,6BAA6B;AAM/C,OAAO,EACL,KAAK,EACL,aAAa,EACb,OAAO,EACP,gBAAgB,EAEjB,mCAAmC;AAEpC,OAAO,SAAQ,4BAA4B;;AAQ3C,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;AAa/E,OAAO,EAAE,SAAS,EAAE,qBAAqB;AACzC,OAAO,UAAS,4BAAyB;;AAEzC,OAAO,EACL,YAAY,EACZ,iDAAiD,EACjD,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC3B,wBAAoB;AACrB,OAAO,EACL,gCAAgC,EAChC,wCAAwC,EACzC,yCAAqC;AACtC,OAAO,EAAE,qCAAqC,EAAE,sCAAkC;AAclF,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,oBAAgB;AAC5D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,6BAA6B,EAC7B,yBAAyB,EACzB,SAAS,EACT,oCAAoC,EACpC,6CAA6C,EAC7C,qCAAqC,EACrC,+BAA+B,EAChC,oBAAgB;AAEjB,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,GAAG,CAAC,CAAC;AAC3C,MAAM,mBAAmB,GACvB,0DAA0D,CAAC;AAE7D;;GAEG;AACH,MAAM,cAAc,GAAG,6BAA6B,CAAC;AAErD,MAAM,kBAAkB,GAAoD;IAC1E,sBAAsB,EAAE;QACtB,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,sBAAsB,EAAE,IAAI;QAC5B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAmBF;;;;GAIG;AACH,MAAM,UAAU,0CAA0C;IACxD,OAAO;QACL,sBAAsB,EAAE;YACtB,iBAAiB,EAAE,EAAE;YACrB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;YACjB,IAAI,EAAE;gBACJ,cAAc,EAAE,IAAI;gBACpB,WAAW,EAAE,IAAI;aAClB;YAED,kFAAkF;YAClF,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE;gBACjB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI;gBACvB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI;aACxB;YACD,aAAa,EAAE;gBACb,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACjB,cAAc,EAAE,IAAI;oBACpB,WAAW,EAAE,IAAI;iBAClB;gBACD,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACjB,cAAc,EAAE,IAAI;oBACpB,WAAW,EAAE,IAAI;iBAClB;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAoGD,MAAM,OAAO,2BAA4B,SAAQ,+BAA+B,EAI/E;IAoFC,YAAY,EACV,QAAQ,GAAG,gBAAgB,EAC3B,QAAQ,EACR,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,EACzC,iBAAiB,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACtD,qBAAqB,EACrB,KAAK,GAAG,EAAE,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,KAAK,GAC8B;QACnC,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,kBAAkB;YAC5B,SAAS;YACT,KAAK,kCACA,0CAA0C,EAAE,GAC5C,KAAK,CACT;SACF,CAAC,CAAC;;QAvGL,wDAAkB;QAElB,wDAAoB;QAEpB,uDAAc;QAEd,iEAA0B;QAI1B,wDAAgC;QAEhC,qEAA6F;QAE7F,mEAA+D;QAE/D,8DAGc;QAEd,qDAAsB;QAoFpB,uBAAA,IAAI,yCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,yCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,wCAAY,cAAc,MAAA,CAAC;QAC/B,uBAAA,IAAI,kDAAsB,iBAAiB,MAAA,CAAC;QAC5C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,uBAAA,IAAI,yCAAa,SAAS,MAAA,CAAC;QAC3B,uBAAA,IAAI,sDAA0B,qBAAqB,MAAA,CAAC;QACpD,uBAAA,IAAI,oDAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,+CAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,sCAAU,KAAK,aAAL,KAAK,cAAL,KAAK,GAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,aAAF,EAAE,uBAAF,EAAE,EAAI,CAAmB,MAAA,CAAC;QAErE,IAAI,CAAC,qCAAqC,EAAE,CAAC;QAE7C,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,+BAA+B,EAC/B,CAAC,EAAE,uBAAuB,EAAE,EAAE,EAAE;YAC9B,MAAM,EACJ,aAAa,EAAE,EAAE,OAAO,EAAE,EAC1B,QAAQ,GACT,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrB,wCAAwC,EACxC,uBAAuB,CACxB,CAAC;YACF,uBAAA,IAAI,wCAAY,OAAO,MAAA,CAAC;YACxB,uBAAA,IAAI,yCAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAA,CAAC;YACxC,IAAI,CAAC,qCAAqC,EAAE,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,cAAc,cAAc,EAAE,CAAC,YAAY,EAAE,EAAE,CACzE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAC7B,CAAC;QAEF,oCAAoC;QACpC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACvE,uBAAA,IAAI,0GAA+B,MAAnC,IAAI,CAAiC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EACjB,QAAQ,GACgC;QACxC,gFAAgF;QAChF,qFAAqF;QACrF,+FAA+F;QAC/F,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3D,uBAAA,IAAI,sDAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC1C,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACjC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC1B;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,CAAC,EACR,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GACZ;QACjC,MAAM,6BAA6B,GACjC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1C,MAAM,mBAAmB,GAAG,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,MAAM,CAC/D,yBAAyB,CAC1B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,MAAM,IAAG,CAAC,EAAE;YAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;aAAM,IAAI,IAAI,CAAC,aAAa,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,MAAM,MAAK,CAAC,EAAE;YAClE,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;IACH,CAAC;IAED,qCAAqC;QACnC,IAAI,uBAAA,IAAI,sDAAmB,CAAC,QAAQ,CAAC,uBAAA,IAAI,4CAAS,CAAC,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;;gBACpB,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,uBAAA,IAAI,4CAAS,CAAC;oBAC3D,MAAA,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,uBAAA,IAAI,4CAAS,CAAC,mCAAI,EAAE,CAAC;YACxE,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAiB;QAC1B,IAAI,QAAQ,EAAE;YACZ,uBAAA,IAAI,yCAAa,QAAQ,MAAA,CAAC;SAC3B;QAED,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAExD,IAAI,CAAC,uBAAA,IAAI,sDAAmB,CAAC,QAAQ,CAAC,uBAAA,IAAI,4CAAS,CAAC,EAAE;YACpD,OAAO;SACR;QAED,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAC5D,CAAC,EAAE,uBAAA,IAAI,6CAAU,CAAC,CAAC;QACnB,MAAM,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,aAAa,CAAC,UAA0B;QACtC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,sBAAsB,CAAC,WAAW,GAAG,UAAU,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB,CAClB,gBAAkC,EAClC,oBAAuC;QAEvC,IAAI,uBAAuB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1D,uBAAuB,mCAClB,SAAS,CAAC,oBAAoB,CAAC,GAC/B,uBAAuB,CAC3B,CAAC;QAEF,IAAI,uBAAuB,CAAC,MAAM,MAAK,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,CAAA,EAAE;YACnE,OAAO,CAAC,kDAAkD;SAC3D;QAED,uBAAA,IAAI,0DAAuB,MAA3B,IAAI,EAAwB;YAC1B,KAAK,EAAE,oBAAoB,CAAC,gBAAgB;YAC5C,QAAQ,EAAE,wBAAwB,CAAC,YAAY;YAC/C,UAAU,EAAE,oCAAoC,CAAC,uBAAuB,CAAC;YACzE,mBAAmB,EAAE,6CAA6C,CAChE,uBAAuB,CACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CAAC,oBAA4B,EAAE,OAAa;QAC/D,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;QACf,MAAM,wBAAwB,GAC5B,iBAAiB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,uBAAA,IAAI,4CAAS,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,SAAS,CACtD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,oBAAoB,CAC3C,CAAC;QACF,OAAO,YAAY,KAAK,CAAC,CAAC,IAAI,YAAY,KAAK,SAAS,CAAC;IAC3D,CAAC;IAED,sBAAsB,CACpB,gBAAkC,EAClC,EAAE,eAAe,KAA4C,EAAE;QAE/D,IAAI,QAAQ,GAAG,uBAAA,IAAI,6CAAU,CAAC;QAC9B,IAAI,OAAO,GAAG,uBAAA,IAAI,4CAAS,CAAC;QAC5B,IAAI,eAAe,EAAE;YACnB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrD,wCAAwC,EACxC,eAAe,CAChB,CAAC;YACF,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;YAChC,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC;QAED,uBAAA,IAAI,2GAAgC,MAApC,IAAI,EAAiC,gBAAgB,EAAE;YACrD,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAwKD,KAAK,CAAC,uBAAuB,CAC3B,EACE,QAAQ,MAGN;QACF,QAAQ,EAAE,uBAAA,IAAI,wFAAa,MAAjB,IAAI,CAAe;KAC9B;QAED,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,yCAAyC;QACzC,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YACvE,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAc,CAAC,EAAE;gBAClD,SAAS;aACV;YACD,gEAAgE;YAChE,MAAM,mBAAmB,GAAG,YAAY;iBACrC,MAAM,CAAC,yBAAyB,CAAC;iBACjC,GAAG,CAAC,CAAC,uBAAuB,EAAE,EAAE;gBAC/B,2EAA2E;gBAC3E,MAAM,oBAAoB,GAAG,uBAAA,IAAI,+FAAoB,MAAxB,IAAI,EAAqB;oBACpD,OAAO,EAAE,OAAc;iBACxB,CAAC,CAAC;gBACH,OAAO;oBACL,IAAI,EAAE,uBAAuB,CAAC,IAAI;oBAClC,eAAe,EAAE,oBAAoB;oBACrC,OAAO,EAAE,uBAAuB,CAAC,OAAc,EAAE,mDAAmD;iBACrG,CAAC;YACJ,CAAC,CAAC,CAAC;YAEL,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClC,0EAA0E;gBAC1E,MAAM,IAAI,CAAC,4BAA4B,CAAC,mBAAmB,CAAC,CAAC;aAC9D;SACF;IACH,CAAC;IAkDD,sDAAsD;IACtD,KAAK,CAAC,4BAA4B,CAChC,YAIG;QAEH,0FAA0F;QAC1F,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAEpC,wCAAwC;QACxC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE/D,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,uBAAA,IAAI,wFAAa,MAAjB,IAAI,EAAc;YACjC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,eAAe;SACjD,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,GAAG,GAAG,GAAG,gBAAgB,CAC7B,OAAO,CAAC,YAAY,EACpB,OAAO,CACR,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,uBAAA,IAAI,kFAAO,MAAX,IAAI,EAAQ,GAAG,CAAC,CAGnC,CAAC;QAEF,+BAA+B;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACpD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC/D,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;gBACjE,SAAS;aACV;YAED,MAAM,gBAAgB,GAAqB;gBACzC,cAAc,EAAE,SAAS;gBACzB,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC;gBAClC,WAAW,EAAE,6BAA6B,CAAC,SAAS,CAAC;gBACrD,IAAI;gBACJ,eAAe,EAAE,UAAU,CAAC,eAAe;aAC5C,CAAC;YAEF,MAAM,uBAAA,IAAI,2GAAgC,MAApC,IAAI,EAAiC,gBAAgB,EAAE;gBAC3D,OAAO;gBACP,QAAQ;aACT,CAAC,CAAC;SACJ;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAmBD,SAAS;QACP,MAAM,IAAI,GAAG;YACX,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;SAClB,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,sBAAsB,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA4B,EAC5B,UAAgC,EAChC,EAAE,eAAe,KAA4C,EAAE;QAE/D,MAAM,uBAAuB,GAC3B,eAAe,aAAf,eAAe,cAAf,eAAe,GACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,uBAAuB,CAAC;QAC5E,MAAM,OAAO,GAAG,uBAAA,IAAI,uFAAY,MAAhB,IAAI,EAAa;YAC/B,eAAe,EAAE,uBAAuB;SACzC,CAAC,CAAC;QACH,MAAM,YAAY,GAA0B,EAAE,CAAC;QAC/C,IAAI,iCAAiC,CAAC;QACtC,IAAI,UAAU,EAAE;YACd,MAAM,oCAAoC,GACxC,MAAM,uBAAA,IAAI,kGAAuB,MAA3B,IAAI,EAAwB,UAAU,EAAE,uBAAuB,CAAC,CAAC;YACzE,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACxD,iCAAiC,mCAC5B,OAAO;gBACV,sEAAsE;gBACtE,KAAK,EAAE,mBAAmB,CAAC,oCAAoC,CAAC,KAAK,CAAC,GACvE,CAAC;SACH;aAAM,IAAI,OAAO,CAAC,KAAK,EAAE;YACxB,iCAAiC,GAAG,OAAO,CAAC;SAC7C;aAAM;YACL,iCAAiC,GAAG,MAAM,uBAAA,IAAI,kGAAuB,MAA3B,IAAI,EAC5C,OAAO,EACP,uBAAuB,CACxB,CAAC;SACH;QACD,YAAY,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACrB,EAAE,IAAI,EAAE,0BAA0B,CAAC,OAAO,EAAE,EAC5C,KAAK,IAAI,EAAE,CACT,MAAM,uBAAA,IAAI,kFAAO,MAAX,IAAI,EAAQ,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,EAAE,YAAY;aAClB,CAAC;SACH,CAAC,CACL,CAAC;QACF,IAAI,cAAuC,CAAC;QAC5C,IAAI,WAAoC,CAAC;QACzC,IAAI,UAAU,EAAE;YACd,cAAc,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9B,WAAW,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5B;aAAM;YACL,cAAc,GAAG,IAAI,CAAC;YACtB,WAAW,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5B;QAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,OAAO,KAAK,uBAAA,IAAI,4CAAS,EAAE;gBAC7B,KAAK,CAAC,sBAAsB,CAAC,IAAI,GAAG;oBAClC,cAAc;oBACd,WAAW;iBACZ,CAAC;aACH;YACD,KAAK,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG;gBACpD,cAAc;gBACd,WAAW;aACZ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,cAAc;YACd,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,sDAAsD;IACtD,KAAK,CAAC,wBAAwB,CAAC,EAC7B,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,0BAA0B,GAAG,EAAE,EAC/B,8BAA8B,EAC9B,eAAe,GAQhB;;QACC,MAAM,uBAAuB,GAC3B,eAAe,aAAf,eAAe,cAAf,eAAe,GACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,uBAAuB,CAAC;QAC5E,MAAM,OAAO,GAAG,uBAAA,IAAI,uFAAY,MAAhB,IAAI,EAAa;YAC/B,eAAe,EAAE,uBAAuB;SACzC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAA,IAAI,wFAAa,MAAjB,IAAI,EAAc;YACjC,eAAe,EAAE,uBAAuB;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACrB,EAAE,IAAI,EAAE,0BAA0B,CAAC,kBAAkB,EAAE,EACvD,KAAK,IAAI,EAAE,CACT,MAAM,uBAAA,IAAI,kFAAO,MAAX,IAAI,EACR,gBAAgB,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,EACtD;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,0BAA0B;gBACxC,kBAAkB,EAAE,8BAA8B;aACnD,CAAC;SACH,CACF,CACJ,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,YAAY,CAAC;QACjB,IAAI;YACF,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE;gBAClB,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE;oBACzD,QAAQ,CAAC,IAAI;iBACd,CAAC,CAAC;gBACH,YAAY,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aAC3D;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;SACpD;QAED,MAAM,aAAa,GAAG,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClD,IAAI,KAAK,CAAC;QACV,IAAI,SAAS,CAAC;QACd,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,wFAAwF;QACxF,IAAI,aAAa,EAAE;YACjB,IAAI;gBACF,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACnC,oCAAoC,EACpC,QAAQ,CAAC,IAAI,EACb,uBAAuB,CACxB,CAAC;gBACF,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACrC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;gBACtC,MAAA,QAAQ,CAAC,KAAK,oCAAd,QAAQ,CAAC,KAAK,GAAK,KAAK,EAAC;aAC1B;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;gBACtD,MAAM,KAAK,CAAC;aACb;SACF;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,yBAAyB,mCAC1B,IAAI,KACP,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,oDAAoD;YAC3F,QAAQ,GACT,CAAC;QAEF,IAAI;YACF,MAAM,uBAAA,IAAI,2GAAgC,MAApC,IAAI,EACR;gBACE,OAAO;gBACP,YAAY;gBACZ,YAAY;gBACZ,MAAM,EAAE,wBAAwB,CAAC,OAAO;gBACxC,IAAI;gBACJ,QAAQ;gBACR,IAAI,EAAE,yBAAyB,CAAC,IAAI;gBACpC,MAAM,EAAE,yBAAyB,CAAC,MAAM;gBACxC,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,mCAAI,MAAM;gBACrC,aAAa,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,EAAE;gBAClC,eAAe,EAAE,uBAAuB;gBACxC,QAAQ,EAAE,8CAA8C;aACzD,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,CACtB,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC;SACb;gBAAS;YACR,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,WAAW,EAAE,CAAC;aACzB;SACF;QAED,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAsDD,0FAA0F;IAC1F,qEAAqE;IACrE,uDAAuD;IACvD,KAAK,CAAC,sBAAsB,CAC1B,IAAY,EACZ,EACE,eAAe,MAGb,EAAE;QAEN,MAAM,OAAO,GAAG,uBAAA,IAAI,uFAAY,MAAhB,IAAI,EAAa,EAAE,eAAe,EAAE,CAAC,CAAC;QACtD,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACR,EAAE,IAAI,EAAE,0BAA0B,CAAC,iBAAiB,EAAE,EACtD,KAAK,IAAI,EAAE,CACT,MAAM,uBAAA,IAAI,kFAAO,MAAX,IAAI,EAAQ,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CACL,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CAAC,EAClB,eAAe,EACf,OAAO,EAAE,UAAU,MAKjB,EAAE;QACJ,0EAA0E;QAC1E,MAAM,OAAO,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,uBAAA,IAAI,uFAAY,MAAhB,IAAI,EAAa,EAAE,eAAe,EAAE,CAAC,CAAC;QACpE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACzB,EAAE,IAAI,EAAE,0BAA0B,CAAC,aAAa,EAAE,EAClD,KAAK,IAAI,EAAE,CACT,MAAM,uBAAA,IAAI,kFAAO,MAAX,IAAI,EAAQ,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CACjE,CAAC;YACF,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;SAChD;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;SAChD;QAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,OAAO,KAAK,uBAAA,IAAI,4CAAS,EAAE;gBAC7B,KAAK,CAAC,sBAAsB,CAAC,QAAQ,GAAG,QAAQ,CAAC;aAClD;YACD,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,QAAgB;QAC7C,IAAI,QAAQ,KAAK,uBAAA,IAAI,6CAAU,EAAE;YAC/B,uBAAA,IAAI,yCAAa,QAAQ,MAAA,CAAC;SAC3B;IACH,CAAC;IAiBD,eAAe,CAAC,EACd,WAAW,EACX,MAAM,GAIP;QACC,MAAM,wBAAwB,GAAG,uBAAA,IAAI,wGAA6B,MAAjC,IAAI,CAA+B,CAAC;QACrE,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;;YAC7C,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,IAAI,MAAK,WAAW,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC,CAC9B,MAA0B;QAE1B,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,SAAS,CAAC;SAClB;QACD,MAAM,wBAAwB,GAAG,uBAAA,IAAI,wGAA6B,MAAjC,IAAI,CAA+B,CAAC;QACrE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,EAAE;;YACxD,OAAO,CACL,CAAA,MAAA,MAAA,gBAAgB,CAAC,cAAc,0CAAE,SAAS,0CAAE,WAAW,EAAE;gBACzD,MAAM,CAAC,WAAW,EAAE,CACrB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CAAC,EACpB,OAAO,EACP,aAAa,GAId;QACC,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QACD,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,aAAa,EAAE;YACjB,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5D,uBAAA,IAAI,4GAAiC,MAArC,IAAI,EAAkC;oBACpC,OAAO;oBACP,gBAAgB;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,uBAAA,IAAI,4GAAiC,MAArC,IAAI,EAAkC;gBACpC,OAAO,EAAE,uBAAA,IAAI,4CAAS;gBACtB,gBAAgB;aACjB,CAAC,CAAC;SACJ;IACH,CAAC;CA8BF;;;IAz9BG,MAAM,gCAAgC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC1D,sCAAsC,CACvC,CAAC;IACF,MAAM,QAAQ,GACZ,MAAA,gCAAgC,aAAhC,gCAAgC,uBAAhC,gCAAgC,CAAE,kBAAkB,0CAChD,yBAAyB,CAAC;IAEhC,MAAM,EAAE,MAAM,EAAE,GAAG,qCAAqC,CAAC,QAAQ,CAAC,CAAC;IAEnE,yCAAyC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,wCAAwC,EACxC,IAAI,KAAK,CACP,iEACE,KAAK,CAAC,OACR,yJAAyJ,IAAI,CAAC,SAAS,CACrK,iDAAiD,CAAC,OAAO,CAC1D,EAAE,CACJ,CACF,CAAC;KACH;AACH,CAAC;AAED,0BAA0B;AAC1B,KAAK,6CAAQ,OAAe,EAAE,OAAqB;IACjD,MAAM,OAAO,mBACX,cAAc,EAAE,kBAAkB,IAC/B,CAAC,uBAAA,IAAI,6CAAU,IAAI,EAAE,aAAa,EAAE,uBAAA,IAAI,6CAAU,EAAE,CAAC,CACzD,CAAC;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAC5B,CAAC;IACJ,IAAI,uBAAA,IAAI,mDAAgB,IAAI,UAAU,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,uBAAA,IAAI,mDAAgB,MAApB,IAAI,CAAkB,CAAC,CAAC;QAC5D,IAAI,KAAK,EAAE;YACT,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;SAC3C;KACF;IAED,MAAM,YAAY,mCACb,OAAO,KACV,OAAO,kCACF,OAAO,GACP,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,IAEtB,CAAC;IAEF,OAAO,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC,qHAgMC,gBAAkC,EAClC,EACE,OAAO,GAAG,uBAAA,IAAI,4CAAS,GAGxB;;IAED,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;IACf,MAAM,wBAAwB,GAAG,MAAA,iBAAiB,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,SAAS,CACtD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAC5C,CAAC;IAEF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;QACvB,OAAO,CAAC,sDAAsD;KAC/D;IAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAC9B,OAAO;KACR;IAED,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,mCAChE,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CACxD,YAAY,CACb,GACE,gBAAgB,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,0EAED,KAAK,gFACH,gBAAkC;IAElC,MAAM,gBAAgB,GAAG,MAAM,uBAAA,IAAI,wDAAqB,MAAzB,IAAI,CAAuB,CAAC;IAC3D,gBAAgB,CAAC,mBAAmB;QAClC,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,mBAAmB,CAAC;IACxC,gBAAgB,CAAC,WAAW,GAAG,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,CAAC;IAC7D,gBAAgB,CAAC,WAAW,GAAG,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,CAAC;AAC/D,CAAC,gEAED,KAAK,sEACH,gBAAkC,EAClC,EACE,OAAO,GAAG,uBAAA,IAAI,4CAAS,EACvB,QAAQ,GAAG,uBAAA,IAAI,6CAAU,GAI1B;;IAED,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;IACf,MAAM,wBAAwB,GAAG,MAAA,iBAAiB,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,SAAS,CACtD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAC5C,CAAC;IACF,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CACtD,gBAAgB,CAAC,IAAI,EACrB,OAAO,CACR,CAAC;IACF,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;KACtC;IAED,IAAI,qBAAqB,EAAE;QACzB,IAAI;YACF,MAAM,uBAAA,IAAI,qHAA0C,MAA9C,IAAI,EAA2C,gBAAgB,CAAC,CAAC;SACxE;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CACX,mDAAmD,EACnD,KAAK,CACN,CAAC;YACF,iCAAiC;SAClC;KACF;IAED,IAAI,CAAC,oBAAoB,CACvB,gBAAgB,EAChB,qBAAqB;QACnB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAC3C,CAAC;IAEF,IAAI,qBAAqB,EAAE;QACzB,wBAAwB;QACxB,MAAM,mBAAmB,GAAG,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,SAAS,CAC7D,CAAC,GAAqB,EAAE,EAAE;;YACxB,OAAA,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,KAAK,OAAK,MAAA,gBAAgB,CAAC,QAAQ,0CAAE,KAAK,CAAA;iBACxD,MAAA,GAAG,CAAC,MAAM,0CAAE,UAAU,CAAC,WAAW,CAAC,CAAA,CAAA;SAAA,CACtC,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,2BAA2B,mCAAQ,gBAAgB,KAAE,OAAO,GAAE,CAAC;QACrE,MAAM,qBAAqB,GACzB,mBAAmB,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,wBAAwB;iBACrB,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC;iBAC7B,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;iBAC/D,MAAM,CAAC,2BAA2B,CAAC;YACxC,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBACrD,qBAAqB,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO;KACR;IAED,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACvE,MAAM,oBAAoB,mCACrB,uBAAuB,GACvB,gBAAgB,CACpB,CAAC;IAEF,6GAA6G;IAC7G,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,8CAA8C,EAC9C,oBAAoB,CACrB,CAAC;IAEF,MAAM,YAAY,GAAG,wCAAwC,CAC3D,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,EAChD,OAAO,CACR,CAAC;IAEF,IACE,qCAAqC,CAAC;QACpC,gBAAgB,EAAE,oBAAoB;QACtC,QAAQ,EAAE,uBAAA,IAAI,6CAAU;QACxB,YAAY;KACb,CAAC,EACF;QACA,+BAA+B,CAAC;YAC9B,gBAAgB,EAAE,oBAAoB;YACtC,sBAAsB,EAAE,GAAG,EAAE,CAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uCAAuC,CAAC;YAC9D,iBAAiB,EAAE,CAAC,eAAgC,EAAE,IAAY,EAAE,EAAE,CACpE,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,yCAAyC,EACzC,eAAe,EACf,IAAI,CACL;SACJ,CAAC,CAAC;KACJ;IAED,IACE,CAAC,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,OAAO;QAC3D,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,QAAQ,CAAC;QAChE,CAAC,gBAAgB,CAAC,SAAS,EAC3B;QACA,MAAM,uBAAA,IAAI,oGAAyB,MAA7B,IAAI,EAA0B,oBAAoB,EAAE;YACxD,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;KACJ;SAAM;QACL,uBAAA,IAAI,mGAAwB,MAA5B,IAAI,EAAyB,gBAAgB,EAAE;YAC7C,OAAO;SACR,CAAC,CAAC;KACJ;AACH,CAAC,yDA0CD,KAAK,+DACH,gBAAkC,EAClC,EACE,OAAO,GAAG,uBAAA,IAAI,4CAAS,EACvB,QAAQ,GAAG,uBAAA,IAAI,6CAAU,GAI1B;;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;KACtC;IACD,MAAM,MAAM,GAAG,MAAA,gBAAgB,CAAC,cAAc,0CAAE,SAAS,CAAC;IAC1D,IAAI;QACF,MAAM,kBAAkB,GAEb,MAAM,KAAK,CAAC,QAAQ,EAAE,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEpE,IAAI,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,WAAW,EAAE;YACnC,uBAAA,IAAI,0DAAuB,MAA3B,IAAI,EAAwB;gBAC1B,KAAK,EAAE,oBAAoB,CAAC,YAAY;gBACxC,QAAQ,EAAE,wBAAwB,CAAC,YAAY;gBAC/C,UAAU,EAAE,oCAAoC,CAAC,gBAAgB,CAAC;gBAClE,mBAAmB,EACjB,6CAA6C,CAAC,gBAAgB,CAAC;aAClE,CAAC,CAAC;YACH,uBAAA,IAAI,mGAAwB,MAA5B,IAAI,kCACG,gBAAgB,KAAE,SAAS,EAAE,IAAI,KACtC;gBACE,OAAO;aACR,CACF,CAAC;SACH;KACF;IAAC,OAAO,KAAK,EAAE;QACd,uBAAA,IAAI,0DAAuB,MAA3B,IAAI,EAAwB;YAC1B,KAAK,EAAE,oBAAoB,CAAC,qBAAqB;YACjD,QAAQ,EAAE,wBAAwB,CAAC,YAAY;SAChD,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;KACvC;YAAS;QACR,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,8DAA8D,EAC9D,gBAAgB,CACjB,CAAC;KACH;AACH,CAAC,uDAyDD,KAAK,6DACH,WAAgC,EAChC,eAAgC;IAEhC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,oCAAoC,EACpC,WAAW,CAAC,IAAI,EAChB,eAAe,CAChB,CAAC;IACF,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;IAClC,SAAS,CAAC,WAAW,EAAE,CAAC;IACxB,uCACK,WAAW,KACd,KAAK,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAChC;AACJ,CAAC,6FAsMW,EACV,eAAe,MAC0B,EAAE;IAC3C,IAAI,eAAe,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CACxB,wCAAwC,EACxC,eAAe,CAChB,CAAC,aAAa,CAAC,OAAO,CAAC;KACzB;IAED,OAAO,uBAAA,IAAI,4CAAS,CAAC;AACvB,CAAC;IAGC,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,MAAM,CACvD,CAAC,OAAO,EAAkB,EAAE,CAC1B,uBAAA,IAAI,sDAAmB,CAAC,QAAQ,CAAC,OAAc,CAAC,CACnD,CAAC;AACJ,CAAC,6GAEmB,EAAE,OAAO,EAAuB;IAClD,MAAM,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC5D,4BAA4B,CAC7B,CAAC;IACF,OAAO,8BAA8B,CAAC,OAAc,CAAC,CAAC,YAAY,CAChE,8BAA8B,CAAC,OAAc,CAAC,CAAC,uBAAuB,CACvE,CAAC,eAAe,CAAC;AACpB,CAAC,+FAEY,EACX,eAAe,MAGb,EAAE;IACJ,IAAI,eAAe,EAAE;QACnB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACtC,wCAAwC,EACxC,eAAe,CAChB,CAAC;QACF,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;KAC/B;IAED,IAAI,uBAAA,IAAI,6CAAU,KAAK,SAAS,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;KACtC;IAED,OAAO,uBAAA,IAAI,6CAAU,CAAC;AACxB,CAAC;IAuEC,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;IACf,MAAM,6BAA6B,GACjC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IACE,CAAC,6BAA6B;QAC9B,6BAA6B,CAAC,MAAM,KAAK,CAAC,EAC1C;QACA,OAAO,EAAE,CAAC;KACX;IACD,OAAO,6BAA6B,CAAC;AACvC,CAAC,uIA2DgC,EAC/B,OAAO,EACP,gBAAgB,GAIjB;IACC,MAAM,EACJ,sBAAsB,EAAE,EAAE,iBAAiB,EAAE,GAC9C,GAAG,IAAI,CAAC,KAAK,CAAC;IACf,MAAM,iCAAiC,GACrC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAG,OAAO,CAAC,CAAC;IAC/B,IACE,CAAC,iCAAiC;QAClC,iCAAiC,CAAC,MAAM,KAAK,CAAC,EAC9C;QACA,OAAO;KACR;IACD,MAAM,oCAAoC,GACxC,iCAAiC,CAAC,MAAM,CACtC,CAAC,gBAAkC,EAAE,EAAE,WACrC,OAAA,CAAA,MAAA,gBAAgB,CAAC,QAAQ,0CAAE,IAAI,MAAK,gBAAgB,CAAA,EAAA,CACvD,CAAC;IACJ,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACrD,oCAAoC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { hexlify } from '@ethersproject/bytes';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport {\n query,\n safelyExecute,\n ChainId,\n isSafeDynamicKey,\n type TraceCallback,\n} from '@metamask/controller-utils';\nimport type { ErrorReportingServiceCaptureExceptionAction } from '@metamask/error-reporting-service';\nimport EthQuery from '@metamask/eth-query';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type {\n RemoteFeatureFlagControllerGetStateAction,\n RemoteFeatureFlagControllerStateChangeEvent,\n} from '@metamask/remote-feature-flag-controller';\nimport type {\n TransactionControllerGetNonceLockAction,\n TransactionControllerGetTransactionsAction,\n TransactionControllerUpdateTransactionAction,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n API_BASE_URL,\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS,\n MetaMetricsEventCategory,\n MetaMetricsEventName,\n SENTINEL_API_BASE_URL_MAP,\n SmartTransactionsTraceName,\n} from './constants';\nimport {\n getSmartTransactionsFeatureFlags,\n getSmartTransactionsFeatureFlagsForChain,\n} from './featureFlags/feature-flags';\nimport { validateSmartTransactionsFeatureFlags } from './featureFlags/validators';\nimport type {\n Fees,\n IndividualTxFees,\n SignedCanceledTransaction,\n SignedTransaction,\n SignedTransactionWithMetadata,\n SmartTransaction,\n SmartTransactionsStatus,\n UnsignedTransaction,\n MetaMetricsProps,\n FeatureFlags,\n ClientId,\n} from './types';\nimport { APIType, SmartTransactionStatuses } from './types';\nimport {\n calculateStatus,\n getAPIRequestURL,\n handleFetch,\n incrementNonceInHex,\n isSmartTransactionCancellable,\n isSmartTransactionPending,\n getTxHash,\n getSmartTransactionMetricsProperties,\n getSmartTransactionMetricsSensitiveProperties,\n shouldMarkRegularTransactionsAsFailed,\n markRegularTransactionsAsFailed,\n} from './utils';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\nconst ETH_QUERY_ERROR_MSG =\n '`ethQuery` is not defined on SmartTransactionsController';\n\n/**\n * The name of the {@link SmartTransactionsController}\n */\nconst controllerName = 'SmartTransactionsController';\n\nconst controllerMetadata: StateMetadata<SmartTransactionsControllerState> = {\n smartTransactionsState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n};\n\ntype FeeEstimates = {\n approvalTxFees: IndividualTxFees | null;\n tradeTxFees: IndividualTxFees | null;\n};\n\nexport type SmartTransactionsControllerState = {\n smartTransactionsState: {\n smartTransactions: Record<Hex, SmartTransaction[]>;\n userOptIn: boolean | null;\n userOptInV2: boolean | null;\n liveness: boolean | null;\n fees: FeeEstimates;\n feesByChainId: Record<Hex, FeeEstimates>;\n livenessByChainId: Record<Hex, boolean>;\n };\n};\n\n/**\n * Get the default {@link SmartTransactionsController} state.\n *\n * @returns The default {@link SmartTransactionsController} state.\n */\nexport function getDefaultSmartTransactionsControllerState(): SmartTransactionsControllerState {\n return {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: null,\n userOptInV2: null,\n fees: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n\n // TODO: set this to false once the clients are all refreshing the liveness state.\n liveness: true,\n livenessByChainId: {\n [ChainId.mainnet]: true,\n [ChainId.sepolia]: true,\n },\n feesByChainId: {\n [ChainId.mainnet]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n [ChainId.sepolia]: {\n approvalTxFees: null,\n tradeTxFees: null,\n },\n },\n },\n };\n}\n\nexport type SmartTransactionsControllerGetStateAction =\n ControllerGetStateAction<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\n/**\n * The actions that can be performed using the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerActions =\n SmartTransactionsControllerGetStateAction;\n\ntype AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | RemoteFeatureFlagControllerGetStateAction\n | TransactionControllerGetNonceLockAction\n | TransactionControllerGetTransactionsAction\n | TransactionControllerUpdateTransactionAction\n | ErrorReportingServiceCaptureExceptionAction;\n\nexport type SmartTransactionsControllerStateChangeEvent =\n ControllerStateChangeEvent<\n typeof controllerName,\n SmartTransactionsControllerState\n >;\n\nexport type SmartTransactionsControllerSmartTransactionEvent = {\n type: 'SmartTransactionsController:smartTransaction';\n payload: [SmartTransaction];\n};\n\nexport type SmartTransactionsControllerSmartTransactionConfirmationDoneEvent = {\n type: 'SmartTransactionsController:smartTransactionConfirmationDone';\n payload: [SmartTransaction];\n};\n\n/**\n * The events that {@link SmartTransactionsController} can emit.\n */\nexport type SmartTransactionsControllerEvents =\n | SmartTransactionsControllerStateChangeEvent\n | SmartTransactionsControllerSmartTransactionEvent\n | SmartTransactionsControllerSmartTransactionConfirmationDoneEvent;\n\ntype AllowedEvents =\n | NetworkControllerStateChangeEvent\n | RemoteFeatureFlagControllerStateChangeEvent;\n\n/**\n * The messenger of the {@link SmartTransactionsController}.\n */\nexport type SmartTransactionsControllerMessenger = Messenger<\n typeof controllerName,\n SmartTransactionsControllerActions | AllowedActions,\n SmartTransactionsControllerEvents | AllowedEvents\n>;\n\ntype SmartTransactionsControllerOptions = {\n interval?: number;\n clientId: ClientId;\n chainId?: Hex;\n supportedChainIds?: Hex[];\n trackMetaMetricsEvent: (\n event: {\n event: MetaMetricsEventName;\n category: MetaMetricsEventCategory;\n properties?: ReturnType<typeof getSmartTransactionMetricsProperties>;\n sensitiveProperties?: ReturnType<\n typeof getSmartTransactionMetricsSensitiveProperties\n >;\n },\n options?: { metaMetricsId?: string } & Record<string, boolean>,\n ) => void;\n state?: Partial<SmartTransactionsControllerState>;\n messenger: SmartTransactionsControllerMessenger;\n getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n /**\n * @deprecated This option is ignored. Feature flags are now read directly\n * from RemoteFeatureFlagController via the messenger. This option will be\n * removed in a future version.\n */\n getFeatureFlags?: () => FeatureFlags;\n /**\n * Optional callback to obtain a bearer token for authenticating requests to\n * the Transaction API. When provided, the token is sent in the\n * Authorization header for all Transaction API calls. Can be used with\n * the authentication flow from @metamask/core-backend (e.g. from\n * AuthenticationController.getBearerToken).\n */\n getBearerToken?: () => Promise<string | undefined> | string | undefined;\n trace?: TraceCallback;\n};\n\nexport type SmartTransactionsControllerPollingInput = {\n chainIds: Hex[];\n};\n\nexport class SmartTransactionsController extends StaticIntervalPollingController<SmartTransactionsControllerPollingInput>()<\n typeof controllerName,\n SmartTransactionsControllerState,\n SmartTransactionsControllerMessenger\n> {\n #interval: number;\n\n #clientId: ClientId;\n\n #chainId: Hex;\n\n #supportedChainIds: Hex[];\n\n timeoutHandle?: NodeJS.Timeout;\n\n #ethQuery: EthQuery | undefined;\n\n readonly #trackMetaMetricsEvent: SmartTransactionsControllerOptions['trackMetaMetricsEvent'];\n\n readonly #getMetaMetricsProps: () => Promise<MetaMetricsProps>;\n\n readonly #getBearerToken?: () =>\n | Promise<string | undefined>\n | string\n | undefined;\n\n #trace: TraceCallback;\n\n /**\n * Validates the smart transactions feature flags from the remote feature flag controller\n * and reports any validation errors to Sentry via ErrorReportingService.\n * Does not report errors when flags are undefined (not yet fetched).\n */\n #validateAndReportFeatureFlags(): void {\n const remoteFeatureFlagControllerState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const rawFlags =\n remoteFeatureFlagControllerState?.remoteFeatureFlags\n ?.smartTransactionsNetworks;\n\n const { errors } = validateSmartTransactionsFeatureFlags(rawFlags);\n\n // Report each validation error to Sentry\n for (const error of errors) {\n this.messenger.call(\n 'ErrorReportingService:captureException',\n new Error(\n `[SmartTransactionsController] Feature flag validation failed: ${\n error.message\n }. Please check the SmartTransactionNetworks feature flag in Remote Config. Smart transactions are disabled for this network. Default disabled config: ${JSON.stringify(\n DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS.default,\n )}`,\n ),\n );\n }\n }\n\n /* istanbul ignore next */\n async #fetch(request: string, options?: RequestInit) {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(this.#clientId && { 'X-Client-Id': this.#clientId }),\n };\n\n const urlMatches =\n request.startsWith(API_BASE_URL) ||\n Object.values(SENTINEL_API_BASE_URL_MAP).some((baseUrl) =>\n request.startsWith(baseUrl),\n );\n if (this.#getBearerToken && urlMatches) {\n const token = await Promise.resolve(this.#getBearerToken());\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n const fetchOptions = {\n ...options,\n headers: {\n ...headers,\n ...options?.headers,\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor({\n interval = DEFAULT_INTERVAL,\n clientId,\n chainId: InitialChainId = ChainId.mainnet,\n supportedChainIds = [ChainId.mainnet, ChainId.sepolia],\n trackMetaMetricsEvent,\n state = {},\n messenger,\n getMetaMetricsProps,\n getBearerToken,\n trace,\n }: SmartTransactionsControllerOptions) {\n super({\n name: controllerName,\n metadata: controllerMetadata,\n messenger,\n state: {\n ...getDefaultSmartTransactionsControllerState(),\n ...state,\n },\n });\n\n this.#interval = interval;\n this.#clientId = clientId;\n this.#chainId = InitialChainId;\n this.#supportedChainIds = supportedChainIds;\n this.setIntervalLength(interval);\n this.#ethQuery = undefined;\n this.#trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.#getMetaMetricsProps = getMetaMetricsProps;\n this.#getBearerToken = getBearerToken;\n this.#trace = trace ?? (((_request, fn) => fn?.()) as TraceCallback);\n\n this.initializeSmartTransactionsForChainId();\n\n this.messenger.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }) => {\n const {\n configuration: { chainId },\n provider,\n } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n this.#chainId = chainId;\n this.#ethQuery = new EthQuery(provider);\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n },\n );\n\n this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) =>\n this.checkPoll(currentState),\n );\n\n // Validate feature flags on changes\n this.messenger.subscribe('RemoteFeatureFlagController:stateChange', () => {\n this.#validateAndReportFeatureFlags();\n });\n }\n\n async _executePoll({\n chainIds,\n }: SmartTransactionsControllerPollingInput): Promise<void> {\n // if this is going to be truly UI driven polling we shouldn't really reach here\n // with a networkClientId that is not supported, but for now I'll add a check in case\n // wondering if we should add some kind of predicate to the polling controller to check whether\n // we should poll or not\n const filteredChainIds = (chainIds ?? []).filter((chainId) =>\n this.#supportedChainIds.includes(chainId),\n );\n\n if (filteredChainIds.length === 0) {\n return Promise.resolve();\n }\n return this.updateSmartTransactions({ chainIds: filteredChainIds });\n }\n\n checkPoll({\n smartTransactionsState: { smartTransactions },\n }: SmartTransactionsControllerState) {\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n\n const pendingTransactions = smartTransactionsForAllChains?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.#supportedChainIds.includes(this.#chainId)) {\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[this.#chainId] =\n state.smartTransactionsState.smartTransactions[this.#chainId] ?? [];\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n if (interval) {\n this.#interval = interval;\n }\n\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n\n if (!this.#supportedChainIds.includes(this.#chainId)) {\n return;\n }\n\n this.timeoutHandle = setInterval(() => {\n safelyExecute(async () => this.updateSmartTransactions());\n }, this.#interval);\n await safelyExecute(async () => this.updateSmartTransactions());\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(optInState: boolean | null): void {\n this.update((state) => {\n state.smartTransactionsState.userOptInV2 = optInState;\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (updatedSmartTransaction.status === prevSmartTransaction?.status) {\n return; // If status hasn't changed, don't track it again.\n }\n\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxStatusUpdated,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(updatedSmartTransaction),\n sensitiveProperties: getSmartTransactionMetricsSensitiveProperties(\n updatedSmartTransaction,\n ),\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string, chainId?: Hex): boolean {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions =\n smartTransactions[chainId ?? this.#chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(\n smartTransaction: SmartTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ) {\n let ethQuery = this.#ethQuery;\n let chainId = this.#chainId;\n if (networkClientId) {\n const { configuration, provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n chainId = configuration.chainId;\n ethQuery = new EthQuery(provider);\n }\n\n this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n #updateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n }: {\n chainId: Hex;\n },\n ) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n\n if (currentIndex === -1) {\n return; // Smart transaction not found, don't update anything.\n }\n\n if (!isSafeDynamicKey(chainId)) {\n return;\n }\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId][currentIndex] = {\n ...state.smartTransactionsState.smartTransactions[chainId][\n currentIndex\n ],\n ...smartTransaction,\n };\n });\n }\n\n async #addMetaMetricsPropsToNewSmartTransaction(\n smartTransaction: SmartTransaction,\n ) {\n const metaMetricsProps = await this.#getMetaMetricsProps();\n smartTransaction.accountHardwareType =\n metaMetricsProps?.accountHardwareType;\n smartTransaction.accountType = metaMetricsProps?.accountType;\n smartTransaction.deviceModel = metaMetricsProps?.deviceModel;\n }\n\n async #createOrUpdateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const currentSmartTransactions = smartTransactions[chainId] ?? [];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n chainId,\n );\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n if (isNewSmartTransaction) {\n try {\n await this.#addMetaMetricsPropsToNewSmartTransaction(smartTransaction);\n } catch (error) {\n console.error(\n 'Failed to add metrics props to smart transaction:',\n error,\n );\n // Continue without metrics props\n }\n }\n\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions?.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions.concat(historifiedSmartTransaction);\n\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n nextSmartTransactions;\n });\n return;\n }\n\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n\n // We have to emit this event here, so a txHash is returned to the TransactionController once it's available.\n this.messenger.publish(\n `SmartTransactionsController:smartTransaction`,\n nextSmartTransaction,\n );\n\n const featureFlags = getSmartTransactionsFeatureFlagsForChain(\n getSmartTransactionsFeatureFlags(this.messenger),\n chainId,\n );\n\n if (\n shouldMarkRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n clientId: this.#clientId,\n featureFlags,\n })\n ) {\n markRegularTransactionsAsFailed({\n smartTransaction: nextSmartTransaction,\n getRegularTransactions: () =>\n this.messenger.call('TransactionController:getTransactions'),\n updateTransaction: (transactionMeta: TransactionMeta, note: string) =>\n this.messenger.call(\n 'TransactionController:updateTransaction',\n transactionMeta,\n note,\n ),\n });\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n await this.#confirmSmartTransaction(nextSmartTransaction, {\n chainId,\n ethQuery,\n });\n } else {\n this.#updateSmartTransaction(smartTransaction, {\n chainId,\n });\n }\n }\n\n async updateSmartTransactions(\n {\n chainIds,\n }: {\n chainIds: Hex[];\n } = {\n chainIds: this.#getChainIds(),\n },\n ): Promise<void> {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n\n // Iterate over each chain group directly\n for (const [chainId, transactions] of Object.entries(smartTransactions)) {\n if (chainIds && !chainIds.includes(chainId as Hex)) {\n continue;\n }\n // Filter pending transactions and map them to the desired shape\n const pendingTransactions = transactions\n .filter(isSmartTransactionPending)\n .map((pendingSmartTransaction) => {\n // Use the transaction's chainId (from the key) to derive a networkClientId\n const networkClientIdToUse = this.#getNetworkClientId({\n chainId: chainId as Hex,\n });\n return {\n uuid: pendingSmartTransaction.uuid,\n networkClientId: networkClientIdToUse,\n chainId: pendingSmartTransaction.chainId as Hex, // same as the key, but explicit on the transaction\n };\n });\n\n if (pendingTransactions.length > 0) {\n // Since each group is per chain, all transactions share the same chainId.\n await this.fetchSmartTransactionsStatus(pendingTransactions);\n }\n }\n }\n\n async #confirmSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.#chainId,\n ethQuery = this.#ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery | undefined;\n },\n ) {\n if (ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt: {\n blockNumber: string;\n } | null = await query(ethQuery, 'getTransactionReceipt', [txHash]);\n\n if (transactionReceipt?.blockNumber) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmed,\n category: MetaMetricsEventCategory.Transactions,\n properties: getSmartTransactionMetricsProperties(smartTransaction),\n sensitiveProperties:\n getSmartTransactionMetricsSensitiveProperties(smartTransaction),\n });\n this.#updateSmartTransaction(\n { ...smartTransaction, confirmed: true },\n {\n chainId,\n },\n );\n }\n } catch (error) {\n this.#trackMetaMetricsEvent({\n event: MetaMetricsEventName.StxConfirmationFailed,\n category: MetaMetricsEventCategory.Transactions,\n });\n console.error('confirm error', error);\n } finally {\n this.messenger.publish(\n `SmartTransactionsController:smartTransactionConfirmationDone`,\n smartTransaction,\n );\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n transactions: {\n uuid: string;\n networkClientId?: NetworkClientId;\n chainId: Hex;\n }[],\n ): Promise<Record<string, SmartTransactionsStatus>> {\n // Since transactions come from the same chain group, take the chainId from the first one.\n const { chainId } = transactions[0];\n\n // Build query parameters with all UUIDs\n const uuids = transactions.map((tx) => tx.uuid);\n const params = new URLSearchParams({ uuids: uuids.join(',') });\n\n // Get the ethQuery for the first transaction's networkClientId\n const ethQuery = this.#getEthQuery({\n networkClientId: transactions[0].networkClientId,\n });\n\n // Construct the URL and fetch the data\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n const data = (await this.#fetch(url)) as Record<\n string,\n SmartTransactionsStatus\n >;\n\n // Process each returned status\n for (const [uuid, stxStatus] of Object.entries(data)) {\n const matchingTx = transactions.find((tx) => tx.uuid === uuid);\n if (!matchingTx) {\n console.error(`No matching transaction found for uuid: ${uuid}`);\n continue;\n }\n\n const smartTransaction: SmartTransaction = {\n statusMetadata: stxStatus,\n status: calculateStatus(stxStatus),\n cancellable: isSmartTransactionCancellable(stxStatus),\n uuid,\n networkClientId: matchingTx.networkClientId,\n };\n\n await this.#createOrUpdateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n return data;\n }\n\n async #addNonceToTransaction(\n transaction: UnsignedTransaction,\n networkClientId: NetworkClientId,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n transaction.from,\n networkClientId,\n );\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: null,\n tradeTxFees: null,\n };\n this.update((state) => {\n state.smartTransactionsState.fees = fees;\n });\n\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx?: UnsignedTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<Fees> {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const transactions: UnsignedTransaction[] = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.#addNonceToTransaction(approvalTx, selectedNetworkClientId);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else if (tradeTx.nonce) {\n unsignedTradeTransactionWithNonce = tradeTx;\n } else {\n unsignedTradeTransactionWithNonce = await this.#addNonceToTransaction(\n tradeTx,\n selectedNetworkClientId,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.GetFees },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n }),\n );\n let approvalTxFees: IndividualTxFees | null;\n let tradeTxFees: IndividualTxFees | null;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n approvalTxFees = null;\n tradeTxFees = data?.txs[0];\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.fees = {\n approvalTxFees,\n tradeTxFees,\n };\n }\n state.smartTransactionsState.feesByChainId[chainId] = {\n approvalTxFees,\n tradeTxFees,\n };\n });\n\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n transactionMeta,\n txParams,\n signedTransactions,\n signedCanceledTransactions = [],\n signedTransactionsWithMetadata,\n networkClientId,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions?: SignedCanceledTransaction[];\n signedTransactionsWithMetadata?: SignedTransactionWithMetadata[];\n transactionMeta?: TransactionMeta;\n txParams?: TransactionParams;\n networkClientId?: NetworkClientId;\n }) {\n const selectedNetworkClientId =\n networkClientId ??\n this.messenger.call('NetworkController:getState').selectedNetworkClientId;\n const chainId = this.#getChainId({\n networkClientId: selectedNetworkClientId,\n });\n const ethQuery = this.#getEthQuery({\n networkClientId: selectedNetworkClientId,\n });\n const data = await this.#trace(\n { name: SmartTransactionsTraceName.SubmitTransactions },\n async () =>\n await this.#fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n rawTxsWithMetadata: signedTransactionsWithMetadata,\n }),\n },\n ),\n );\n const time = Date.now();\n let preTxBalance;\n try {\n if (txParams?.from) {\n const preTxBalanceBN = await query(ethQuery, 'getBalance', [\n txParams.from,\n ]);\n preTxBalance = new BigNumber(preTxBalanceBN).toString(16);\n }\n } catch (error) {\n console.error('ethQuery.getBalance error:', error);\n }\n\n const requiresNonce = txParams && !txParams.nonce;\n let nonce;\n let nonceLock;\n let nonceDetails = {};\n\n // This should only happen for Swaps. Non-swaps transactions should already have a nonce\n if (requiresNonce) {\n try {\n nonceLock = await this.messenger.call(\n 'TransactionController:getNonceLock',\n txParams.from,\n selectedNetworkClientId,\n );\n nonce = hexlify(nonceLock.nextNonce);\n nonceDetails = nonceLock.nonceDetails;\n txParams.nonce ??= nonce;\n } catch (error) {\n console.error('Failed to acquire nonce lock:', error);\n throw error;\n }\n }\n\n const txHashes = signedTransactions.map((tx) => getTxHash(tx));\n const submitTransactionResponse = {\n ...data,\n txHash: txHashes[txHashes.length - 1], // For backward compatibility - use the last tx hash\n txHashes,\n };\n\n try {\n await this.#createOrUpdateSmartTransaction(\n {\n chainId,\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: submitTransactionResponse.uuid,\n txHash: submitTransactionResponse.txHash,\n cancellable: true,\n type: transactionMeta?.type ?? 'swap',\n transactionId: transactionMeta?.id,\n networkClientId: selectedNetworkClientId,\n txHashes, // Add support for multiple transaction hashes\n },\n { chainId, ethQuery },\n );\n } catch (error) {\n console.error('Failed to create a smart transaction:', error);\n throw error;\n } finally {\n if (nonceLock) {\n nonceLock.releaseLock();\n }\n }\n\n return submitTransactionResponse;\n }\n\n #getChainId({\n networkClientId,\n }: { networkClientId?: NetworkClientId } = {}): Hex {\n if (networkClientId) {\n return this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n ).configuration.chainId;\n }\n\n return this.#chainId;\n }\n\n #getChainIds(): Hex[] {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return Object.keys(networkConfigurationsByChainId).filter(\n (chainId): chainId is Hex =>\n this.#supportedChainIds.includes(chainId as Hex),\n );\n }\n\n #getNetworkClientId({ chainId }: { chainId: string }): string {\n const { networkConfigurationsByChainId } = this.messenger.call(\n 'NetworkController:getState',\n );\n return networkConfigurationsByChainId[chainId as Hex].rpcEndpoints[\n networkConfigurationsByChainId[chainId as Hex].defaultRpcEndpointIndex\n ].networkClientId;\n }\n\n #getEthQuery({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): EthQuery {\n if (networkClientId) {\n const { provider } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n return new EthQuery(provider);\n }\n\n if (this.#ethQuery === undefined) {\n throw new Error(ETH_QUERY_ERROR_MSG);\n }\n\n return this.#ethQuery;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(\n uuid: string,\n {\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<void> {\n const chainId = this.#getChainId({ networkClientId });\n await this.#trace(\n { name: SmartTransactionsTraceName.CancelTransaction },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n }),\n );\n }\n\n /**\n * Fetches the liveness status of Smart Transactions for a given chain.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID to fetch liveness for. Preferred over networkClientId.\n * @param options.networkClientId - The network client ID to derive chain ID from.\n * @returns A promise that resolves to the liveness status.\n */\n async fetchLiveness({\n networkClientId,\n chainId: chainIdArg,\n }: {\n /** @deprecated Use `chainId` instead. */\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): Promise<boolean> {\n // Use chainId directly if provided, otherwise derive from networkClientId\n const chainId = chainIdArg ?? this.#getChainId({ networkClientId });\n let liveness = false;\n try {\n const response = await this.#trace(\n { name: SmartTransactionsTraceName.FetchLiveness },\n async () =>\n await this.#fetch(getAPIRequestURL(APIType.LIVENESS, chainId)),\n );\n liveness = Boolean(response.smartTransactions);\n } catch (error) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update((state) => {\n if (chainId === this.#chainId) {\n state.smartTransactionsState.liveness = liveness;\n }\n state.smartTransactionsState.livenessByChainId[chainId] = liveness;\n });\n\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.#interval) {\n this.#interval = interval;\n }\n }\n\n #getCurrentSmartTransactions(): SmartTransaction[] {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForAllChains =\n Object.values(smartTransactions).flat();\n if (\n !smartTransactionsForAllChains ||\n smartTransactionsForAllChains.length === 0\n ) {\n return [];\n }\n return smartTransactionsForAllChains;\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n\n getSmartTransactionByMinedTxHash(\n txHash: string | undefined,\n ): SmartTransaction | undefined {\n if (!txHash) {\n return undefined;\n }\n const currentSmartTransactions = this.#getCurrentSmartTransactions();\n return currentSmartTransactions.find((smartTransaction) => {\n return (\n smartTransaction.statusMetadata?.minedHash?.toLowerCase() ===\n txHash.toLowerCase()\n );\n });\n }\n\n wipeSmartTransactions({\n address,\n ignoreNetwork,\n }: {\n address: string;\n ignoreNetwork?: boolean;\n }): void {\n if (!address) {\n return;\n }\n const addressLowerCase = address.toLowerCase();\n if (ignoreNetwork) {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n (Object.keys(smartTransactions) as Hex[]).forEach((chainId) => {\n this.#wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n });\n });\n } else {\n this.#wipeSmartTransactionsPerChainId({\n chainId: this.#chainId,\n addressLowerCase,\n });\n }\n }\n\n #wipeSmartTransactionsPerChainId({\n chainId,\n addressLowerCase,\n }: {\n chainId: Hex;\n addressLowerCase: string;\n }): void {\n const {\n smartTransactionsState: { smartTransactions },\n } = this.state;\n const smartTransactionsForSelectedChain: SmartTransaction[] =\n smartTransactions?.[chainId];\n if (\n !smartTransactionsForSelectedChain ||\n smartTransactionsForSelectedChain.length === 0\n ) {\n return;\n }\n const newSmartTransactionsForSelectedChain =\n smartTransactionsForSelectedChain.filter(\n (smartTransaction: SmartTransaction) =>\n smartTransaction.txParams?.from !== addressLowerCase,\n );\n this.update((state) => {\n state.smartTransactionsState.smartTransactions[chainId] =\n newSmartTransactionsForSelectedChain;\n });\n }\n}\n"]}
@@ -48,6 +48,7 @@ exports.DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {
48
48
  extensionReturnTxHashAsapBatch: false,
49
49
  mobileReturnTxHashAsap: false,
50
50
  extensionSkipSmartTransactionStatusPage: false,
51
+ gaslessBridgeWith7702Enabled: false,
51
52
  batchStatusPollingInterval: 1000,
52
53
  },
53
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAChB,QAAA,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAK/B;AAED,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAGnC;AAED,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,kCAA0B,KAA1B,kCAA0B,QAKrC;AAED;;;;GAIG;AACU,QAAA,iDAAiD,GAAG;IAC/D,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,GAAG;QAChB,yBAAyB,EAAE,KAAK;QAChC,8BAA8B,EAAE,KAAK;QACrC,sBAAsB,EAAE,KAAK;QAC7B,uCAAuC,EAAE,KAAK;QAC9C,0BAA0B,EAAE,IAAI;KACjC;CACO,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n\n/**\n * Default feature flags configuration for smart transactions.\n * Used as a fallback when remote feature flags are unavailable or invalid.\n * This is voluntarily defensive because it is applied to any network without valid configuration.\n */\nexport const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {\n default: {\n extensionActive: false,\n mobileActive: false,\n mobileActiveIOS: false,\n mobileActiveAndroid: false,\n expectedDeadline: 45,\n maxDeadline: 150,\n extensionReturnTxHashAsap: false,\n extensionReturnTxHashAsapBatch: false,\n mobileReturnTxHashAsap: false,\n extensionSkipSmartTransactionStatusPage: false,\n batchStatusPollingInterval: 1000,\n },\n} as const;\n"]}
1
+ {"version":3,"file":"constants.cjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAChB,QAAA,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAK/B;AAED,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAGnC;AAED,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,kCAA0B,KAA1B,kCAA0B,QAKrC;AAED;;;;GAIG;AACU,QAAA,iDAAiD,GAAG;IAC/D,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,GAAG;QAChB,yBAAyB,EAAE,KAAK;QAChC,8BAA8B,EAAE,KAAK;QACrC,sBAAsB,EAAE,KAAK;QAC7B,uCAAuC,EAAE,KAAK;QAC9C,4BAA4B,EAAE,KAAK;QACnC,0BAA0B,EAAE,IAAI;KACjC;CACO,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n\n/**\n * Default feature flags configuration for smart transactions.\n * Used as a fallback when remote feature flags are unavailable or invalid.\n * This is voluntarily defensive because it is applied to any network without valid configuration.\n */\nexport const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {\n default: {\n extensionActive: false,\n mobileActive: false,\n mobileActiveIOS: false,\n mobileActiveAndroid: false,\n expectedDeadline: 45,\n maxDeadline: 150,\n extensionReturnTxHashAsap: false,\n extensionReturnTxHashAsapBatch: false,\n mobileReturnTxHashAsap: false,\n extensionSkipSmartTransactionStatusPage: false,\n gaslessBridgeWith7702Enabled: false,\n batchStatusPollingInterval: 1000,\n },\n} as const;\n"]}
@@ -36,6 +36,7 @@ export declare const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS: {
36
36
  readonly extensionReturnTxHashAsapBatch: false;
37
37
  readonly mobileReturnTxHashAsap: false;
38
38
  readonly extensionSkipSmartTransactionStatusPage: false;
39
+ readonly gaslessBridgeWith7702Enabled: false;
39
40
  readonly batchStatusPollingInterval: 1000;
40
41
  };
41
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;CAcpD,CAAC"}
1
+ {"version":3,"file":"constants.d.cts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;;CAepD,CAAC"}
@@ -36,6 +36,7 @@ export declare const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS: {
36
36
  readonly extensionReturnTxHashAsapBatch: false;
37
37
  readonly mobileReturnTxHashAsap: false;
38
38
  readonly extensionSkipSmartTransactionStatusPage: false;
39
+ readonly gaslessBridgeWith7702Enabled: false;
39
40
  readonly batchStatusPollingInterval: 1000;
40
41
  };
41
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;CAcpD,CAAC"}
1
+ {"version":3,"file":"constants.d.mts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,2CAA2C,CAAC;AAErE,aAAK,qBAAqB,GAAG;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAGF,eAAO,MAAM,yBAAyB,EAAE,qBAQvC,CAAC;AAEF,oBAAY,oBAAoB;IAC9B,gBAAgB,uBAAuB;IACvC,YAAY,kBAAkB;IAC9B,qBAAqB,4BAA4B;IACjD,cAAc,oBAAoB;CACnC;AAED,oBAAY,wBAAwB;IAClC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;CAC1B;AAED,oBAAY,0BAA0B;IACpC,OAAO,iCAAiC;IACxC,kBAAkB,4CAA4C;IAC9D,iBAAiB,2CAA2C;IAC5D,aAAa,uCAAuC;CACrD;AAED;;;;GAIG;AACH,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;;CAepD,CAAC"}
@@ -45,6 +45,7 @@ export const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {
45
45
  extensionReturnTxHashAsapBatch: false,
46
46
  mobileReturnTxHashAsap: false,
47
47
  extensionSkipSmartTransactionStatusPage: false,
48
+ gaslessBridgeWith7702Enabled: false,
48
49
  batchStatusPollingInterval: 1000,
49
50
  },
50
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,oBAAoB,KAApB,oBAAoB,QAK/B;AAED,MAAM,CAAN,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAGnC;AAED,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,0BAA0B,KAA1B,0BAA0B,QAKrC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,GAAG;QAChB,yBAAyB,EAAE,KAAK;QAChC,8BAA8B,EAAE,KAAK;QACrC,sBAAsB,EAAE,KAAK;QAC7B,uCAAuC,EAAE,KAAK;QAC9C,0BAA0B,EAAE,IAAI;KACjC;CACO,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n\n/**\n * Default feature flags configuration for smart transactions.\n * Used as a fallback when remote feature flags are unavailable or invalid.\n * This is voluntarily defensive because it is applied to any network without valid configuration.\n */\nexport const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {\n default: {\n extensionActive: false,\n mobileActive: false,\n mobileActiveIOS: false,\n mobileActiveAndroid: false,\n expectedDeadline: 45,\n maxDeadline: 150,\n extensionReturnTxHashAsap: false,\n extensionReturnTxHashAsapBatch: false,\n mobileReturnTxHashAsap: false,\n extensionSkipSmartTransactionStatusPage: false,\n batchStatusPollingInterval: 1000,\n },\n} as const;\n"]}
1
+ {"version":3,"file":"constants.mjs","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAMrE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,yBAAyB,GAA0B;IAC9D,CAAC,EAAE,yDAAyD;IAC5D,EAAE,EAAE,oDAAoD;IACxD,GAAG,EAAE,wDAAwD;IAC7D,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,yDAAyD;IAChE,KAAK,EAAE,sDAAsD;IAC7D,QAAQ,EAAE,yDAAyD;CACpE,CAAC;AAEF,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC9B,+DAAuC,CAAA;IACvC,sDAA8B,CAAA;IAC9B,yEAAiD,CAAA;IACjD,0DAAkC,CAAA;AACpC,CAAC,EALW,oBAAoB,GAApB,oBAAoB,KAApB,oBAAoB,QAK/B;AAED,MAAM,CAAN,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAClC,yDAA6B,CAAA;IAC7B,qDAAyB,CAAA;AAC3B,CAAC,EAHW,wBAAwB,GAAxB,wBAAwB,KAAxB,wBAAwB,QAGnC;AAED,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IACpC,sEAAwC,CAAA;IACxC,4FAA8D,CAAA;IAC9D,0FAA4D,CAAA;IAC5D,kFAAoD,CAAA;AACtD,CAAC,EALW,0BAA0B,GAA1B,0BAA0B,KAA1B,0BAA0B,QAKrC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,GAAG;QAChB,yBAAyB,EAAE,KAAK;QAChC,8BAA8B,EAAE,KAAK;QACrC,sBAAsB,EAAE,KAAK;QAC7B,uCAAuC,EAAE,KAAK;QAC9C,4BAA4B,EAAE,KAAK;QACnC,0BAA0B,EAAE,IAAI;KACjC;CACO,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.api.cx.metamask.io';\n\ntype SentinelApiBaseUrlMap = {\n [key: number]: string;\n};\n\n// The map with types applied\nexport const SENTINEL_API_BASE_URL_MAP: SentinelApiBaseUrlMap = {\n 1: 'https://tx-sentinel-ethereum-mainnet.api.cx.metamask.io',\n 56: 'https://tx-sentinel-bsc-mainnet.api.cx.metamask.io',\n 137: 'https://tx-sentinel-polygon-mainnet.api.cx.metamask.io',\n 8453: 'https://tx-sentinel-base-mainnet.api.cx.metamask.io',\n 42161: 'https://tx-sentinel-arbitrum-mainnet.api.cx.metamask.io',\n 59144: 'https://tx-sentinel-linea-mainnet.api.cx.metamask.io',\n 11155111: 'https://tx-sentinel-ethereum-sepolia.api.cx.metamask.io',\n};\n\nexport enum MetaMetricsEventName {\n StxStatusUpdated = 'STX Status Updated',\n StxConfirmed = 'STX Confirmed',\n StxConfirmationFailed = 'STX Confirmation Failed',\n ReceiveRequest = 'Receive Request',\n}\n\nexport enum MetaMetricsEventCategory {\n Transactions = 'Transactions',\n Navigation = 'Navigation',\n}\n\nexport enum SmartTransactionsTraceName {\n GetFees = 'Smart Transactions: Get Fees',\n SubmitTransactions = 'Smart Transactions: Submit Transactions',\n CancelTransaction = 'Smart Transactions: Cancel Transaction',\n FetchLiveness = 'Smart Transactions: Fetch Liveness',\n}\n\n/**\n * Default feature flags configuration for smart transactions.\n * Used as a fallback when remote feature flags are unavailable or invalid.\n * This is voluntarily defensive because it is applied to any network without valid configuration.\n */\nexport const DEFAULT_DISABLED_SMART_TRANSACTIONS_FEATURE_FLAGS = {\n default: {\n extensionActive: false,\n mobileActive: false,\n mobileActiveIOS: false,\n mobileActiveAndroid: false,\n expectedDeadline: 45,\n maxDeadline: 150,\n extensionReturnTxHashAsap: false,\n extensionReturnTxHashAsapBatch: false,\n mobileReturnTxHashAsap: false,\n extensionSkipSmartTransactionStatusPage: false,\n gaslessBridgeWith7702Enabled: false,\n batchStatusPollingInterval: 1000,\n },\n} as const;\n"]}
@@ -40,6 +40,8 @@ exports.SmartTransactionsNetworkConfigSchema = (0, superstruct_1.type)({
40
40
  extensionSkipSmartTransactionStatusPage: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
41
41
  /** Polling interval in milliseconds for batch status updates */
42
42
  batchStatusPollingInterval: (0, superstruct_1.optional)((0, superstruct_1.number)()),
43
+ /** Whether gasless bridge with 7702 is enabled for the network */
44
+ gaslessBridgeWith7702Enabled: (0, superstruct_1.optional)((0, superstruct_1.boolean)()),
43
45
  /** Custom sentinel URL for the network */
44
46
  sentinelUrl: (0, superstruct_1.optional)((0, superstruct_1.string)()),
45
47
  });
@@ -1 +1 @@
1
- {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n boolean,\n number,\n optional,\n string,\n type,\n is,\n validate,\n} from '@metamask/superstruct';\nimport type { Infer } from '@metamask/superstruct';\nimport { isCaipChainId, isStrictHexString } from '@metamask/utils';\n\n/**\n * Validates that a key is a valid chain ID (hex or CAIP-2 format).\n * Supports both EVM hex chain IDs and chain-agnostic CAIP-2 identifiers.\n *\n * @param key - The key to validate\n * @returns True if the key is a valid chain ID format\n */\nfunction isValidChainIdKey(key: string): boolean {\n return isStrictHexString(key) || isCaipChainId(key);\n}\n\n/**\n * Schema for validating per-network smart transactions configuration.\n * All fields are optional to allow partial configuration and merging with defaults.\n */\nexport const SmartTransactionsNetworkConfigSchema = type({\n /** Whether smart transactions are active for the extension client */\n extensionActive: optional(boolean()),\n /** Whether smart transactions are active for mobile clients (generic) */\n mobileActive: optional(boolean()),\n /** Whether smart transactions are active for iOS specifically */\n mobileActiveIOS: optional(boolean()),\n /** Whether smart transactions are active for Android specifically */\n mobileActiveAndroid: optional(boolean()),\n /** Expected time in seconds for a smart transaction to be mined */\n expectedDeadline: optional(number()),\n /** Maximum time in seconds before a smart transaction is considered failed */\n maxDeadline: optional(number()),\n /** Whether extension should return tx hash immediately without waiting for confirmation */\n extensionReturnTxHashAsap: optional(boolean()),\n /** Whether extension should return tx hash immediately for batch transactions */\n extensionReturnTxHashAsapBatch: optional(boolean()),\n /** Whether mobile should return tx hash immediately without waiting for confirmation */\n mobileReturnTxHashAsap: optional(boolean()),\n /** Whether extension should skip the smart transaction status page */\n extensionSkipSmartTransactionStatusPage: optional(boolean()),\n /** Polling interval in milliseconds for batch status updates */\n batchStatusPollingInterval: optional(number()),\n /** Custom sentinel URL for the network */\n sentinelUrl: optional(string()),\n});\n\n/**\n * Schema for validating the complete smart transactions feature flags configuration.\n * This includes a default configuration and optional chain-specific overrides.\n */\nexport const SmartTransactionsFeatureFlagsConfigSchema = type({\n /** Default configuration applied to all chains unless overridden */\n default: optional(SmartTransactionsNetworkConfigSchema),\n});\n\n/**\n * Type inferred from the SmartTransactionsNetworkConfigSchema\n */\nexport type SmartTransactionsNetworkConfigFromSchema = Infer<\n typeof SmartTransactionsNetworkConfigSchema\n>;\n\n/**\n * Type inferred from the SmartTransactionsFeatureFlagsConfigSchema\n */\nexport type SmartTransactionsFeatureFlagsConfigFromSchema = Infer<\n typeof SmartTransactionsFeatureFlagsConfigSchema\n>;\n\n/**\n * Result of processing feature flags with collected validation errors.\n * Uses per-chain validation: invalid chains are removed, valid ones are kept.\n */\nexport type FeatureFlagsProcessResult = {\n /** The validated configuration (may be partial if some chains were invalid) */\n config: SmartTransactionsFeatureFlagsConfigFromSchema &\n Record<string, SmartTransactionsNetworkConfigFromSchema | undefined>;\n /** Validation errors for invalid parts of the configuration */\n errors: Error[];\n};\n\n/**\n * Validates smart transactions feature flags with per-chain validation.\n * - If the input is not an object, returns empty config with error\n * - If `default` is present and invalid, returns empty config with error\n * - For each chain: if invalid, removes it and collects error; if valid, includes it\n *\n * @param data - The data to validate\n * @returns The validated config and any validation errors\n */\nexport function validateSmartTransactionsFeatureFlags(\n data: unknown,\n): FeatureFlagsProcessResult {\n const errors: Error[] = [];\n\n // Step 1: Check if it's a valid object\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n const typeDescription = data === null ? 'null' : typeof data;\n const arraySuffix = Array.isArray(data) ? ' (array)' : '';\n return {\n config: {},\n errors: [\n new Error(\n `Expected an object, received ${typeDescription}${arraySuffix}`,\n ),\n ],\n };\n }\n\n const dataRecord = data as Record<string, unknown>;\n const validConfig: FeatureFlagsProcessResult['config'] = {};\n\n // Step 2: Validate 'default' - if present and invalid, reject everything\n if (dataRecord.default !== undefined) {\n const [defaultError, validatedDefault] = validate(\n dataRecord.default,\n SmartTransactionsNetworkConfigSchema,\n );\n if (defaultError) {\n return {\n config: {},\n errors: [\n new Error(`Invalid 'default' config: ${defaultError.message}`),\n ],\n };\n }\n // validatedDefault is properly typed from superstruct\n validConfig.default = validatedDefault;\n }\n\n // Step 3: Validate chain-specific configs, keeping valid ones\n for (const [key, value] of Object.entries(dataRecord)) {\n if (key === 'default') {\n continue;\n }\n\n // Check chain ID format\n if (!isValidChainIdKey(key)) {\n errors.push(\n new Error(\n `Invalid chain ID key \"${key}\". Expected hex string (e.g., \"0x1\") or CAIP-2 format (e.g., \"eip155:1\", \"solana:...\")`,\n ),\n );\n continue; // Skip this chain, don't add to result\n }\n\n // Validate chain config\n if (value !== undefined) {\n const [chainError, validatedChain] = validate(\n value,\n SmartTransactionsNetworkConfigSchema,\n );\n if (chainError) {\n errors.push(new Error(`Chain \"${key}\": ${chainError.message}`));\n continue; // Skip this chain, don't add to result\n }\n // validatedChain is properly typed from superstruct\n validConfig[key] = validatedChain;\n }\n }\n\n return { config: validConfig, errors };\n}\n\n/**\n * Validates that the given data conforms to the SmartTransactionsNetworkConfig schema.\n *\n * @param data - The data to validate\n * @returns True if the data is valid, false otherwise\n */\nexport function validateSmartTransactionsNetworkConfig(\n data: unknown,\n): data is SmartTransactionsNetworkConfigFromSchema {\n return is(data, SmartTransactionsNetworkConfigSchema);\n}\n"]}
1
+ {"version":3,"file":"validators.cjs","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n boolean,\n number,\n optional,\n string,\n type,\n is,\n validate,\n} from '@metamask/superstruct';\nimport type { Infer } from '@metamask/superstruct';\nimport { isCaipChainId, isStrictHexString } from '@metamask/utils';\n\n/**\n * Validates that a key is a valid chain ID (hex or CAIP-2 format).\n * Supports both EVM hex chain IDs and chain-agnostic CAIP-2 identifiers.\n *\n * @param key - The key to validate\n * @returns True if the key is a valid chain ID format\n */\nfunction isValidChainIdKey(key: string): boolean {\n return isStrictHexString(key) || isCaipChainId(key);\n}\n\n/**\n * Schema for validating per-network smart transactions configuration.\n * All fields are optional to allow partial configuration and merging with defaults.\n */\nexport const SmartTransactionsNetworkConfigSchema = type({\n /** Whether smart transactions are active for the extension client */\n extensionActive: optional(boolean()),\n /** Whether smart transactions are active for mobile clients (generic) */\n mobileActive: optional(boolean()),\n /** Whether smart transactions are active for iOS specifically */\n mobileActiveIOS: optional(boolean()),\n /** Whether smart transactions are active for Android specifically */\n mobileActiveAndroid: optional(boolean()),\n /** Expected time in seconds for a smart transaction to be mined */\n expectedDeadline: optional(number()),\n /** Maximum time in seconds before a smart transaction is considered failed */\n maxDeadline: optional(number()),\n /** Whether extension should return tx hash immediately without waiting for confirmation */\n extensionReturnTxHashAsap: optional(boolean()),\n /** Whether extension should return tx hash immediately for batch transactions */\n extensionReturnTxHashAsapBatch: optional(boolean()),\n /** Whether mobile should return tx hash immediately without waiting for confirmation */\n mobileReturnTxHashAsap: optional(boolean()),\n /** Whether extension should skip the smart transaction status page */\n extensionSkipSmartTransactionStatusPage: optional(boolean()),\n /** Polling interval in milliseconds for batch status updates */\n batchStatusPollingInterval: optional(number()),\n /** Whether gasless bridge with 7702 is enabled for the network */\n gaslessBridgeWith7702Enabled: optional(boolean()),\n /** Custom sentinel URL for the network */\n sentinelUrl: optional(string()),\n});\n\n/**\n * Schema for validating the complete smart transactions feature flags configuration.\n * This includes a default configuration and optional chain-specific overrides.\n */\nexport const SmartTransactionsFeatureFlagsConfigSchema = type({\n /** Default configuration applied to all chains unless overridden */\n default: optional(SmartTransactionsNetworkConfigSchema),\n});\n\n/**\n * Type inferred from the SmartTransactionsNetworkConfigSchema\n */\nexport type SmartTransactionsNetworkConfigFromSchema = Infer<\n typeof SmartTransactionsNetworkConfigSchema\n>;\n\n/**\n * Type inferred from the SmartTransactionsFeatureFlagsConfigSchema\n */\nexport type SmartTransactionsFeatureFlagsConfigFromSchema = Infer<\n typeof SmartTransactionsFeatureFlagsConfigSchema\n>;\n\n/**\n * Result of processing feature flags with collected validation errors.\n * Uses per-chain validation: invalid chains are removed, valid ones are kept.\n */\nexport type FeatureFlagsProcessResult = {\n /** The validated configuration (may be partial if some chains were invalid) */\n config: SmartTransactionsFeatureFlagsConfigFromSchema &\n Record<string, SmartTransactionsNetworkConfigFromSchema | undefined>;\n /** Validation errors for invalid parts of the configuration */\n errors: Error[];\n};\n\n/**\n * Validates smart transactions feature flags with per-chain validation.\n * - If the input is not an object, returns empty config with error\n * - If `default` is present and invalid, returns empty config with error\n * - For each chain: if invalid, removes it and collects error; if valid, includes it\n *\n * @param data - The data to validate\n * @returns The validated config and any validation errors\n */\nexport function validateSmartTransactionsFeatureFlags(\n data: unknown,\n): FeatureFlagsProcessResult {\n const errors: Error[] = [];\n\n // Step 1: Check if it's a valid object\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n const typeDescription = data === null ? 'null' : typeof data;\n const arraySuffix = Array.isArray(data) ? ' (array)' : '';\n return {\n config: {},\n errors: [\n new Error(\n `Expected an object, received ${typeDescription}${arraySuffix}`,\n ),\n ],\n };\n }\n\n const dataRecord = data as Record<string, unknown>;\n const validConfig: FeatureFlagsProcessResult['config'] = {};\n\n // Step 2: Validate 'default' - if present and invalid, reject everything\n if (dataRecord.default !== undefined) {\n const [defaultError, validatedDefault] = validate(\n dataRecord.default,\n SmartTransactionsNetworkConfigSchema,\n );\n if (defaultError) {\n return {\n config: {},\n errors: [\n new Error(`Invalid 'default' config: ${defaultError.message}`),\n ],\n };\n }\n // validatedDefault is properly typed from superstruct\n validConfig.default = validatedDefault;\n }\n\n // Step 3: Validate chain-specific configs, keeping valid ones\n for (const [key, value] of Object.entries(dataRecord)) {\n if (key === 'default') {\n continue;\n }\n\n // Check chain ID format\n if (!isValidChainIdKey(key)) {\n errors.push(\n new Error(\n `Invalid chain ID key \"${key}\". Expected hex string (e.g., \"0x1\") or CAIP-2 format (e.g., \"eip155:1\", \"solana:...\")`,\n ),\n );\n continue; // Skip this chain, don't add to result\n }\n\n // Validate chain config\n if (value !== undefined) {\n const [chainError, validatedChain] = validate(\n value,\n SmartTransactionsNetworkConfigSchema,\n );\n if (chainError) {\n errors.push(new Error(`Chain \"${key}\": ${chainError.message}`));\n continue; // Skip this chain, don't add to result\n }\n // validatedChain is properly typed from superstruct\n validConfig[key] = validatedChain;\n }\n }\n\n return { config: validConfig, errors };\n}\n\n/**\n * Validates that the given data conforms to the SmartTransactionsNetworkConfig schema.\n *\n * @param data - The data to validate\n * @returns True if the data is valid, false otherwise\n */\nexport function validateSmartTransactionsNetworkConfig(\n data: unknown,\n): data is SmartTransactionsNetworkConfigFromSchema {\n return is(data, SmartTransactionsNetworkConfigSchema);\n}\n"]}
@@ -15,6 +15,7 @@ export declare const SmartTransactionsNetworkConfigSchema: import("@metamask/sup
15
15
  mobileReturnTxHashAsap?: boolean | undefined;
16
16
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
17
17
  batchStatusPollingInterval?: number | undefined;
18
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
18
19
  sentinelUrl?: string | undefined;
19
20
  }, {
20
21
  /** Whether smart transactions are active for the extension client */
@@ -39,6 +40,8 @@ export declare const SmartTransactionsNetworkConfigSchema: import("@metamask/sup
39
40
  extensionSkipSmartTransactionStatusPage: import("@metamask/superstruct").Struct<boolean | undefined, null>;
40
41
  /** Polling interval in milliseconds for batch status updates */
41
42
  batchStatusPollingInterval: import("@metamask/superstruct").Struct<number | undefined, null>;
43
+ /** Whether gasless bridge with 7702 is enabled for the network */
44
+ gaslessBridgeWith7702Enabled: import("@metamask/superstruct").Struct<boolean | undefined, null>;
42
45
  /** Custom sentinel URL for the network */
43
46
  sentinelUrl: import("@metamask/superstruct").Struct<string | undefined, null>;
44
47
  }>;
@@ -59,6 +62,7 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
59
62
  mobileReturnTxHashAsap?: boolean | undefined;
60
63
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
61
64
  batchStatusPollingInterval?: number | undefined;
65
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
62
66
  sentinelUrl?: string | undefined;
63
67
  } | undefined;
64
68
  }, {
@@ -75,6 +79,7 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
75
79
  mobileReturnTxHashAsap?: boolean | undefined;
76
80
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
77
81
  batchStatusPollingInterval?: number | undefined;
82
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
78
83
  sentinelUrl?: string | undefined;
79
84
  } | undefined, {
80
85
  /** Whether smart transactions are active for the extension client */
@@ -99,6 +104,8 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
99
104
  extensionSkipSmartTransactionStatusPage: import("@metamask/superstruct").Struct<boolean | undefined, null>;
100
105
  /** Polling interval in milliseconds for batch status updates */
101
106
  batchStatusPollingInterval: import("@metamask/superstruct").Struct<number | undefined, null>;
107
+ /** Whether gasless bridge with 7702 is enabled for the network */
108
+ gaslessBridgeWith7702Enabled: import("@metamask/superstruct").Struct<boolean | undefined, null>;
102
109
  /** Custom sentinel URL for the network */
103
110
  sentinelUrl: import("@metamask/superstruct").Struct<string | undefined, null>;
104
111
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAcnD;;;GAGG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;IAC/C,qEAAqE;;IAErE,yEAAyE;;IAEzE,iEAAiE;;IAEjE,qEAAqE;;IAErE,mEAAmE;;IAEnE,8EAA8E;;IAE9E,2FAA2F;;IAE3F,iFAAiF;;IAEjF,wFAAwF;;IAExF,sEAAsE;;IAEtE,gEAAgE;;IAEhE,0CAA0C;;EAE1C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,yCAAyC;;;;;;;;;;;;;;;;IACpD,oEAAoE;;;;;;;;;;;;;;;QA/BpE,qEAAqE;;QAErE,yEAAyE;;QAEzE,iEAAiE;;QAEjE,qEAAqE;;QAErE,mEAAmE;;QAEnE,8EAA8E;;QAE9E,2FAA2F;;QAE3F,iFAAiF;;QAEjF,wFAAwF;;QAExF,sEAAsE;;QAEtE,gEAAgE;;QAEhE,0CAA0C;;;EAW1C,CAAC;AAEH;;GAEG;AACH,oBAAY,wCAAwC,GAAG,KAAK,CAC1D,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;GAEG;AACH,oBAAY,6CAA6C,GAAG,KAAK,CAC/D,OAAO,yCAAyC,CACjD,CAAC;AAEF;;;GAGG;AACH,oBAAY,yBAAyB,GAAG;IACtC,+EAA+E;IAC/E,MAAM,EAAE,6CAA6C,GACnD,MAAM,CAAC,MAAM,EAAE,wCAAwC,GAAG,SAAS,CAAC,CAAC;IACvE,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,OAAO,GACZ,yBAAyB,CAsE3B;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,wCAAwC,CAElD"}
1
+ {"version":3,"file":"validators.d.cts","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAcnD;;;GAGG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;IAC/C,qEAAqE;;IAErE,yEAAyE;;IAEzE,iEAAiE;;IAEjE,qEAAqE;;IAErE,mEAAmE;;IAEnE,8EAA8E;;IAE9E,2FAA2F;;IAE3F,iFAAiF;;IAEjF,wFAAwF;;IAExF,sEAAsE;;IAEtE,gEAAgE;;IAEhE,kEAAkE;;IAElE,0CAA0C;;EAE1C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,yCAAyC;;;;;;;;;;;;;;;;;IACpD,oEAAoE;;;;;;;;;;;;;;;;QAjCpE,qEAAqE;;QAErE,yEAAyE;;QAEzE,iEAAiE;;QAEjE,qEAAqE;;QAErE,mEAAmE;;QAEnE,8EAA8E;;QAE9E,2FAA2F;;QAE3F,iFAAiF;;QAEjF,wFAAwF;;QAExF,sEAAsE;;QAEtE,gEAAgE;;QAEhE,kEAAkE;;QAElE,0CAA0C;;;EAW1C,CAAC;AAEH;;GAEG;AACH,oBAAY,wCAAwC,GAAG,KAAK,CAC1D,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;GAEG;AACH,oBAAY,6CAA6C,GAAG,KAAK,CAC/D,OAAO,yCAAyC,CACjD,CAAC;AAEF;;;GAGG;AACH,oBAAY,yBAAyB,GAAG;IACtC,+EAA+E;IAC/E,MAAM,EAAE,6CAA6C,GACnD,MAAM,CAAC,MAAM,EAAE,wCAAwC,GAAG,SAAS,CAAC,CAAC;IACvE,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,OAAO,GACZ,yBAAyB,CAsE3B;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,wCAAwC,CAElD"}
@@ -15,6 +15,7 @@ export declare const SmartTransactionsNetworkConfigSchema: import("@metamask/sup
15
15
  mobileReturnTxHashAsap?: boolean | undefined;
16
16
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
17
17
  batchStatusPollingInterval?: number | undefined;
18
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
18
19
  sentinelUrl?: string | undefined;
19
20
  }, {
20
21
  /** Whether smart transactions are active for the extension client */
@@ -39,6 +40,8 @@ export declare const SmartTransactionsNetworkConfigSchema: import("@metamask/sup
39
40
  extensionSkipSmartTransactionStatusPage: import("@metamask/superstruct").Struct<boolean | undefined, null>;
40
41
  /** Polling interval in milliseconds for batch status updates */
41
42
  batchStatusPollingInterval: import("@metamask/superstruct").Struct<number | undefined, null>;
43
+ /** Whether gasless bridge with 7702 is enabled for the network */
44
+ gaslessBridgeWith7702Enabled: import("@metamask/superstruct").Struct<boolean | undefined, null>;
42
45
  /** Custom sentinel URL for the network */
43
46
  sentinelUrl: import("@metamask/superstruct").Struct<string | undefined, null>;
44
47
  }>;
@@ -59,6 +62,7 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
59
62
  mobileReturnTxHashAsap?: boolean | undefined;
60
63
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
61
64
  batchStatusPollingInterval?: number | undefined;
65
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
62
66
  sentinelUrl?: string | undefined;
63
67
  } | undefined;
64
68
  }, {
@@ -75,6 +79,7 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
75
79
  mobileReturnTxHashAsap?: boolean | undefined;
76
80
  extensionSkipSmartTransactionStatusPage?: boolean | undefined;
77
81
  batchStatusPollingInterval?: number | undefined;
82
+ gaslessBridgeWith7702Enabled?: boolean | undefined;
78
83
  sentinelUrl?: string | undefined;
79
84
  } | undefined, {
80
85
  /** Whether smart transactions are active for the extension client */
@@ -99,6 +104,8 @@ export declare const SmartTransactionsFeatureFlagsConfigSchema: import("@metamas
99
104
  extensionSkipSmartTransactionStatusPage: import("@metamask/superstruct").Struct<boolean | undefined, null>;
100
105
  /** Polling interval in milliseconds for batch status updates */
101
106
  batchStatusPollingInterval: import("@metamask/superstruct").Struct<number | undefined, null>;
107
+ /** Whether gasless bridge with 7702 is enabled for the network */
108
+ gaslessBridgeWith7702Enabled: import("@metamask/superstruct").Struct<boolean | undefined, null>;
102
109
  /** Custom sentinel URL for the network */
103
110
  sentinelUrl: import("@metamask/superstruct").Struct<string | undefined, null>;
104
111
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAcnD;;;GAGG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;IAC/C,qEAAqE;;IAErE,yEAAyE;;IAEzE,iEAAiE;;IAEjE,qEAAqE;;IAErE,mEAAmE;;IAEnE,8EAA8E;;IAE9E,2FAA2F;;IAE3F,iFAAiF;;IAEjF,wFAAwF;;IAExF,sEAAsE;;IAEtE,gEAAgE;;IAEhE,0CAA0C;;EAE1C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,yCAAyC;;;;;;;;;;;;;;;;IACpD,oEAAoE;;;;;;;;;;;;;;;QA/BpE,qEAAqE;;QAErE,yEAAyE;;QAEzE,iEAAiE;;QAEjE,qEAAqE;;QAErE,mEAAmE;;QAEnE,8EAA8E;;QAE9E,2FAA2F;;QAE3F,iFAAiF;;QAEjF,wFAAwF;;QAExF,sEAAsE;;QAEtE,gEAAgE;;QAEhE,0CAA0C;;;EAW1C,CAAC;AAEH;;GAEG;AACH,oBAAY,wCAAwC,GAAG,KAAK,CAC1D,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;GAEG;AACH,oBAAY,6CAA6C,GAAG,KAAK,CAC/D,OAAO,yCAAyC,CACjD,CAAC;AAEF;;;GAGG;AACH,oBAAY,yBAAyB,GAAG;IACtC,+EAA+E;IAC/E,MAAM,EAAE,6CAA6C,GACnD,MAAM,CAAC,MAAM,EAAE,wCAAwC,GAAG,SAAS,CAAC,CAAC;IACvE,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,OAAO,GACZ,yBAAyB,CAsE3B;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,wCAAwC,CAElD"}
1
+ {"version":3,"file":"validators.d.mts","sourceRoot":"","sources":["../../src/featureFlags/validators.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,8BAA8B;AAcnD;;;GAGG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;IAC/C,qEAAqE;;IAErE,yEAAyE;;IAEzE,iEAAiE;;IAEjE,qEAAqE;;IAErE,mEAAmE;;IAEnE,8EAA8E;;IAE9E,2FAA2F;;IAE3F,iFAAiF;;IAEjF,wFAAwF;;IAExF,sEAAsE;;IAEtE,gEAAgE;;IAEhE,kEAAkE;;IAElE,0CAA0C;;EAE1C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,yCAAyC;;;;;;;;;;;;;;;;;IACpD,oEAAoE;;;;;;;;;;;;;;;;QAjCpE,qEAAqE;;QAErE,yEAAyE;;QAEzE,iEAAiE;;QAEjE,qEAAqE;;QAErE,mEAAmE;;QAEnE,8EAA8E;;QAE9E,2FAA2F;;QAE3F,iFAAiF;;QAEjF,wFAAwF;;QAExF,sEAAsE;;QAEtE,gEAAgE;;QAEhE,kEAAkE;;QAElE,0CAA0C;;;EAW1C,CAAC;AAEH;;GAEG;AACH,oBAAY,wCAAwC,GAAG,KAAK,CAC1D,OAAO,oCAAoC,CAC5C,CAAC;AAEF;;GAEG;AACH,oBAAY,6CAA6C,GAAG,KAAK,CAC/D,OAAO,yCAAyC,CACjD,CAAC;AAEF;;;GAGG;AACH,oBAAY,yBAAyB,GAAG;IACtC,+EAA+E;IAC/E,MAAM,EAAE,6CAA6C,GACnD,MAAM,CAAC,MAAM,EAAE,wCAAwC,GAAG,SAAS,CAAC,CAAC;IACvE,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,OAAO,GACZ,yBAAyB,CAsE3B;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,wCAAwC,CAElD"}
@@ -37,6 +37,8 @@ export const SmartTransactionsNetworkConfigSchema = type({
37
37
  extensionSkipSmartTransactionStatusPage: optional(boolean()),
38
38
  /** Polling interval in milliseconds for batch status updates */
39
39
  batchStatusPollingInterval: optional(number()),
40
+ /** Whether gasless bridge with 7702 is enabled for the network */
41
+ gaslessBridgeWith7702Enabled: optional(boolean()),
40
42
  /** Custom sentinel URL for the network */
41
43
  sentinelUrl: optional(string()),
42
44
  });