@metamask-previews/user-operation-controller 40.0.0-preview-ee982ebe → 40.0.0-preview-1a8571ae
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UserOperationController.cjs.map +1 -1
- package/dist/UserOperationController.mjs.map +1 -1
- package/dist/helpers/Bundler.cjs.map +1 -1
- package/dist/helpers/Bundler.mjs.map +1 -1
- package/dist/helpers/PendingUserOperationTracker.cjs.map +1 -1
- package/dist/helpers/PendingUserOperationTracker.mjs.map +1 -1
- package/dist/utils/gas-fees.cjs.map +1 -1
- package/dist/utils/gas-fees.mjs.map +1 -1
- package/dist/utils/gas.cjs.map +1 -1
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/transaction.cjs.map +1 -1
- package/dist/utils/transaction.mjs.map +1 -1
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserOperationController.cjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport {\n determineTransactionType,\n type TransactionMeta,\n type TransactionParams,\n type TransactionType,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants';\nimport { Bundler } from './helpers/Bundler';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount';\nimport { projectLogger as log } from './logger';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types';\nimport { UserOperationStatus } from './types';\nimport { updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getTransactionMetadata } from './utils/transaction';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation';\n\nconst controllerName = 'UserOperationController';\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | NetworkControllerGetNetworkClientByIdAction\n | AddApprovalRequest\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n #entrypoint: string;\n\n #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n provider,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n provider: Provider,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n const ethQuery = new EthQuery(provider);\n const result = determineTransactionType(transaction, ethQuery);\n\n return (await result).type;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UserOperationController.cjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAKA,+DAImC;AACnC,iEAA0D;AAC1D,oEAA2C;AAY3C,qDAAkD;AAClD,6EAK0C;AAC1C,2CAAwC;AACxC,kEAAkE;AAClE,sDAAsD;AACtD,oDAAkC;AAClC,mCAAmC;AACnC,+BAAoC;AAEpC,+CAAoE;AACpE,mDAA4C;AAC5C,2FAAoF;AACpF,qFAA8E;AAC9E,yCAAgD;AAMhD,uCAA8C;AAC9C,yCAAwC;AACxC,mDAAiD;AACjD,yDAA6D;AAC7D,uDAM4B;AAE5B,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAEjD,MAAM,aAAa,GAAG;IACpB,cAAc,EAAE;QACd,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC;AA6HH;;GAEG;AACH,MAAa,uBAAwB,SAAQ,gCAI5C;IASC;;;;;;;;OAQG;IACH,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,KAAK,GAC0B;QAC/B,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,KAAK,EAAE;SAC1C,CAAC,CAAC;;QA1BL,sDAAoB;QAEpB,8DAAgD;QAEhD,uEAA0D;QAwBxD,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAY,EAAyC,CAAC;QAErE,uBAAA,IAAI,uCAAe,UAAU,MAAA,CAAC;QAC9B,uBAAA,IAAI,+CAAuB,kBAAkB,MAAA,CAAC;QAE9C,uBAAA,IAAI,wDAAgC,IAAI,yDAA2B,CAAC;YAClE,iBAAiB,EAAE,GAAG,EAAE,CACtB,IAAA,kBAAS,EAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrD,SAAS;SACV,CAAC,MAAA,CAAC;QAEH,uBAAA,IAAI,4GAAyC,MAA7C,IAAI,CAA2C,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,gBAAgB,CACpB,OAAgC,EAChC,OAAgC;QAEhC,IAAA,4CAA+B,EAAC,OAAO,CAAC,CAAC;QACzC,IAAA,4CAA+B,EAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,+BAA+B,CACnC,WAA8B,EAC9B,OAAgC;QAEhC,IAAA,4CAA+B,EAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,EAAE,KAAK,EAAE,GACjE,WAAW,CAAC;QAEd,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACpC,IAAI;YACJ,YAAY;YACZ,oBAAoB;YACpB,EAAE;YACF,KAAK;SACN,CAAC;QAEF,IAAA,4CAA+B,EAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,6BAA6B,CAAC,eAAuB;QACnD,OAAO,uBAAA,IAAI,4DAA6B,CAAC,YAAY,CAAC;YACpD,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;CA0jBF;AA7qBD,0DA6qBC;wRAxjBC,KAAK,oDACH,OAAgC,EAChC,OAAsE;IAEtE,IAAA,sBAAG,EAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnD,MAAM,EACJ,eAAe,EACf,MAAM,EACN,oBAAoB,EAAE,2BAA2B,EACjD,KAAK,EACL,WAAW,GACZ,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAA,IAAI,gFAAa,MAAjB,IAAI,EAAc,eAAe,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EACzB,OAAO,EACP,MAAM,EACN,WAAW,EACX,KAAK,CACN,CAAC;IAEF,MAAM,oBAAoB,GACxB,2BAA2B;QAC3B,IAAI,mDAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAuB;QAChC,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,oBAAoB,EAAE;QAC7C,QAAQ;QACR,OAAO;QACP,WAAW;KACZ,CAAC;IAEF,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,uBAAA,IAAI,kGAA+B,MAAnC,IAAI,EAAgC,KAAK,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,EAAE,KAAK,CAAC,CAAC;YAEzC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,MAAM,SAAS,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,MAAM,IAAI,EAAE,CAAC;QAEb,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAC7C,MAAM,uBAAA,IAAI,wFAAqB,MAAzB,IAAI,EAAsB,QAAQ,CAAC,CAAC;QAE5C,OAAO,oBAA8B,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO;QACL,EAAE;QACF,IAAI;QACJ,eAAe;KAChB,CAAC;AACJ,CAAC,2DAED,KAAK,iEAAgC,KAAyB;IAC5D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAC1D,IAAI,eAAkD,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;QACxC,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAE7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;QAEhD,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;YAC9B,eAAe,GAAG,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,uBAAA,IAAI,wFAAqB,MAAzB,IAAI,EAAsB,QAAQ,CAAC,CAAC;QAE1C,eAAe,EAAE,OAAO,EAAE,CAAC;QAE3B,OAAO,QAAQ,CAAC,IAAc,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,eAAe,EAAE,KAAK,CAAC,KAAc,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,iDAED,KAAK,uDACH,QAA+B;IAE/B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAE9B,IAAA,sBAAG,EAAC,0BAA0B,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAE1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,aAAa,EAAE,EAAE;YACjD,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,4CAED,KAAK,kDACH,OAAe,EACf,MAAc,EACd,WAA+B,EAC/B,KAAmC;IAEnC,MAAM,QAAQ,GAA0B;QACtC,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,IAAA,SAAM,GAAE;QACZ,MAAM;QACN,MAAM,EAAE,2BAAmB,CAAC,UAAU;QACtC,aAAa,EAAE,KAAK;YAClB,CAAC,CAAC;gBACE,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;gBACxC,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,IAAI,IAAI;gBAC9D,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;gBAC5D,wBAAwB,EAAE,KAAK,CAAC,wBAAwB,IAAI,IAAI;gBAChE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;gBAC5D,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;gBAChD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,IAAI,IAAI;gBACpD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;gBAClD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,IAAI;gBACtD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;gBAClD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,IAAI,IAAI;gBACxD,YAAY,EAAG,KAAK,CAAC,YAAsC,IAAI,IAAI;gBACnE,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;aAC7C;YACH,CAAC,CAAC,IAAI;QACR,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;QAChB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAG,WAA2C,IAAI,IAAI;QACvE,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,uBAAA,IAAI,6FAA0B,MAA9B,IAAI,EAA2B,WAAW,CAAC;KAC3D,CAAC;IAEF,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,IAAA,sBAAG,EAAC,sBAAsB,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC;AAClB,CAAC,kDAED,KAAK,wDAAuB,KAAyB;IACnD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAClE,KAAK,CAAC;IAER,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAC1D,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAEzC,IAAA,sBAAG,EAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAExC,MAAM,eAAe,GAAG,MAAM,uBAAA,IAAI,uFAAoB,MAAxB,IAAI,EAChC,WAAW,EACX,QAAQ,EACR,OAAO,CACR,CAAC;IAEF,QAAQ,CAAC,eAAe,GAAG,eAAe,IAAI,IAAI,CAAC;IAEnD,IAAA,sBAAG,EAAC,6BAA6B,EAAE,eAAe,CAAC,CAAC;IAEpD,MAAM,IAAA,wBAAa,EAAC;QAClB,kBAAkB,EAAE,uBAAA,IAAI,mDAAoB;QAC5C,QAAQ;QACR,eAAe,EAAE,OAAO;QACxB,QAAQ;QACR,WAAW,EAAE,iBAAiB,IAAI,SAAS;KAC5C,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAAC;QAC/D,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,EAAE;QACF,KAAK;KACN,CAAC,CAAC;IAEH,IAAA,iDAAoC,EAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,EACJ,OAAO,EAAE,UAAU,EACnB,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,QAAQ,EACR,KAAK,EACL,MAAM,GACP,GAAG,QAAQ,CAAC;IAEb,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,QAAQ,GAAG,QAAQ,IAAI,uBAAW,CAAC;IACjD,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,aAAa,CAAC,gBAAgB,GAAG,qBAAqB,IAAI,uBAAW,CAAC;IACtE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,SAAS,GAAG,cAAc,IAAI,uBAAW,CAAC;IAExD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IAEjC,MAAM,IAAA,eAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,uBAAA,IAAI,2CAAY,CAAC,CAAC;IAEtD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,8CAED,KAAK,oDACH,QAA+B,EAC/B,oBAA0C;IAE1C,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAEhD,IAAA,sBAAG,EAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,mBAAmB,CAAC;QAC9D,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,IAAA,gDAAmC,EAAC,QAAQ,CAAC,CAAC;IAE9C,aAAa,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,uBAAW,CAAC;IAC1E,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1B,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACrD,CAAC;IACD,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAChC,aAAa,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IACjE,CAAC;IACD,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAClC,aAAa,CAAC,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB,CAAC;IACrE,CAAC;IAED,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,kDAED,KAAK,wDAAuB,KAAyB;IACnD,IAAA,sBAAG,EAAC,qBAAqB,CAAC,CAAC;IAE3B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE3B,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAiB,MAArB,IAAI,EAAkB,QAAQ,CAAC,CAAC;IACzE,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAM,CAAC;IAEzC,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,uBAAA,IAAI,qGAAkC,MAAtC,IAAI,EAAmC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG,2BAAmB,CAAC,QAAQ,CAAC;IAE/C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,OAAO,eAAe,CAAC;AACzB,CAAC,+CAED,KAAK,qDACH,QAA+B,EAC/B,oBAA0C;IAE1C,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEhD,IAAA,sBAAG,EAAC,wBAAwB,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,CAAC;QAC5D,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,IAAA,8CAAiC,EAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;IAE/B,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;IAEpC,IAAA,sBAAG,EAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAExC,QAAQ,CAAC,MAAM,GAAG,2BAAmB,CAAC,MAAM,CAAC;IAE7C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,iDAED,KAAK,uDAAsB,QAA+B;IACxD,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,IAAA,sBAAG,EAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,QAAQ,CAAC,UAAoB,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAC1C,aAAa,EACb,uBAAA,IAAI,2CAAY,CACjB,CAAC;IAEF,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,GAAG,2BAAmB,CAAC,SAAS,CAAC;IAEhD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,mGAEkB,QAA+B,EAAE,KAAc;IAChE,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IACxB,MAAM,QAAQ,GAAG,KAA+B,CAAC;IAEjD,IAAA,sBAAG,EAAC,uBAAuB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAExC,QAAQ,CAAC,KAAK,GAAG;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,EAAE,QAAQ,CAAC,KAAK;KACpB,CAAC;IAEF,QAAQ,CAAC,MAAM,GAAG,2BAAmB,CAAC,MAAM,CAAC;IAE7C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,uBAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACzE,CAAC;QACD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC,iHAEyB,WAA+B;IACvD,OAAO;QACL,QAAQ,EAAE,uBAAW;QACrB,YAAY,EAAE,uBAAW;QACzB,QAAQ,EAAE,uBAAW;QACrB,YAAY,EAAE,WAAW,EAAE,YAAY,IAAI,uBAAW;QACtD,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,IAAI,uBAAW;QACtE,KAAK,EAAE,uBAAW;QAClB,gBAAgB,EAAE,uBAAW;QAC7B,kBAAkB,EAAE,uBAAW;QAC/B,MAAM,EAAE,wBAAY;QACpB,SAAS,EAAE,uBAAW;QACtB,oBAAoB,EAAE,uBAAW;KAClC,CAAC;AACJ,CAAC,6FAEe,QAA+B;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IAExB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,CAAC,CAAC;AACpC,CAAC,6FAEe,EAAU;IACxB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,OAAO,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,mGAEkB,QAA+B;IAChD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAA,oCAAsB,EAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;IAGC,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,0BAA0B,EAC1B,CAAC,QAAQ,EAAE,EAAE;QACX,IAAA,sBAAG,EAAC,gBAAgB,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;QACpD,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;IAEF,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,uBAAuB,EACvB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC,CACF,CAAC;IAEF,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,wBAAwB,EACxB,CAAC,QAAQ,EAAE,EAAE;QACX,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IACjC,CAAC,CACF,CAAC;AACJ,CAAC,6CAED,KAAK,mDAAkB,QAA+B;IACpD,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAChC,MAAM,IAAI,GAAG,+BAAY,CAAC,WAAW,CAAC;IACtC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAEjC,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC/B,+BAA+B,EAC/B;QACE,EAAE;QACF,MAAM;QACN,IAAI;QACJ,WAAW;QACX,aAAa,EAAE,IAAI;KACpB,EACD,IAAI,CACL,CAAyD,CAAC;AAC7D,CAAC,gDAED,KAAK,sDACH,WAA0C,EAC1C,QAAkB,EAClB,OAAgC;IAEhC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAA,iDAAwB,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC;AAC7B,CAAC,yCAED,KAAK,+CACH,eAAuB;IAEvB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrD,wCAAwC,EACxC,eAAe,CAChB,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IAElC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC,8DAED,KAAK,oEACH,KAAyB,EACzB,kBAAmC;IAEnC,IAAA,sBAAG,EAAC,uCAAuC,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAErE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IACnC,MAAM,cAAc,GAAG,aAAa,CAAC,gBAAgB,KAAK,uBAAW,CAAC;IAEtE,MAAM,mBAAmB,GAAG,IAAA,aAAK,EAC/B,kBAAkB,CAAC,QAAQ,CAAC,YAAsB,CACnD,CAAC;IAEF,MAAM,2BAA2B,GAAG,IAAA,aAAK,EACvC,kBAAkB,CAAC,QAAQ,CAAC,oBAA8B,CAC3D,CAAC;IAEF,IAAI,uBAAuB,GAAG,KAAK,CAAC;IACpC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,MAAM,4BAA4B,GAAG,aAAa,CAAC,oBAAoB,CAAC;IAExE,MAAM,cAAc,GAClB,oBAAoB,KAAK,mBAAmB;QAC5C,4BAA4B,KAAK,2BAA2B,CAAC;IAE/D;;;;OAIG;IACH,MAAM,gCAAgC,GACpC,cAAc;QACd,mBAAmB,KAAK,sBAAU;QAClC,2BAA2B,KAAK,sBAAU,CAAC;IAE7C,IAAI,cAAc,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACxD,IAAA,sBAAG,EAAC,kCAAkC,EAAE;YACtC,oBAAoB;YACpB,4BAA4B;YAC5B,mBAAmB;YACnB,2BAA2B;SAC5B,CAAC,CAAC;QAEH,aAAa,CAAC,YAAY,GAAG,mBAAmB,CAAC;QACjD,aAAa,CAAC,oBAAoB,GAAG,2BAA2B,CAAC;QAEjE,uBAAuB,GAAG,cAAc,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,uBAAW,CAAC;IACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,IAAI,uBAAW,CAAC;IAEpE,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,IAAA,sBAAG,EAAC,8BAA8B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,uBAAuB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAU,CAAC;IAClD,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,IAAI,sBAAU,CAAC;IAErE,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;QACnC,IAAA,sBAAG,EAAC,+BAA+B,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;QACtE,uBAAuB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,IAAI,uBAAuB,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG;YACrB,GAAG,OAAO;YACV,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,mBAAmB;YACjC,oBAAoB,EAAE,2BAA2B;YACjD,KAAK,EAAE,YAAY;SACpB,CAAC;QAEF,MAAM,uBAAA,IAAI,4FAAyB,MAA7B,IAAI,EAA0B;YAClC,GAAG,KAAK;YACR,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,qDAED,KAAK,2DAA0B,KAAyB;IACtD,IAAA,sBAAG,EACD,wEAAwE,CACzE,CAAC;IAEF,MAAM,EACJ,OAAO,EAAE,EAAE,oBAAoB,EAAE,EACjC,QAAQ,GACT,GAAG,KAAK,CAAC;IAEV,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;IACxC,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAE7D,IAAA,sBAAG,EAAC,4BAA4B,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport {\n determineTransactionType,\n type TransactionMeta,\n type TransactionParams,\n type TransactionType,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants';\nimport { Bundler } from './helpers/Bundler';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount';\nimport { projectLogger as log } from './logger';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types';\nimport { UserOperationStatus } from './types';\nimport { updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getTransactionMetadata } from './utils/transaction';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation';\n\nconst controllerName = 'UserOperationController';\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | NetworkControllerGetNetworkClientByIdAction\n | AddApprovalRequest\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n #entrypoint: string;\n\n #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n provider,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n provider: Provider,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n const ethQuery = new EthQuery(provider);\n const result = determineTransactionType(transaction, ethQuery);\n\n return (await result).type;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserOperationController.mjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport {\n determineTransactionType,\n type TransactionMeta,\n type TransactionParams,\n type TransactionType,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants';\nimport { Bundler } from './helpers/Bundler';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount';\nimport { projectLogger as log } from './logger';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types';\nimport { UserOperationStatus } from './types';\nimport { updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getTransactionMetadata } from './utils/transaction';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation';\n\nconst controllerName = 'UserOperationController';\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | NetworkControllerGetNetworkClientByIdAction\n | AddApprovalRequest\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n #entrypoint: string;\n\n #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n provider,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n provider: Provider,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n const ethQuery = new EthQuery(provider);\n const result = determineTransactionType(transaction, ethQuery);\n\n return (await result).type;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UserOperationController.mjs","sourceRoot":"","sources":["../src/UserOperationController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAKA,OAAO,EACL,cAAc,EAGf,kCAAkC;AACnC,OAAO,EAAE,YAAY,EAAE,mCAAmC;AAC1D,OAAO,SAAQ,4BAA4B;;AAY3C,OAAO,EAAE,UAAU,EAAE,6BAA6B;AAClD,OAAO,EACL,wBAAwB,EAIzB,yCAAyC;AAC1C,OAAO,EAAE,KAAK,EAAE,wBAAwB;AACxC,kEAAkE;AAClE,sDAAsD;AACtD,OAAO,YAAY,eAAe;;;AAElC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,aAAa;AAEpC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,wBAAoB;AACpE,OAAO,EAAE,OAAO,EAAE,8BAA0B;AAC5C,OAAO,EAAE,2BAA2B,EAAE,kDAA8C;AACpF,OAAO,EAAE,wBAAwB,EAAE,+CAA2C;AAC9E,OAAO,EAAE,aAAa,IAAI,GAAG,EAAE,qBAAiB;AAMhD,OAAO,EAAE,mBAAmB,EAAE,oBAAgB;AAC9C,OAAO,EAAE,SAAS,EAAE,wBAAoB;AACxC,OAAO,EAAE,aAAa,EAAE,6BAAyB;AACjD,OAAO,EAAE,sBAAsB,EAAE,gCAA4B;AAC7D,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,oCAAoC,EACpC,iCAAiC,EACjC,mCAAmC,EACpC,+BAA2B;AAE5B,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAEjD,MAAM,aAAa,GAAG;IACpB,cAAc,EAAE;QACd,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,IAAI;QACb,sBAAsB,EAAE,KAAK;QAC7B,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,cAAc,EAAE,EAAE;CACnB,CAAC,CAAC;AA6HH;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,cAI5C;IASC;;;;;;;;OAQG;IACH,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,KAAK,GAC0B;QAC/B,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,KAAK,EAAE;SAC1C,CAAC,CAAC;;QA1BL,sDAAoB;QAEpB,8DAAgD;QAEhD,uEAA0D;QAwBxD,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,EAAyC,CAAC;QAErE,uBAAA,IAAI,uCAAe,UAAU,MAAA,CAAC;QAC9B,uBAAA,IAAI,+CAAuB,kBAAkB,MAAA,CAAC;QAE9C,uBAAA,IAAI,wDAAgC,IAAI,2BAA2B,CAAC;YAClE,iBAAiB,EAAE,GAAG,EAAE,CACtB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrD,SAAS;SACV,CAAC,MAAA,CAAC;QAEH,uBAAA,IAAI,4GAAyC,MAA7C,IAAI,CAA2C,CAAC;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,gBAAgB,CACpB,OAAgC,EAChC,OAAgC;QAEhC,+BAA+B,CAAC,OAAO,CAAC,CAAC;QACzC,+BAA+B,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,+BAA+B,CACnC,WAA8B,EAC9B,OAAgC;QAEhC,+BAA+B,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,oBAAoB,EAAE,EAAE,EAAE,KAAK,EAAE,GACjE,WAAW,CAAC;QAEd,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACpC,IAAI;YACJ,YAAY;YACZ,oBAAoB;YACpB,EAAE;YACF,KAAK;SACN,CAAC;QAEF,+BAA+B,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,6BAA6B,CAAC,eAAuB;QACnD,OAAO,uBAAA,IAAI,4DAA6B,CAAC,YAAY,CAAC;YACpD,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;CA0jBF;wRAxjBC,KAAK,oDACH,OAAgC,EAChC,OAAsE;IAEtE,GAAG,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnD,MAAM,EACJ,eAAe,EACf,MAAM,EACN,oBAAoB,EAAE,2BAA2B,EACjD,KAAK,EACL,WAAW,GACZ,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAA,IAAI,gFAAa,MAAjB,IAAI,EAAc,eAAe,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EACzB,OAAO,EACP,MAAM,EACN,WAAW,EACX,KAAK,CACN,CAAC;IAEF,MAAM,oBAAoB,GACxB,2BAA2B;QAC3B,IAAI,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAuB;QAChC,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,oBAAoB,EAAE;QAC7C,QAAQ;QACR,OAAO;QACP,WAAW;KACZ,CAAC;IAEF,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,uBAAA,IAAI,kGAA+B,MAAnC,IAAI,EAAgC,KAAK,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,EAAE,KAAK,CAAC,CAAC;YAEzC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,MAAM,SAAS,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,MAAM,IAAI,EAAE,CAAC;QAEb,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAC7C,MAAM,uBAAA,IAAI,wFAAqB,MAAzB,IAAI,EAAsB,QAAQ,CAAC,CAAC;QAE5C,OAAO,oBAA8B,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO;QACL,EAAE;QACF,IAAI;QACJ,eAAe;KAChB,CAAC;AACJ,CAAC,2DAED,KAAK,iEAAgC,KAAyB;IAC5D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAC1D,IAAI,eAAkD,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;QACxC,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAE7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;QAEhD,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;YAC9B,eAAe,GAAG,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,uBAAA,IAAI,wFAAqB,MAAzB,IAAI,EAAsB,QAAQ,CAAC,CAAC;QAE1C,eAAe,EAAE,OAAO,EAAE,CAAC;QAE3B,OAAO,QAAQ,CAAC,IAAc,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,eAAe,EAAE,KAAK,CAAC,KAAc,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,iDAED,KAAK,uDACH,QAA+B;IAE/B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAE9B,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAE1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,aAAa,EAAE,EAAE;YACjD,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,4CAED,KAAK,kDACH,OAAe,EACf,MAAc,EACd,WAA+B,EAC/B,KAAmC;IAEnC,MAAM,QAAQ,GAA0B;QACtC,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,MAAM,EAAE;QACZ,MAAM;QACN,MAAM,EAAE,mBAAmB,CAAC,UAAU;QACtC,aAAa,EAAE,KAAK;YAClB,CAAC,CAAC;gBACE,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;gBACxC,uBAAuB,EAAE,KAAK,CAAC,uBAAuB,IAAI,IAAI;gBAC9D,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;gBAC5D,wBAAwB,EAAE,KAAK,CAAC,wBAAwB,IAAI,IAAI;gBAChE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;gBAC5D,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;gBAChD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,IAAI,IAAI;gBACpD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;gBAClD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,IAAI;gBACtD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;gBAClD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,IAAI,IAAI;gBACxD,YAAY,EAAG,KAAK,CAAC,YAAsC,IAAI,IAAI;gBACnE,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;aAC7C;YACH,CAAC,CAAC,IAAI;QACR,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;QAChB,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAG,WAA2C,IAAI,IAAI;QACvE,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,uBAAA,IAAI,6FAA0B,MAA9B,IAAI,EAA2B,WAAW,CAAC;KAC3D,CAAC;IAEF,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzC,OAAO,QAAQ,CAAC;AAClB,CAAC,kDAED,KAAK,wDAAuB,KAAyB;IACnD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAClE,KAAK,CAAC;IAER,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAC1D,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAEzC,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAExC,MAAM,eAAe,GAAG,MAAM,uBAAA,IAAI,uFAAoB,MAAxB,IAAI,EAChC,WAAW,EACX,QAAQ,EACR,OAAO,CACR,CAAC;IAEF,QAAQ,CAAC,eAAe,GAAG,eAAe,IAAI,IAAI,CAAC;IAEnD,GAAG,CAAC,6BAA6B,EAAE,eAAe,CAAC,CAAC;IAEpD,MAAM,aAAa,CAAC;QAClB,kBAAkB,EAAE,uBAAA,IAAI,mDAAoB;QAC5C,QAAQ;QACR,eAAe,EAAE,OAAO;QACxB,QAAQ;QACR,WAAW,EAAE,iBAAiB,IAAI,SAAS;KAC5C,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAAC;QAC/D,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,EAAE;QACF,KAAK;KACN,CAAC,CAAC;IAEH,oCAAoC,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,EACJ,OAAO,EAAE,UAAU,EACnB,QAAQ,EACR,qBAAqB,EACrB,cAAc,EACd,QAAQ,EACR,KAAK,EACL,MAAM,GACP,GAAG,QAAQ,CAAC;IAEb,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAC;IACjD,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,aAAa,CAAC,gBAAgB,GAAG,qBAAqB,IAAI,WAAW,CAAC;IACtE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,SAAS,GAAG,cAAc,IAAI,WAAW,CAAC;IAExD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IAEjC,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,uBAAA,IAAI,2CAAY,CAAC,CAAC;IAEtD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,8CAED,KAAK,oDACH,QAA+B,EAC/B,oBAA0C;IAE1C,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAEhD,GAAG,CAAC,2BAA2B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,mBAAmB,CAAC;QAC9D,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,mCAAmC,CAAC,QAAQ,CAAC,CAAC;IAE9C,aAAa,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,WAAW,CAAC;IAC1E,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1B,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IACrD,CAAC;IACD,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAChC,aAAa,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IACjE,CAAC;IACD,IAAI,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAClC,aAAa,CAAC,oBAAoB,GAAG,QAAQ,CAAC,oBAAoB,CAAC;IACrE,CAAC;IAED,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,kDAED,KAAK,wDAAuB,KAAyB;IACnD,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAE3B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE3B,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAA,IAAI,oFAAiB,MAArB,IAAI,EAAkB,QAAQ,CAAC,CAAC;IACzE,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAM,CAAC;IAEzC,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,uBAAA,IAAI,qGAAkC,MAAtC,IAAI,EAAmC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;IAE/C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,OAAO,eAAe,CAAC;AACzB,CAAC,+CAED,KAAK,qDACH,QAA+B,EAC/B,oBAA0C;IAE1C,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEhD,GAAG,CAAC,wBAAwB,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,CAAC;QAC5D,aAAa;QACb,OAAO;KACR,CAAC,CAAC;IAEH,iCAAiC,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;IAE/B,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;IAEpC,GAAG,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC;IAExC,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC;IAE7C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,iDAED,KAAK,uDAAsB,QAA+B;IACxD,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAoB,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAC1C,aAAa,EACb,uBAAA,IAAI,2CAAY,CACjB,CAAC;IAEF,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC;IAEhD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;AACjC,CAAC,mGAEkB,QAA+B,EAAE,KAAc;IAChE,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IACxB,MAAM,QAAQ,GAAG,KAA+B,CAAC;IAEjD,GAAG,CAAC,uBAAuB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAExC,QAAQ,CAAC,KAAK,GAAG;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,EAAE,QAAQ,CAAC,KAAK;KACpB,CAAC;IAEF,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC;IAE7C,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IAE/B,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACzE,CAAC;QACD,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC,iHAEyB,WAA+B;IACvD,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE,WAAW;QACzB,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE,WAAW,EAAE,YAAY,IAAI,WAAW;QACtD,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,IAAI,WAAW;QACtE,KAAK,EAAE,WAAW;QAClB,gBAAgB,EAAE,WAAW;QAC7B,kBAAkB,EAAE,WAAW;QAC/B,MAAM,EAAE,YAAY;QACpB,SAAS,EAAE,WAAW;QACtB,oBAAoB,EAAE,WAAW;KAClC,CAAC;AACJ,CAAC,6FAEe,QAA+B;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC;IAExB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,uBAAA,IAAI,sFAAmB,MAAvB,IAAI,EAAoB,QAAQ,CAAC,CAAC;AACpC,CAAC,6FAEe,EAAU;IACxB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,OAAO,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,mGAEkB,QAA+B;IAChD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;IAGC,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,0BAA0B,EAC1B,CAAC,QAAQ,EAAE,EAAE;QACX,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;QACpD,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC,CACF,CAAC;IAEF,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,uBAAuB,EACvB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,gFAAgF;QAChF,4EAA4E;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC,CACF,CAAC;IAEF,uBAAA,IAAI,4DAA6B,CAAC,GAAG,CAAC,EAAE,CACtC,wBAAwB,EACxB,CAAC,QAAQ,EAAE,EAAE;QACX,uBAAA,IAAI,mFAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,CAAC;IACjC,CAAC,CACF,CAAC;AACJ,CAAC,6CAED,KAAK,mDAAkB,QAA+B;IACpD,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAChC,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC;IACtC,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAEjC,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAC/B,+BAA+B,EAC/B;QACE,EAAE;QACF,MAAM;QACN,IAAI;QACJ,WAAW;QACX,aAAa,EAAE,IAAI;KACpB,EACD,IAAI,CACL,CAAyD,CAAC;AAC7D,CAAC,gDAED,KAAK,sDACH,WAA0C,EAC1C,QAAkB,EAClB,OAAgC;IAEhC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,wBAAwB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC;AAC7B,CAAC,yCAED,KAAK,+CACH,eAAuB;IAEvB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CACrD,wCAAwC,EACxC,eAAe,CAChB,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IAElC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC,8DAED,KAAK,oEACH,KAAyB,EACzB,kBAAmC;IAEnC,GAAG,CAAC,uCAAuC,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAErE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEpC,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IACnC,MAAM,cAAc,GAAG,aAAa,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAEtE,MAAM,mBAAmB,GAAG,KAAK,CAC/B,kBAAkB,CAAC,QAAQ,CAAC,YAAsB,CACnD,CAAC;IAEF,MAAM,2BAA2B,GAAG,KAAK,CACvC,kBAAkB,CAAC,QAAQ,CAAC,oBAA8B,CAC3D,CAAC;IAEF,IAAI,uBAAuB,GAAG,KAAK,CAAC;IACpC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,MAAM,4BAA4B,GAAG,aAAa,CAAC,oBAAoB,CAAC;IAExE,MAAM,cAAc,GAClB,oBAAoB,KAAK,mBAAmB;QAC5C,4BAA4B,KAAK,2BAA2B,CAAC;IAE/D;;;;OAIG;IACH,MAAM,gCAAgC,GACpC,cAAc;QACd,mBAAmB,KAAK,UAAU;QAClC,2BAA2B,KAAK,UAAU,CAAC;IAE7C,IAAI,cAAc,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACxD,GAAG,CAAC,kCAAkC,EAAE;YACtC,oBAAoB;YACpB,4BAA4B;YAC5B,mBAAmB;YACnB,2BAA2B;SAC5B,CAAC,CAAC;QAEH,aAAa,CAAC,YAAY,GAAG,mBAAmB,CAAC;QACjD,aAAa,CAAC,oBAAoB,GAAG,2BAA2B,CAAC;QAEjE,uBAAuB,GAAG,cAAc,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;IAEpE,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,GAAG,CAAC,8BAA8B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,uBAAuB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC;IAClD,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC;IAErE,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;QACnC,GAAG,CAAC,+BAA+B,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;QACtE,uBAAuB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,IAAI,uBAAuB,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG;YACrB,GAAG,OAAO;YACV,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,mBAAmB;YACjC,oBAAoB,EAAE,2BAA2B;YACjD,KAAK,EAAE,YAAY;SACpB,CAAC;QAEF,MAAM,uBAAA,IAAI,4FAAyB,MAA7B,IAAI,EAA0B;YAClC,GAAG,KAAK;YACR,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,qDAED,KAAK,2DAA0B,KAAyB;IACtD,GAAG,CACD,wEAAwE,CACzE,CAAC;IAEF,MAAM,EACJ,OAAO,EAAE,EAAE,oBAAoB,EAAE,EACjC,QAAQ,GACT,GAAG,KAAK,CAAC;IAEV,MAAM,uBAAA,IAAI,yFAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;IACxC,MAAM,uBAAA,IAAI,qFAAkB,MAAtB,IAAI,EAAmB,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAE7D,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddApprovalRequest,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n BaseController,\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { ApprovalType } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type {\n KeyringControllerPrepareUserOperationAction,\n KeyringControllerPatchUserOperationAction,\n KeyringControllerSignUserOperationAction,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n Provider,\n} from '@metamask/network-controller';\nimport { errorCodes } from '@metamask/rpc-errors';\nimport {\n determineTransactionType,\n type TransactionMeta,\n type TransactionParams,\n type TransactionType,\n} from '@metamask/transaction-controller';\nimport { add0x } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\nimport { cloneDeep } from 'lodash';\nimport { v1 as random } from 'uuid';\n\nimport { ADDRESS_ZERO, EMPTY_BYTES, VALUE_ZERO } from './constants';\nimport { Bundler } from './helpers/Bundler';\nimport { PendingUserOperationTracker } from './helpers/PendingUserOperationTracker';\nimport { SnapSmartContractAccount } from './helpers/SnapSmartContractAccount';\nimport { projectLogger as log } from './logger';\nimport type {\n SmartContractAccount,\n UserOperation,\n UserOperationMetadata,\n} from './types';\nimport { UserOperationStatus } from './types';\nimport { updateGas } from './utils/gas';\nimport { updateGasFees } from './utils/gas-fees';\nimport { getTransactionMetadata } from './utils/transaction';\nimport {\n validateAddUserOperationOptions,\n validateAddUserOperationRequest,\n validatePrepareUserOperationResponse,\n validateSignUserOperationResponse,\n validateUpdateUserOperationResponse,\n} from './utils/validation';\n\nconst controllerName = 'UserOperationController';\n\nconst stateMetadata = {\n userOperations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = () => ({\n userOperations: {},\n});\n\ntype Events = {\n 'transaction-updated': [metadata: TransactionMeta];\n 'user-operation-added': [metadata: UserOperationMetadata];\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [metadata: UserOperationMetadata, error: Error];\n [key: `${string}:confirmed`]: [metadata: UserOperationMetadata];\n [key: `${string}:failed`]: [metadata: UserOperationMetadata, error: Error];\n};\n\nexport type UserOperationControllerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): UserOperationControllerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\nexport type UserOperationControllerState = {\n userOperations: Record<string, UserOperationMetadata>;\n};\n\nexport type GetUserOperationState = ControllerGetStateAction<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationStateChange = ControllerStateChangeEvent<\n typeof controllerName,\n UserOperationControllerState\n>;\n\nexport type UserOperationControllerActions =\n | GetUserOperationState\n | NetworkControllerGetNetworkClientByIdAction\n | AddApprovalRequest\n | KeyringControllerPrepareUserOperationAction\n | KeyringControllerPatchUserOperationAction\n | KeyringControllerSignUserOperationAction;\n\nexport type UserOperationControllerEvents = UserOperationStateChange;\n\nexport type UserOperationControllerMessenger = Messenger<\n typeof controllerName,\n UserOperationControllerActions,\n UserOperationControllerEvents\n>;\n\nexport type UserOperationControllerOptions = {\n entrypoint: string;\n getGasFeeEstimates: () => Promise<GasFeeState>;\n interval?: number;\n messenger: UserOperationControllerMessenger;\n state?: Partial<UserOperationControllerState>;\n};\n\nexport type AddUserOperationRequest = {\n data?: string;\n from: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to?: string;\n value?: string;\n};\n\nexport type AddUserOperationSwapOptions = {\n approvalTxId?: string;\n destinationTokenAddress?: string;\n destinationTokenAmount?: string;\n destinationTokenDecimals?: number;\n destinationTokenSymbol?: string;\n estimatedBaseFee?: string;\n sourceTokenAddress?: string;\n sourceTokenAmount?: string;\n sourceTokenDecimals?: number;\n sourceTokenSymbol?: string;\n swapAndSendRecipient?: string;\n swapMetaData?: Record<string, unknown>;\n swapTokenValue?: string;\n};\n\nexport type AddUserOperationOptions = {\n networkClientId: string;\n origin: string;\n requireApproval?: boolean;\n smartContractAccount?: SmartContractAccount;\n swaps?: AddUserOperationSwapOptions;\n type?: TransactionType;\n};\n\nexport type AddUserOperationResponse = {\n id: string;\n hash: () => Promise<string | undefined>;\n transactionHash: () => Promise<string | undefined>;\n};\n\n/**\n * All the objects related to a pending user operation in order to:\n * - Avoid duplicated effort to derive the same properties.\n * - Minimise duplicate arguments in private methods.\n */\ntype UserOperationCache = {\n chainId: string;\n metadata: UserOperationMetadata;\n options: AddUserOperationOptions & {\n smartContractAccount: SmartContractAccount;\n };\n provider: Provider;\n request: AddUserOperationRequest;\n transaction?: TransactionParams;\n};\n\n/**\n * Controller for creating and managing the life cycle of user operations.\n */\nexport class UserOperationController extends BaseController<\n typeof controllerName,\n UserOperationControllerState,\n UserOperationControllerMessenger\n> {\n hub: UserOperationControllerEventEmitter;\n\n #entrypoint: string;\n\n #getGasFeeEstimates: () => Promise<GasFeeState>;\n\n #pendingUserOperationTracker: PendingUserOperationTracker;\n\n /**\n * Construct a UserOperationController instance.\n *\n * @param options - Controller options.\n * @param options.entrypoint - Address of the entrypoint contract.\n * @param options.getGasFeeEstimates - Callback to get gas fee estimates.\n * @param options.messenger - Restricted messenger for the user operation controller.\n * @param options.state - Initial state to set on the controller.\n */\n constructor({\n entrypoint,\n getGasFeeEstimates,\n messenger,\n state,\n }: UserOperationControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.hub = new EventEmitter() as UserOperationControllerEventEmitter;\n\n this.#entrypoint = entrypoint;\n this.#getGasFeeEstimates = getGasFeeEstimates;\n\n this.#pendingUserOperationTracker = new PendingUserOperationTracker({\n getUserOperations: () =>\n cloneDeep(Object.values(this.state.userOperations)),\n messenger,\n });\n\n this.#addPendingUserOperationTrackerListeners();\n }\n\n /**\n * Create and submit a user operation.\n *\n * @param request - Information required to create a user operation.\n * @param request.data - Data to include in the resulting transaction.\n * @param request.maxFeePerGas - Maximum fee per gas to pay towards the transaction.\n * @param request.maxPriorityFeePerGas - Maximum priority fee per gas to pay towards the transaction.\n * @param request.to - Destination address of the resulting transaction.\n * @param request.value - Value to include in the resulting transaction.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationRequest(request);\n validateAddUserOperationOptions(options);\n\n return await this.#addUserOperation(request, options);\n }\n\n /**\n * Create and submit a user operation equivalent to the provided transaction.\n *\n * @param transaction - Transaction to use as the basis for the user operation.\n * @param options - Configuration options when creating a user operation.\n * @param options.networkClientId - ID of the network client used to query the chain.\n * @param options.origin - Origin of the user operation, such as the hostname of a dApp.\n * @param options.requireApproval - Whether to require user approval before submitting the user operation. Defaults to true.\n * @param options.smartContractAccount - Smart contract abstraction to provide the contract specific values such as call data and nonce. Defaults to the current snap account.\n * @param options.swaps - Swap metadata to record with the user operation.\n * @param options.type - Type of the transaction.\n */\n async addUserOperationFromTransaction(\n transaction: TransactionParams,\n options: AddUserOperationOptions,\n ): Promise<AddUserOperationResponse> {\n validateAddUserOperationOptions(options);\n\n const { data, from, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n transaction;\n\n const request: AddUserOperationRequest = {\n data: data === '' ? undefined : data,\n from,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n validateAddUserOperationRequest(request);\n\n return await this.#addUserOperation(request, { ...options, transaction });\n }\n\n startPollingByNetworkClientId(networkClientId: string): string {\n return this.#pendingUserOperationTracker.startPolling({\n networkClientId,\n });\n }\n\n async #addUserOperation(\n request: AddUserOperationRequest,\n options: AddUserOperationOptions & { transaction?: TransactionParams },\n ): Promise<AddUserOperationResponse> {\n log('Adding user operation', { request, options });\n\n const {\n networkClientId,\n origin,\n smartContractAccount: requestSmartContractAccount,\n swaps,\n transaction,\n } = options;\n\n const { chainId, provider } = await this.#getProvider(networkClientId);\n\n const metadata = await this.#createMetadata(\n chainId,\n origin,\n transaction,\n swaps,\n );\n\n const smartContractAccount =\n requestSmartContractAccount ??\n new SnapSmartContractAccount(this.messenger);\n\n const cache: UserOperationCache = {\n chainId,\n metadata,\n options: { ...options, smartContractAccount },\n provider,\n request,\n transaction,\n };\n\n const { id } = metadata;\n let throwError = false;\n\n const hashValue = (async () => {\n try {\n return await this.#prepareAndSubmitUserOperation(cache);\n } catch (error) {\n this.#failUserOperation(metadata, error);\n\n if (throwError) {\n throw error;\n }\n\n return undefined;\n }\n })();\n\n const hash = async () => {\n throwError = true;\n return await hashValue;\n };\n\n const transactionHash = async () => {\n await hash();\n\n const { transactionHash: finalTransactionHash } =\n await this.#waitForConfirmation(metadata);\n\n return finalTransactionHash as string;\n };\n\n return {\n id,\n hash,\n transactionHash,\n };\n }\n\n async #prepareAndSubmitUserOperation(cache: UserOperationCache) {\n const { metadata, options } = cache;\n const { requireApproval, smartContractAccount } = options;\n let resultCallbacks: AcceptResultCallbacks | undefined;\n\n try {\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n this.hub.emit('user-operation-added', metadata);\n\n if (requireApproval !== false) {\n resultCallbacks = await this.#approveUserOperation(cache);\n }\n\n await this.#signUserOperation(metadata, smartContractAccount);\n await this.#submitUserOperation(metadata);\n\n resultCallbacks?.success();\n\n return metadata.hash as string;\n } catch (error) {\n /* istanbul ignore next */\n resultCallbacks?.error(error as Error);\n throw error;\n }\n }\n\n async #waitForConfirmation(\n metadata: UserOperationMetadata,\n ): Promise<UserOperationMetadata> {\n const { id, hash } = metadata;\n\n log('Waiting for confirmation', id, hash);\n\n return new Promise((resolve, reject) => {\n this.hub.once(`${id}:confirmed`, (finalMetadata) => {\n resolve(finalMetadata);\n });\n\n this.hub.once(`${id}:failed`, (_finalMetadata, error) => {\n reject(error);\n });\n });\n }\n\n async #createMetadata(\n chainId: string,\n origin: string,\n transaction?: TransactionParams,\n swaps?: AddUserOperationSwapOptions,\n ): Promise<UserOperationMetadata> {\n const metadata: UserOperationMetadata = {\n actualGasCost: null,\n actualGasUsed: null,\n baseFeePerGas: null,\n bundlerUrl: null,\n chainId,\n error: null,\n hash: null,\n id: random(),\n origin,\n status: UserOperationStatus.Unapproved,\n swapsMetadata: swaps\n ? {\n approvalTxId: swaps.approvalTxId ?? null,\n destinationTokenAddress: swaps.destinationTokenAddress ?? null,\n destinationTokenAmount: swaps.destinationTokenAmount ?? null,\n destinationTokenDecimals: swaps.destinationTokenDecimals ?? null,\n destinationTokenSymbol: swaps.destinationTokenSymbol ?? null,\n estimatedBaseFee: swaps.estimatedBaseFee ?? null,\n sourceTokenAddress: swaps.sourceTokenAddress ?? null,\n sourceTokenAmount: swaps.sourceTokenAmount ?? null,\n sourceTokenDecimals: swaps.sourceTokenDecimals ?? null,\n sourceTokenSymbol: swaps.sourceTokenSymbol ?? null,\n swapAndSendRecipient: swaps.swapAndSendRecipient ?? null,\n swapMetaData: (swaps.swapMetaData as Record<string, never>) ?? null,\n swapTokenValue: swaps.swapTokenValue ?? null,\n }\n : null,\n time: Date.now(),\n transactionHash: null,\n transactionParams: (transaction as Required<TransactionParams>) ?? null,\n transactionType: null,\n userFeeLevel: null,\n userOperation: this.#createEmptyUserOperation(transaction),\n };\n\n this.#updateMetadata(metadata);\n\n log('Added user operation', metadata.id);\n\n return metadata;\n }\n\n async #prepareUserOperation(cache: UserOperationCache) {\n const { chainId, metadata, options, provider, request, transaction } =\n cache;\n\n const { data, from, to, value } = request;\n const { id, transactionParams, userOperation } = metadata;\n const { smartContractAccount } = options;\n\n log('Preparing user operation', { id });\n\n const transactionType = await this.#getTransactionType(\n transaction,\n provider,\n options,\n );\n\n metadata.transactionType = transactionType ?? null;\n\n log('Determined transaction type', transactionType);\n\n await updateGasFees({\n getGasFeeEstimates: this.#getGasFeeEstimates,\n metadata,\n originalRequest: request,\n provider,\n transaction: transactionParams ?? undefined,\n });\n\n const response = await smartContractAccount.prepareUserOperation({\n chainId,\n data,\n from,\n to,\n value,\n });\n\n validatePrepareUserOperationResponse(response);\n\n const {\n bundler: bundlerUrl,\n callData,\n dummyPaymasterAndData,\n dummySignature,\n initCode,\n nonce,\n sender,\n } = response;\n\n userOperation.callData = callData;\n userOperation.initCode = initCode ?? EMPTY_BYTES;\n userOperation.nonce = nonce;\n userOperation.paymasterAndData = dummyPaymasterAndData ?? EMPTY_BYTES;\n userOperation.sender = sender;\n userOperation.signature = dummySignature ?? EMPTY_BYTES;\n\n metadata.bundlerUrl = bundlerUrl;\n\n await updateGas(metadata, response, this.#entrypoint);\n\n this.#updateMetadata(metadata);\n }\n\n async #addPaymasterData(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, userOperation, chainId } = metadata;\n\n log('Requesting paymaster data', { id });\n\n const response = await smartContractAccount.updateUserOperation({\n userOperation,\n chainId,\n });\n\n validateUpdateUserOperationResponse(response);\n\n userOperation.paymasterAndData = response.paymasterAndData ?? EMPTY_BYTES;\n if (response.callGasLimit) {\n userOperation.callGasLimit = response.callGasLimit;\n }\n if (response.preVerificationGas) {\n userOperation.preVerificationGas = response.preVerificationGas;\n }\n if (response.verificationGasLimit) {\n userOperation.verificationGasLimit = response.verificationGasLimit;\n }\n\n this.#updateMetadata(metadata);\n }\n\n async #approveUserOperation(cache: UserOperationCache) {\n log('Requesting approval');\n\n const { metadata } = cache;\n\n const { resultCallbacks, value } = await this.#requestApproval(metadata);\n const updatedTransaction = value?.txMeta;\n\n if (updatedTransaction) {\n await this.#updateUserOperationAfterApproval(cache, updatedTransaction);\n }\n\n metadata.status = UserOperationStatus.Approved;\n\n this.#updateMetadata(metadata);\n\n return resultCallbacks;\n }\n\n async #signUserOperation(\n metadata: UserOperationMetadata,\n smartContractAccount: SmartContractAccount,\n ) {\n const { id, chainId, userOperation } = metadata;\n\n log('Signing user operation', id, userOperation);\n\n const response = await smartContractAccount.signUserOperation({\n userOperation,\n chainId,\n });\n\n validateSignUserOperationResponse(response);\n\n const { signature } = response;\n\n userOperation.signature = signature;\n\n log('Signed user operation', signature);\n\n metadata.status = UserOperationStatus.Signed;\n\n this.#updateMetadata(metadata);\n }\n\n async #submitUserOperation(metadata: UserOperationMetadata) {\n const { userOperation } = metadata;\n\n log('Submitting user operation', userOperation);\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n\n const hash = await bundler.sendUserOperation(\n userOperation,\n this.#entrypoint,\n );\n\n metadata.hash = hash;\n metadata.status = UserOperationStatus.Submitted;\n\n this.#updateMetadata(metadata);\n }\n\n #failUserOperation(metadata: UserOperationMetadata, error: unknown) {\n const { id } = metadata;\n const rawError = error as Record<string, string>;\n\n log('User operation failed', id, error);\n\n metadata.error = {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.value,\n };\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateMetadata(metadata);\n\n if (\n String(rawError.code) === String(errorCodes.provider.userRejectedRequest)\n ) {\n this.#deleteMetadata(id);\n }\n }\n\n #createEmptyUserOperation(transaction?: TransactionParams): UserOperation {\n return {\n callData: EMPTY_BYTES,\n callGasLimit: EMPTY_BYTES,\n initCode: EMPTY_BYTES,\n maxFeePerGas: transaction?.maxFeePerGas ?? EMPTY_BYTES,\n maxPriorityFeePerGas: transaction?.maxPriorityFeePerGas ?? EMPTY_BYTES,\n nonce: EMPTY_BYTES,\n paymasterAndData: EMPTY_BYTES,\n preVerificationGas: EMPTY_BYTES,\n sender: ADDRESS_ZERO,\n signature: EMPTY_BYTES,\n verificationGasLimit: EMPTY_BYTES,\n };\n }\n\n #updateMetadata(metadata: UserOperationMetadata) {\n const { id } = metadata;\n\n this.update((state) => {\n state.userOperations[id] = cloneDeep(metadata);\n });\n\n this.#updateTransaction(metadata);\n }\n\n #deleteMetadata(id: string) {\n this.update((state) => {\n delete state.userOperations[id];\n });\n }\n\n #updateTransaction(metadata: UserOperationMetadata) {\n if (!metadata.transactionParams) {\n return;\n }\n\n const transactionMetadata = getTransactionMetadata(metadata);\n\n this.hub.emit('transaction-updated', transactionMetadata);\n }\n\n #addPendingUserOperationTrackerListeners() {\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-confirmed',\n (metadata) => {\n log('In listener...');\n this.hub.emit('user-operation-confirmed', metadata);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:confirmed`, metadata);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-failed',\n (metadata, error) => {\n this.hub.emit('user-operation-failed', metadata, error);\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n this.hub.emit(`${metadata.id}:failed`, metadata, error);\n },\n );\n\n this.#pendingUserOperationTracker.hub.on(\n 'user-operation-updated',\n (metadata) => {\n this.#updateMetadata(metadata);\n },\n );\n }\n\n async #requestApproval(metadata: UserOperationMetadata) {\n const { id, origin } = metadata;\n const type = ApprovalType.Transaction;\n const requestData = { txId: id };\n\n return (await this.messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin,\n type,\n requestData,\n expectsResult: true,\n },\n true, // Should display approval request to user\n )) as AddResult & { value?: { txMeta?: TransactionMeta } };\n }\n\n async #getTransactionType(\n transaction: TransactionParams | undefined,\n provider: Provider,\n options: AddUserOperationOptions,\n ): Promise<TransactionType | undefined> {\n if (!transaction) {\n return undefined;\n }\n\n if (options.type) {\n return options.type;\n }\n\n const ethQuery = new EthQuery(provider);\n const result = determineTransactionType(transaction, ethQuery);\n\n return (await result).type;\n }\n\n async #getProvider(\n networkClientId: string,\n ): Promise<{ provider: Provider; chainId: string }> {\n const { provider, configuration } = this.messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n const { chainId } = configuration;\n\n return { provider, chainId };\n }\n\n async #updateUserOperationAfterApproval(\n cache: UserOperationCache,\n updatedTransaction: TransactionMeta,\n ) {\n log('Found updated transaction in approval', { updatedTransaction });\n\n const { metadata, request } = cache;\n\n const { userOperation } = metadata;\n const usingPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const updatedMaxFeePerGas = add0x(\n updatedTransaction.txParams.maxFeePerGas as string,\n );\n\n const updatedMaxPriorityFeePerGas = add0x(\n updatedTransaction.txParams.maxPriorityFeePerGas as string,\n );\n\n let regenerateUserOperation = false;\n const previousMaxFeePerGas = userOperation.maxFeePerGas;\n const previousMaxPriorityFeePerGas = userOperation.maxPriorityFeePerGas;\n\n const gasFeesUpdated =\n previousMaxFeePerGas !== updatedMaxFeePerGas ||\n previousMaxPriorityFeePerGas !== updatedMaxPriorityFeePerGas;\n\n /**\n * true when we detect {@link getTransactionMetadata} has set the gas fees to zero\n * because the userOperation has a paymaster. This should not be mistaken for gas\n * fees being updated during the approval process.\n */\n const areGasFeesZeroBecauseOfPaymaster =\n usingPaymaster &&\n updatedMaxFeePerGas === VALUE_ZERO &&\n updatedMaxPriorityFeePerGas === VALUE_ZERO;\n\n if (gasFeesUpdated && !areGasFeesZeroBecauseOfPaymaster) {\n log('Gas fees updated during approval', {\n previousMaxFeePerGas,\n previousMaxPriorityFeePerGas,\n updatedMaxFeePerGas,\n updatedMaxPriorityFeePerGas,\n });\n\n userOperation.maxFeePerGas = updatedMaxFeePerGas;\n userOperation.maxPriorityFeePerGas = updatedMaxPriorityFeePerGas;\n\n regenerateUserOperation = usingPaymaster;\n }\n\n const previousData = request.data ?? EMPTY_BYTES;\n const updatedData = updatedTransaction.txParams.data ?? EMPTY_BYTES;\n\n if (previousData !== updatedData) {\n log('Data updated during approval', { previousData, updatedData });\n regenerateUserOperation = true;\n }\n\n const previousValue = request.value ?? VALUE_ZERO;\n const updatedValue = updatedTransaction.txParams.value ?? VALUE_ZERO;\n\n if (previousValue !== updatedValue) {\n log('Value updated during approval', { previousValue, updatedValue });\n regenerateUserOperation = true;\n }\n\n if (regenerateUserOperation) {\n const updatedRequest = {\n ...request,\n data: updatedData,\n maxFeePerGas: updatedMaxFeePerGas,\n maxPriorityFeePerGas: updatedMaxPriorityFeePerGas,\n value: updatedValue,\n };\n\n await this.#regenerateUserOperation({\n ...cache,\n request: updatedRequest,\n });\n }\n }\n\n async #regenerateUserOperation(cache: UserOperationCache) {\n log(\n 'Regenerating user operation as parameters were updated during approval',\n );\n\n const {\n options: { smartContractAccount },\n metadata,\n } = cache;\n\n await this.#prepareUserOperation(cache);\n await this.#addPaymasterData(metadata, smartContractAccount);\n\n log('Regenerated user operation', metadata.userOperation);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bundler.cjs","sourceRoot":"","sources":["../../src/helpers/Bundler.ts"],"names":[],"mappings":";AAAA,wCAAwC;;;;;;;;;;;;;;;AAExC,0CAA8D;AAG9D,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,SAAS,CAAC,CAAC;AAoBzD;;GAEG;AACH,MAAa,OAAO;IAGlB,YAAY,GAAW;;QAFvB,+BAAa;QAGX,uBAAA,IAAI,gBAAQ,GAAG,MAAA,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,wBAAwB,CAC5B,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAA4C,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAClE,8BAA8B,EAC9B,CAAC,aAAa,EAAE,UAAU,CAAC,CAC5B,CAAC;QAEF,GAAG,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAC3B,IAAa;QAEb,GAAG,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,OAAO,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACf,6BAA6B,EAC7B,CAAC,IAAI,CAAC,CACP,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,wBAAwB,EAAE;YAC5B,GAAG,EAAE,uBAAA,IAAI,oBAAK;YACd,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAW,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAAQ,uBAAuB,EAAE;YAC9D,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;CA4BF;AAlGD,0BAkGC;;AA1BC,gFAAgF;AAChF,gEAAgE;AAChE,KAAK,yBAAW,MAAc,EAAE,MAAiB;IAC/C,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAA,IAAI,oBAAK,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,YAAY,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"Bundler.cjs","sourceRoot":"","sources":["../../src/helpers/Bundler.ts"],"names":[],"mappings":";AAAA,wCAAwC;;;;;;;;;;;;;;;AAExC,0CAA8D;AAG9D,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,SAAS,CAAC,CAAC;AAoBzD;;GAEG;AACH,MAAa,OAAO;IAGlB,YAAY,GAAW;;QAFvB,+BAAa;QAGX,uBAAA,IAAI,gBAAQ,GAAG,MAAA,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,wBAAwB,CAC5B,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAA4C,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAClE,8BAA8B,EAC9B,CAAC,aAAa,EAAE,UAAU,CAAC,CAC5B,CAAC;QAEF,GAAG,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAC3B,IAAa;QAEb,GAAG,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,OAAO,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACf,6BAA6B,EAC7B,CAAC,IAAI,CAAC,CACP,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,wBAAwB,EAAE;YAC5B,GAAG,EAAE,uBAAA,IAAI,oBAAK;YACd,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAW,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAAQ,uBAAuB,EAAE;YAC9D,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;CA4BF;AAlGD,0BAkGC;;AA1BC,gFAAgF;AAChF,gEAAgE;AAChE,KAAK,yBAAW,MAAc,EAAE,MAAiB;IAC/C,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAA,IAAI,oBAAK,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAEzE,KAA2C,CAAC,IAAI;YAC/C,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;QAE1B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC;AAC7B,CAAC","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationReceipt } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'bundler');\n\n/**\n * Response from the `eth_estimateUserOperationGas` bundler method.\n * Includes the estimated gas limits required by a user operation.\n */\nexport type BundlerEstimateUserOperationGasResponse = {\n /** Estimated gas required to compensate the bundler for any pre-verification. */\n preVerificationGas: number | string;\n\n /** Estimated gas required to verify the user operation. */\n verificationGas?: number | string;\n\n /** Estimated gas required to verify the user operation. */\n verificationGasLimit?: number | string;\n\n /** Estimated gas required for the execution of the user operation. */\n callGasLimit: number | string;\n};\n\n/**\n * A helper class for interacting with a bundler.\n */\nexport class Bundler {\n #url: string;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n /**\n * Estimate the gas required to execute a user operation.\n *\n * @param userOperation - The user operation to estimate gas for.\n * @param entrypoint - The address of entrypoint to use for the user operation.\n * @returns The estimated gas limits for the user operation.\n */\n async estimateUserOperationGas(\n userOperation: UserOperation,\n entrypoint: string,\n ): Promise<BundlerEstimateUserOperationGasResponse> {\n log('Estimating gas', { url: this.#url, userOperation, entrypoint });\n\n const response: BundlerEstimateUserOperationGasResponse = await this.#query(\n 'eth_estimateUserOperationGas',\n [userOperation, entrypoint],\n );\n\n log('Estimated gas', { response });\n\n return response;\n }\n\n /**\n * Retrieve the receipt for a user operation.\n * @param hash - The hash of the user operation.\n * @returns The receipt for the user operation, or `undefined` if the user operation is pending.\n */\n async getUserOperationReceipt(\n hash?: string,\n ): Promise<UserOperationReceipt | undefined> {\n log('Getting user operation receipt', { url: this.#url, hash });\n\n return await this.#query<UserOperationReceipt | undefined>(\n 'eth_getUserOperationReceipt',\n [hash],\n );\n }\n\n /**\n * Submit a user operation to the bundler.\n * @param userOperation - The signed user operation to submit.\n * @param entrypoint - The address of entrypoint to use for the user operation.\n * @returns The hash of the user operation.\n */\n async sendUserOperation(\n userOperation: UserOperation,\n entrypoint: string,\n ): Promise<string> {\n log('Sending user operation', {\n url: this.#url,\n userOperation,\n entrypoint,\n });\n\n const hash: string = await this.#query('eth_sendUserOperation', [\n userOperation,\n entrypoint,\n ]);\n\n log('Sent user operation', hash);\n\n return hash;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async #query<T>(method: string, params: unknown[]): Promise<T> {\n const request = {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),\n };\n\n const response = await fetch(this.#url, request);\n const responseJson = await response.json();\n\n if (responseJson.error) {\n const error = new Error(responseJson.error.message || responseJson.error);\n\n (error as unknown as Record<string, string>).code =\n responseJson.error.code;\n\n throw error;\n }\n\n return responseJson.result;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bundler.mjs","sourceRoot":"","sources":["../../src/helpers/Bundler.ts"],"names":[],"mappings":"AAAA,wCAAwC;;;;;;;;;;;;;AAExC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAG9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAoBzD;;GAEG;AACH,MAAM,OAAO,OAAO;IAGlB,YAAY,GAAW;;QAFvB,+BAAa;QAGX,uBAAA,IAAI,gBAAQ,GAAG,MAAA,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,wBAAwB,CAC5B,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAA4C,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAClE,8BAA8B,EAC9B,CAAC,aAAa,EAAE,UAAU,CAAC,CAC5B,CAAC;QAEF,GAAG,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAC3B,IAAa;QAEb,GAAG,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,OAAO,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACf,6BAA6B,EAC7B,CAAC,IAAI,CAAC,CACP,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,wBAAwB,EAAE;YAC5B,GAAG,EAAE,uBAAA,IAAI,oBAAK;YACd,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAW,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAAQ,uBAAuB,EAAE;YAC9D,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;CA4BF;;AA1BC,gFAAgF;AAChF,gEAAgE;AAChE,KAAK,yBAAW,MAAc,EAAE,MAAiB;IAC/C,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAA,IAAI,oBAAK,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,YAAY,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"Bundler.mjs","sourceRoot":"","sources":["../../src/helpers/Bundler.ts"],"names":[],"mappings":"AAAA,wCAAwC;;;;;;;;;;;;;AAExC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAG9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAoBzD;;GAEG;AACH,MAAM,OAAO,OAAO;IAGlB,YAAY,GAAW;;QAFvB,+BAAa;QAGX,uBAAA,IAAI,gBAAQ,GAAG,MAAA,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,wBAAwB,CAC5B,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAA4C,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAClE,8BAA8B,EAC9B,CAAC,aAAa,EAAE,UAAU,CAAC,CAC5B,CAAC;QAEF,GAAG,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAC3B,IAAa;QAEb,GAAG,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,oBAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,OAAO,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EACf,6BAA6B,EAC7B,CAAC,IAAI,CAAC,CACP,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,aAA4B,EAC5B,UAAkB;QAElB,GAAG,CAAC,wBAAwB,EAAE;YAC5B,GAAG,EAAE,uBAAA,IAAI,oBAAK;YACd,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,MAAM,IAAI,GAAW,MAAM,uBAAA,IAAI,0CAAO,MAAX,IAAI,EAAQ,uBAAuB,EAAE;YAC9D,aAAa;YACb,UAAU;SACX,CAAC,CAAC;QAEH,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;CA4BF;;AA1BC,gFAAgF;AAChF,gEAAgE;AAChE,KAAK,yBAAW,MAAc,EAAE,MAAiB;IAC/C,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;KAChE,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAA,IAAI,oBAAK,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAEzE,KAA2C,CAAC,IAAI;YAC/C,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;QAE1B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC;AAC7B,CAAC","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationReceipt } from '../types';\n\nconst log = createModuleLogger(projectLogger, 'bundler');\n\n/**\n * Response from the `eth_estimateUserOperationGas` bundler method.\n * Includes the estimated gas limits required by a user operation.\n */\nexport type BundlerEstimateUserOperationGasResponse = {\n /** Estimated gas required to compensate the bundler for any pre-verification. */\n preVerificationGas: number | string;\n\n /** Estimated gas required to verify the user operation. */\n verificationGas?: number | string;\n\n /** Estimated gas required to verify the user operation. */\n verificationGasLimit?: number | string;\n\n /** Estimated gas required for the execution of the user operation. */\n callGasLimit: number | string;\n};\n\n/**\n * A helper class for interacting with a bundler.\n */\nexport class Bundler {\n #url: string;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n /**\n * Estimate the gas required to execute a user operation.\n *\n * @param userOperation - The user operation to estimate gas for.\n * @param entrypoint - The address of entrypoint to use for the user operation.\n * @returns The estimated gas limits for the user operation.\n */\n async estimateUserOperationGas(\n userOperation: UserOperation,\n entrypoint: string,\n ): Promise<BundlerEstimateUserOperationGasResponse> {\n log('Estimating gas', { url: this.#url, userOperation, entrypoint });\n\n const response: BundlerEstimateUserOperationGasResponse = await this.#query(\n 'eth_estimateUserOperationGas',\n [userOperation, entrypoint],\n );\n\n log('Estimated gas', { response });\n\n return response;\n }\n\n /**\n * Retrieve the receipt for a user operation.\n * @param hash - The hash of the user operation.\n * @returns The receipt for the user operation, or `undefined` if the user operation is pending.\n */\n async getUserOperationReceipt(\n hash?: string,\n ): Promise<UserOperationReceipt | undefined> {\n log('Getting user operation receipt', { url: this.#url, hash });\n\n return await this.#query<UserOperationReceipt | undefined>(\n 'eth_getUserOperationReceipt',\n [hash],\n );\n }\n\n /**\n * Submit a user operation to the bundler.\n * @param userOperation - The signed user operation to submit.\n * @param entrypoint - The address of entrypoint to use for the user operation.\n * @returns The hash of the user operation.\n */\n async sendUserOperation(\n userOperation: UserOperation,\n entrypoint: string,\n ): Promise<string> {\n log('Sending user operation', {\n url: this.#url,\n userOperation,\n entrypoint,\n });\n\n const hash: string = await this.#query('eth_sendUserOperation', [\n userOperation,\n entrypoint,\n ]);\n\n log('Sent user operation', hash);\n\n return hash;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async #query<T>(method: string, params: unknown[]): Promise<T> {\n const request = {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),\n };\n\n const response = await fetch(this.#url, request);\n const responseJson = await response.json();\n\n if (responseJson.error) {\n const error = new Error(responseJson.error.message || responseJson.error);\n\n (error as unknown as Record<string, string>).code =\n responseJson.error.code;\n\n throw error;\n }\n\n return responseJson.result;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingUserOperationTracker.cjs","sourceRoot":"","sources":["../../src/helpers/PendingUserOperationTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query, toHex } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClient,\n NetworkClientId,\n Provider,\n} from '@metamask/network-controller';\nimport { BlockTrackerPollingControllerOnly } from '@metamask/polling-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { UserOperationMetadata, UserOperationReceipt } from '../types';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationControllerMessenger } from '../UserOperationController';\nimport { Bundler } from './Bundler';\n\nconst log = createModuleLogger(projectLogger, 'pending-user-operations');\n\ntype Events = {\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [txMeta: UserOperationMetadata, error: Error];\n 'user-operation-updated': [txMeta: UserOperationMetadata];\n};\n\nexport type PendingUserOperationTrackerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\n/** The input to start polling for the {@link PendingUserOperationTracker} */\ntype PendingUserOperationPollingInput = {\n networkClientId: NetworkClientId;\n};\n\n/**\n * A helper class to periodically query the bundlers\n * and update the status of any submitted user operations.\n */\nexport class PendingUserOperationTracker extends BlockTrackerPollingControllerOnly<PendingUserOperationPollingInput>() {\n hub: PendingUserOperationTrackerEventEmitter;\n\n #getUserOperations: () => UserOperationMetadata[];\n\n #messenger: UserOperationControllerMessenger;\n\n constructor({\n getUserOperations,\n messenger,\n }: {\n getUserOperations: () => UserOperationMetadata[];\n messenger: UserOperationControllerMessenger;\n }) {\n super();\n\n this.hub = new EventEmitter() as PendingUserOperationTrackerEventEmitter;\n\n this.#getUserOperations = getUserOperations;\n this.#messenger = messenger;\n }\n\n async _executePoll({ networkClientId }: PendingUserOperationPollingInput) {\n try {\n const { blockTracker, configuration, provider } =\n this._getNetworkClientById(networkClientId) as NetworkClient;\n\n log('Polling', {\n blockNumber: blockTracker.getCurrentBlock(),\n chainId: configuration.chainId,\n });\n\n await this.#checkUserOperations(configuration.chainId, provider);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check user operations', error);\n }\n }\n\n _getNetworkClientById(networkClientId: string): NetworkClient | undefined {\n return this.#messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n\n async #checkUserOperations(chainId: string, provider: Provider) {\n const pendingUserOperations = this.#getPendingUserOperations().filter(\n (metadata) => metadata.chainId === chainId,\n );\n\n if (!pendingUserOperations.length) {\n log('No pending user operations to check');\n return;\n }\n\n log('Found pending user operations to check', {\n count: pendingUserOperations.length,\n ids: pendingUserOperations.map((userOperation) => userOperation.id),\n });\n\n await Promise.all(\n pendingUserOperations.map((userOperation) =>\n this.#checkUserOperation(userOperation, provider),\n ),\n );\n }\n\n async #checkUserOperation(\n metadata: UserOperationMetadata,\n provider: Provider,\n ) {\n const { bundlerUrl, hash, id } = metadata;\n\n if (!hash || !bundlerUrl) {\n log('Skipping user operation as missing hash or bundler', id);\n return;\n }\n\n try {\n const receipt = await this.#getUserOperationReceipt(hash, bundlerUrl);\n const isSuccess = receipt?.success;\n\n if (receipt && !isSuccess) {\n this.#onUserOperationFailed(metadata, receipt);\n return;\n }\n\n if (isSuccess) {\n await this.#onUserOperationConfirmed(metadata, receipt, provider);\n return;\n }\n\n log('No receipt found for user operation', { id, hash });\n } catch (error) {\n log('Failed to check user operation', id, error);\n }\n }\n\n async #onUserOperationConfirmed(\n metadata: UserOperationMetadata,\n receipt: UserOperationReceipt,\n provider: Provider,\n ) {\n const { id } = metadata;\n\n const {\n actualGasCost,\n actualGasUsed,\n receipt: { blockHash, transactionHash },\n } = receipt;\n\n log('User operation confirmed', id, transactionHash);\n\n const { baseFeePerGas } = await query(\n new EthQuery(provider),\n 'getBlockByHash',\n [blockHash, false],\n );\n\n metadata.actualGasCost = this.#normalizeGasValue(actualGasCost);\n metadata.actualGasUsed = this.#normalizeGasValue(actualGasUsed);\n metadata.baseFeePerGas = baseFeePerGas;\n metadata.status = UserOperationStatus.Confirmed;\n metadata.transactionHash = transactionHash;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit('user-operation-confirmed', metadata);\n }\n\n #onUserOperationFailed(\n metadata: UserOperationMetadata,\n _receipt: UserOperationReceipt,\n ) {\n const { id } = metadata;\n\n log('User operation failed', id);\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit(\n 'user-operation-failed',\n metadata,\n new Error('User operation receipt has failed status'),\n );\n }\n\n #getPendingUserOperations(): UserOperationMetadata[] {\n return this.#getUserOperations().filter(\n (userOperation) => userOperation.status === UserOperationStatus.Submitted,\n );\n }\n\n #updateUserOperation(metadata: UserOperationMetadata) {\n this.hub.emit('user-operation-updated', metadata);\n }\n\n async #getUserOperationReceipt(\n hash: string,\n bundlerUrl: string,\n ): Promise<UserOperationReceipt | undefined> {\n const bundler = new Bundler(bundlerUrl);\n return bundler.getUserOperationReceipt(hash);\n }\n\n #normalizeGasValue(gasValue: Hex | number): string {\n if (typeof gasValue === 'number') {\n return toHex(gasValue);\n }\n return gasValue;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PendingUserOperationTracker.cjs","sourceRoot":"","sources":["../../src/helpers/PendingUserOperationTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query, toHex } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClient,\n NetworkClientId,\n Provider,\n} from '@metamask/network-controller';\nimport { BlockTrackerPollingControllerOnly } from '@metamask/polling-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { UserOperationMetadata, UserOperationReceipt } from '../types';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationControllerMessenger } from '../UserOperationController';\nimport { Bundler } from './Bundler';\n\nconst log = createModuleLogger(projectLogger, 'pending-user-operations');\n\ntype Events = {\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [txMeta: UserOperationMetadata, error: Error];\n 'user-operation-updated': [txMeta: UserOperationMetadata];\n};\n\nexport type PendingUserOperationTrackerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\n/** The input to start polling for the {@link PendingUserOperationTracker} */\ntype PendingUserOperationPollingInput = {\n networkClientId: NetworkClientId;\n};\n\n/**\n * A helper class to periodically query the bundlers\n * and update the status of any submitted user operations.\n */\nexport class PendingUserOperationTracker extends BlockTrackerPollingControllerOnly<PendingUserOperationPollingInput>() {\n hub: PendingUserOperationTrackerEventEmitter;\n\n #getUserOperations: () => UserOperationMetadata[];\n\n #messenger: UserOperationControllerMessenger;\n\n constructor({\n getUserOperations,\n messenger,\n }: {\n getUserOperations: () => UserOperationMetadata[];\n messenger: UserOperationControllerMessenger;\n }) {\n super();\n\n this.hub = new EventEmitter() as PendingUserOperationTrackerEventEmitter;\n\n this.#getUserOperations = getUserOperations;\n this.#messenger = messenger;\n }\n\n async _executePoll({ networkClientId }: PendingUserOperationPollingInput) {\n try {\n const { blockTracker, configuration, provider } =\n this._getNetworkClientById(networkClientId) as NetworkClient;\n\n log('Polling', {\n blockNumber: blockTracker.getCurrentBlock(),\n chainId: configuration.chainId,\n });\n\n await this.#checkUserOperations(configuration.chainId, provider);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check user operations', error);\n }\n }\n\n _getNetworkClientById(networkClientId: string): NetworkClient | undefined {\n return this.#messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n\n async #checkUserOperations(chainId: string, provider: Provider) {\n const pendingUserOperations = this.#getPendingUserOperations().filter(\n (metadata) => metadata.chainId === chainId,\n );\n\n if (!pendingUserOperations.length) {\n log('No pending user operations to check');\n return;\n }\n\n log('Found pending user operations to check', {\n count: pendingUserOperations.length,\n ids: pendingUserOperations.map((userOperation) => userOperation.id),\n });\n\n await Promise.all(\n pendingUserOperations.map((userOperation) =>\n this.#checkUserOperation(userOperation, provider),\n ),\n );\n }\n\n async #checkUserOperation(\n metadata: UserOperationMetadata,\n provider: Provider,\n ) {\n const { bundlerUrl, hash, id } = metadata;\n\n if (!hash || !bundlerUrl) {\n log('Skipping user operation as missing hash or bundler', id);\n return;\n }\n\n try {\n const receipt = await this.#getUserOperationReceipt(hash, bundlerUrl);\n const isSuccess = receipt?.success;\n\n if (receipt && !isSuccess) {\n this.#onUserOperationFailed(metadata, receipt);\n return;\n }\n\n if (isSuccess) {\n await this.#onUserOperationConfirmed(metadata, receipt, provider);\n return;\n }\n\n log('No receipt found for user operation', { id, hash });\n } catch (error) {\n log('Failed to check user operation', id, error);\n }\n }\n\n async #onUserOperationConfirmed(\n metadata: UserOperationMetadata,\n receipt: UserOperationReceipt,\n provider: Provider,\n ) {\n const { id } = metadata;\n\n const {\n actualGasCost,\n actualGasUsed,\n receipt: { blockHash, transactionHash },\n } = receipt;\n\n log('User operation confirmed', id, transactionHash);\n\n const { baseFeePerGas } = await query(\n new EthQuery(provider),\n 'getBlockByHash',\n [blockHash, false],\n );\n\n metadata.actualGasCost = this.#normalizeGasValue(actualGasCost);\n metadata.actualGasUsed = this.#normalizeGasValue(actualGasUsed);\n metadata.baseFeePerGas = baseFeePerGas;\n metadata.status = UserOperationStatus.Confirmed;\n metadata.transactionHash = transactionHash;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit('user-operation-confirmed', metadata);\n }\n\n #onUserOperationFailed(\n metadata: UserOperationMetadata,\n _receipt: UserOperationReceipt,\n ) {\n const { id } = metadata;\n\n log('User operation failed', id);\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit(\n 'user-operation-failed',\n metadata,\n new Error('User operation receipt has failed status'),\n );\n }\n\n #getPendingUserOperations(): UserOperationMetadata[] {\n return this.#getUserOperations().filter(\n (userOperation) => userOperation.status === UserOperationStatus.Submitted,\n );\n }\n\n #updateUserOperation(metadata: UserOperationMetadata) {\n this.hub.emit('user-operation-updated', metadata);\n }\n\n async #getUserOperationReceipt(\n hash: string,\n bundlerUrl: string,\n ): Promise<UserOperationReceipt | undefined> {\n const bundler = new Bundler(bundlerUrl);\n return bundler.getUserOperationReceipt(hash);\n }\n\n #normalizeGasValue(gasValue: Hex | number): string {\n if (typeof gasValue === 'number') {\n return toHex(gasValue);\n }\n return gasValue;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingUserOperationTracker.mjs","sourceRoot":"","sources":["../../src/helpers/PendingUserOperationTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query, toHex } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClient,\n NetworkClientId,\n Provider,\n} from '@metamask/network-controller';\nimport { BlockTrackerPollingControllerOnly } from '@metamask/polling-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { UserOperationMetadata, UserOperationReceipt } from '../types';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationControllerMessenger } from '../UserOperationController';\nimport { Bundler } from './Bundler';\n\nconst log = createModuleLogger(projectLogger, 'pending-user-operations');\n\ntype Events = {\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [txMeta: UserOperationMetadata, error: Error];\n 'user-operation-updated': [txMeta: UserOperationMetadata];\n};\n\nexport type PendingUserOperationTrackerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\n/** The input to start polling for the {@link PendingUserOperationTracker} */\ntype PendingUserOperationPollingInput = {\n networkClientId: NetworkClientId;\n};\n\n/**\n * A helper class to periodically query the bundlers\n * and update the status of any submitted user operations.\n */\nexport class PendingUserOperationTracker extends BlockTrackerPollingControllerOnly<PendingUserOperationPollingInput>() {\n hub: PendingUserOperationTrackerEventEmitter;\n\n #getUserOperations: () => UserOperationMetadata[];\n\n #messenger: UserOperationControllerMessenger;\n\n constructor({\n getUserOperations,\n messenger,\n }: {\n getUserOperations: () => UserOperationMetadata[];\n messenger: UserOperationControllerMessenger;\n }) {\n super();\n\n this.hub = new EventEmitter() as PendingUserOperationTrackerEventEmitter;\n\n this.#getUserOperations = getUserOperations;\n this.#messenger = messenger;\n }\n\n async _executePoll({ networkClientId }: PendingUserOperationPollingInput) {\n try {\n const { blockTracker, configuration, provider } =\n this._getNetworkClientById(networkClientId) as NetworkClient;\n\n log('Polling', {\n blockNumber: blockTracker.getCurrentBlock(),\n chainId: configuration.chainId,\n });\n\n await this.#checkUserOperations(configuration.chainId, provider);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check user operations', error);\n }\n }\n\n _getNetworkClientById(networkClientId: string): NetworkClient | undefined {\n return this.#messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n\n async #checkUserOperations(chainId: string, provider: Provider) {\n const pendingUserOperations = this.#getPendingUserOperations().filter(\n (metadata) => metadata.chainId === chainId,\n );\n\n if (!pendingUserOperations.length) {\n log('No pending user operations to check');\n return;\n }\n\n log('Found pending user operations to check', {\n count: pendingUserOperations.length,\n ids: pendingUserOperations.map((userOperation) => userOperation.id),\n });\n\n await Promise.all(\n pendingUserOperations.map((userOperation) =>\n this.#checkUserOperation(userOperation, provider),\n ),\n );\n }\n\n async #checkUserOperation(\n metadata: UserOperationMetadata,\n provider: Provider,\n ) {\n const { bundlerUrl, hash, id } = metadata;\n\n if (!hash || !bundlerUrl) {\n log('Skipping user operation as missing hash or bundler', id);\n return;\n }\n\n try {\n const receipt = await this.#getUserOperationReceipt(hash, bundlerUrl);\n const isSuccess = receipt?.success;\n\n if (receipt && !isSuccess) {\n this.#onUserOperationFailed(metadata, receipt);\n return;\n }\n\n if (isSuccess) {\n await this.#onUserOperationConfirmed(metadata, receipt, provider);\n return;\n }\n\n log('No receipt found for user operation', { id, hash });\n } catch (error) {\n log('Failed to check user operation', id, error);\n }\n }\n\n async #onUserOperationConfirmed(\n metadata: UserOperationMetadata,\n receipt: UserOperationReceipt,\n provider: Provider,\n ) {\n const { id } = metadata;\n\n const {\n actualGasCost,\n actualGasUsed,\n receipt: { blockHash, transactionHash },\n } = receipt;\n\n log('User operation confirmed', id, transactionHash);\n\n const { baseFeePerGas } = await query(\n new EthQuery(provider),\n 'getBlockByHash',\n [blockHash, false],\n );\n\n metadata.actualGasCost = this.#normalizeGasValue(actualGasCost);\n metadata.actualGasUsed = this.#normalizeGasValue(actualGasUsed);\n metadata.baseFeePerGas = baseFeePerGas;\n metadata.status = UserOperationStatus.Confirmed;\n metadata.transactionHash = transactionHash;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit('user-operation-confirmed', metadata);\n }\n\n #onUserOperationFailed(\n metadata: UserOperationMetadata,\n _receipt: UserOperationReceipt,\n ) {\n const { id } = metadata;\n\n log('User operation failed', id);\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit(\n 'user-operation-failed',\n metadata,\n new Error('User operation receipt has failed status'),\n );\n }\n\n #getPendingUserOperations(): UserOperationMetadata[] {\n return this.#getUserOperations().filter(\n (userOperation) => userOperation.status === UserOperationStatus.Submitted,\n );\n }\n\n #updateUserOperation(metadata: UserOperationMetadata) {\n this.hub.emit('user-operation-updated', metadata);\n }\n\n async #getUserOperationReceipt(\n hash: string,\n bundlerUrl: string,\n ): Promise<UserOperationReceipt | undefined> {\n const bundler = new Bundler(bundlerUrl);\n return bundler.getUserOperationReceipt(hash);\n }\n\n #normalizeGasValue(gasValue: Hex | number): string {\n if (typeof gasValue === 'number') {\n return toHex(gasValue);\n }\n return gasValue;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PendingUserOperationTracker.mjs","sourceRoot":"","sources":["../../src/helpers/PendingUserOperationTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query, toHex } from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClient,\n NetworkClientId,\n Provider,\n} from '@metamask/network-controller';\nimport { BlockTrackerPollingControllerOnly } from '@metamask/polling-controller';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type { UserOperationMetadata, UserOperationReceipt } from '../types';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationControllerMessenger } from '../UserOperationController';\nimport { Bundler } from './Bundler';\n\nconst log = createModuleLogger(projectLogger, 'pending-user-operations');\n\ntype Events = {\n 'user-operation-confirmed': [metadata: UserOperationMetadata];\n 'user-operation-failed': [txMeta: UserOperationMetadata, error: Error];\n 'user-operation-updated': [txMeta: UserOperationMetadata];\n};\n\nexport type PendingUserOperationTrackerEventEmitter = EventEmitter & {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n once<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): PendingUserOperationTrackerEventEmitter;\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n};\n\n/** The input to start polling for the {@link PendingUserOperationTracker} */\ntype PendingUserOperationPollingInput = {\n networkClientId: NetworkClientId;\n};\n\n/**\n * A helper class to periodically query the bundlers\n * and update the status of any submitted user operations.\n */\nexport class PendingUserOperationTracker extends BlockTrackerPollingControllerOnly<PendingUserOperationPollingInput>() {\n hub: PendingUserOperationTrackerEventEmitter;\n\n #getUserOperations: () => UserOperationMetadata[];\n\n #messenger: UserOperationControllerMessenger;\n\n constructor({\n getUserOperations,\n messenger,\n }: {\n getUserOperations: () => UserOperationMetadata[];\n messenger: UserOperationControllerMessenger;\n }) {\n super();\n\n this.hub = new EventEmitter() as PendingUserOperationTrackerEventEmitter;\n\n this.#getUserOperations = getUserOperations;\n this.#messenger = messenger;\n }\n\n async _executePoll({ networkClientId }: PendingUserOperationPollingInput) {\n try {\n const { blockTracker, configuration, provider } =\n this._getNetworkClientById(networkClientId) as NetworkClient;\n\n log('Polling', {\n blockNumber: blockTracker.getCurrentBlock(),\n chainId: configuration.chainId,\n });\n\n await this.#checkUserOperations(configuration.chainId, provider);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check user operations', error);\n }\n }\n\n _getNetworkClientById(networkClientId: string): NetworkClient | undefined {\n return this.#messenger.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n\n async #checkUserOperations(chainId: string, provider: Provider) {\n const pendingUserOperations = this.#getPendingUserOperations().filter(\n (metadata) => metadata.chainId === chainId,\n );\n\n if (!pendingUserOperations.length) {\n log('No pending user operations to check');\n return;\n }\n\n log('Found pending user operations to check', {\n count: pendingUserOperations.length,\n ids: pendingUserOperations.map((userOperation) => userOperation.id),\n });\n\n await Promise.all(\n pendingUserOperations.map((userOperation) =>\n this.#checkUserOperation(userOperation, provider),\n ),\n );\n }\n\n async #checkUserOperation(\n metadata: UserOperationMetadata,\n provider: Provider,\n ) {\n const { bundlerUrl, hash, id } = metadata;\n\n if (!hash || !bundlerUrl) {\n log('Skipping user operation as missing hash or bundler', id);\n return;\n }\n\n try {\n const receipt = await this.#getUserOperationReceipt(hash, bundlerUrl);\n const isSuccess = receipt?.success;\n\n if (receipt && !isSuccess) {\n this.#onUserOperationFailed(metadata, receipt);\n return;\n }\n\n if (isSuccess) {\n await this.#onUserOperationConfirmed(metadata, receipt, provider);\n return;\n }\n\n log('No receipt found for user operation', { id, hash });\n } catch (error) {\n log('Failed to check user operation', id, error);\n }\n }\n\n async #onUserOperationConfirmed(\n metadata: UserOperationMetadata,\n receipt: UserOperationReceipt,\n provider: Provider,\n ) {\n const { id } = metadata;\n\n const {\n actualGasCost,\n actualGasUsed,\n receipt: { blockHash, transactionHash },\n } = receipt;\n\n log('User operation confirmed', id, transactionHash);\n\n const { baseFeePerGas } = await query(\n new EthQuery(provider),\n 'getBlockByHash',\n [blockHash, false],\n );\n\n metadata.actualGasCost = this.#normalizeGasValue(actualGasCost);\n metadata.actualGasUsed = this.#normalizeGasValue(actualGasUsed);\n metadata.baseFeePerGas = baseFeePerGas;\n metadata.status = UserOperationStatus.Confirmed;\n metadata.transactionHash = transactionHash;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit('user-operation-confirmed', metadata);\n }\n\n #onUserOperationFailed(\n metadata: UserOperationMetadata,\n _receipt: UserOperationReceipt,\n ) {\n const { id } = metadata;\n\n log('User operation failed', id);\n\n metadata.status = UserOperationStatus.Failed;\n\n this.#updateUserOperation(metadata);\n\n this.hub.emit(\n 'user-operation-failed',\n metadata,\n new Error('User operation receipt has failed status'),\n );\n }\n\n #getPendingUserOperations(): UserOperationMetadata[] {\n return this.#getUserOperations().filter(\n (userOperation) => userOperation.status === UserOperationStatus.Submitted,\n );\n }\n\n #updateUserOperation(metadata: UserOperationMetadata) {\n this.hub.emit('user-operation-updated', metadata);\n }\n\n async #getUserOperationReceipt(\n hash: string,\n bundlerUrl: string,\n ): Promise<UserOperationReceipt | undefined> {\n const bundler = new Bundler(bundlerUrl);\n return bundler.getUserOperationReceipt(hash);\n }\n\n #normalizeGasValue(gasValue: Hex | number): string {\n if (typeof gasValue === 'number') {\n return toHex(gasValue);\n }\n return gasValue;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fees.cjs","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n gweiDecToWEIBN,\n ORIGIN_METAMASK,\n query,\n toHex,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport {\n GAS_ESTIMATE_TYPES,\n type GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { Provider } from '@metamask/network-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport { UserFeeLevel } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationMetadata } from '../types';\nimport type { AddUserOperationRequest } from '../UserOperationController';\n\nconst log = createModuleLogger(projectLogger, 'gas-fees');\n\nexport type UpdateGasFeesRequest = {\n getGasFeeEstimates: () => Promise<GasFeeState>;\n metadata: UserOperationMetadata;\n originalRequest: AddUserOperationRequest;\n provider: Provider;\n transaction?: TransactionParams;\n};\n\ntype SuggestedGasFees = {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n};\n\n/**\n * Populates the gas fee properties for a user operation.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.metadata - The metadata for the user operation.\n * @param request.originalRequest - The original request to add the user operation.\n * @param request.provider - A provider to query the network.\n * @param request.transaction - The transaction that created the user operation.\n */\nexport async function updateGasFees(request: UpdateGasFeesRequest) {\n const { metadata, originalRequest, transaction } = request;\n const { userOperation } = metadata;\n let suggestedGasFees: SuggestedGasFees | undefined;\n\n const getGasFeeEstimates = async () => {\n if (!suggestedGasFees) {\n suggestedGasFees = await getSuggestedGasFees(request);\n }\n\n return suggestedGasFees;\n };\n\n userOperation.maxFeePerGas = await getMaxFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n transaction,\n );\n\n userOperation.maxPriorityFeePerGas = await getMaxPriorityFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n userOperation,\n transaction,\n );\n\n metadata.userFeeLevel = getUserFeeLevel(\n metadata,\n originalRequest,\n suggestedGasFees,\n transaction,\n );\n}\n\n/**\n * Gets the maxFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxFeePerGas for the user operation.\n */\nasync function getMaxFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n\n if (!isGasFeeEmpty(maxFeePerGas)) {\n log('Using maxFeePerGas from request', maxFeePerGas);\n return maxFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxPriorityFeePerGas) && gasPrice) {\n log('Setting maxFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxFeePerGas: suggestedMaxFeePerGas } = await getGetFasEstimates();\n\n if (!suggestedMaxFeePerGas) {\n throw new Error('Failed to get gas fee estimate for maxFeePerGas');\n }\n\n log('Using maxFeePerGas from estimate', suggestedMaxFeePerGas);\n\n return suggestedMaxFeePerGas;\n}\n\n/**\n * Gets the maxPriorityFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param userOperation - The user operation being updated.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxPriorityFeePerGas for the user operation.\n */\nasync function getMaxPriorityFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n userOperation: UserOperation,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n const { maxFeePerGas: updatedMaxFeePerGas } = userOperation;\n\n if (!isGasFeeEmpty(maxPriorityFeePerGas)) {\n log('Using maxPriorityFeePerGas from request', maxPriorityFeePerGas);\n return maxPriorityFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxFeePerGas) && gasPrice) {\n log('Setting maxPriorityFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas } =\n await getGetFasEstimates();\n\n if (suggestedMaxPriorityFeePerGas) {\n log(\n 'Using maxPriorityFeePerGas from estimate',\n suggestedMaxPriorityFeePerGas,\n );\n return suggestedMaxPriorityFeePerGas;\n }\n\n log('Setting maxPriorityFeePerGas to maxFeePerGas', updatedMaxFeePerGas);\n\n return updatedMaxFeePerGas;\n}\n\n/**\n * Gets the userFeeLevel for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param suggestedGasFees - The suggested gas fees, if any.\n * @param transaction - The transaction that created the user operation.\n * @returns The userFeeLevel for the user operation.\n */\nfunction getUserFeeLevel(\n metadata: UserOperationMetadata,\n originalRequest: AddUserOperationRequest,\n suggestedGasFees?: SuggestedGasFees,\n transaction?: TransactionParams,\n): UserFeeLevel {\n const { origin } = metadata;\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n\n const {\n maxFeePerGas: suggestedMaxFeePerGas,\n maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas,\n } = suggestedGasFees || {};\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n transaction?.gasPrice\n ) {\n return origin === ORIGIN_METAMASK\n ? UserFeeLevel.CUSTOM\n : UserFeeLevel.DAPP_SUGGESTED;\n }\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n suggestedMaxFeePerGas &&\n suggestedMaxPriorityFeePerGas\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (origin === ORIGIN_METAMASK) {\n return UserFeeLevel.CUSTOM;\n }\n\n return UserFeeLevel.DAPP_SUGGESTED;\n}\n\n/**\n * Gets suggested gas fees.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.provider - A provider to query the network.\n * @returns The suggested gas fees.\n */\nasync function getSuggestedGasFees(\n request: UpdateGasFeesRequest,\n): Promise<{ maxFeePerGas?: Hex; maxPriorityFeePerGas?: Hex }> {\n const { getGasFeeEstimates, provider } = request;\n\n try {\n const { gasFeeEstimates, gasEstimateType } = await getGasFeeEstimates();\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET) {\n /* istanbul ignore next */\n const {\n medium: { suggestedMaxPriorityFeePerGas, suggestedMaxFeePerGas } = {},\n } = gasFeeEstimates;\n\n if (suggestedMaxPriorityFeePerGas && suggestedMaxFeePerGas) {\n const values = {\n maxFeePerGas: gweiDecimalToWeiHex(suggestedMaxFeePerGas),\n maxPriorityFeePerGas: gweiDecimalToWeiHex(\n suggestedMaxPriorityFeePerGas,\n ),\n };\n\n log('Using medium values from fee market estimate', values);\n\n return values;\n }\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.LEGACY) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.medium);\n\n log('Using medium value from legacy estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.ETH_GASPRICE) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.gasPrice);\n\n log('Using gasPrice from estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n } catch (error) {\n log('Failed to get estimate', error);\n }\n\n const gasPriceDecimal = (await query(new EthQuery(provider), 'gasPrice')) as\n | number\n | undefined;\n\n if (!gasPriceDecimal) {\n return {};\n }\n\n const maxFeePerGas = add0x(gasPriceDecimal.toString(16)) as Hex;\n\n log('Using gasPrice from network as fallback', maxFeePerGas);\n\n return { maxFeePerGas };\n}\n\n/**\n * Converts a GWEI decimal string to a WEI hexadecimal string.\n * @param value - The GWEI decimal string to convert.\n * @returns The WEI hexadecimal string.\n */\nfunction gweiDecimalToWeiHex(value: string) {\n return toHex(gweiDecToWEIBN(value));\n}\n\n/**\n * Checks if a gas fee property is empty.\n * @param value - The gas fee value to check.\n * @returns Whether the gas fee property is empty.\n */\nfunction isGasFeeEmpty(value?: string): boolean {\n return !value || value === EMPTY_BYTES;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas-fees.cjs","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n gweiDecToWEIBN,\n ORIGIN_METAMASK,\n query,\n toHex,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport {\n GAS_ESTIMATE_TYPES,\n type GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { Provider } from '@metamask/network-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport { UserFeeLevel } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationMetadata } from '../types';\nimport type { AddUserOperationRequest } from '../UserOperationController';\n\nconst log = createModuleLogger(projectLogger, 'gas-fees');\n\nexport type UpdateGasFeesRequest = {\n getGasFeeEstimates: () => Promise<GasFeeState>;\n metadata: UserOperationMetadata;\n originalRequest: AddUserOperationRequest;\n provider: Provider;\n transaction?: TransactionParams;\n};\n\ntype SuggestedGasFees = {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n};\n\n/**\n * Populates the gas fee properties for a user operation.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.metadata - The metadata for the user operation.\n * @param request.originalRequest - The original request to add the user operation.\n * @param request.provider - A provider to query the network.\n * @param request.transaction - The transaction that created the user operation.\n */\nexport async function updateGasFees(request: UpdateGasFeesRequest) {\n const { metadata, originalRequest, transaction } = request;\n const { userOperation } = metadata;\n let suggestedGasFees: SuggestedGasFees | undefined;\n\n const getGasFeeEstimates = async () => {\n if (!suggestedGasFees) {\n suggestedGasFees = await getSuggestedGasFees(request);\n }\n\n return suggestedGasFees;\n };\n\n userOperation.maxFeePerGas = await getMaxFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n transaction,\n );\n\n userOperation.maxPriorityFeePerGas = await getMaxPriorityFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n userOperation,\n transaction,\n );\n\n metadata.userFeeLevel = getUserFeeLevel(\n metadata,\n originalRequest,\n suggestedGasFees,\n transaction,\n );\n}\n\n/**\n * Gets the maxFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxFeePerGas for the user operation.\n */\nasync function getMaxFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n\n if (!isGasFeeEmpty(maxFeePerGas)) {\n log('Using maxFeePerGas from request', maxFeePerGas);\n return maxFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxPriorityFeePerGas) && gasPrice) {\n log('Setting maxFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxFeePerGas: suggestedMaxFeePerGas } = await getGetFasEstimates();\n\n if (!suggestedMaxFeePerGas) {\n throw new Error('Failed to get gas fee estimate for maxFeePerGas');\n }\n\n log('Using maxFeePerGas from estimate', suggestedMaxFeePerGas);\n\n return suggestedMaxFeePerGas;\n}\n\n/**\n * Gets the maxPriorityFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param userOperation - The user operation being updated.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxPriorityFeePerGas for the user operation.\n */\nasync function getMaxPriorityFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n userOperation: UserOperation,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n const { maxFeePerGas: updatedMaxFeePerGas } = userOperation;\n\n if (!isGasFeeEmpty(maxPriorityFeePerGas)) {\n log('Using maxPriorityFeePerGas from request', maxPriorityFeePerGas);\n return maxPriorityFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxFeePerGas) && gasPrice) {\n log('Setting maxPriorityFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas } =\n await getGetFasEstimates();\n\n if (suggestedMaxPriorityFeePerGas) {\n log(\n 'Using maxPriorityFeePerGas from estimate',\n suggestedMaxPriorityFeePerGas,\n );\n return suggestedMaxPriorityFeePerGas;\n }\n\n log('Setting maxPriorityFeePerGas to maxFeePerGas', updatedMaxFeePerGas);\n\n return updatedMaxFeePerGas;\n}\n\n/**\n * Gets the userFeeLevel for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param suggestedGasFees - The suggested gas fees, if any.\n * @param transaction - The transaction that created the user operation.\n * @returns The userFeeLevel for the user operation.\n */\nfunction getUserFeeLevel(\n metadata: UserOperationMetadata,\n originalRequest: AddUserOperationRequest,\n suggestedGasFees?: SuggestedGasFees,\n transaction?: TransactionParams,\n): UserFeeLevel {\n const { origin } = metadata;\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n\n const {\n maxFeePerGas: suggestedMaxFeePerGas,\n maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas,\n } = suggestedGasFees || {};\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n transaction?.gasPrice\n ) {\n return origin === ORIGIN_METAMASK\n ? UserFeeLevel.CUSTOM\n : UserFeeLevel.DAPP_SUGGESTED;\n }\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n suggestedMaxFeePerGas &&\n suggestedMaxPriorityFeePerGas\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (origin === ORIGIN_METAMASK) {\n return UserFeeLevel.CUSTOM;\n }\n\n return UserFeeLevel.DAPP_SUGGESTED;\n}\n\n/**\n * Gets suggested gas fees.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.provider - A provider to query the network.\n * @returns The suggested gas fees.\n */\nasync function getSuggestedGasFees(\n request: UpdateGasFeesRequest,\n): Promise<{ maxFeePerGas?: Hex; maxPriorityFeePerGas?: Hex }> {\n const { getGasFeeEstimates, provider } = request;\n\n try {\n const { gasFeeEstimates, gasEstimateType } = await getGasFeeEstimates();\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET) {\n /* istanbul ignore next */\n const {\n medium: { suggestedMaxPriorityFeePerGas, suggestedMaxFeePerGas } = {},\n } = gasFeeEstimates;\n\n if (suggestedMaxPriorityFeePerGas && suggestedMaxFeePerGas) {\n const values = {\n maxFeePerGas: gweiDecimalToWeiHex(suggestedMaxFeePerGas),\n maxPriorityFeePerGas: gweiDecimalToWeiHex(\n suggestedMaxPriorityFeePerGas,\n ),\n };\n\n log('Using medium values from fee market estimate', values);\n\n return values;\n }\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.LEGACY) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.medium);\n\n log('Using medium value from legacy estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.ETH_GASPRICE) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.gasPrice);\n\n log('Using gasPrice from estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n } catch (error) {\n log('Failed to get estimate', error);\n }\n\n const gasPriceDecimal = (await query(new EthQuery(provider), 'gasPrice')) as\n | number\n | undefined;\n\n if (!gasPriceDecimal) {\n return {};\n }\n\n const maxFeePerGas = add0x(gasPriceDecimal.toString(16)) as Hex;\n\n log('Using gasPrice from network as fallback', maxFeePerGas);\n\n return { maxFeePerGas };\n}\n\n/**\n * Converts a GWEI decimal string to a WEI hexadecimal string.\n * @param value - The GWEI decimal string to convert.\n * @returns The WEI hexadecimal string.\n */\nfunction gweiDecimalToWeiHex(value: string) {\n return toHex(gweiDecToWEIBN(value));\n}\n\n/**\n * Checks if a gas fee property is empty.\n * @param value - The gas fee value to check.\n * @returns Whether the gas fee property is empty.\n */\nfunction isGasFeeEmpty(value?: string): boolean {\n return !value || value === EMPTY_BYTES;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fees.mjs","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n gweiDecToWEIBN,\n ORIGIN_METAMASK,\n query,\n toHex,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport {\n GAS_ESTIMATE_TYPES,\n type GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { Provider } from '@metamask/network-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport { UserFeeLevel } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationMetadata } from '../types';\nimport type { AddUserOperationRequest } from '../UserOperationController';\n\nconst log = createModuleLogger(projectLogger, 'gas-fees');\n\nexport type UpdateGasFeesRequest = {\n getGasFeeEstimates: () => Promise<GasFeeState>;\n metadata: UserOperationMetadata;\n originalRequest: AddUserOperationRequest;\n provider: Provider;\n transaction?: TransactionParams;\n};\n\ntype SuggestedGasFees = {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n};\n\n/**\n * Populates the gas fee properties for a user operation.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.metadata - The metadata for the user operation.\n * @param request.originalRequest - The original request to add the user operation.\n * @param request.provider - A provider to query the network.\n * @param request.transaction - The transaction that created the user operation.\n */\nexport async function updateGasFees(request: UpdateGasFeesRequest) {\n const { metadata, originalRequest, transaction } = request;\n const { userOperation } = metadata;\n let suggestedGasFees: SuggestedGasFees | undefined;\n\n const getGasFeeEstimates = async () => {\n if (!suggestedGasFees) {\n suggestedGasFees = await getSuggestedGasFees(request);\n }\n\n return suggestedGasFees;\n };\n\n userOperation.maxFeePerGas = await getMaxFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n transaction,\n );\n\n userOperation.maxPriorityFeePerGas = await getMaxPriorityFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n userOperation,\n transaction,\n );\n\n metadata.userFeeLevel = getUserFeeLevel(\n metadata,\n originalRequest,\n suggestedGasFees,\n transaction,\n );\n}\n\n/**\n * Gets the maxFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxFeePerGas for the user operation.\n */\nasync function getMaxFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n\n if (!isGasFeeEmpty(maxFeePerGas)) {\n log('Using maxFeePerGas from request', maxFeePerGas);\n return maxFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxPriorityFeePerGas) && gasPrice) {\n log('Setting maxFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxFeePerGas: suggestedMaxFeePerGas } = await getGetFasEstimates();\n\n if (!suggestedMaxFeePerGas) {\n throw new Error('Failed to get gas fee estimate for maxFeePerGas');\n }\n\n log('Using maxFeePerGas from estimate', suggestedMaxFeePerGas);\n\n return suggestedMaxFeePerGas;\n}\n\n/**\n * Gets the maxPriorityFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param userOperation - The user operation being updated.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxPriorityFeePerGas for the user operation.\n */\nasync function getMaxPriorityFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n userOperation: UserOperation,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n const { maxFeePerGas: updatedMaxFeePerGas } = userOperation;\n\n if (!isGasFeeEmpty(maxPriorityFeePerGas)) {\n log('Using maxPriorityFeePerGas from request', maxPriorityFeePerGas);\n return maxPriorityFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxFeePerGas) && gasPrice) {\n log('Setting maxPriorityFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas } =\n await getGetFasEstimates();\n\n if (suggestedMaxPriorityFeePerGas) {\n log(\n 'Using maxPriorityFeePerGas from estimate',\n suggestedMaxPriorityFeePerGas,\n );\n return suggestedMaxPriorityFeePerGas;\n }\n\n log('Setting maxPriorityFeePerGas to maxFeePerGas', updatedMaxFeePerGas);\n\n return updatedMaxFeePerGas;\n}\n\n/**\n * Gets the userFeeLevel for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param suggestedGasFees - The suggested gas fees, if any.\n * @param transaction - The transaction that created the user operation.\n * @returns The userFeeLevel for the user operation.\n */\nfunction getUserFeeLevel(\n metadata: UserOperationMetadata,\n originalRequest: AddUserOperationRequest,\n suggestedGasFees?: SuggestedGasFees,\n transaction?: TransactionParams,\n): UserFeeLevel {\n const { origin } = metadata;\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n\n const {\n maxFeePerGas: suggestedMaxFeePerGas,\n maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas,\n } = suggestedGasFees || {};\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n transaction?.gasPrice\n ) {\n return origin === ORIGIN_METAMASK\n ? UserFeeLevel.CUSTOM\n : UserFeeLevel.DAPP_SUGGESTED;\n }\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n suggestedMaxFeePerGas &&\n suggestedMaxPriorityFeePerGas\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (origin === ORIGIN_METAMASK) {\n return UserFeeLevel.CUSTOM;\n }\n\n return UserFeeLevel.DAPP_SUGGESTED;\n}\n\n/**\n * Gets suggested gas fees.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.provider - A provider to query the network.\n * @returns The suggested gas fees.\n */\nasync function getSuggestedGasFees(\n request: UpdateGasFeesRequest,\n): Promise<{ maxFeePerGas?: Hex; maxPriorityFeePerGas?: Hex }> {\n const { getGasFeeEstimates, provider } = request;\n\n try {\n const { gasFeeEstimates, gasEstimateType } = await getGasFeeEstimates();\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET) {\n /* istanbul ignore next */\n const {\n medium: { suggestedMaxPriorityFeePerGas, suggestedMaxFeePerGas } = {},\n } = gasFeeEstimates;\n\n if (suggestedMaxPriorityFeePerGas && suggestedMaxFeePerGas) {\n const values = {\n maxFeePerGas: gweiDecimalToWeiHex(suggestedMaxFeePerGas),\n maxPriorityFeePerGas: gweiDecimalToWeiHex(\n suggestedMaxPriorityFeePerGas,\n ),\n };\n\n log('Using medium values from fee market estimate', values);\n\n return values;\n }\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.LEGACY) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.medium);\n\n log('Using medium value from legacy estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.ETH_GASPRICE) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.gasPrice);\n\n log('Using gasPrice from estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n } catch (error) {\n log('Failed to get estimate', error);\n }\n\n const gasPriceDecimal = (await query(new EthQuery(provider), 'gasPrice')) as\n | number\n | undefined;\n\n if (!gasPriceDecimal) {\n return {};\n }\n\n const maxFeePerGas = add0x(gasPriceDecimal.toString(16)) as Hex;\n\n log('Using gasPrice from network as fallback', maxFeePerGas);\n\n return { maxFeePerGas };\n}\n\n/**\n * Converts a GWEI decimal string to a WEI hexadecimal string.\n * @param value - The GWEI decimal string to convert.\n * @returns The WEI hexadecimal string.\n */\nfunction gweiDecimalToWeiHex(value: string) {\n return toHex(gweiDecToWEIBN(value));\n}\n\n/**\n * Checks if a gas fee property is empty.\n * @param value - The gas fee value to check.\n * @returns Whether the gas fee property is empty.\n */\nfunction isGasFeeEmpty(value?: string): boolean {\n return !value || value === EMPTY_BYTES;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas-fees.mjs","sourceRoot":"","sources":["../../src/utils/gas-fees.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n gweiDecToWEIBN,\n ORIGIN_METAMASK,\n query,\n toHex,\n} from '@metamask/controller-utils';\nimport EthQuery from '@metamask/eth-query';\nimport {\n GAS_ESTIMATE_TYPES,\n type GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { Provider } from '@metamask/network-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport { UserFeeLevel } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { UserOperation, UserOperationMetadata } from '../types';\nimport type { AddUserOperationRequest } from '../UserOperationController';\n\nconst log = createModuleLogger(projectLogger, 'gas-fees');\n\nexport type UpdateGasFeesRequest = {\n getGasFeeEstimates: () => Promise<GasFeeState>;\n metadata: UserOperationMetadata;\n originalRequest: AddUserOperationRequest;\n provider: Provider;\n transaction?: TransactionParams;\n};\n\ntype SuggestedGasFees = {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n};\n\n/**\n * Populates the gas fee properties for a user operation.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.metadata - The metadata for the user operation.\n * @param request.originalRequest - The original request to add the user operation.\n * @param request.provider - A provider to query the network.\n * @param request.transaction - The transaction that created the user operation.\n */\nexport async function updateGasFees(request: UpdateGasFeesRequest) {\n const { metadata, originalRequest, transaction } = request;\n const { userOperation } = metadata;\n let suggestedGasFees: SuggestedGasFees | undefined;\n\n const getGasFeeEstimates = async () => {\n if (!suggestedGasFees) {\n suggestedGasFees = await getSuggestedGasFees(request);\n }\n\n return suggestedGasFees;\n };\n\n userOperation.maxFeePerGas = await getMaxFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n transaction,\n );\n\n userOperation.maxPriorityFeePerGas = await getMaxPriorityFeePerGas(\n originalRequest,\n getGasFeeEstimates,\n userOperation,\n transaction,\n );\n\n metadata.userFeeLevel = getUserFeeLevel(\n metadata,\n originalRequest,\n suggestedGasFees,\n transaction,\n );\n}\n\n/**\n * Gets the maxFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxFeePerGas for the user operation.\n */\nasync function getMaxFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n\n if (!isGasFeeEmpty(maxFeePerGas)) {\n log('Using maxFeePerGas from request', maxFeePerGas);\n return maxFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxPriorityFeePerGas) && gasPrice) {\n log('Setting maxFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxFeePerGas: suggestedMaxFeePerGas } = await getGetFasEstimates();\n\n if (!suggestedMaxFeePerGas) {\n throw new Error('Failed to get gas fee estimate for maxFeePerGas');\n }\n\n log('Using maxFeePerGas from estimate', suggestedMaxFeePerGas);\n\n return suggestedMaxFeePerGas;\n}\n\n/**\n * Gets the maxPriorityFeePerGas for a user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param getGetFasEstimates - A callback to get gas fee estimates.\n * @param userOperation - The user operation being updated.\n * @param transaction - The transaction that created the user operation.\n * @returns The maxPriorityFeePerGas for the user operation.\n */\nasync function getMaxPriorityFeePerGas(\n originalRequest: AddUserOperationRequest,\n getGetFasEstimates: () => Promise<SuggestedGasFees>,\n userOperation: UserOperation,\n transaction?: TransactionParams,\n) {\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n const { gasPrice } = transaction ?? {};\n const { maxFeePerGas: updatedMaxFeePerGas } = userOperation;\n\n if (!isGasFeeEmpty(maxPriorityFeePerGas)) {\n log('Using maxPriorityFeePerGas from request', maxPriorityFeePerGas);\n return maxPriorityFeePerGas as string;\n }\n\n if (isGasFeeEmpty(maxFeePerGas) && gasPrice) {\n log('Setting maxPriorityFeePerGas to transaction gasPrice', gasPrice);\n return gasPrice;\n }\n\n const { maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas } =\n await getGetFasEstimates();\n\n if (suggestedMaxPriorityFeePerGas) {\n log(\n 'Using maxPriorityFeePerGas from estimate',\n suggestedMaxPriorityFeePerGas,\n );\n return suggestedMaxPriorityFeePerGas;\n }\n\n log('Setting maxPriorityFeePerGas to maxFeePerGas', updatedMaxFeePerGas);\n\n return updatedMaxFeePerGas;\n}\n\n/**\n * Gets the userFeeLevel for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param originalRequest - The original request to add the user operation.\n * @param suggestedGasFees - The suggested gas fees, if any.\n * @param transaction - The transaction that created the user operation.\n * @returns The userFeeLevel for the user operation.\n */\nfunction getUserFeeLevel(\n metadata: UserOperationMetadata,\n originalRequest: AddUserOperationRequest,\n suggestedGasFees?: SuggestedGasFees,\n transaction?: TransactionParams,\n): UserFeeLevel {\n const { origin } = metadata;\n const { maxFeePerGas, maxPriorityFeePerGas } = originalRequest;\n\n const {\n maxFeePerGas: suggestedMaxFeePerGas,\n maxPriorityFeePerGas: suggestedMaxPriorityFeePerGas,\n } = suggestedGasFees || {};\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n transaction?.gasPrice\n ) {\n return origin === ORIGIN_METAMASK\n ? UserFeeLevel.CUSTOM\n : UserFeeLevel.DAPP_SUGGESTED;\n }\n\n if (\n isGasFeeEmpty(maxFeePerGas) &&\n isGasFeeEmpty(maxPriorityFeePerGas) &&\n suggestedMaxFeePerGas &&\n suggestedMaxPriorityFeePerGas\n ) {\n return UserFeeLevel.MEDIUM;\n }\n\n if (origin === ORIGIN_METAMASK) {\n return UserFeeLevel.CUSTOM;\n }\n\n return UserFeeLevel.DAPP_SUGGESTED;\n}\n\n/**\n * Gets suggested gas fees.\n * @param request - The request to update the gas fees.\n * @param request.getGasFeeEstimates - A callback to get gas fee estimates.\n * @param request.provider - A provider to query the network.\n * @returns The suggested gas fees.\n */\nasync function getSuggestedGasFees(\n request: UpdateGasFeesRequest,\n): Promise<{ maxFeePerGas?: Hex; maxPriorityFeePerGas?: Hex }> {\n const { getGasFeeEstimates, provider } = request;\n\n try {\n const { gasFeeEstimates, gasEstimateType } = await getGasFeeEstimates();\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET) {\n /* istanbul ignore next */\n const {\n medium: { suggestedMaxPriorityFeePerGas, suggestedMaxFeePerGas } = {},\n } = gasFeeEstimates;\n\n if (suggestedMaxPriorityFeePerGas && suggestedMaxFeePerGas) {\n const values = {\n maxFeePerGas: gweiDecimalToWeiHex(suggestedMaxFeePerGas),\n maxPriorityFeePerGas: gweiDecimalToWeiHex(\n suggestedMaxPriorityFeePerGas,\n ),\n };\n\n log('Using medium values from fee market estimate', values);\n\n return values;\n }\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.LEGACY) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.medium);\n\n log('Using medium value from legacy estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n\n if (gasEstimateType === GAS_ESTIMATE_TYPES.ETH_GASPRICE) {\n const maxFeePerGas = gweiDecimalToWeiHex(gasFeeEstimates.gasPrice);\n\n log('Using gasPrice from estimate', maxFeePerGas);\n\n return {\n maxFeePerGas,\n };\n }\n } catch (error) {\n log('Failed to get estimate', error);\n }\n\n const gasPriceDecimal = (await query(new EthQuery(provider), 'gasPrice')) as\n | number\n | undefined;\n\n if (!gasPriceDecimal) {\n return {};\n }\n\n const maxFeePerGas = add0x(gasPriceDecimal.toString(16)) as Hex;\n\n log('Using gasPrice from network as fallback', maxFeePerGas);\n\n return { maxFeePerGas };\n}\n\n/**\n * Converts a GWEI decimal string to a WEI hexadecimal string.\n * @param value - The GWEI decimal string to convert.\n * @returns The WEI hexadecimal string.\n */\nfunction gweiDecimalToWeiHex(value: string) {\n return toHex(gweiDecToWEIBN(value));\n}\n\n/**\n * Checks if a gas fee property is empty.\n * @param value - The gas fee value to check.\n * @returns Whether the gas fee property is empty.\n */\nfunction isGasFeeEmpty(value?: string): boolean {\n return !value || value === EMPTY_BYTES;\n}\n"]}
|
package/dist/utils/gas.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAqD;AACrD,2CAAwC;AACxC,kDAAuB;AAEvB,gDAA0C;AAC1C,oDAA6C;AAC7C,0CAA8D;AAM9D,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,KAAK,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACI,KAAK,UAAU,SAAS,CAC7B,QAA+B,EAC/B,eAA6C,EAC7C,UAAkB;IAElB,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,IAAI,eAAe,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAqD;AACrD,2CAAwC;AACxC,kDAAuB;AAEvB,gDAA0C;AAC1C,oDAA6C;AAC7C,0CAA8D;AAM9D,MAAM,GAAG,GAAG,IAAA,2BAAkB,EAAC,sBAAa,EAAE,KAAK,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACI,KAAK,UAAU,SAAS,CAC7B,QAA+B,EAC/B,eAA6C,EAC7C,UAAkB;IAElB,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;QACxB,aAAa,CAAC,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9D,aAAa,CAAC,kBAAkB,GAAG,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC1E,aAAa,CAAC,oBAAoB;YAChC,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAE3C,GAAG,CAAC,8CAA8C,EAAE;YAClD,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;YACpD,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;SACzD,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG;QACd,GAAG,aAAa;QAChB,YAAY,EAAE,sBAAU;QACxB,oBAAoB,EAAE,sBAAU;QAChC,YAAY,EAAE,sBAAU;QACxB,kBAAkB,EAAE,sBAAU;QAC9B,oBAAoB,EAAE,SAAS;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,QAAQ,CAAC,UAAoB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE7E,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzE,aAAa,CAAC,kBAAkB,GAAG,oBAAoB,CACrD,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,aAAa,CAAC,oBAAoB,GAAG,oBAAoB,CACvD,CAAC,QAAQ,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAEhD,CACX,CAAC;IAEF,GAAG,CAAC,iDAAiD,EAAE;QACrD,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;QACpD,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;QACxD,UAAU,EAAE,uBAAuB;QACnC,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAnDD,8BAmDC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAyB;IACrD,MAAM,KAAK,GACT,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,0BAAO,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,eAAE,CAAC,QAAQ,CAAC,CAAC;IAEtE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAE1D,OAAO,IAAA,aAAK,EAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import { hexToBN } from '@metamask/controller-utils';\nimport { add0x } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { VALUE_ZERO } from '../constants';\nimport { Bundler } from '../helpers/Bundler';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type {\n PrepareUserOperationResponse,\n UserOperationMetadata,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n * A multiplier to apply to all gas estimate values returned from the bundler.\n */\nconst GAS_ESTIMATE_MULTIPLIER = 1.5;\n\n/**\n * Populates the gas properties for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param prepareResponse - The prepare response from the smart contract account.\n * @param entrypoint - Address of the entrypoint contract.\n */\nexport async function updateGas(\n metadata: UserOperationMetadata,\n prepareResponse: PrepareUserOperationResponse,\n entrypoint: string,\n) {\n const { userOperation } = metadata;\n\n if (prepareResponse.gas) {\n userOperation.callGasLimit = prepareResponse.gas.callGasLimit;\n userOperation.preVerificationGas = prepareResponse.gas.preVerificationGas;\n userOperation.verificationGasLimit =\n prepareResponse.gas.verificationGasLimit;\n\n log('Using gas values from smart contract account', {\n callGasLimit: userOperation.callGasLimit,\n preVerificationGas: userOperation.preVerificationGas,\n verificationGasLimit: userOperation.verificationGasLimit,\n });\n\n return;\n }\n\n const payload = {\n ...userOperation,\n maxFeePerGas: VALUE_ZERO,\n maxPriorityFeePerGas: VALUE_ZERO,\n callGasLimit: VALUE_ZERO,\n preVerificationGas: VALUE_ZERO,\n verificationGasLimit: '0xF4240',\n };\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n const estimate = await bundler.estimateUserOperationGas(payload, entrypoint);\n\n userOperation.callGasLimit = normalizeGasEstimate(estimate.callGasLimit);\n userOperation.preVerificationGas = normalizeGasEstimate(\n estimate.preVerificationGas,\n );\n userOperation.verificationGasLimit = normalizeGasEstimate(\n (estimate.verificationGasLimit ?? estimate.verificationGas) as\n | string\n | number,\n );\n\n log('Using buffered gas values from bundler estimate', {\n callGasLimit: userOperation.callGasLimit,\n preVerificationGas: userOperation.preVerificationGas,\n verificationGasLimit: userOperation.verificationGasLimit,\n multiplier: GAS_ESTIMATE_MULTIPLIER,\n estimate,\n });\n}\n\n/**\n * Normalizes a gas estimate value from the bundler.\n * @param rawValue - The raw value to normalize.\n * @returns The normalized value as a hexadecimal string.\n */\nfunction normalizeGasEstimate(rawValue: string | number): string {\n const value =\n typeof rawValue === 'string' ? hexToBN(rawValue) : new BN(rawValue);\n\n const bufferedValue = value.muln(GAS_ESTIMATE_MULTIPLIER);\n\n return add0x(bufferedValue.toString(16));\n}\n"]}
|
package/dist/utils/gas.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,mCAAmC;AACrD,OAAO,EAAE,KAAK,EAAE,wBAAwB;AACxC,OAAO,GAAE,cAAc;;AAEvB,OAAO,EAAE,UAAU,EAAE,yBAAqB;AAC1C,OAAO,EAAE,OAAO,EAAE,+BAA2B;AAC7C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAM9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAA+B,EAC/B,eAA6C,EAC7C,UAAkB;IAElB,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,IAAI,eAAe,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,mCAAmC;AACrD,OAAO,EAAE,KAAK,EAAE,wBAAwB;AACxC,OAAO,GAAE,cAAc;;AAEvB,OAAO,EAAE,UAAU,EAAE,yBAAqB;AAC1C,OAAO,EAAE,OAAO,EAAE,+BAA2B;AAC7C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAkB;AAM9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAA+B,EAC/B,eAA6C,EAC7C,UAAkB;IAElB,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;IAEnC,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;QACxB,aAAa,CAAC,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9D,aAAa,CAAC,kBAAkB,GAAG,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC1E,aAAa,CAAC,oBAAoB;YAChC,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAE3C,GAAG,CAAC,8CAA8C,EAAE;YAClD,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;YACpD,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;SACzD,CAAC,CAAC;QAEH,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG;QACd,GAAG,aAAa;QAChB,YAAY,EAAE,UAAU;QACxB,oBAAoB,EAAE,UAAU;QAChC,YAAY,EAAE,UAAU;QACxB,kBAAkB,EAAE,UAAU;QAC9B,oBAAoB,EAAE,SAAS;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAoB,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE7E,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzE,aAAa,CAAC,kBAAkB,GAAG,oBAAoB,CACrD,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,aAAa,CAAC,oBAAoB,GAAG,oBAAoB,CACvD,CAAC,QAAQ,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAEhD,CACX,CAAC;IAEF,GAAG,CAAC,iDAAiD,EAAE;QACrD,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;QACpD,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;QACxD,UAAU,EAAE,uBAAuB;QACnC,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAyB;IACrD,MAAM,KAAK,GACT,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEtE,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAE1D,OAAO,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import { hexToBN } from '@metamask/controller-utils';\nimport { add0x } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { VALUE_ZERO } from '../constants';\nimport { Bundler } from '../helpers/Bundler';\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type {\n PrepareUserOperationResponse,\n UserOperationMetadata,\n} from '../types';\n\nconst log = createModuleLogger(projectLogger, 'gas');\n\n/**\n * A multiplier to apply to all gas estimate values returned from the bundler.\n */\nconst GAS_ESTIMATE_MULTIPLIER = 1.5;\n\n/**\n * Populates the gas properties for a user operation.\n * @param metadata - The metadata for the user operation.\n * @param prepareResponse - The prepare response from the smart contract account.\n * @param entrypoint - Address of the entrypoint contract.\n */\nexport async function updateGas(\n metadata: UserOperationMetadata,\n prepareResponse: PrepareUserOperationResponse,\n entrypoint: string,\n) {\n const { userOperation } = metadata;\n\n if (prepareResponse.gas) {\n userOperation.callGasLimit = prepareResponse.gas.callGasLimit;\n userOperation.preVerificationGas = prepareResponse.gas.preVerificationGas;\n userOperation.verificationGasLimit =\n prepareResponse.gas.verificationGasLimit;\n\n log('Using gas values from smart contract account', {\n callGasLimit: userOperation.callGasLimit,\n preVerificationGas: userOperation.preVerificationGas,\n verificationGasLimit: userOperation.verificationGasLimit,\n });\n\n return;\n }\n\n const payload = {\n ...userOperation,\n maxFeePerGas: VALUE_ZERO,\n maxPriorityFeePerGas: VALUE_ZERO,\n callGasLimit: VALUE_ZERO,\n preVerificationGas: VALUE_ZERO,\n verificationGasLimit: '0xF4240',\n };\n\n const bundler = new Bundler(metadata.bundlerUrl as string);\n const estimate = await bundler.estimateUserOperationGas(payload, entrypoint);\n\n userOperation.callGasLimit = normalizeGasEstimate(estimate.callGasLimit);\n userOperation.preVerificationGas = normalizeGasEstimate(\n estimate.preVerificationGas,\n );\n userOperation.verificationGasLimit = normalizeGasEstimate(\n (estimate.verificationGasLimit ?? estimate.verificationGas) as\n | string\n | number,\n );\n\n log('Using buffered gas values from bundler estimate', {\n callGasLimit: userOperation.callGasLimit,\n preVerificationGas: userOperation.preVerificationGas,\n verificationGasLimit: userOperation.verificationGasLimit,\n multiplier: GAS_ESTIMATE_MULTIPLIER,\n estimate,\n });\n}\n\n/**\n * Normalizes a gas estimate value from the bundler.\n * @param rawValue - The raw value to normalize.\n * @returns The normalized value as a hexadecimal string.\n */\nfunction normalizeGasEstimate(rawValue: string | number): string {\n const value =\n typeof rawValue === 'string' ? hexToBN(rawValue) : new BN(rawValue);\n\n const bufferedValue = value.muln(GAS_ESTIMATE_MULTIPLIER);\n\n return add0x(bufferedValue.toString(16));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":";;;;;;AAKA,6EAG0C;AAE1C,2CAAkD;AAClD,kDAAuB;AAEvB,gDAAuD;AACvD,wCAA+C;AAG/C;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,QAA+B;IAE/B,MAAM,EACJ,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,EACP,KAAK,EAAE,QAAQ,EACf,MAAM,EACN,eAAe,EACf,EAAE,EACF,aAAa,EACb,IAAI,EACJ,iBAAiB,EACjB,eAAe,EACf,YAAY,EAAE,eAAe,EAC7B,aAAa,GACd,GAAG,QAAQ,CAAC;IAEb,IAAI,CAAC,iBAAiB,EAAE;
|
|
1
|
+
{"version":3,"file":"transaction.cjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n TransactionError,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n UserFeeLevel,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, remove0x } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { EMPTY_BYTES, VALUE_ZERO } from '../constants';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationMetadata } from '../types';\n\n/**\n * Converts a user operation metadata object into a transaction metadata object.\n * @param metadata - The user operation metadata object to convert.\n * @returns The equivalent transaction metadata object.\n */\nexport function getTransactionMetadata(\n metadata: UserOperationMetadata,\n): TransactionMeta | undefined {\n const {\n actualGasCost,\n actualGasUsed,\n baseFeePerGas,\n chainId,\n error: rawError,\n origin,\n transactionHash,\n id,\n swapsMetadata,\n time,\n transactionParams,\n transactionType,\n userFeeLevel: rawUserFeeLevel,\n userOperation,\n } = metadata;\n\n if (!transactionParams) {\n return undefined;\n }\n\n // effectiveGasPrice = actualGasCost / actualGasUsed\n const effectiveGasPrice =\n actualGasCost && actualGasUsed\n ? add0x(\n new BN(remove0x(actualGasCost), 16)\n .div(new BN(remove0x(actualGasUsed), 16))\n .toString(16),\n )\n : undefined;\n\n const error = (\n rawError\n ? {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.rpc,\n }\n : undefined\n ) as TransactionError;\n\n const status: TransactionStatus = {\n [UserOperationStatus.Unapproved]: TransactionStatus.unapproved,\n [UserOperationStatus.Approved]: TransactionStatus.approved,\n [UserOperationStatus.Signed]: TransactionStatus.signed,\n [UserOperationStatus.Submitted]: TransactionStatus.submitted,\n [UserOperationStatus.Confirmed]: TransactionStatus.confirmed,\n [UserOperationStatus.Failed]: TransactionStatus.failed,\n }[metadata.status];\n\n const gas = addHex(\n userOperation.preVerificationGas,\n userOperation.verificationGasLimit,\n userOperation.callGasLimit,\n );\n\n const hasPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const maxFeePerGas = hasPaymaster ? VALUE_ZERO : userOperation.maxFeePerGas;\n\n const maxPriorityFeePerGas = hasPaymaster\n ? VALUE_ZERO\n : userOperation.maxPriorityFeePerGas;\n\n const nonce =\n userOperation.nonce === EMPTY_BYTES ? undefined : userOperation.nonce;\n\n const txParams = {\n ...transactionParams,\n from: userOperation.sender,\n gas,\n nonce,\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as TransactionParams;\n\n // User operations only support EIP-1559 gas fee properties.\n delete txParams.gasPrice;\n\n const swaps = {\n approvalTxId: swapsMetadata?.approvalTxId ?? undefined,\n destinationTokenAddress:\n swapsMetadata?.destinationTokenAddress ?? undefined,\n destinationTokenAmount: swapsMetadata?.destinationTokenAmount ?? undefined,\n destinationTokenDecimals:\n swapsMetadata?.destinationTokenDecimals ?? undefined,\n destinationTokenSymbol: swapsMetadata?.destinationTokenSymbol ?? undefined,\n estimatedBaseFee: swapsMetadata?.estimatedBaseFee ?? undefined,\n sourceTokenAddress: swapsMetadata?.sourceTokenAddress ?? undefined,\n sourceTokenAmount: swapsMetadata?.sourceTokenAmount ?? undefined,\n sourceTokenDecimals: swapsMetadata?.sourceTokenDecimals ?? undefined,\n sourceTokenSymbol: swapsMetadata?.sourceTokenSymbol ?? undefined,\n swapAndSendRecipient: swapsMetadata?.swapAndSendRecipient ?? undefined,\n swapMetaData: swapsMetadata?.swapMetaData ?? undefined,\n swapTokenValue: swapsMetadata?.swapTokenValue ?? undefined,\n };\n\n const userFeeLevel = hasPaymaster ? UserFeeLevel.CUSTOM : rawUserFeeLevel;\n\n return {\n baseFeePerGas: (baseFeePerGas as Hex) ?? undefined,\n chainId: chainId as Hex,\n error,\n hash: transactionHash ?? undefined,\n id,\n isUserOperation: true,\n networkClientId: 'user-operation',\n origin,\n status,\n time,\n txParams,\n txReceipt: {\n effectiveGasPrice: effectiveGasPrice ?? undefined,\n gasUsed: actualGasUsed ?? undefined,\n },\n type: transactionType ?? undefined,\n userFeeLevel: userFeeLevel as string,\n ...swaps,\n };\n}\n\n/**\n * Adds the given hexadecimal values together.\n * @param values - The hexadecimal values to add together.\n * @returns The sum of the given hexadecimal values.\n */\nfunction addHex(...values: (string | undefined)[]) {\n const total = new BN(0);\n\n for (const value of values) {\n if (!value) {\n continue;\n }\n\n total.iadd(new BN(remove0x(value), 16));\n }\n\n return add0x(total.toString(16));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":";;;;;;AAKA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACb,yCAAyC;AAE1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,wBAAwB;AAClD,OAAO,GAAE,cAAc;;AAEvB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,yBAAqB;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAiB;AAG/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA+B;IAE/B,MAAM,EACJ,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,EACP,KAAK,EAAE,QAAQ,EACf,MAAM,EACN,eAAe,EACf,EAAE,EACF,aAAa,EACb,IAAI,EACJ,iBAAiB,EACjB,eAAe,EACf,YAAY,EAAE,eAAe,EAC7B,aAAa,GACd,GAAG,QAAQ,CAAC;IAEb,IAAI,CAAC,iBAAiB,EAAE;
|
|
1
|
+
{"version":3,"file":"transaction.mjs","sourceRoot":"","sources":["../../src/utils/transaction.ts"],"names":[],"mappings":";;;;;;AAKA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACb,yCAAyC;AAE1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,wBAAwB;AAClD,OAAO,GAAE,cAAc;;AAEvB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,yBAAqB;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAiB;AAG/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA+B;IAE/B,MAAM,EACJ,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,EACP,KAAK,EAAE,QAAQ,EACf,MAAM,EACN,eAAe,EACf,EAAE,EACF,aAAa,EACb,IAAI,EACJ,iBAAiB,EACjB,eAAe,EACf,YAAY,EAAE,eAAe,EAC7B,aAAa,GACd,GAAG,QAAQ,CAAC;IAEb,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oDAAoD;IACpD,MAAM,iBAAiB,GACrB,aAAa,IAAI,aAAa;QAC5B,CAAC,CAAC,KAAK,CACH,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;aAChC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;aACxC,QAAQ,CAAC,EAAE,CAAC,CAChB;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,KAAK,GAAG,CACZ,QAAQ;QACN,CAAC,CAAC;YACE,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;SAClB;QACH,CAAC,CAAC,SAAS,CACM,CAAC;IAEtB,MAAM,MAAM,GAAsB;QAChC,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,UAAU;QAC9D,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,QAAQ;QAC1D,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM;QACtD,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,SAAS;QAC5D,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,SAAS;QAC5D,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM;KACvD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEnB,MAAM,GAAG,GAAG,MAAM,CAChB,aAAa,CAAC,kBAAkB,EAChC,aAAa,CAAC,oBAAoB,EAClC,aAAa,CAAC,YAAY,CAC3B,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAEpE,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC;IAE5E,MAAM,oBAAoB,GAAG,YAAY;QACvC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC;IAEvC,MAAM,KAAK,GACT,aAAa,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;IAExE,MAAM,QAAQ,GAAG;QACf,GAAG,iBAAiB;QACpB,IAAI,EAAE,aAAa,CAAC,MAAM;QAC1B,GAAG;QACH,KAAK;QACL,YAAY;QACZ,oBAAoB;KACA,CAAC;IAEvB,4DAA4D;IAC5D,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAEzB,MAAM,KAAK,GAAG;QACZ,YAAY,EAAE,aAAa,EAAE,YAAY,IAAI,SAAS;QACtD,uBAAuB,EACrB,aAAa,EAAE,uBAAuB,IAAI,SAAS;QACrD,sBAAsB,EAAE,aAAa,EAAE,sBAAsB,IAAI,SAAS;QAC1E,wBAAwB,EACtB,aAAa,EAAE,wBAAwB,IAAI,SAAS;QACtD,sBAAsB,EAAE,aAAa,EAAE,sBAAsB,IAAI,SAAS;QAC1E,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,IAAI,SAAS;QAC9D,kBAAkB,EAAE,aAAa,EAAE,kBAAkB,IAAI,SAAS;QAClE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,IAAI,SAAS;QAChE,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,IAAI,SAAS;QACpE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,IAAI,SAAS;QAChE,oBAAoB,EAAE,aAAa,EAAE,oBAAoB,IAAI,SAAS;QACtE,YAAY,EAAE,aAAa,EAAE,YAAY,IAAI,SAAS;QACtD,cAAc,EAAE,aAAa,EAAE,cAAc,IAAI,SAAS;KAC3D,CAAC;IAEF,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IAE1E,OAAO;QACL,aAAa,EAAG,aAAqB,IAAI,SAAS;QAClD,OAAO,EAAE,OAAc;QACvB,KAAK;QACL,IAAI,EAAE,eAAe,IAAI,SAAS;QAClC,EAAE;QACF,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,gBAAgB;QACjC,MAAM;QACN,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,SAAS,EAAE;YACT,iBAAiB,EAAE,iBAAiB,IAAI,SAAS;YACjD,OAAO,EAAE,aAAa,IAAI,SAAS;SACpC;QACD,IAAI,EAAE,eAAe,IAAI,SAAS;QAClC,YAAY,EAAE,YAAsB;QACpC,GAAG,KAAK;KACT,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,GAAG,MAA8B;IAC/C,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type {\n TransactionError,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport {\n TransactionStatus,\n UserFeeLevel,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, remove0x } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { EMPTY_BYTES, VALUE_ZERO } from '../constants';\nimport { UserOperationStatus } from '../types';\nimport type { UserOperationMetadata } from '../types';\n\n/**\n * Converts a user operation metadata object into a transaction metadata object.\n * @param metadata - The user operation metadata object to convert.\n * @returns The equivalent transaction metadata object.\n */\nexport function getTransactionMetadata(\n metadata: UserOperationMetadata,\n): TransactionMeta | undefined {\n const {\n actualGasCost,\n actualGasUsed,\n baseFeePerGas,\n chainId,\n error: rawError,\n origin,\n transactionHash,\n id,\n swapsMetadata,\n time,\n transactionParams,\n transactionType,\n userFeeLevel: rawUserFeeLevel,\n userOperation,\n } = metadata;\n\n if (!transactionParams) {\n return undefined;\n }\n\n // effectiveGasPrice = actualGasCost / actualGasUsed\n const effectiveGasPrice =\n actualGasCost && actualGasUsed\n ? add0x(\n new BN(remove0x(actualGasCost), 16)\n .div(new BN(remove0x(actualGasUsed), 16))\n .toString(16),\n )\n : undefined;\n\n const error = (\n rawError\n ? {\n name: rawError.name,\n message: rawError.message,\n stack: rawError.stack,\n code: rawError.code,\n rpc: rawError.rpc,\n }\n : undefined\n ) as TransactionError;\n\n const status: TransactionStatus = {\n [UserOperationStatus.Unapproved]: TransactionStatus.unapproved,\n [UserOperationStatus.Approved]: TransactionStatus.approved,\n [UserOperationStatus.Signed]: TransactionStatus.signed,\n [UserOperationStatus.Submitted]: TransactionStatus.submitted,\n [UserOperationStatus.Confirmed]: TransactionStatus.confirmed,\n [UserOperationStatus.Failed]: TransactionStatus.failed,\n }[metadata.status];\n\n const gas = addHex(\n userOperation.preVerificationGas,\n userOperation.verificationGasLimit,\n userOperation.callGasLimit,\n );\n\n const hasPaymaster = userOperation.paymasterAndData !== EMPTY_BYTES;\n\n const maxFeePerGas = hasPaymaster ? VALUE_ZERO : userOperation.maxFeePerGas;\n\n const maxPriorityFeePerGas = hasPaymaster\n ? VALUE_ZERO\n : userOperation.maxPriorityFeePerGas;\n\n const nonce =\n userOperation.nonce === EMPTY_BYTES ? undefined : userOperation.nonce;\n\n const txParams = {\n ...transactionParams,\n from: userOperation.sender,\n gas,\n nonce,\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as TransactionParams;\n\n // User operations only support EIP-1559 gas fee properties.\n delete txParams.gasPrice;\n\n const swaps = {\n approvalTxId: swapsMetadata?.approvalTxId ?? undefined,\n destinationTokenAddress:\n swapsMetadata?.destinationTokenAddress ?? undefined,\n destinationTokenAmount: swapsMetadata?.destinationTokenAmount ?? undefined,\n destinationTokenDecimals:\n swapsMetadata?.destinationTokenDecimals ?? undefined,\n destinationTokenSymbol: swapsMetadata?.destinationTokenSymbol ?? undefined,\n estimatedBaseFee: swapsMetadata?.estimatedBaseFee ?? undefined,\n sourceTokenAddress: swapsMetadata?.sourceTokenAddress ?? undefined,\n sourceTokenAmount: swapsMetadata?.sourceTokenAmount ?? undefined,\n sourceTokenDecimals: swapsMetadata?.sourceTokenDecimals ?? undefined,\n sourceTokenSymbol: swapsMetadata?.sourceTokenSymbol ?? undefined,\n swapAndSendRecipient: swapsMetadata?.swapAndSendRecipient ?? undefined,\n swapMetaData: swapsMetadata?.swapMetaData ?? undefined,\n swapTokenValue: swapsMetadata?.swapTokenValue ?? undefined,\n };\n\n const userFeeLevel = hasPaymaster ? UserFeeLevel.CUSTOM : rawUserFeeLevel;\n\n return {\n baseFeePerGas: (baseFeePerGas as Hex) ?? undefined,\n chainId: chainId as Hex,\n error,\n hash: transactionHash ?? undefined,\n id,\n isUserOperation: true,\n networkClientId: 'user-operation',\n origin,\n status,\n time,\n txParams,\n txReceipt: {\n effectiveGasPrice: effectiveGasPrice ?? undefined,\n gasUsed: actualGasUsed ?? undefined,\n },\n type: transactionType ?? undefined,\n userFeeLevel: userFeeLevel as string,\n ...swaps,\n };\n}\n\n/**\n * Adds the given hexadecimal values together.\n * @param values - The hexadecimal values to add together.\n * @returns The sum of the given hexadecimal values.\n */\nfunction addHex(...values: (string | undefined)[]) {\n const total = new BN(0);\n\n for (const value of values) {\n if (!value) {\n continue;\n }\n\n total.iadd(new BN(remove0x(value), 16));\n }\n\n return add0x(total.toString(16));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Struct, StructError } from '@metamask/superstruct';\nimport {\n assert,\n boolean,\n define,\n enums,\n func,\n number,\n object,\n optional,\n refine,\n string,\n} from '@metamask/superstruct';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport type {\n PrepareUserOperationResponse,\n SignUserOperationResponse,\n UpdateUserOperationResponse,\n} from '../types';\nimport type {\n AddUserOperationOptions,\n AddUserOperationRequest,\n} from '../UserOperationController';\n\n/**\n * Validate a request to add a user operation.\n * @param request - The request to validate.\n */\nexport function validateAddUserOperationRequest(\n request: AddUserOperationRequest,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidRequest = object({\n data: optional(HexOrEmptyBytes),\n from: Hex,\n maxFeePerGas: optional(Hex),\n maxPriorityFeePerGas: optional(Hex),\n to: optional(Hex),\n value: optional(Hex),\n });\n\n validate(request, ValidRequest, 'Invalid request to add user operation');\n}\n\n/**\n * Validate the options when adding a user operation.\n * @param options - The options to validate.\n */\nexport function validateAddUserOperationOptions(\n options: AddUserOperationOptions,\n) {\n const ValidOptions = object({\n networkClientId: string(),\n origin: string(),\n requireApproval: optional(boolean()),\n smartContractAccount: optional(\n object({\n prepareUserOperation: func(),\n updateUserOperation: func(),\n signUserOperation: func(),\n }),\n ),\n swaps: optional(\n object({\n approvalTxId: optional(string()),\n destinationTokenAddress: optional(string()),\n destinationTokenDecimals: optional(number()),\n destinationTokenSymbol: optional(string()),\n estimatedBaseFee: optional(string()),\n sourceTokenSymbol: optional(string()),\n swapMetaData: optional(object()),\n swapTokenValue: optional(string()),\n destinationTokenAmount: optional(string()),\n sourceTokenAddress: optional(string()),\n sourceTokenAmount: optional(string()),\n sourceTokenDecimals: optional(number()),\n swapAndSendRecipient: optional(string()),\n }),\n ),\n type: optional(enums(Object.values(TransactionType))),\n });\n\n validate(options, ValidOptions, 'Invalid options to add user operation');\n}\n\n/**\n * Validate the response from a smart contract account when preparing the user operation.\n * @param response - The response to validate.\n */\nexport function validatePrepareUserOperationResponse(\n response: PrepareUserOperationResponse,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidResponse = refine(\n object({\n bundler: string(),\n callData: Hex,\n dummyPaymasterAndData: optional(HexOrEmptyBytes),\n dummySignature: optional(HexOrEmptyBytes),\n gas: optional(\n object({\n callGasLimit: Hex,\n preVerificationGas: Hex,\n verificationGasLimit: Hex,\n }),\n ),\n initCode: optional(HexOrEmptyBytes),\n nonce: Hex,\n sender: Hex,\n }),\n 'ValidPrepareUserOperationResponse',\n ({ gas, dummySignature }) => {\n if (!gas && (!dummySignature || dummySignature === EMPTY_BYTES)) {\n return 'Must specify dummySignature if not specifying gas';\n }\n\n /* istanbul ignore next */\n return true;\n },\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when preparing user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when updating the user operation.\n * @param response - The response to validate.\n */\nexport function validateUpdateUserOperationResponse(\n response: UpdateUserOperationResponse,\n) {\n const ValidResponse = optional(\n object({\n paymasterAndData: optional(defineHexOrEmptyBytes()),\n callGasLimit: optional(defineHexOrEmptyBytes()),\n preVerificationGas: optional(defineHexOrEmptyBytes()),\n verificationGasLimit: optional(defineHexOrEmptyBytes()),\n }),\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when updating user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when signing the user operation.\n * @param response - The response to validate.\n */\nexport function validateSignUserOperationResponse(\n response: SignUserOperationResponse,\n) {\n const Hex = defineHex();\n\n const ValidResponse = object({\n signature: Hex,\n });\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when signing user operation',\n );\n}\n\n/**\n * Validate data against a struct.\n * @param data - The data to validate.\n * @param struct - The struct to validate against.\n * @param message - The message to throw if validation fails.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction validate<T>(data: unknown, struct: Struct<T>, message: string) {\n try {\n assert(data, struct, message);\n } catch (error) {\n const causes = (error as StructError)\n .failures()\n .map((failure) => {\n if (!failure.path.length) {\n return failure.message;\n }\n\n return `${failure.path.join('.')} - ${failure.message}`;\n })\n .join('\\n');\n\n const finalMessage = `${message}\\n${causes}`;\n\n throw new Error(finalMessage);\n }\n}\n\n/**\n * Define the Hex type used by superstruct.\n * @returns The Hex superstruct type.\n */\nfunction defineHex() {\n return define<string>('Hexadecimal String', (value) =>\n isStrictHexString(value),\n );\n}\n\n/**\n * Define the HexOrEmptyBytes type used by superstruct.\n * @returns The HexOrEmptyBytes superstruct type.\n */\nfunction defineHexOrEmptyBytes() {\n return define<string>(\n 'Hexadecimal String or 0x',\n (value) => isStrictHexString(value) || value === EMPTY_BYTES,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validation.cjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Struct, StructError } from '@metamask/superstruct';\nimport {\n assert,\n boolean,\n define,\n enums,\n func,\n number,\n object,\n optional,\n refine,\n string,\n} from '@metamask/superstruct';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport type {\n PrepareUserOperationResponse,\n SignUserOperationResponse,\n UpdateUserOperationResponse,\n} from '../types';\nimport type {\n AddUserOperationOptions,\n AddUserOperationRequest,\n} from '../UserOperationController';\n\n/**\n * Validate a request to add a user operation.\n * @param request - The request to validate.\n */\nexport function validateAddUserOperationRequest(\n request: AddUserOperationRequest,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidRequest = object({\n data: optional(HexOrEmptyBytes),\n from: Hex,\n maxFeePerGas: optional(Hex),\n maxPriorityFeePerGas: optional(Hex),\n to: optional(Hex),\n value: optional(Hex),\n });\n\n validate(request, ValidRequest, 'Invalid request to add user operation');\n}\n\n/**\n * Validate the options when adding a user operation.\n * @param options - The options to validate.\n */\nexport function validateAddUserOperationOptions(\n options: AddUserOperationOptions,\n) {\n const ValidOptions = object({\n networkClientId: string(),\n origin: string(),\n requireApproval: optional(boolean()),\n smartContractAccount: optional(\n object({\n prepareUserOperation: func(),\n updateUserOperation: func(),\n signUserOperation: func(),\n }),\n ),\n swaps: optional(\n object({\n approvalTxId: optional(string()),\n destinationTokenAddress: optional(string()),\n destinationTokenDecimals: optional(number()),\n destinationTokenSymbol: optional(string()),\n estimatedBaseFee: optional(string()),\n sourceTokenSymbol: optional(string()),\n swapMetaData: optional(object()),\n swapTokenValue: optional(string()),\n destinationTokenAmount: optional(string()),\n sourceTokenAddress: optional(string()),\n sourceTokenAmount: optional(string()),\n sourceTokenDecimals: optional(number()),\n swapAndSendRecipient: optional(string()),\n }),\n ),\n type: optional(enums(Object.values(TransactionType))),\n });\n\n validate(options, ValidOptions, 'Invalid options to add user operation');\n}\n\n/**\n * Validate the response from a smart contract account when preparing the user operation.\n * @param response - The response to validate.\n */\nexport function validatePrepareUserOperationResponse(\n response: PrepareUserOperationResponse,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidResponse = refine(\n object({\n bundler: string(),\n callData: Hex,\n dummyPaymasterAndData: optional(HexOrEmptyBytes),\n dummySignature: optional(HexOrEmptyBytes),\n gas: optional(\n object({\n callGasLimit: Hex,\n preVerificationGas: Hex,\n verificationGasLimit: Hex,\n }),\n ),\n initCode: optional(HexOrEmptyBytes),\n nonce: Hex,\n sender: Hex,\n }),\n 'ValidPrepareUserOperationResponse',\n ({ gas, dummySignature }) => {\n if (!gas && (!dummySignature || dummySignature === EMPTY_BYTES)) {\n return 'Must specify dummySignature if not specifying gas';\n }\n\n /* istanbul ignore next */\n return true;\n },\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when preparing user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when updating the user operation.\n * @param response - The response to validate.\n */\nexport function validateUpdateUserOperationResponse(\n response: UpdateUserOperationResponse,\n) {\n const ValidResponse = optional(\n object({\n paymasterAndData: optional(defineHexOrEmptyBytes()),\n callGasLimit: optional(defineHexOrEmptyBytes()),\n preVerificationGas: optional(defineHexOrEmptyBytes()),\n verificationGasLimit: optional(defineHexOrEmptyBytes()),\n }),\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when updating user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when signing the user operation.\n * @param response - The response to validate.\n */\nexport function validateSignUserOperationResponse(\n response: SignUserOperationResponse,\n) {\n const Hex = defineHex();\n\n const ValidResponse = object({\n signature: Hex,\n });\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when signing user operation',\n );\n}\n\n/**\n * Validate data against a struct.\n * @param data - The data to validate.\n * @param struct - The struct to validate against.\n * @param message - The message to throw if validation fails.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction validate<T>(data: unknown, struct: Struct<T>, message: string) {\n try {\n assert(data, struct, message);\n } catch (error) {\n const causes = (error as StructError)\n .failures()\n .map((failure) => {\n if (!failure.path.length) {\n return failure.message;\n }\n\n return `${failure.path.join('.')} - ${failure.message}`;\n })\n .join('\\n');\n\n const finalMessage = `${message}\\n${causes}`;\n\n throw new Error(finalMessage);\n }\n}\n\n/**\n * Define the Hex type used by superstruct.\n * @returns The Hex superstruct type.\n */\nfunction defineHex() {\n return define<string>('Hexadecimal String', (value) =>\n isStrictHexString(value),\n );\n}\n\n/**\n * Define the HexOrEmptyBytes type used by superstruct.\n * @returns The HexOrEmptyBytes superstruct type.\n */\nfunction defineHexOrEmptyBytes() {\n return define<string>(\n 'Hexadecimal String or 0x',\n (value) => isStrictHexString(value) || value === EMPTY_BYTES,\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Struct, StructError } from '@metamask/superstruct';\nimport {\n assert,\n boolean,\n define,\n enums,\n func,\n number,\n object,\n optional,\n refine,\n string,\n} from '@metamask/superstruct';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport type {\n PrepareUserOperationResponse,\n SignUserOperationResponse,\n UpdateUserOperationResponse,\n} from '../types';\nimport type {\n AddUserOperationOptions,\n AddUserOperationRequest,\n} from '../UserOperationController';\n\n/**\n * Validate a request to add a user operation.\n * @param request - The request to validate.\n */\nexport function validateAddUserOperationRequest(\n request: AddUserOperationRequest,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidRequest = object({\n data: optional(HexOrEmptyBytes),\n from: Hex,\n maxFeePerGas: optional(Hex),\n maxPriorityFeePerGas: optional(Hex),\n to: optional(Hex),\n value: optional(Hex),\n });\n\n validate(request, ValidRequest, 'Invalid request to add user operation');\n}\n\n/**\n * Validate the options when adding a user operation.\n * @param options - The options to validate.\n */\nexport function validateAddUserOperationOptions(\n options: AddUserOperationOptions,\n) {\n const ValidOptions = object({\n networkClientId: string(),\n origin: string(),\n requireApproval: optional(boolean()),\n smartContractAccount: optional(\n object({\n prepareUserOperation: func(),\n updateUserOperation: func(),\n signUserOperation: func(),\n }),\n ),\n swaps: optional(\n object({\n approvalTxId: optional(string()),\n destinationTokenAddress: optional(string()),\n destinationTokenDecimals: optional(number()),\n destinationTokenSymbol: optional(string()),\n estimatedBaseFee: optional(string()),\n sourceTokenSymbol: optional(string()),\n swapMetaData: optional(object()),\n swapTokenValue: optional(string()),\n destinationTokenAmount: optional(string()),\n sourceTokenAddress: optional(string()),\n sourceTokenAmount: optional(string()),\n sourceTokenDecimals: optional(number()),\n swapAndSendRecipient: optional(string()),\n }),\n ),\n type: optional(enums(Object.values(TransactionType))),\n });\n\n validate(options, ValidOptions, 'Invalid options to add user operation');\n}\n\n/**\n * Validate the response from a smart contract account when preparing the user operation.\n * @param response - The response to validate.\n */\nexport function validatePrepareUserOperationResponse(\n response: PrepareUserOperationResponse,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidResponse = refine(\n object({\n bundler: string(),\n callData: Hex,\n dummyPaymasterAndData: optional(HexOrEmptyBytes),\n dummySignature: optional(HexOrEmptyBytes),\n gas: optional(\n object({\n callGasLimit: Hex,\n preVerificationGas: Hex,\n verificationGasLimit: Hex,\n }),\n ),\n initCode: optional(HexOrEmptyBytes),\n nonce: Hex,\n sender: Hex,\n }),\n 'ValidPrepareUserOperationResponse',\n ({ gas, dummySignature }) => {\n if (!gas && (!dummySignature || dummySignature === EMPTY_BYTES)) {\n return 'Must specify dummySignature if not specifying gas';\n }\n\n /* istanbul ignore next */\n return true;\n },\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when preparing user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when updating the user operation.\n * @param response - The response to validate.\n */\nexport function validateUpdateUserOperationResponse(\n response: UpdateUserOperationResponse,\n) {\n const ValidResponse = optional(\n object({\n paymasterAndData: optional(defineHexOrEmptyBytes()),\n callGasLimit: optional(defineHexOrEmptyBytes()),\n preVerificationGas: optional(defineHexOrEmptyBytes()),\n verificationGasLimit: optional(defineHexOrEmptyBytes()),\n }),\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when updating user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when signing the user operation.\n * @param response - The response to validate.\n */\nexport function validateSignUserOperationResponse(\n response: SignUserOperationResponse,\n) {\n const Hex = defineHex();\n\n const ValidResponse = object({\n signature: Hex,\n });\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when signing user operation',\n );\n}\n\n/**\n * Validate data against a struct.\n * @param data - The data to validate.\n * @param struct - The struct to validate against.\n * @param message - The message to throw if validation fails.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction validate<T>(data: unknown, struct: Struct<T>, message: string) {\n try {\n assert(data, struct, message);\n } catch (error) {\n const causes = (error as StructError)\n .failures()\n .map((failure) => {\n if (!failure.path.length) {\n return failure.message;\n }\n\n return `${failure.path.join('.')} - ${failure.message}`;\n })\n .join('\\n');\n\n const finalMessage = `${message}\\n${causes}`;\n\n throw new Error(finalMessage);\n }\n}\n\n/**\n * Define the Hex type used by superstruct.\n * @returns The Hex superstruct type.\n */\nfunction defineHex() {\n return define<string>('Hexadecimal String', (value) =>\n isStrictHexString(value),\n );\n}\n\n/**\n * Define the HexOrEmptyBytes type used by superstruct.\n * @returns The HexOrEmptyBytes superstruct type.\n */\nfunction defineHexOrEmptyBytes() {\n return define<string>(\n 'Hexadecimal String or 0x',\n (value) => isStrictHexString(value) || value === EMPTY_BYTES,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validation.mjs","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Struct, StructError } from '@metamask/superstruct';\nimport {\n assert,\n boolean,\n define,\n enums,\n func,\n number,\n object,\n optional,\n refine,\n string,\n} from '@metamask/superstruct';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport { isStrictHexString } from '@metamask/utils';\n\nimport { EMPTY_BYTES } from '../constants';\nimport type {\n PrepareUserOperationResponse,\n SignUserOperationResponse,\n UpdateUserOperationResponse,\n} from '../types';\nimport type {\n AddUserOperationOptions,\n AddUserOperationRequest,\n} from '../UserOperationController';\n\n/**\n * Validate a request to add a user operation.\n * @param request - The request to validate.\n */\nexport function validateAddUserOperationRequest(\n request: AddUserOperationRequest,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidRequest = object({\n data: optional(HexOrEmptyBytes),\n from: Hex,\n maxFeePerGas: optional(Hex),\n maxPriorityFeePerGas: optional(Hex),\n to: optional(Hex),\n value: optional(Hex),\n });\n\n validate(request, ValidRequest, 'Invalid request to add user operation');\n}\n\n/**\n * Validate the options when adding a user operation.\n * @param options - The options to validate.\n */\nexport function validateAddUserOperationOptions(\n options: AddUserOperationOptions,\n) {\n const ValidOptions = object({\n networkClientId: string(),\n origin: string(),\n requireApproval: optional(boolean()),\n smartContractAccount: optional(\n object({\n prepareUserOperation: func(),\n updateUserOperation: func(),\n signUserOperation: func(),\n }),\n ),\n swaps: optional(\n object({\n approvalTxId: optional(string()),\n destinationTokenAddress: optional(string()),\n destinationTokenDecimals: optional(number()),\n destinationTokenSymbol: optional(string()),\n estimatedBaseFee: optional(string()),\n sourceTokenSymbol: optional(string()),\n swapMetaData: optional(object()),\n swapTokenValue: optional(string()),\n destinationTokenAmount: optional(string()),\n sourceTokenAddress: optional(string()),\n sourceTokenAmount: optional(string()),\n sourceTokenDecimals: optional(number()),\n swapAndSendRecipient: optional(string()),\n }),\n ),\n type: optional(enums(Object.values(TransactionType))),\n });\n\n validate(options, ValidOptions, 'Invalid options to add user operation');\n}\n\n/**\n * Validate the response from a smart contract account when preparing the user operation.\n * @param response - The response to validate.\n */\nexport function validatePrepareUserOperationResponse(\n response: PrepareUserOperationResponse,\n) {\n const Hex = defineHex();\n const HexOrEmptyBytes = defineHexOrEmptyBytes();\n\n const ValidResponse = refine(\n object({\n bundler: string(),\n callData: Hex,\n dummyPaymasterAndData: optional(HexOrEmptyBytes),\n dummySignature: optional(HexOrEmptyBytes),\n gas: optional(\n object({\n callGasLimit: Hex,\n preVerificationGas: Hex,\n verificationGasLimit: Hex,\n }),\n ),\n initCode: optional(HexOrEmptyBytes),\n nonce: Hex,\n sender: Hex,\n }),\n 'ValidPrepareUserOperationResponse',\n ({ gas, dummySignature }) => {\n if (!gas && (!dummySignature || dummySignature === EMPTY_BYTES)) {\n return 'Must specify dummySignature if not specifying gas';\n }\n\n /* istanbul ignore next */\n return true;\n },\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when preparing user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when updating the user operation.\n * @param response - The response to validate.\n */\nexport function validateUpdateUserOperationResponse(\n response: UpdateUserOperationResponse,\n) {\n const ValidResponse = optional(\n object({\n paymasterAndData: optional(defineHexOrEmptyBytes()),\n callGasLimit: optional(defineHexOrEmptyBytes()),\n preVerificationGas: optional(defineHexOrEmptyBytes()),\n verificationGasLimit: optional(defineHexOrEmptyBytes()),\n }),\n );\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when updating user operation',\n );\n}\n\n/**\n * Validate the response from a smart contract account when signing the user operation.\n * @param response - The response to validate.\n */\nexport function validateSignUserOperationResponse(\n response: SignUserOperationResponse,\n) {\n const Hex = defineHex();\n\n const ValidResponse = object({\n signature: Hex,\n });\n\n validate(\n response,\n ValidResponse,\n 'Invalid response when signing user operation',\n );\n}\n\n/**\n * Validate data against a struct.\n * @param data - The data to validate.\n * @param struct - The struct to validate against.\n * @param message - The message to throw if validation fails.\n */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction validate<T>(data: unknown, struct: Struct<T>, message: string) {\n try {\n assert(data, struct, message);\n } catch (error) {\n const causes = (error as StructError)\n .failures()\n .map((failure) => {\n if (!failure.path.length) {\n return failure.message;\n }\n\n return `${failure.path.join('.')} - ${failure.message}`;\n })\n .join('\\n');\n\n const finalMessage = `${message}\\n${causes}`;\n\n throw new Error(finalMessage);\n }\n}\n\n/**\n * Define the Hex type used by superstruct.\n * @returns The Hex superstruct type.\n */\nfunction defineHex() {\n return define<string>('Hexadecimal String', (value) =>\n isStrictHexString(value),\n );\n}\n\n/**\n * Define the HexOrEmptyBytes type used by superstruct.\n * @returns The HexOrEmptyBytes superstruct type.\n */\nfunction defineHexOrEmptyBytes() {\n return define<string>(\n 'Hexadecimal String or 0x',\n (value) => isStrictHexString(value) || value === EMPTY_BYTES,\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/user-operation-controller",
|
|
3
|
-
"version": "40.0.0-preview-
|
|
3
|
+
"version": "40.0.0-preview-1a8571ae",
|
|
4
4
|
"description": "Creates user operations and manages their life cycle",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"ts-jest": "^27.1.4",
|
|
78
78
|
"typedoc": "^0.24.8",
|
|
79
79
|
"typedoc-plugin-missing-exports": "^2.0.0",
|
|
80
|
-
"typescript": "~5.
|
|
80
|
+
"typescript": "~5.3.3"
|
|
81
81
|
},
|
|
82
82
|
"peerDependencies": {
|
|
83
83
|
"@metamask/approval-controller": "^8.0.0",
|