@metamask/transaction-pay-controller 19.2.2 → 20.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -1
- package/dist/TransactionPayController.cjs +10 -1
- package/dist/TransactionPayController.cjs.map +1 -1
- package/dist/TransactionPayController.d.cts.map +1 -1
- package/dist/TransactionPayController.d.mts.map +1 -1
- package/dist/TransactionPayController.mjs +10 -1
- package/dist/TransactionPayController.mjs.map +1 -1
- package/dist/actions/update-payment-token.cjs +3 -1
- package/dist/actions/update-payment-token.cjs.map +1 -1
- package/dist/actions/update-payment-token.d.cts.map +1 -1
- package/dist/actions/update-payment-token.d.mts.map +1 -1
- package/dist/actions/update-payment-token.mjs +3 -1
- package/dist/actions/update-payment-token.mjs.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.cjs +3 -0
- package/dist/helpers/TransactionPayPublishHook.cjs.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.d.cts.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.d.mts.map +1 -1
- package/dist/helpers/TransactionPayPublishHook.mjs +3 -0
- package/dist/helpers/TransactionPayPublishHook.mjs.map +1 -1
- package/dist/strategy/across/AcrossStrategy.cjs +34 -3
- package/dist/strategy/across/AcrossStrategy.cjs.map +1 -1
- package/dist/strategy/across/AcrossStrategy.d.cts +2 -1
- package/dist/strategy/across/AcrossStrategy.d.cts.map +1 -1
- package/dist/strategy/across/AcrossStrategy.d.mts +2 -1
- package/dist/strategy/across/AcrossStrategy.d.mts.map +1 -1
- package/dist/strategy/across/AcrossStrategy.mjs +34 -3
- package/dist/strategy/across/AcrossStrategy.mjs.map +1 -1
- package/dist/strategy/across/across-quotes.cjs +4 -2
- package/dist/strategy/across/across-quotes.cjs.map +1 -1
- package/dist/strategy/across/across-quotes.mjs +4 -2
- package/dist/strategy/across/across-quotes.mjs.map +1 -1
- package/dist/strategy/across/types.cjs.map +1 -1
- package/dist/strategy/across/types.d.cts +1 -0
- package/dist/strategy/across/types.d.cts.map +1 -1
- package/dist/strategy/across/types.d.mts +1 -0
- package/dist/strategy/across/types.d.mts.map +1 -1
- package/dist/strategy/across/types.mjs.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.cjs +2 -1
- package/dist/strategy/fiat/fiat-quotes.cjs.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.d.cts.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.d.mts.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.mjs +2 -1
- package/dist/strategy/fiat/fiat-quotes.mjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.cjs +3 -1
- package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
- package/dist/strategy/relay/relay-quotes.mjs +3 -1
- package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
- package/dist/strategy/relay/relay-submit.cjs +5 -2
- package/dist/strategy/relay/relay-submit.cjs.map +1 -1
- package/dist/strategy/relay/relay-submit.mjs +5 -2
- package/dist/strategy/relay/relay-submit.mjs.map +1 -1
- package/dist/tests/messenger-mock.cjs +12 -0
- package/dist/tests/messenger-mock.cjs.map +1 -1
- package/dist/tests/messenger-mock.d.cts +2 -4
- package/dist/tests/messenger-mock.d.cts.map +1 -1
- package/dist/tests/messenger-mock.d.mts +2 -4
- package/dist/tests/messenger-mock.d.mts.map +1 -1
- package/dist/tests/messenger-mock.mjs +12 -0
- package/dist/tests/messenger-mock.mjs.map +1 -1
- package/dist/types.cjs +9 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +42 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +42 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +8 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/7702.cjs +23 -0
- package/dist/utils/7702.cjs.map +1 -0
- package/dist/utils/7702.d.cts +15 -0
- package/dist/utils/7702.d.cts.map +1 -0
- package/dist/utils/7702.d.mts +15 -0
- package/dist/utils/7702.d.mts.map +1 -0
- package/dist/utils/7702.mjs +19 -0
- package/dist/utils/7702.mjs.map +1 -0
- package/dist/utils/feature-flags.cjs +1 -1
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +1 -1
- package/dist/utils/feature-flags.d.mts +1 -1
- package/dist/utils/feature-flags.mjs +1 -1
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/quote-gas.cjs +2 -1
- package/dist/utils/quote-gas.cjs.map +1 -1
- package/dist/utils/quote-gas.d.cts +1 -0
- package/dist/utils/quote-gas.d.cts.map +1 -1
- package/dist/utils/quote-gas.d.mts +1 -0
- package/dist/utils/quote-gas.d.mts.map +1 -1
- package/dist/utils/quote-gas.mjs +2 -1
- package/dist/utils/quote-gas.mjs.map +1 -1
- package/dist/utils/quotes.cjs +22 -5
- package/dist/utils/quotes.cjs.map +1 -1
- package/dist/utils/quotes.d.cts.map +1 -1
- package/dist/utils/quotes.d.mts.map +1 -1
- package/dist/utils/quotes.mjs +23 -6
- package/dist/utils/quotes.mjs.map +1 -1
- package/dist/utils/strategy.cjs +30 -1
- package/dist/utils/strategy.cjs.map +1 -1
- package/dist/utils/strategy.d.cts +21 -1
- package/dist/utils/strategy.d.cts.map +1 -1
- package/dist/utils/strategy.d.mts +21 -1
- package/dist/utils/strategy.d.mts.map +1 -1
- package/dist/utils/strategy.mjs +27 -0
- package/dist/utils/strategy.mjs.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [20.0.0]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Rename `executeEnabled` feature flag to `gaslessEnabled` ([#8607](https://github.com/MetaMask/core/pull/8607))
|
|
15
|
+
- Bump `@metamask/transaction-controller` from `^64.3.0` to `^65.0.0` ([#8585](https://github.com/MetaMask/core/pull/8585), [#8613](https://github.com/MetaMask/core/pull/8613))
|
|
16
|
+
- Bump `@metamask/assets-controller` from `^6.1.0` to `^6.2.0` ([#8590](https://github.com/MetaMask/core/pull/8590))
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- Fall back from Across to later pay strategies when Across quotes would require a first-time EIP-7702 authorization list ([#8577](https://github.com/MetaMask/core/pull/8577))
|
|
21
|
+
- **BREAKING:** Fix mUSD conversion for hardware wallets on EIP-7702 chains by gating relay and Across 7702 paths on the account keyring type via `KeyringController:getState` ([#8388](https://github.com/MetaMask/core/pull/8388))
|
|
22
|
+
- The `TransactionPayControllerMessenger` now requires `KeyringController:getState` permission.
|
|
23
|
+
|
|
24
|
+
## [19.3.0]
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Add support for transaction config parameter accountOverride ([#8454](https://github.com/MetaMask/core/pull/8454))
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Bump `@metamask/assets-controller` from `^6.0.0` to `^6.1.0` ([#8559](https://github.com/MetaMask/core/pull/8559))
|
|
33
|
+
- Bump `@metamask/assets-controllers` from `^104.2.0` to `^104.3.0` ([#8559](https://github.com/MetaMask/core/pull/8559))
|
|
34
|
+
- Bump `@metamask/bridge-controller` from `^70.1.1` to `^70.2.0` ([#8571](https://github.com/MetaMask/core/pull/8571))
|
|
35
|
+
- Bump `@metamask/bridge-status-controller` from `^70.0.5` to `^71.0.0` ([#8571](https://github.com/MetaMask/core/pull/8571))
|
|
36
|
+
|
|
10
37
|
## [19.2.2]
|
|
11
38
|
|
|
12
39
|
### Changed
|
|
@@ -689,7 +716,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
689
716
|
|
|
690
717
|
- Initial release ([#6820](https://github.com/MetaMask/core/pull/6820))
|
|
691
718
|
|
|
692
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@
|
|
719
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@20.0.0...HEAD
|
|
720
|
+
[20.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@19.3.0...@metamask/transaction-pay-controller@20.0.0
|
|
721
|
+
[19.3.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@19.2.2...@metamask/transaction-pay-controller@19.3.0
|
|
693
722
|
[19.2.2]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@19.2.1...@metamask/transaction-pay-controller@19.2.2
|
|
694
723
|
[19.2.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@19.2.0...@metamask/transaction-pay-controller@19.2.1
|
|
695
724
|
[19.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@19.1.3...@metamask/transaction-pay-controller@19.2.0
|
|
@@ -81,12 +81,18 @@ class TransactionPayController extends base_controller_1.BaseController {
|
|
|
81
81
|
isPostQuote: transactionData.isPostQuote,
|
|
82
82
|
isHyperliquidSource: transactionData.isHyperliquidSource,
|
|
83
83
|
refundTo: transactionData.refundTo,
|
|
84
|
+
accountOverride: transactionData.accountOverride,
|
|
84
85
|
};
|
|
86
|
+
const previousAccountOverride = config.accountOverride;
|
|
85
87
|
callback(config);
|
|
88
|
+
transactionData.accountOverride = config.accountOverride;
|
|
86
89
|
transactionData.isMaxAmount = config.isMaxAmount;
|
|
87
90
|
transactionData.isPostQuote = config.isPostQuote;
|
|
88
91
|
transactionData.isHyperliquidSource = config.isHyperliquidSource;
|
|
89
92
|
transactionData.refundTo = config.refundTo;
|
|
93
|
+
if (config.accountOverride !== previousAccountOverride) {
|
|
94
|
+
transactionData.paymentToken = undefined;
|
|
95
|
+
}
|
|
90
96
|
});
|
|
91
97
|
}
|
|
92
98
|
/**
|
|
@@ -164,6 +170,7 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
|
|
|
164
170
|
const originalTokens = current?.tokens;
|
|
165
171
|
const originalIsMaxAmount = current?.isMaxAmount;
|
|
166
172
|
const originalIsPostQuote = current?.isPostQuote;
|
|
173
|
+
const originalAccountOverride = current?.accountOverride;
|
|
167
174
|
if (!current) {
|
|
168
175
|
transactionData[transactionId] = {
|
|
169
176
|
fiatPayment: {},
|
|
@@ -179,10 +186,12 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
|
|
|
179
186
|
const isTokensUpdated = current.tokens !== originalTokens;
|
|
180
187
|
const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;
|
|
181
188
|
const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;
|
|
189
|
+
const isAccountOverrideUpdated = current.accountOverride !== originalAccountOverride;
|
|
182
190
|
if (isPaymentTokenUpdated ||
|
|
183
191
|
isIsMaxUpdated ||
|
|
184
192
|
isTokensUpdated ||
|
|
185
|
-
isPostQuoteUpdated
|
|
193
|
+
isPostQuoteUpdated ||
|
|
194
|
+
isAccountOverrideUpdated) {
|
|
186
195
|
(0, source_amounts_1.updateSourceAmounts)(transactionId, current, this.messenger);
|
|
187
196
|
shouldUpdateQuotes = true;
|
|
188
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController.cjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n accountOverride: transactionData.accountOverride,\n };\n\n const previousAccountOverride = config.accountOverride;\n\n callback(config);\n\n transactionData.accountOverride = config.accountOverride;\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n\n if (config.accountOverride !== previousAccountOverride) {\n transactionData.paymentToken = undefined;\n }\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n const originalAccountOverride = current?.accountOverride;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n const isAccountOverrideUpdated =\n current.accountOverride !== originalAccountOverride;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated ||\n isAccountOverrideUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.cts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IA0BP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CAkGlE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.mts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,yCAAyC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,wBAAoB;AAErB,OAAO,KAAK,EACV,gCAAgC,EAChC,yBAAyB,EAEzB,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,oBAAgB;AA2BjB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;gBAWa,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,GACN,EAAE,+BAA+B;IA+BlC;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI;IA0BP;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IAO5D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAO1D;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC;IAI/C;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB;CAkGlE"}
|
|
@@ -79,12 +79,18 @@ export class TransactionPayController extends BaseController {
|
|
|
79
79
|
isPostQuote: transactionData.isPostQuote,
|
|
80
80
|
isHyperliquidSource: transactionData.isHyperliquidSource,
|
|
81
81
|
refundTo: transactionData.refundTo,
|
|
82
|
+
accountOverride: transactionData.accountOverride,
|
|
82
83
|
};
|
|
84
|
+
const previousAccountOverride = config.accountOverride;
|
|
83
85
|
callback(config);
|
|
86
|
+
transactionData.accountOverride = config.accountOverride;
|
|
84
87
|
transactionData.isMaxAmount = config.isMaxAmount;
|
|
85
88
|
transactionData.isPostQuote = config.isPostQuote;
|
|
86
89
|
transactionData.isHyperliquidSource = config.isHyperliquidSource;
|
|
87
90
|
transactionData.refundTo = config.refundTo;
|
|
91
|
+
if (config.accountOverride !== previousAccountOverride) {
|
|
92
|
+
transactionData.paymentToken = undefined;
|
|
93
|
+
}
|
|
88
94
|
});
|
|
89
95
|
}
|
|
90
96
|
/**
|
|
@@ -161,6 +167,7 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
|
|
|
161
167
|
const originalTokens = current?.tokens;
|
|
162
168
|
const originalIsMaxAmount = current?.isMaxAmount;
|
|
163
169
|
const originalIsPostQuote = current?.isPostQuote;
|
|
170
|
+
const originalAccountOverride = current?.accountOverride;
|
|
164
171
|
if (!current) {
|
|
165
172
|
transactionData[transactionId] = {
|
|
166
173
|
fiatPayment: {},
|
|
@@ -176,10 +183,12 @@ _TransactionPayController_getDelegationTransaction = new WeakMap(), _Transaction
|
|
|
176
183
|
const isTokensUpdated = current.tokens !== originalTokens;
|
|
177
184
|
const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;
|
|
178
185
|
const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;
|
|
186
|
+
const isAccountOverrideUpdated = current.accountOverride !== originalAccountOverride;
|
|
179
187
|
if (isPaymentTokenUpdated ||
|
|
180
188
|
isIsMaxUpdated ||
|
|
181
189
|
isTokensUpdated ||
|
|
182
|
-
isPostQuoteUpdated
|
|
190
|
+
isPostQuoteUpdated ||
|
|
191
|
+
isAccountOverrideUpdated) {
|
|
183
192
|
updateSourceAmounts(transactionId, current, this.messenger);
|
|
184
193
|
shouldUpdateQuotes = true;
|
|
185
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n };\n\n callback(config);\n\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController.mjs","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { Draft } from 'immer';\nimport { noop } from 'lodash';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment';\nimport { updatePaymentToken } from './actions/update-payment-token';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants';\nimport { QuoteRefresher } from './helpers/QuoteRefresher';\nimport type {\n GetDelegationTransactionCallback,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types';\nimport { getStrategyOrder } from './utils/feature-flags';\nimport { updateQuotes } from './utils/quotes';\nimport { updateSourceAmounts } from './utils/source-amounts';\nimport { pollTransactionChanges } from './utils/transaction';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getDelegationTransaction',\n 'getStrategy',\n 'setTransactionConfig',\n 'updateFiatPayment',\n 'updatePaymentToken',\n] as const;\n\nconst stateMetadata: StateMetadata<TransactionPayControllerState> = {\n transactionData: {\n includeInDebugSnapshot: false,\n includeInStateLogs: true,\n persist: false,\n usedInUi: true,\n },\n};\n\nconst getDefaultState = (): TransactionPayControllerState => ({\n transactionData: {},\n});\n\nexport class TransactionPayController extends BaseController<\n typeof CONTROLLER_NAME,\n TransactionPayControllerState,\n TransactionPayControllerMessenger\n> {\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n constructor({\n getDelegationTransaction,\n getStrategy,\n getStrategies,\n messenger,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n pollTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Sets the transaction configuration.\n *\n * The callback receives the current configuration properties and can mutate\n * them in place. Updated values are written back to the transaction data.\n *\n * @param transactionId - The ID of the transaction to configure.\n * @param callback - A callback that receives a mutable {@link TransactionConfig} object.\n */\n setTransactionConfig(\n transactionId: string,\n callback: TransactionConfigCallback,\n ): void {\n this.#updateTransactionData(transactionId, (transactionData) => {\n const config = {\n isMaxAmount: transactionData.isMaxAmount,\n isPostQuote: transactionData.isPostQuote,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n refundTo: transactionData.refundTo,\n accountOverride: transactionData.accountOverride,\n };\n\n const previousAccountOverride = config.accountOverride;\n\n callback(config);\n\n transactionData.accountOverride = config.accountOverride;\n transactionData.isMaxAmount = config.isMaxAmount;\n transactionData.isPostQuote = config.isPostQuote;\n transactionData.isHyperliquidSource = config.isHyperliquidSource;\n transactionData.refundTo = config.refundTo;\n\n if (config.accountOverride !== previousAccountOverride) {\n transactionData.paymentToken = undefined;\n }\n });\n }\n\n /**\n * Updates the payment token for a transaction.\n *\n * Resolves token metadata and balances, then stores the new payment token\n * in the transaction data. This triggers recalculation of source amounts\n * and quote retrieval.\n *\n * @param request - The payment token update request containing the\n * transaction ID, token address, and chain ID.\n */\n updatePaymentToken(request: UpdatePaymentTokenRequest): void {\n updatePaymentToken(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Updates the fiat payment state for a transaction.\n *\n * The request callback receives the current fiat payment state and can\n * mutate it to update properties such as the selected payment method or\n * fiat amount.\n *\n * @param request - The fiat payment update request containing the\n * transaction ID and a callback to mutate fiat payment state.\n */\n updateFiatPayment(request: UpdateFiatPaymentRequest): void {\n updateFiatPayment(request, {\n messenger: this.messenger,\n updateTransactionData: this.#updateTransactionData.bind(this),\n });\n }\n\n /**\n * Gets the delegation transaction for a given transaction.\n *\n * Converts the provided transaction into a redeem delegation by delegating\n * to the configured callback. Returns the delegation transaction data\n * including the encoded call data, target address, value, and an optional\n * authorization list.\n *\n * @param args - The arguments forwarded to the {@link GetDelegationTransactionCallback},\n * containing the transaction metadata.\n * @returns A promise resolving to the delegation transaction data.\n */\n getDelegationTransaction(\n ...args: Parameters<GetDelegationTransactionCallback>\n ): ReturnType<GetDelegationTransactionCallback> {\n return this.#getDelegationTransaction(...args);\n }\n\n /**\n * Gets the preferred strategy for a transaction.\n *\n * Returns the first strategy from the ordered list of strategies applicable\n * to the given transaction. Falls back to the default strategy order derived\n * from feature flags when no custom strategy callback is configured.\n *\n * @param transaction - The transaction metadata to determine the strategy for.\n * @returns The preferred {@link TransactionPayStrategy} for the transaction.\n */\n getStrategy(transaction: TransactionMeta): TransactionPayStrategy {\n return this.#getStrategiesWithFallback(transaction)[0];\n }\n\n #removeTransactionData(transactionId: string): void {\n this.update((state) => {\n delete state.transactionData[transactionId];\n });\n }\n\n #updateTransactionData(\n transactionId: string,\n fn: (transactionData: Draft<TransactionData>) => void,\n ): void {\n let shouldUpdateQuotes = false;\n\n this.update((state) => {\n const { transactionData } = state;\n let current = transactionData[transactionId];\n const originalPaymentToken = current?.paymentToken;\n const originalTokens = current?.tokens;\n const originalIsMaxAmount = current?.isMaxAmount;\n const originalIsPostQuote = current?.isPostQuote;\n const originalAccountOverride = current?.accountOverride;\n\n if (!current) {\n transactionData[transactionId] = {\n fiatPayment: {},\n isLoading: false,\n tokens: [],\n };\n\n current = transactionData[transactionId];\n }\n\n fn(current);\n\n const isPaymentTokenUpdated =\n current.paymentToken?.address?.toLowerCase() !==\n originalPaymentToken?.address?.toLowerCase() ||\n current.paymentToken?.chainId !== originalPaymentToken?.chainId;\n\n const isTokensUpdated = current.tokens !== originalTokens;\n const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;\n const isPostQuoteUpdated = current.isPostQuote !== originalIsPostQuote;\n const isAccountOverrideUpdated =\n current.accountOverride !== originalAccountOverride;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated ||\n isAccountOverrideUpdated\n ) {\n updateSourceAmounts(transactionId, current as never, this.messenger);\n\n shouldUpdateQuotes = true;\n }\n });\n\n if (shouldUpdateQuotes) {\n updateQuotes({\n getStrategies: this.#getStrategiesWithFallback.bind(this),\n messenger: this.messenger,\n transactionData: this.state.transactionData[transactionId],\n transactionId,\n updateTransactionData: this.#updateTransactionData.bind(this),\n }).catch(noop);\n }\n }\n\n #getStrategiesWithFallback(\n transaction: TransactionMeta,\n ): TransactionPayStrategy[] {\n const strategyCandidates: unknown[] =\n this.#getStrategies?.(transaction) ??\n (this.#getStrategy ? [this.#getStrategy(transaction)] : []);\n\n const validStrategies = strategyCandidates.filter(\n (strategy): strategy is TransactionPayStrategy =>\n isTransactionPayStrategy(strategy),\n );\n\n if (validStrategies.length) {\n return validStrategies;\n }\n\n const paymentToken =\n this.state.transactionData[transaction.id]?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n );\n }\n}\n"]}
|
|
@@ -19,9 +19,11 @@ function updatePaymentToken(request, options) {
|
|
|
19
19
|
if (!transaction) {
|
|
20
20
|
throw new Error('Transaction not found');
|
|
21
21
|
}
|
|
22
|
+
const state = messenger.call('TransactionPayController:getState');
|
|
23
|
+
const accountOverride = state.transactionData[transactionId]?.accountOverride;
|
|
22
24
|
const paymentToken = getPaymentToken({
|
|
23
25
|
chainId,
|
|
24
|
-
from: transaction
|
|
26
|
+
from: accountOverride ?? transaction.txParams.from,
|
|
25
27
|
messenger,
|
|
26
28
|
tokenAddress,
|
|
27
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":";;;AAAA,2CAAqD;AAIrD,0CAA0C;AAM1C,8CAKwB;AACxB,0DAAsD;AAEtD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"update-payment-token.cjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":";;;AAAA,2CAAqD;AAIrD,0CAA0C;AAM1C,8CAKwB;AACxB,0DAAsD;AAEtD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IAE9E,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,eAAe,IAAK,WAAW,CAAC,QAAQ,CAAC,IAAY;QAC3D,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAjCD,gDAiCC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,IAAA,oBAAY,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,IAAA,wBAAgB,EAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAExE,MAAM,EACJ,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,WAAW,GAClB,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n computeTokenAmounts,\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n): void {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const state = messenger.call('TransactionPayController:getState');\n const accountOverride = state.transactionData[transactionId]?.accountOverride;\n\n const paymentToken = getPaymentToken({\n chainId,\n from: accountOverride ?? (transaction.txParams.from as Hex),\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n data.fiatPayment = {};\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(balance, decimals, tokenFiatRate);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,
|
|
1
|
+
{"version":3,"file":"update-payment-token.d.cts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,CA8BN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,
|
|
1
|
+
{"version":3,"file":"update-payment-token.d.mts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAW;AAE5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,qBAAiB;AAWlB,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,qBAAqB,EAAE,6BAA6B,CAAC;CACtD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,yBAAyB,GACjC,IAAI,CA8BN"}
|
|
@@ -16,9 +16,11 @@ export function updatePaymentToken(request, options) {
|
|
|
16
16
|
if (!transaction) {
|
|
17
17
|
throw new Error('Transaction not found');
|
|
18
18
|
}
|
|
19
|
+
const state = messenger.call('TransactionPayController:getState');
|
|
20
|
+
const accountOverride = state.transactionData[transactionId]?.accountOverride;
|
|
19
21
|
const paymentToken = getPaymentToken({
|
|
20
22
|
chainId,
|
|
21
|
-
from: transaction
|
|
23
|
+
from: accountOverride ?? transaction.txParams.from,
|
|
22
24
|
messenger,
|
|
23
25
|
tokenAddress,
|
|
24
26
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAIrD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAM1C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,2BAAuB;AACxB,OAAO,EAAE,cAAc,EAAE,iCAA6B;AAEtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"update-payment-token.mjs","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAIrD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAM1C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,2BAAuB;AACxB,OAAO,EAAE,cAAc,EAAE,iCAA6B;AAEtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAOtE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC,EAClC,OAAkC;IAElC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IAE9E,MAAM,YAAY,GAAG,eAAe,CAAC;QACnC,OAAO;QACP,IAAI,EAAE,eAAe,IAAK,WAAW,CAAC,QAAQ,CAAC,IAAY;QAC3D,SAAS;QACT,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,uBAAuB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAE9D,qBAAqB,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,YAAY,GAMb;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GACxB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAExE,MAAM,EACJ,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,WAAW,GAClB,GAAG,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionPayControllerMessenger } from '..';\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types';\nimport {\n computeTokenAmounts,\n getTokenBalance,\n getTokenFiatRate,\n getTokenInfo,\n} from '../utils/token';\nimport { getTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'update-payment-token');\n\nexport type UpdatePaymentTokenOptions = {\n messenger: TransactionPayControllerMessenger;\n updateTransactionData: UpdateTransactionDataCallback;\n};\n\n/**\n * Update the payment token for a specific transaction.\n *\n * @param request - Request parameters.\n * @param options - Options bag.\n */\nexport function updatePaymentToken(\n request: UpdatePaymentTokenRequest,\n options: UpdatePaymentTokenOptions,\n): void {\n const { transactionId, tokenAddress, chainId } = request;\n const { messenger, updateTransactionData } = options;\n\n const transaction = getTransaction(transactionId, messenger);\n\n if (!transaction) {\n throw new Error('Transaction not found');\n }\n\n const state = messenger.call('TransactionPayController:getState');\n const accountOverride = state.transactionData[transactionId]?.accountOverride;\n\n const paymentToken = getPaymentToken({\n chainId,\n from: accountOverride ?? (transaction.txParams.from as Hex),\n messenger,\n tokenAddress,\n });\n\n if (!paymentToken) {\n throw new Error('Payment token not found');\n }\n\n log('Updated payment token', { transactionId, paymentToken });\n\n updateTransactionData(transactionId, (data) => {\n data.paymentToken = paymentToken;\n data.fiatPayment = {};\n });\n}\n\n/**\n * Generate the full payment token data from a token address and chain ID.\n *\n * @param request - The payment token request parameters.\n * @param request.chainId - The chain ID.\n * @param request.from - The address to get the token balance for.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.tokenAddress - The token address.\n * @returns The payment token or undefined if the token data could not be retrieved.\n */\nfunction getPaymentToken({\n chainId,\n from,\n messenger,\n tokenAddress,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n tokenAddress: Hex;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } =\n getTokenInfo(messenger, tokenAddress, chainId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n const tokenFiatRate = getTokenFiatRate(messenger, tokenAddress, chainId);\n\n if (tokenFiatRate === undefined) {\n return undefined;\n }\n\n const balance = getTokenBalance(messenger, from, chainId, tokenAddress);\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(balance, decimals, tokenFiatRate);\n\n return {\n address: tokenAddress,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n chainId,\n decimals,\n symbol,\n };\n}\n"]}
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.TransactionPayPublishHook = void 0;
|
|
16
16
|
const utils_1 = require("@metamask/utils");
|
|
17
17
|
const logger_1 = require("../logger.cjs");
|
|
18
|
+
const _7702_1 = require("../utils/7702.cjs");
|
|
18
19
|
const strategy_1 = require("../utils/strategy.cjs");
|
|
19
20
|
const transaction_1 = require("../utils/transaction.cjs");
|
|
20
21
|
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'pay-publish-hook');
|
|
@@ -59,7 +60,9 @@ _TransactionPayPublishHook_isSmartTransaction = new WeakMap(), _TransactionPayPu
|
|
|
59
60
|
tx.submittedTime = new Date().getTime();
|
|
60
61
|
});
|
|
61
62
|
const strategy = (0, strategy_1.getStrategyByName)(quotes[0].strategy);
|
|
63
|
+
const from = transactionMeta.txParams.from;
|
|
62
64
|
return await strategy.execute({
|
|
65
|
+
accountSupports7702: (0, _7702_1.accountSupports7702)(__classPrivateFieldGet(this, _TransactionPayPublishHook_messenger, "f"), from),
|
|
63
66
|
isSmartTransaction: __classPrivateFieldGet(this, _TransactionPayPublishHook_isSmartTransaction, "f"),
|
|
64
67
|
quotes,
|
|
65
68
|
messenger: __classPrivateFieldGet(this, _TransactionPayPublishHook_messenger, "f"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayPublishHook.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,2CAAqD;AAErD,0CAA0C;AAK1C,oDAAsD;AACtD,0DAAyD;AAEzD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,kBAAkB,CAAC,CAAC;AAElE,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,MAAa,yBAAyB;IAKpC,YAAY,EACV,kBAAkB,EAClB,SAAS,GAIV;;QAVQ,gEAA+C;QAE/C,uDAA8C;QASrD,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,uBAAA,IAAI,oFAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPayPublishHook.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,2CAAqD;AAErD,0CAA0C;AAK1C,6CAAoD;AACpD,oDAAsD;AACtD,0DAAyD;AAEzD,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,kBAAkB,CAAC,CAAC;AAElE,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,MAAa,yBAAyB;IAKpC,YAAY,EACV,kBAAkB,EAClB,SAAS,GAIV;;QAVQ,gEAA+C;QAE/C,uDAA8C;QASrD,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,uBAAA,IAAI,oFAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CAuDF;AAzED,8DAyEC;oNArDC,KAAK,iDACH,eAAgC,EAChC,SAAiB;IAEjB,IAAI,CAAC;QACH,OAAO,MAAM,uBAAA,IAAI,oFAAa,MAAjB,IAAI,EAAc,eAAe,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,2CAED,KAAK,iDACH,eAAgC,EAChC,SAAiB;IAEjB,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;IAE9C,MAAM,eAAe,GAAG,uBAAA,IAAI,4CAAW,CAAC,IAAI,CAC1C,mCAAmC,CACpC,CAAC;IAEF,MAAM,MAAM,GACT,eAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC;QAC/C,EAAE,MAAyC,IAAI,EAAE,CAAC;IAEtD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAA,+BAAiB,EACf;QACE,aAAa;QACb,SAAS,EAAE,uBAAA,IAAI,4CAAW;QAC1B,IAAI,EAAE,6CAA6C;KACpD,EACD,CAAC,EAAE,EAAE,EAAE;QACL,EAAE,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAA,4BAAiB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAW,CAAC;IAElD,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC;QAC5B,mBAAmB,EAAE,IAAA,2BAAmB,EAAC,uBAAA,IAAI,4CAAW,EAAE,IAAI,CAAC;QAC/D,kBAAkB,EAAE,uBAAA,IAAI,qDAAoB;QAC5C,MAAM;QACN,SAAS,EAAE,uBAAA,IAAI,4CAAW;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { PublishHook } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { PublishHookResult } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../types';\nimport { accountSupports7702 } from '../utils/7702';\nimport { getStrategyByName } from '../utils/strategy';\nimport { updateTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'pay-publish-hook');\n\nconst EMPTY_RESULT = {\n transactionHash: undefined,\n};\n\nexport class TransactionPayPublishHook {\n readonly #isSmartTransaction: (chainId: Hex) => boolean;\n\n readonly #messenger: TransactionPayControllerMessenger;\n\n constructor({\n isSmartTransaction,\n messenger,\n }: {\n isSmartTransaction: (chainId: Hex) => boolean;\n messenger: TransactionPayControllerMessenger;\n }) {\n this.#isSmartTransaction = isSmartTransaction;\n this.#messenger = messenger;\n }\n\n getHook(): PublishHook {\n return this.#hookWrapper.bind(this);\n }\n\n async #hookWrapper(\n transactionMeta: TransactionMeta,\n _signedTx: string,\n ): Promise<PublishHookResult> {\n try {\n return await this.#publishHook(transactionMeta, _signedTx);\n } catch (error) {\n log('Error', error);\n throw error;\n }\n }\n\n async #publishHook(\n transactionMeta: TransactionMeta,\n _signedTx: string,\n ): Promise<PublishHookResult> {\n const { id: transactionId } = transactionMeta;\n\n const controllerState = this.#messenger.call(\n 'TransactionPayController:getState',\n );\n\n const quotes =\n (controllerState.transactionData?.[transactionId]\n ?.quotes as TransactionPayQuote<unknown>[]) ?? [];\n\n if (!quotes?.length) {\n log('Skipping as no quotes found');\n return EMPTY_RESULT;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: this.#messenger,\n note: 'Set submittedTime at pay publish hook start',\n },\n (tx) => {\n tx.submittedTime = new Date().getTime();\n },\n );\n\n const strategy = getStrategyByName(quotes[0].strategy);\n const from = transactionMeta.txParams.from as Hex;\n\n return await strategy.execute({\n accountSupports7702: accountSupports7702(this.#messenger, from),\n isSmartTransaction: this.#isSmartTransaction,\n quotes,\n messenger: this.#messenger,\n transaction: transactionMeta,\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayPublishHook.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yCAAyC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAiB;
|
|
1
|
+
{"version":3,"file":"TransactionPayPublishHook.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yCAAyC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAiB;AAWlB,qBAAa,yBAAyB;;gBAKxB,EACV,kBAAkB,EAClB,SAAS,GACV,EAAE;QACD,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;QAC9C,SAAS,EAAE,iCAAiC,CAAC;KAC9C;IAKD,OAAO,IAAI,WAAW;CAyDvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayPublishHook.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yCAAyC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAiB;
|
|
1
|
+
{"version":3,"file":"TransactionPayPublishHook.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,yCAAyC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,iCAAiC,EAElC,qBAAiB;AAWlB,qBAAa,yBAAyB;;gBAKxB,EACV,kBAAkB,EAClB,SAAS,GACV,EAAE;QACD,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC;QAC9C,SAAS,EAAE,iCAAiC,CAAC;KAC9C;IAKD,OAAO,IAAI,WAAW;CAyDvB"}
|
|
@@ -12,6 +12,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
12
12
|
var _TransactionPayPublishHook_instances, _TransactionPayPublishHook_isSmartTransaction, _TransactionPayPublishHook_messenger, _TransactionPayPublishHook_hookWrapper, _TransactionPayPublishHook_publishHook;
|
|
13
13
|
import { createModuleLogger } from "@metamask/utils";
|
|
14
14
|
import { projectLogger } from "../logger.mjs";
|
|
15
|
+
import { accountSupports7702 } from "../utils/7702.mjs";
|
|
15
16
|
import { getStrategyByName } from "../utils/strategy.mjs";
|
|
16
17
|
import { updateTransaction } from "../utils/transaction.mjs";
|
|
17
18
|
const log = createModuleLogger(projectLogger, 'pay-publish-hook');
|
|
@@ -55,7 +56,9 @@ _TransactionPayPublishHook_isSmartTransaction = new WeakMap(), _TransactionPayPu
|
|
|
55
56
|
tx.submittedTime = new Date().getTime();
|
|
56
57
|
});
|
|
57
58
|
const strategy = getStrategyByName(quotes[0].strategy);
|
|
59
|
+
const from = transactionMeta.txParams.from;
|
|
58
60
|
return await strategy.execute({
|
|
61
|
+
accountSupports7702: accountSupports7702(__classPrivateFieldGet(this, _TransactionPayPublishHook_messenger, "f"), from),
|
|
59
62
|
isSmartTransaction: __classPrivateFieldGet(this, _TransactionPayPublishHook_isSmartTransaction, "f"),
|
|
60
63
|
quotes,
|
|
61
64
|
messenger: __classPrivateFieldGet(this, _TransactionPayPublishHook_messenger, "f"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayPublishHook.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;AAIA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAErD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAK1C,OAAO,EAAE,iBAAiB,EAAE,8BAA0B;AACtD,OAAO,EAAE,iBAAiB,EAAE,iCAA6B;AAEzD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAElE,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,MAAM,OAAO,yBAAyB;IAKpC,YAAY,EACV,kBAAkB,EAClB,SAAS,GAIV;;QAVQ,gEAA+C;QAE/C,uDAA8C;QASrD,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,uBAAA,IAAI,oFAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPayPublishHook.mjs","sourceRoot":"","sources":["../../src/helpers/TransactionPayPublishHook.ts"],"names":[],"mappings":";;;;;;;;;;;;AAIA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAErD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAK1C,OAAO,EAAE,mBAAmB,EAAE,0BAAsB;AACpD,OAAO,EAAE,iBAAiB,EAAE,8BAA0B;AACtD,OAAO,EAAE,iBAAiB,EAAE,iCAA6B;AAEzD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAElE,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,MAAM,OAAO,yBAAyB;IAKpC,YAAY,EACV,kBAAkB,EAClB,SAAS,GAIV;;QAVQ,gEAA+C;QAE/C,uDAA8C;QASrD,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,uBAAA,IAAI,oFAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CAuDF;oNArDC,KAAK,iDACH,eAAgC,EAChC,SAAiB;IAEjB,IAAI,CAAC;QACH,OAAO,MAAM,uBAAA,IAAI,oFAAa,MAAjB,IAAI,EAAc,eAAe,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,2CAED,KAAK,iDACH,eAAgC,EAChC,SAAiB;IAEjB,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;IAE9C,MAAM,eAAe,GAAG,uBAAA,IAAI,4CAAW,CAAC,IAAI,CAC1C,mCAAmC,CACpC,CAAC;IAEF,MAAM,MAAM,GACT,eAAe,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC;QAC/C,EAAE,MAAyC,IAAI,EAAE,CAAC;IAEtD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,GAAG,CAAC,6BAA6B,CAAC,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,iBAAiB,CACf;QACE,aAAa;QACb,SAAS,EAAE,uBAAA,IAAI,4CAAW;QAC1B,IAAI,EAAE,6CAA6C;KACpD,EACD,CAAC,EAAE,EAAE,EAAE;QACL,EAAE,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAW,CAAC;IAElD,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC;QAC5B,mBAAmB,EAAE,mBAAmB,CAAC,uBAAA,IAAI,4CAAW,EAAE,IAAI,CAAC;QAC/D,kBAAkB,EAAE,uBAAA,IAAI,qDAAoB;QAC5C,MAAM;QACN,SAAS,EAAE,uBAAA,IAAI,4CAAW;QAC1B,WAAW,EAAE,eAAe;KAC7B,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { PublishHook } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport type { PublishHookResult } from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../types';\nimport { accountSupports7702 } from '../utils/7702';\nimport { getStrategyByName } from '../utils/strategy';\nimport { updateTransaction } from '../utils/transaction';\n\nconst log = createModuleLogger(projectLogger, 'pay-publish-hook');\n\nconst EMPTY_RESULT = {\n transactionHash: undefined,\n};\n\nexport class TransactionPayPublishHook {\n readonly #isSmartTransaction: (chainId: Hex) => boolean;\n\n readonly #messenger: TransactionPayControllerMessenger;\n\n constructor({\n isSmartTransaction,\n messenger,\n }: {\n isSmartTransaction: (chainId: Hex) => boolean;\n messenger: TransactionPayControllerMessenger;\n }) {\n this.#isSmartTransaction = isSmartTransaction;\n this.#messenger = messenger;\n }\n\n getHook(): PublishHook {\n return this.#hookWrapper.bind(this);\n }\n\n async #hookWrapper(\n transactionMeta: TransactionMeta,\n _signedTx: string,\n ): Promise<PublishHookResult> {\n try {\n return await this.#publishHook(transactionMeta, _signedTx);\n } catch (error) {\n log('Error', error);\n throw error;\n }\n }\n\n async #publishHook(\n transactionMeta: TransactionMeta,\n _signedTx: string,\n ): Promise<PublishHookResult> {\n const { id: transactionId } = transactionMeta;\n\n const controllerState = this.#messenger.call(\n 'TransactionPayController:getState',\n );\n\n const quotes =\n (controllerState.transactionData?.[transactionId]\n ?.quotes as TransactionPayQuote<unknown>[]) ?? [];\n\n if (!quotes?.length) {\n log('Skipping as no quotes found');\n return EMPTY_RESULT;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: this.#messenger,\n note: 'Set submittedTime at pay publish hook start',\n },\n (tx) => {\n tx.submittedTime = new Date().getTime();\n },\n );\n\n const strategy = getStrategyByName(quotes[0].strategy);\n const from = transactionMeta.txParams.from as Hex;\n\n return await strategy.execute({\n accountSupports7702: accountSupports7702(this.#messenger, from),\n isSmartTransaction: this.#isSmartTransaction,\n quotes,\n messenger: this.#messenger,\n transaction: transactionMeta,\n });\n }\n}\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AcrossStrategy = void 0;
|
|
4
4
|
const transaction_controller_1 = require("@metamask/transaction-controller");
|
|
5
5
|
const feature_flags_1 = require("../../utils/feature-flags.cjs");
|
|
6
|
+
const across_actions_1 = require("./across-actions.cjs");
|
|
6
7
|
const across_quotes_1 = require("./across-quotes.cjs");
|
|
7
8
|
const across_submit_1 = require("./across-submit.cjs");
|
|
8
9
|
const perps_1 = require("./perps.cjs");
|
|
@@ -18,10 +19,40 @@ class AcrossStrategy {
|
|
|
18
19
|
return false;
|
|
19
20
|
}
|
|
20
21
|
if (request.transaction?.type === transaction_controller_1.TransactionType.perpsDeposit) {
|
|
21
|
-
|
|
22
|
+
const supportsPerpsDeposit = actionableRequests.every((singleRequest) => (0, perps_1.isSupportedAcrossPerpsDepositRequest)(singleRequest, request.transaction?.type));
|
|
23
|
+
if (!supportsPerpsDeposit) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
else {
|
|
28
|
+
// Across doesn't support same-chain swaps (e.g. mUSD conversions).
|
|
29
|
+
const hasSameChainRequest = actionableRequests.some((singleRequest) => singleRequest.sourceChainId === singleRequest.targetChainId);
|
|
30
|
+
if (hasSameChainRequest) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Across cannot submit EIP-7702 authorization lists. This pre-quote check
|
|
35
|
+
// catches transactions where the authorization list is already present.
|
|
36
|
+
// First-time 7702 upgrades discovered during gas planning are handled in
|
|
37
|
+
// `checkQuoteSupport` below.
|
|
38
|
+
if (request.transaction.txParams?.authorizationList?.length) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return actionableRequests.every((singleRequest) => {
|
|
42
|
+
try {
|
|
43
|
+
(0, across_actions_1.getAcrossDestination)(request.transaction, singleRequest);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
checkQuoteSupport(request) {
|
|
52
|
+
// Gas planning can discover that TransactionController would add an
|
|
53
|
+
// authorization list for a first-time 7702 upgrade. `is7702` alone is not a
|
|
54
|
+
// blocker because it also covers already-upgraded accounts.
|
|
55
|
+
return !request.quotes.some((quote) => quote.original.metamask.requiresAuthorizationList);
|
|
25
56
|
}
|
|
26
57
|
async getQuotes(request) {
|
|
27
58
|
return (0, across_quotes_1.getAcrossQuotes)(request);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcrossStrategy.cjs","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;
|
|
1
|
+
{"version":3,"file":"AcrossStrategy.cjs","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;AASnE,iEAAmE;AACnE,yDAAwD;AACxD,uDAAkD;AAClD,uDAAqD;AACrD,uCAA+D;AAC/D,6CAAkD;AAGlD,MAAa,cAAc;IACzB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,IAAA,sCAAsB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,+BAAoB,CAAC,CAAC;QAEzE,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,wCAAe,CAAC,YAAY,EAAE,CAAC;YAC/D,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,EAAE,CACtE,IAAA,4CAAoC,EAClC,aAAa,EACb,OAAO,CAAC,WAAW,EAAE,IAAI,CAC1B,CACF,CAAC;YAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mEAAmE;YACnE,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,IAAI,CACjD,CAAC,aAAa,EAAE,EAAE,CAChB,aAAa,CAAC,aAAa,KAAK,aAAa,CAAC,aAAa,CAC9D,CAAC;YAEF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,6BAA6B;QAC7B,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,IAAA,qCAAoB,EAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CACf,OAAyD;QAEzD,oEAAoE;QACpE,4EAA4E;QAC5E,4DAA4D;QAC5D,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAC7D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,IAAA,+BAAe,EAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA+C;QAE/C,OAAO,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF;AA7ED,wCA6EC","sourcesContent":["import { TransactionType } from '@metamask/transaction-controller';\n\nimport type {\n PayStrategy,\n PayStrategyCheckQuoteSupportRequest,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\nimport { getAcrossDestination } from './across-actions';\nimport { getAcrossQuotes } from './across-quotes';\nimport { submitAcrossQuotes } from './across-submit';\nimport { isSupportedAcrossPerpsDepositRequest } from './perps';\nimport { isAcrossQuoteRequest } from './requests';\nimport type { AcrossQuote } from './types';\n\nexport class AcrossStrategy implements PayStrategy<AcrossQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n\n if (!config.across.enabled) {\n return false;\n }\n\n const actionableRequests = request.requests.filter(isAcrossQuoteRequest);\n\n if (actionableRequests.length === 0) {\n return false;\n }\n\n if (request.transaction?.type === TransactionType.perpsDeposit) {\n const supportsPerpsDeposit = actionableRequests.every((singleRequest) =>\n isSupportedAcrossPerpsDepositRequest(\n singleRequest,\n request.transaction?.type,\n ),\n );\n\n if (!supportsPerpsDeposit) {\n return false;\n }\n } else {\n // Across doesn't support same-chain swaps (e.g. mUSD conversions).\n const hasSameChainRequest = actionableRequests.some(\n (singleRequest) =>\n singleRequest.sourceChainId === singleRequest.targetChainId,\n );\n\n if (hasSameChainRequest) {\n return false;\n }\n }\n\n // Across cannot submit EIP-7702 authorization lists. This pre-quote check\n // catches transactions where the authorization list is already present.\n // First-time 7702 upgrades discovered during gas planning are handled in\n // `checkQuoteSupport` below.\n if (request.transaction.txParams?.authorizationList?.length) {\n return false;\n }\n\n return actionableRequests.every((singleRequest) => {\n try {\n getAcrossDestination(request.transaction, singleRequest);\n return true;\n } catch {\n return false;\n }\n });\n }\n\n checkQuoteSupport(\n request: PayStrategyCheckQuoteSupportRequest<AcrossQuote>,\n ): boolean {\n // Gas planning can discover that TransactionController would add an\n // authorization list for a first-time 7702 upgrade. `is7702` alone is not a\n // blocker because it also covers already-upgraded accounts.\n return !request.quotes.some(\n (quote) => quote.original.metamask.requiresAuthorizationList,\n );\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<AcrossQuote>[]> {\n return getAcrossQuotes(request);\n }\n\n async execute(\n request: PayStrategyExecuteRequest<AcrossQuote>,\n ): ReturnType<PayStrategy<AcrossQuote>['execute']> {\n return submitAcrossQuotes(request);\n }\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { PayStrategy, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.cjs";
|
|
1
|
+
import type { PayStrategy, PayStrategyCheckQuoteSupportRequest, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.cjs";
|
|
2
2
|
import type { AcrossQuote } from "./types.cjs";
|
|
3
3
|
export declare class AcrossStrategy implements PayStrategy<AcrossQuote> {
|
|
4
4
|
supports(request: PayStrategyGetQuotesRequest): boolean;
|
|
5
|
+
checkQuoteSupport(request: PayStrategyCheckQuoteSupportRequest<AcrossQuote>): boolean;
|
|
5
6
|
getQuotes(request: PayStrategyGetQuotesRequest): Promise<TransactionPayQuote<AcrossQuote>[]>;
|
|
6
7
|
execute(request: PayStrategyExecuteRequest<AcrossQuote>): ReturnType<PayStrategy<AcrossQuote>['execute']>;
|
|
7
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcrossStrategy.d.cts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;
|
|
1
|
+
{"version":3,"file":"AcrossStrategy.d.cts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAOrB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAE3C,qBAAa,cAAe,YAAW,WAAW,CAAC,WAAW,CAAC;IAC7D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAsDvD,iBAAiB,CACf,OAAO,EAAE,mCAAmC,CAAC,WAAW,CAAC,GACxD,OAAO;IASJ,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;IAIxC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC;CAGnD"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { PayStrategy, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.mjs";
|
|
1
|
+
import type { PayStrategy, PayStrategyCheckQuoteSupportRequest, PayStrategyExecuteRequest, PayStrategyGetQuotesRequest, TransactionPayQuote } from "../../types.mjs";
|
|
2
2
|
import type { AcrossQuote } from "./types.mjs";
|
|
3
3
|
export declare class AcrossStrategy implements PayStrategy<AcrossQuote> {
|
|
4
4
|
supports(request: PayStrategyGetQuotesRequest): boolean;
|
|
5
|
+
checkQuoteSupport(request: PayStrategyCheckQuoteSupportRequest<AcrossQuote>): boolean;
|
|
5
6
|
getQuotes(request: PayStrategyGetQuotesRequest): Promise<TransactionPayQuote<AcrossQuote>[]>;
|
|
6
7
|
execute(request: PayStrategyExecuteRequest<AcrossQuote>): ReturnType<PayStrategy<AcrossQuote>['execute']>;
|
|
7
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcrossStrategy.d.mts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;
|
|
1
|
+
{"version":3,"file":"AcrossStrategy.d.mts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,wBAAoB;AAOrB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAE3C,qBAAa,cAAe,YAAW,WAAW,CAAC,WAAW,CAAC;IAC7D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO;IAsDvD,iBAAiB,CACf,OAAO,EAAE,mCAAmC,CAAC,WAAW,CAAC,GACxD,OAAO;IASJ,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;IAIxC,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC;CAGnD"}
|