@metamask-previews/transaction-pay-controller 31.2.0-preview-fe3c580ff → 31.2.1-preview-906029d47
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 +31 -1
- package/dist/TransactionPayController.d.ts.map +1 -1
- package/dist/TransactionPayController.js +4 -5
- package/dist/TransactionPayController.js.map +1 -1
- package/dist/actions/update-payment-token.d.ts.map +1 -1
- package/dist/actions/update-payment-token.js +51 -22
- package/dist/actions/update-payment-token.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/strategy/across/AcrossStrategy.d.ts.map +1 -1
- package/dist/strategy/across/AcrossStrategy.js +6 -1
- package/dist/strategy/across/AcrossStrategy.js.map +1 -1
- package/dist/strategy/across/across-quotes.js +7 -4
- package/dist/strategy/across/across-quotes.js.map +1 -1
- package/dist/strategy/across/across-submit.d.ts.map +1 -1
- package/dist/strategy/across/across-submit.js +3 -1
- package/dist/strategy/across/across-submit.js.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.ts +1 -0
- package/dist/strategy/fiat/FiatStrategy.d.ts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.js +4 -0
- package/dist/strategy/fiat/FiatStrategy.js.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.js +4 -2
- package/dist/strategy/fiat/fiat-direct-musd.js.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.js +4 -2
- package/dist/strategy/fiat/fiat-quotes.js.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.js +5 -2
- package/dist/strategy/fiat/fiat-submit.js.map +1 -1
- package/dist/strategy/fiat/fiat-test-funding.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-test-funding.js +3 -5
- package/dist/strategy/fiat/fiat-test-funding.js.map +1 -1
- package/dist/strategy/relay/RelayStrategy.d.ts +4 -0
- package/dist/strategy/relay/RelayStrategy.d.ts.map +1 -1
- package/dist/strategy/relay/RelayStrategy.js +6 -1
- package/dist/strategy/relay/RelayStrategy.js.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.ts.map +1 -1
- package/dist/strategy/relay/relay-quotes.js +10 -6
- package/dist/strategy/relay/relay-quotes.js.map +1 -1
- package/dist/strategy/relay/relay-submit-execute.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit-execute.js +3 -1
- package/dist/strategy/relay/relay-submit-execute.js.map +1 -1
- package/dist/strategy/relay/relay-submit.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit.js +8 -6
- package/dist/strategy/relay/relay-submit.js.map +1 -1
- package/dist/strategy/relay/relay-validation.d.ts.map +1 -1
- package/dist/strategy/relay/relay-validation.js +5 -2
- package/dist/strategy/relay/relay-validation.js.map +1 -1
- package/dist/strategy/server/ServerStrategy.d.ts.map +1 -1
- package/dist/strategy/server/ServerStrategy.js +4 -0
- package/dist/strategy/server/ServerStrategy.js.map +1 -1
- package/dist/strategy/server/server-quotes.js +7 -4
- package/dist/strategy/server/server-quotes.js.map +1 -1
- package/dist/strategy/server/server-submit.d.ts.map +1 -1
- package/dist/strategy/server/server-submit.js +9 -6
- package/dist/strategy/server/server-submit.js.map +1 -1
- package/dist/strategy/server/server-validation.d.ts.map +1 -1
- package/dist/strategy/server/server-validation.js +3 -1
- package/dist/strategy/server/server-validation.js.map +1 -1
- package/dist/types.d.ts +60 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/account.d.ts +54 -0
- package/dist/utils/account.d.ts.map +1 -1
- package/dist/utils/account.js +124 -0
- package/dist/utils/account.js.map +1 -1
- package/dist/utils/gas-payment.d.ts +12 -3
- package/dist/utils/gas-payment.d.ts.map +1 -1
- package/dist/utils/gas-payment.js +2 -2
- package/dist/utils/gas-payment.js.map +1 -1
- package/dist/utils/max-gas-station.d.ts.map +1 -1
- package/dist/utils/max-gas-station.js +9 -5
- package/dist/utils/max-gas-station.js.map +1 -1
- package/dist/utils/max-quote.js +3 -2
- package/dist/utils/max-quote.js.map +1 -1
- package/dist/utils/no-op-quote.d.ts +3 -3
- package/dist/utils/no-op-quote.d.ts.map +1 -1
- package/dist/utils/no-op-quote.js +4 -3
- package/dist/utils/no-op-quote.js.map +1 -1
- package/dist/utils/perps.d.ts.map +1 -1
- package/dist/utils/perps.js +5 -2
- package/dist/utils/perps.js.map +1 -1
- package/dist/utils/post-quote.js +4 -3
- package/dist/utils/post-quote.js.map +1 -1
- package/dist/utils/quotes.d.ts.map +1 -1
- package/dist/utils/quotes.js +99 -25
- package/dist/utils/quotes.js.map +1 -1
- package/dist/utils/source-amounts.d.ts.map +1 -1
- package/dist/utils/source-amounts.js +25 -4
- package/dist/utils/source-amounts.js.map +1 -1
- package/dist/utils/token.d.ts +84 -1
- package/dist/utils/token.d.ts.map +1 -1
- package/dist/utils/token.js +144 -13
- package/dist/utils/token.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +14 -11
- package/dist/utils/validation.js.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Support non-EVM payment tokens, such as Solana SOL and SPL tokens ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
13
|
+
- `updatePaymentToken` accepts a non-EVM `assetId`, reading its metadata, balance, and price from `AssetsController` state.
|
|
14
|
+
- The non-EVM source account defaults to the account in the same account group as the transaction account that supports the asset chain, or is selected explicitly by `accountOverride`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **BREAKING:** `TransactionPaymentToken` is identified by its CAIP-19 `assetId` for every chain ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
19
|
+
- Remove `address` and `chainId`; derive them from `assetId` where needed.
|
|
20
|
+
- **BREAKING:** `UpdatePaymentTokenRequest` takes `{ transactionId, assetId }` instead of `{ transactionId, tokenAddress, chainId }` ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
21
|
+
- **BREAKING:** `accountOverride` in `TransactionConfig` and `TransactionData` is now the ID of an `InternalAccount` instead of an address ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
22
|
+
- An EVM account overrides the EVM account as before. The account holding a non-EVM payment token is the override account when it supports the payment token chain, otherwise the account in the same account group as the override account, or as the transaction account, that supports that chain.
|
|
23
|
+
- Fiat payments throw if the account override is not an EVM account.
|
|
24
|
+
- **BREAKING:** `TransactionPayControllerMessenger` requires the `AccountTreeController:getAccountContext` and `AccountTreeController:getAccountGroupObject` actions ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
25
|
+
- **BREAKING:** The `request` of a `TransactionPayQuote` identifies its source by CAIP identifiers for every protocol ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
26
|
+
- Remove `sourceChainId` and `sourceTokenAddress`. Add the CAIP-19 `sourceAssetId` and the CAIP-10 `sourceAccountId` of the account holding the source token, and derive an EVM chain ID and token address from `sourceAssetId` where needed.
|
|
27
|
+
- Quote requests are built the same way for every payment token. Post-quote flows with a non-EVM destination token produce no quote requests.
|
|
28
|
+
- `AcrossStrategy`, `RelayStrategy`, `ServerStrategy` and `FiatStrategy` only support requests with an `eip155` source asset.
|
|
29
|
+
- `PayStrategyGetRefreshIntervalRequest.chainId` is the CAIP-2 chain ID of the source asset.
|
|
30
|
+
- Add dependency on `@metamask/account-tree-controller` `^11.2.0` ([#10272](https://github.com/MetaMask/core/pull/10272))
|
|
31
|
+
|
|
32
|
+
## [31.2.1]
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- Bump `@metamask/assets-controller` from `^20.4.0` to `^20.4.1` ([#11472](https://github.com/MetaMask/core/pull/11472))
|
|
37
|
+
- Bump `@metamask/transaction-controller` from `^73.1.2` to `^74.0.0` ([#11472](https://github.com/MetaMask/core/pull/11472))
|
|
38
|
+
|
|
10
39
|
## [31.2.0]
|
|
11
40
|
|
|
12
41
|
### Added
|
|
@@ -1869,7 +1898,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1869
1898
|
|
|
1870
1899
|
- Initial release ([#6820](https://github.com/MetaMask/core/pull/6820))
|
|
1871
1900
|
|
|
1872
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@31.2.
|
|
1901
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@31.2.1...HEAD
|
|
1902
|
+
[31.2.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@31.2.0...@metamask/transaction-pay-controller@31.2.1
|
|
1873
1903
|
[31.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@31.1.0...@metamask/transaction-pay-controller@31.2.0
|
|
1874
1904
|
[31.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@31.0.0...@metamask/transaction-pay-controller@31.1.0
|
|
1875
1905
|
[31.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-pay-controller@30.4.3...@metamask/transaction-pay-controller@31.0.0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.ts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EACV,qBAAqB,EAErB,gCAAgC,EAChC,8BAA8B,EAC9B,mBAAmB,EAEnB,yBAAyB,EAEzB,iCAAiC,EACjC,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.ts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EACV,qBAAqB,EAErB,gCAAgC,EAChC,8BAA8B,EAC9B,mBAAmB,EAEnB,yBAAyB,EAEzB,iCAAiC,EACjC,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAqCpB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;IAuBC,YAAY,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,KAAK,GACN,EAAE,+BAA+B,EA0CjC;IAED;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,yBAAyB,GAClC,IAAI,CA2BN;IAED;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAK3D;IAED;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAKzD;IAED;;;;;;;;OAQG;IACH,WAAW,IAAI,sBAAsB,GAAG,SAAS,CAEhD;IAED;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAI,EAAE,UAAU,CAAC,gCAAgC,CAAC,GACpD,UAAU,CAAC,gCAAgC,CAAC,CAE9C;IAED;;;;;;;;;OASG;IACH,aAAa,CACX,GAAG,IAAI,EAAE,UAAU,CAAC,qBAAqB,CAAC,GACzC,UAAU,CAAC,qBAAqB,CAAC,CAEnC;IAED;;;;;;OAMG;IACH,cAAc,IAAI,yBAAyB,GAAG,SAAS,CAEtD;IAED,sBAAsB,CACpB,GAAG,IAAI,EAAE,UAAU,CAAC,8BAA8B,CAAC,GAClD,UAAU,CAAC,8BAA8B,CAAC,CAI5C;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,sBAAsB,CAEhE;IAED;;;;;;OAMG;IACH,iCAAiC,CAC/B,GAAG,IAAI,EAAE,UAAU,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC,GAClE,UAAU,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC,CAE5D;IAED;;;;;;OAMG;IACH,kCAAkC,CAChC,GAAG,IAAI,EAAE,UAAU,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC,GACnE,UAAU,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC,CAE7D;CA+IF"}
|
|
@@ -7,6 +7,7 @@ import { QuoteRefresher } from './helpers/QuoteRefresher.js';
|
|
|
7
7
|
import { getStrategyOrder } from './utils/feature-flags.js';
|
|
8
8
|
import { updateQuotes } from './utils/quotes.js';
|
|
9
9
|
import { updateSourceAmounts } from './utils/source-amounts.js';
|
|
10
|
+
import { getEvmPaymentToken } from './utils/token.js';
|
|
10
11
|
import { subscribeAssetChanges, subscribeTransactionChanges, } from './utils/transaction.js';
|
|
11
12
|
const MESSENGER_EXPOSED_METHODS = [
|
|
12
13
|
'getAmountData',
|
|
@@ -250,9 +251,7 @@ export class TransactionPayController extends BaseController {
|
|
|
250
251
|
current = transactionData[transactionId];
|
|
251
252
|
}
|
|
252
253
|
fn(current);
|
|
253
|
-
const isPaymentTokenUpdated = current.paymentToken?.
|
|
254
|
-
originalPaymentToken?.address?.toLowerCase() ||
|
|
255
|
-
current.paymentToken?.chainId !== originalPaymentToken?.chainId;
|
|
254
|
+
const isPaymentTokenUpdated = current.paymentToken?.assetId !== originalPaymentToken?.assetId;
|
|
256
255
|
const isPaymentTokenBalanceUpdated = current.paymentToken?.balanceRaw !== originalPaymentToken?.balanceRaw;
|
|
257
256
|
const isTokensUpdated = current.tokens !== originalTokens;
|
|
258
257
|
const isIsMaxUpdated = current.isMaxAmount !== originalIsMaxAmount;
|
|
@@ -309,8 +308,8 @@ export class TransactionPayController extends BaseController {
|
|
|
309
308
|
if (validStrategies.length) {
|
|
310
309
|
return validStrategies;
|
|
311
310
|
}
|
|
312
|
-
const
|
|
313
|
-
return getStrategyOrder(this.messenger,
|
|
311
|
+
const evmPaymentToken = getEvmPaymentToken(transactionData?.paymentToken);
|
|
312
|
+
return getStrategyOrder(this.messenger, evmPaymentToken?.chainId, evmPaymentToken?.address, transaction.type, transactionData?.fiatPayment?.selectedPaymentMethodId);
|
|
314
313
|
}
|
|
315
314
|
}
|
|
316
315
|
//# sourceMappingURL=TransactionPayController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.js","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-es';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment.js';\nimport { updatePaymentToken } from './actions/update-payment-token.js';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants.js';\nimport type { TransactionPayClientId } from './constants.js';\nimport { QuoteRefresher } from './helpers/QuoteRefresher.js';\nimport type {\n GetAmountDataCallback,\n GetBalanceCallback,\n GetDelegationTransactionCallback,\n GetPaymentOverrideDataCallback,\n PolymarketCallbacks,\n TransactionConfig,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayFiatOptions,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types.js';\nimport { getStrategyOrder } from './utils/feature-flags.js';\nimport { updateQuotes } from './utils/quotes.js';\nimport { updateSourceAmounts } from './utils/source-amounts.js';\nimport {\n subscribeAssetChanges,\n subscribeTransactionChanges,\n} from './utils/transaction.js';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getAmountData',\n 'getClientId',\n 'getDelegationTransaction',\n 'getFiatOptions',\n 'getPaymentOverrideData',\n 'getStrategy',\n 'polymarketGetDepositWalletAddress',\n 'polymarketSubmitDepositWalletBatch',\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 #clientId?: TransactionPayClientId;\n\n readonly #fiatOptions?: TransactionPayFiatOptions;\n\n readonly #getAmountData?: GetAmountDataCallback;\n\n readonly #getBalance?: GetBalanceCallback;\n\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getPaymentOverrideData?: GetPaymentOverrideDataCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n readonly #polymarket?: PolymarketCallbacks;\n\n constructor({\n clientId,\n fiatOptions,\n getAmountData,\n getBalance,\n getDelegationTransaction,\n getPaymentOverrideData,\n getStrategy,\n getStrategies,\n messenger,\n polymarket,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#clientId = clientId;\n this.#fiatOptions = fiatOptions;\n this.#getAmountData = getAmountData;\n this.#getBalance = getBalance;\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getPaymentOverrideData = getPaymentOverrideData;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n this.#polymarket = polymarket;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n subscribeTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n subscribeAssetChanges(\n messenger,\n () => this.state,\n this.#updateTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getBalance: this.#getBalance,\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: TransactionConfig = {\n accountOverride: transactionData.accountOverride,\n atomic: transactionData.atomic,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n isMaxAmount: transactionData.isMaxAmount,\n isPolymarketDepositWallet: transactionData.isPolymarketDepositWallet,\n isPostQuote: transactionData.isPostQuote,\n isQuoteRequired: transactionData.isQuoteRequired,\n paymentOverride: transactionData.paymentOverride,\n refundTo: transactionData.refundTo,\n };\n\n const previousAccountOverride = config.accountOverride;\n\n callback(config);\n\n Object.assign(transactionData, config);\n\n if (\n !config.isPostQuote &&\n config.accountOverride !== previousAccountOverride\n ) {\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 * Returns the configured client identifier.\n *\n * Used to set the `X-Client-Id` header on intents API requests so the\n * server can distinguish Mobile from Extension traffic. This is\n * intentionally not stored in controller state.\n *\n * @returns The client identifier, if configured.\n */\n getClientId(): TransactionPayClientId | undefined {\n return this.#clientId;\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 * Returns additional transactions for the paymentOverride flow.\n *\n * Delegates to the client-supplied {@link GetPaymentOverrideDataCallback}.\n * Called during quote execution when `paymentOverride` is defined on the transaction.\n * Returns an empty array when no callback is configured.\n *\n * @param args - The arguments forwarded to the {@link GetPaymentOverrideDataCallback}.\n * @returns A promise resolving to the additional transactions array.\n */\n getAmountData(\n ...args: Parameters<GetAmountDataCallback>\n ): ReturnType<GetAmountDataCallback> {\n return this.#getAmountData?.(...args) ?? Promise.resolve({ updates: [] });\n }\n\n /**\n * Returns optional fiat execution configuration.\n *\n * This is intentionally not stored in controller state.\n *\n * @returns Fiat execution options, if configured.\n */\n getFiatOptions(): TransactionPayFiatOptions | undefined {\n return this.#fiatOptions;\n }\n\n getPaymentOverrideData(\n ...args: Parameters<GetPaymentOverrideDataCallback>\n ): ReturnType<GetPaymentOverrideDataCallback> {\n return (\n this.#getPaymentOverrideData?.(...args) ?? Promise.resolve({ calls: [] })\n );\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 /**\n * Derives the Polymarket deposit-wallet address for an EOA via the\n * client-supplied callback.\n *\n * @param args - The arguments forwarded to {@link PolymarketCallbacks.getDepositWalletAddress}.\n * @returns A promise resolving to the deposit-wallet address.\n */\n polymarketGetDepositWalletAddress(\n ...args: Parameters<PolymarketCallbacks['getDepositWalletAddress']>\n ): ReturnType<PolymarketCallbacks['getDepositWalletAddress']> {\n return this.#requirePolymarket().getDepositWalletAddress(...args);\n }\n\n /**\n * Signs and broadcasts a Polymarket deposit-wallet batch via the\n * client-supplied callback.\n *\n * @param args - The arguments forwarded to {@link PolymarketCallbacks.submitDepositWalletBatch}.\n * @returns A promise resolving to the relayer-issued source hash.\n */\n polymarketSubmitDepositWalletBatch(\n ...args: Parameters<PolymarketCallbacks['submitDepositWalletBatch']>\n ): ReturnType<PolymarketCallbacks['submitDepositWalletBatch']> {\n return this.#requirePolymarket().submitDepositWalletBatch(...args);\n }\n\n #requirePolymarket(): PolymarketCallbacks {\n if (!this.#polymarket) {\n throw new Error('TransactionPayController: Polymarket callbacks missing');\n }\n return this.#polymarket;\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 const originalFiatPaymentAmount = current?.fiatPayment?.amountFiat;\n const originalFiatPaymentMethodId =\n current?.fiatPayment?.selectedPaymentMethodId;\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 isPaymentTokenBalanceUpdated =\n current.paymentToken?.balanceRaw !== originalPaymentToken?.balanceRaw;\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 const isFiatAmountUpdated =\n current.fiatPayment?.amountFiat !== originalFiatPaymentAmount;\n const isFiatPaymentMethodUpdated =\n current.fiatPayment?.selectedPaymentMethodId !==\n originalFiatPaymentMethodId;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated ||\n isAccountOverrideUpdated\n ) {\n updateSourceAmounts(\n transactionId,\n /* oxlint-disable typescript/no-unnecessary-type-assertion */\n current as never,\n /* oxlint-enable typescript/no-unnecessary-type-assertion */\n this.messenger,\n this.#getBalance,\n );\n\n shouldUpdateQuotes = true;\n } else if (\n isPaymentTokenBalanceUpdated &&\n current.isMaxAmount &&\n !current.isPostQuote\n ) {\n // On max the source amount is the payment token balance, so a\n // refreshed balance must re-derive it, otherwise the amount stays at\n // whatever the balance was when the token was selected. Quotes are not\n // requested again here: the balance is refreshed by `updateQuotes`\n // itself, which reads the re-derived amounts before building requests.\n updateSourceAmounts(\n transactionId,\n /* oxlint-disable typescript/no-unnecessary-type-assertion */\n current as never,\n /* oxlint-enable typescript/no-unnecessary-type-assertion */\n this.messenger,\n this.#getBalance,\n );\n }\n\n if (isFiatAmountUpdated || isFiatPaymentMethodUpdated) {\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 transactionData = this.state.transactionData[transaction.id];\n\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 = transactionData?.paymentToken;\n\n return getStrategyOrder(\n this.messenger,\n paymentToken?.chainId,\n paymentToken?.address,\n transaction.type,\n transactionData?.fiatPayment?.selectedPaymentMethodId,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController.js","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-es';\n\nimport { updateFiatPayment } from './actions/update-fiat-payment.js';\nimport { updatePaymentToken } from './actions/update-payment-token.js';\nimport {\n CONTROLLER_NAME,\n isTransactionPayStrategy,\n TransactionPayStrategy,\n} from './constants.js';\nimport type { TransactionPayClientId } from './constants.js';\nimport { QuoteRefresher } from './helpers/QuoteRefresher.js';\nimport type {\n GetAmountDataCallback,\n GetBalanceCallback,\n GetDelegationTransactionCallback,\n GetPaymentOverrideDataCallback,\n PolymarketCallbacks,\n TransactionConfig,\n TransactionConfigCallback,\n TransactionData,\n TransactionPayControllerMessenger,\n TransactionPayFiatOptions,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types.js';\nimport { getStrategyOrder } from './utils/feature-flags.js';\nimport { updateQuotes } from './utils/quotes.js';\nimport { updateSourceAmounts } from './utils/source-amounts.js';\nimport { getEvmPaymentToken } from './utils/token.js';\nimport {\n subscribeAssetChanges,\n subscribeTransactionChanges,\n} from './utils/transaction.js';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getAmountData',\n 'getClientId',\n 'getDelegationTransaction',\n 'getFiatOptions',\n 'getPaymentOverrideData',\n 'getStrategy',\n 'polymarketGetDepositWalletAddress',\n 'polymarketSubmitDepositWalletBatch',\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 #clientId?: TransactionPayClientId;\n\n readonly #fiatOptions?: TransactionPayFiatOptions;\n\n readonly #getAmountData?: GetAmountDataCallback;\n\n readonly #getBalance?: GetBalanceCallback;\n\n readonly #getDelegationTransaction: GetDelegationTransactionCallback;\n\n readonly #getPaymentOverrideData?: GetPaymentOverrideDataCallback;\n\n readonly #getStrategy?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy;\n\n readonly #getStrategies?: (\n transaction: TransactionMeta,\n ) => TransactionPayStrategy[];\n\n readonly #polymarket?: PolymarketCallbacks;\n\n constructor({\n clientId,\n fiatOptions,\n getAmountData,\n getBalance,\n getDelegationTransaction,\n getPaymentOverrideData,\n getStrategy,\n getStrategies,\n messenger,\n polymarket,\n state,\n }: TransactionPayControllerOptions) {\n super({\n name: CONTROLLER_NAME,\n metadata: stateMetadata,\n messenger,\n state: { ...getDefaultState(), ...state },\n });\n\n this.#clientId = clientId;\n this.#fiatOptions = fiatOptions;\n this.#getAmountData = getAmountData;\n this.#getBalance = getBalance;\n this.#getDelegationTransaction = getDelegationTransaction;\n this.#getPaymentOverrideData = getPaymentOverrideData;\n this.#getStrategy = getStrategy;\n this.#getStrategies = getStrategies;\n this.#polymarket = polymarket;\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n subscribeTransactionChanges(\n messenger,\n this.#updateTransactionData.bind(this),\n this.#removeTransactionData.bind(this),\n );\n\n subscribeAssetChanges(\n messenger,\n () => this.state,\n this.#updateTransactionData.bind(this),\n );\n\n // eslint-disable-next-line no-new\n new QuoteRefresher({\n getBalance: this.#getBalance,\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: TransactionConfig = {\n accountOverride: transactionData.accountOverride,\n atomic: transactionData.atomic,\n isHyperliquidSource: transactionData.isHyperliquidSource,\n isMaxAmount: transactionData.isMaxAmount,\n isPolymarketDepositWallet: transactionData.isPolymarketDepositWallet,\n isPostQuote: transactionData.isPostQuote,\n isQuoteRequired: transactionData.isQuoteRequired,\n paymentOverride: transactionData.paymentOverride,\n refundTo: transactionData.refundTo,\n };\n\n const previousAccountOverride = config.accountOverride;\n\n callback(config);\n\n Object.assign(transactionData, config);\n\n if (\n !config.isPostQuote &&\n config.accountOverride !== previousAccountOverride\n ) {\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 * Returns the configured client identifier.\n *\n * Used to set the `X-Client-Id` header on intents API requests so the\n * server can distinguish Mobile from Extension traffic. This is\n * intentionally not stored in controller state.\n *\n * @returns The client identifier, if configured.\n */\n getClientId(): TransactionPayClientId | undefined {\n return this.#clientId;\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 * Returns additional transactions for the paymentOverride flow.\n *\n * Delegates to the client-supplied {@link GetPaymentOverrideDataCallback}.\n * Called during quote execution when `paymentOverride` is defined on the transaction.\n * Returns an empty array when no callback is configured.\n *\n * @param args - The arguments forwarded to the {@link GetPaymentOverrideDataCallback}.\n * @returns A promise resolving to the additional transactions array.\n */\n getAmountData(\n ...args: Parameters<GetAmountDataCallback>\n ): ReturnType<GetAmountDataCallback> {\n return this.#getAmountData?.(...args) ?? Promise.resolve({ updates: [] });\n }\n\n /**\n * Returns optional fiat execution configuration.\n *\n * This is intentionally not stored in controller state.\n *\n * @returns Fiat execution options, if configured.\n */\n getFiatOptions(): TransactionPayFiatOptions | undefined {\n return this.#fiatOptions;\n }\n\n getPaymentOverrideData(\n ...args: Parameters<GetPaymentOverrideDataCallback>\n ): ReturnType<GetPaymentOverrideDataCallback> {\n return (\n this.#getPaymentOverrideData?.(...args) ?? Promise.resolve({ calls: [] })\n );\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 /**\n * Derives the Polymarket deposit-wallet address for an EOA via the\n * client-supplied callback.\n *\n * @param args - The arguments forwarded to {@link PolymarketCallbacks.getDepositWalletAddress}.\n * @returns A promise resolving to the deposit-wallet address.\n */\n polymarketGetDepositWalletAddress(\n ...args: Parameters<PolymarketCallbacks['getDepositWalletAddress']>\n ): ReturnType<PolymarketCallbacks['getDepositWalletAddress']> {\n return this.#requirePolymarket().getDepositWalletAddress(...args);\n }\n\n /**\n * Signs and broadcasts a Polymarket deposit-wallet batch via the\n * client-supplied callback.\n *\n * @param args - The arguments forwarded to {@link PolymarketCallbacks.submitDepositWalletBatch}.\n * @returns A promise resolving to the relayer-issued source hash.\n */\n polymarketSubmitDepositWalletBatch(\n ...args: Parameters<PolymarketCallbacks['submitDepositWalletBatch']>\n ): ReturnType<PolymarketCallbacks['submitDepositWalletBatch']> {\n return this.#requirePolymarket().submitDepositWalletBatch(...args);\n }\n\n #requirePolymarket(): PolymarketCallbacks {\n if (!this.#polymarket) {\n throw new Error('TransactionPayController: Polymarket callbacks missing');\n }\n return this.#polymarket;\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 const originalFiatPaymentAmount = current?.fiatPayment?.amountFiat;\n const originalFiatPaymentMethodId =\n current?.fiatPayment?.selectedPaymentMethodId;\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?.assetId !== originalPaymentToken?.assetId;\n\n const isPaymentTokenBalanceUpdated =\n current.paymentToken?.balanceRaw !== originalPaymentToken?.balanceRaw;\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 const isFiatAmountUpdated =\n current.fiatPayment?.amountFiat !== originalFiatPaymentAmount;\n const isFiatPaymentMethodUpdated =\n current.fiatPayment?.selectedPaymentMethodId !==\n originalFiatPaymentMethodId;\n\n if (\n isPaymentTokenUpdated ||\n isIsMaxUpdated ||\n isTokensUpdated ||\n isPostQuoteUpdated ||\n isAccountOverrideUpdated\n ) {\n updateSourceAmounts(\n transactionId,\n /* oxlint-disable typescript/no-unnecessary-type-assertion */\n current as never,\n /* oxlint-enable typescript/no-unnecessary-type-assertion */\n this.messenger,\n this.#getBalance,\n );\n\n shouldUpdateQuotes = true;\n } else if (\n isPaymentTokenBalanceUpdated &&\n current.isMaxAmount &&\n !current.isPostQuote\n ) {\n // On max the source amount is the payment token balance, so a\n // refreshed balance must re-derive it, otherwise the amount stays at\n // whatever the balance was when the token was selected. Quotes are not\n // requested again here: the balance is refreshed by `updateQuotes`\n // itself, which reads the re-derived amounts before building requests.\n updateSourceAmounts(\n transactionId,\n /* oxlint-disable typescript/no-unnecessary-type-assertion */\n current as never,\n /* oxlint-enable typescript/no-unnecessary-type-assertion */\n this.messenger,\n this.#getBalance,\n );\n }\n\n if (isFiatAmountUpdated || isFiatPaymentMethodUpdated) {\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 transactionData = this.state.transactionData[transaction.id];\n\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 evmPaymentToken = getEvmPaymentToken(transactionData?.paymentToken);\n\n return getStrategyOrder(\n this.messenger,\n evmPaymentToken?.chainId,\n evmPaymentToken?.address,\n transaction.type,\n transactionData?.fiatPayment?.selectedPaymentMethodId,\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.d.ts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"update-payment-token.d.ts","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,KAAK,EAEV,yBAAyB,EACzB,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAarB,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,CA2CN"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createModuleLogger } from '@metamask/utils';
|
|
2
2
|
import { projectLogger } from '../logger.js';
|
|
3
|
-
import {
|
|
3
|
+
import { getEvmAccountAddress, getAssetAccount } from '../utils/account.js';
|
|
4
|
+
import { computeTokenAmounts, getAssetBalance, getAssetFiatRate, getAssetInfo, getEvmAsset, } from '../utils/token.js';
|
|
4
5
|
import { getTransaction } from '../utils/transaction.js';
|
|
5
6
|
const log = createModuleLogger(projectLogger, 'update-payment-token');
|
|
6
7
|
/**
|
|
@@ -10,7 +11,7 @@ const log = createModuleLogger(projectLogger, 'update-payment-token');
|
|
|
10
11
|
* @param options - Options bag.
|
|
11
12
|
*/
|
|
12
13
|
export function updatePaymentToken(request, options) {
|
|
13
|
-
const {
|
|
14
|
+
const { assetId, transactionId } = request;
|
|
14
15
|
const { messenger, updateTransactionData } = options;
|
|
15
16
|
const transaction = getTransaction(transactionId, messenger);
|
|
16
17
|
if (!transaction) {
|
|
@@ -19,11 +20,16 @@ export function updatePaymentToken(request, options) {
|
|
|
19
20
|
const state = messenger.call('TransactionPayController:getState');
|
|
20
21
|
const transactionPayData = state.transactionData[transactionId];
|
|
21
22
|
const accountOverride = transactionPayData?.accountOverride;
|
|
23
|
+
const from = transaction.txParams.from;
|
|
22
24
|
const paymentToken = getPaymentToken({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
accountId: getAssetAccountId({
|
|
26
|
+
accountOverride,
|
|
27
|
+
assetId,
|
|
28
|
+
from,
|
|
29
|
+
messenger,
|
|
30
|
+
}),
|
|
31
|
+
assetId,
|
|
25
32
|
messenger,
|
|
26
|
-
tokenAddress,
|
|
27
33
|
// For post-quote (withdraw) flows the selected token is the receive
|
|
28
34
|
// destination, which may live on a chain the wallet does not actively
|
|
29
35
|
// track, so no local market price or native-currency rate exists.
|
|
@@ -42,43 +48,66 @@ export function updatePaymentToken(request, options) {
|
|
|
42
48
|
});
|
|
43
49
|
}
|
|
44
50
|
/**
|
|
45
|
-
* Generate the full payment token data
|
|
51
|
+
* Generate the full payment token data for an asset from `AssetsController`
|
|
52
|
+
* state.
|
|
46
53
|
*
|
|
47
54
|
* @param request - The payment token request parameters.
|
|
48
|
-
* @param request.
|
|
49
|
-
* @param request.
|
|
55
|
+
* @param request.accountId - ID of the `InternalAccount` holding the asset.
|
|
56
|
+
* @param request.assetId - CAIP-19 asset type of the payment token.
|
|
50
57
|
* @param request.messenger - The transaction pay controller messenger.
|
|
51
|
-
* @param request.tokenAddress - The token address.
|
|
52
58
|
* @param request.allowMissingFiatRate - Whether to resolve the token with
|
|
53
59
|
* zeroed fiat rates when no local rate is available.
|
|
54
|
-
* @returns The payment token or undefined if the
|
|
60
|
+
* @returns The payment token or undefined if the asset data could not be retrieved.
|
|
55
61
|
*/
|
|
56
|
-
function getPaymentToken({
|
|
57
|
-
const { decimals, symbol } =
|
|
62
|
+
function getPaymentToken({ accountId, assetId, messenger, allowMissingFiatRate, }) {
|
|
63
|
+
const { decimals, symbol } = getAssetInfo(messenger, assetId) ?? {};
|
|
58
64
|
if (decimals === undefined || !symbol) {
|
|
59
65
|
return undefined;
|
|
60
66
|
}
|
|
61
|
-
let
|
|
62
|
-
if (
|
|
67
|
+
let fiatRates = getAssetFiatRate(messenger, assetId);
|
|
68
|
+
if (fiatRates === undefined) {
|
|
63
69
|
if (!allowMissingFiatRate) {
|
|
64
70
|
return undefined;
|
|
65
71
|
}
|
|
66
|
-
// No local fiat rate for this
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
|
|
72
|
+
// No local fiat rate for this asset, such as a withdraw destination on a
|
|
73
|
+
// chain the wallet does not track. Resolve with zeroed fiat rates so the
|
|
74
|
+
// token can be selected; fiat display is best-effort.
|
|
75
|
+
fiatRates = { usdRate: '0', fiatRate: '0' };
|
|
70
76
|
}
|
|
71
|
-
const balance =
|
|
72
|
-
|
|
77
|
+
const balance = accountId
|
|
78
|
+
? getAssetBalance(messenger, accountId, assetId)
|
|
79
|
+
: '0';
|
|
80
|
+
const { raw: balanceRaw, human: balanceHuman, usd: balanceUsd, fiat: balanceFiat, } = computeTokenAmounts(balance, decimals, fiatRates);
|
|
73
81
|
return {
|
|
74
|
-
|
|
82
|
+
assetId,
|
|
75
83
|
balanceFiat,
|
|
76
84
|
balanceHuman,
|
|
77
85
|
balanceRaw,
|
|
78
86
|
balanceUsd,
|
|
79
|
-
chainId,
|
|
80
87
|
decimals,
|
|
81
88
|
symbol,
|
|
82
89
|
};
|
|
83
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the ID of the `InternalAccount` holding a payment token.
|
|
93
|
+
*
|
|
94
|
+
* An EVM asset is held by the EVM account of the transaction. A non-EVM asset
|
|
95
|
+
* is held by the account resolved by {@link getAssetAccount}.
|
|
96
|
+
*
|
|
97
|
+
* @param request - Request parameters.
|
|
98
|
+
* @param request.accountOverride - ID of the account override of the transaction, if any.
|
|
99
|
+
* @param request.assetId - CAIP-19 asset type of the payment token.
|
|
100
|
+
* @param request.from - Address of the transaction sender.
|
|
101
|
+
* @param request.messenger - The transaction pay controller messenger.
|
|
102
|
+
* @returns The account ID, or undefined if the EVM account is not found.
|
|
103
|
+
*/
|
|
104
|
+
function getAssetAccountId({ accountOverride, assetId, from, messenger, }) {
|
|
105
|
+
if (getEvmAsset(assetId)) {
|
|
106
|
+
const evmAddress = getEvmAccountAddress(messenger, accountOverride, from);
|
|
107
|
+
const { accountIdByAddress } = messenger.call('AccountsController:getState');
|
|
108
|
+
return (accountIdByAddress[evmAddress] ??
|
|
109
|
+
accountIdByAddress[evmAddress.toLowerCase()]);
|
|
110
|
+
}
|
|
111
|
+
return getAssetAccount(messenger, { accountOverride, assetId, from }).id;
|
|
112
|
+
}
|
|
84
113
|
//# sourceMappingURL=update-payment-token.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-payment-token.js","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAM7C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,
|
|
1
|
+
{"version":3,"file":"update-payment-token.js","sourceRoot":"","sources":["../../src/actions/update-payment-token.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { CaipAssetType, Hex } from '@metamask/utils';\n\nimport type { TransactionPayControllerMessenger } from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport type {\n TransactionPaymentToken,\n UpdatePaymentTokenRequest,\n UpdateTransactionDataCallback,\n} from '../types.js';\nimport { getEvmAccountAddress, getAssetAccount } from '../utils/account.js';\nimport {\n computeTokenAmounts,\n getAssetBalance,\n getAssetFiatRate,\n getAssetInfo,\n getEvmAsset,\n} from '../utils/token.js';\nimport { getTransaction } from '../utils/transaction.js';\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 { assetId, transactionId } = 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 transactionPayData = state.transactionData[transactionId];\n const accountOverride = transactionPayData?.accountOverride;\n const from = transaction.txParams.from as Hex;\n\n const paymentToken = getPaymentToken({\n accountId: getAssetAccountId({\n accountOverride,\n assetId,\n from,\n messenger,\n }),\n assetId,\n messenger,\n // For post-quote (withdraw) flows the selected token is the receive\n // destination, which may live on a chain the wallet does not actively\n // track, so no local market price or native-currency rate exists.\n // Allow resolution without a fiat rate so selection is not blocked; the\n // received amount is determined by the quote, not local rates.\n allowMissingFiatRate: Boolean(transactionPayData?.isPostQuote),\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 data.quoteError = undefined;\n });\n}\n\n/**\n * Generate the full payment token data for an asset from `AssetsController`\n * state.\n *\n * @param request - The payment token request parameters.\n * @param request.accountId - ID of the `InternalAccount` holding the asset.\n * @param request.assetId - CAIP-19 asset type of the payment token.\n * @param request.messenger - The transaction pay controller messenger.\n * @param request.allowMissingFiatRate - Whether to resolve the token with\n * zeroed fiat rates when no local rate is available.\n * @returns The payment token or undefined if the asset data could not be retrieved.\n */\nfunction getPaymentToken({\n accountId,\n assetId,\n messenger,\n allowMissingFiatRate,\n}: {\n accountId: string | undefined;\n assetId: CaipAssetType;\n messenger: TransactionPayControllerMessenger;\n allowMissingFiatRate: boolean;\n}): TransactionPaymentToken | undefined {\n const { decimals, symbol } = getAssetInfo(messenger, assetId) ?? {};\n\n if (decimals === undefined || !symbol) {\n return undefined;\n }\n\n let fiatRates = getAssetFiatRate(messenger, assetId);\n\n if (fiatRates === undefined) {\n if (!allowMissingFiatRate) {\n return undefined;\n }\n\n // No local fiat rate for this asset, such as a withdraw destination on a\n // chain the wallet does not track. Resolve with zeroed fiat rates so the\n // token can be selected; fiat display is best-effort.\n fiatRates = { usdRate: '0', fiatRate: '0' };\n }\n\n const balance = accountId\n ? getAssetBalance(messenger, accountId, assetId)\n : '0';\n\n const {\n raw: balanceRaw,\n human: balanceHuman,\n usd: balanceUsd,\n fiat: balanceFiat,\n } = computeTokenAmounts(balance, decimals, fiatRates);\n\n return {\n assetId,\n balanceFiat,\n balanceHuman,\n balanceRaw,\n balanceUsd,\n decimals,\n symbol,\n };\n}\n\n/**\n * Get the ID of the `InternalAccount` holding a payment token.\n *\n * An EVM asset is held by the EVM account of the transaction. A non-EVM asset\n * is held by the account resolved by {@link getAssetAccount}.\n *\n * @param request - Request parameters.\n * @param request.accountOverride - ID of the account override of the transaction, if any.\n * @param request.assetId - CAIP-19 asset type of the payment token.\n * @param request.from - Address of the transaction sender.\n * @param request.messenger - The transaction pay controller messenger.\n * @returns The account ID, or undefined if the EVM account is not found.\n */\nfunction getAssetAccountId({\n accountOverride,\n assetId,\n from,\n messenger,\n}: {\n accountOverride: string | undefined;\n assetId: CaipAssetType;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n}): string | undefined {\n if (getEvmAsset(assetId)) {\n const evmAddress = getEvmAccountAddress(messenger, accountOverride, from);\n const { accountIdByAddress } = messenger.call(\n 'AccountsController:getState',\n );\n\n return (\n accountIdByAddress[evmAddress] ??\n accountIdByAddress[evmAddress.toLowerCase()]\n );\n }\n\n return getAssetAccount(messenger, { accountOverride, assetId, from }).id;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { GetAmountDataCallback, GetAmountDataRequest, GetAmountDataResponse, GetBalanceCallback, GetBalanceRequest, GetBalanceResponse, GetPaymentOverrideDataRequest, GetPaymentOverrideDataResponse, TransactionConfig, TransactionConfigCallback, TransactionData, TransactionFiatPayment, TransactionFiatPaymentCallback, TransactionPayFiatOptions, TransactionPayControllerActions, TransactionPayControllerEvents, TransactionPayControllerGetStateAction, TransactionPayControllerMessenger, TransactionPayControllerOptions, TransactionPayControllerState,
|
|
1
|
+
export type { GetAmountDataCallback, GetAmountDataRequest, GetAmountDataResponse, GetBalanceCallback, GetBalanceRequest, GetBalanceResponse, GetPaymentOverrideDataRequest, GetPaymentOverrideDataResponse, PolymarketCallbacks, QuoteErrorInfo, QuoteErrorReason, TransactionConfig, TransactionConfigCallback, TransactionData, TransactionFiatPayment, TransactionFiatPaymentCallback, TransactionPayFiatOptions, TransactionPayControllerActions, TransactionPayControllerEvents, TransactionPayControllerGetStateAction, TransactionPayControllerMessenger, TransactionPayControllerOptions, TransactionPayControllerState, TransactionPayControllerStateChangeEvent, TransactionPaymentToken, TransactionPayQuote, TransactionPayRequiredToken, TransactionPaySourceAmount, TransactionPayTotals, UpdateFiatPaymentRequest, UpdatePaymentTokenRequest, } from './types.js';
|
|
2
2
|
export type { TransactionPayControllerGetAmountDataAction, TransactionPayControllerGetClientIdAction, TransactionPayControllerGetDelegationTransactionAction, TransactionPayControllerGetFiatOptionsAction, TransactionPayControllerGetStrategyAction, TransactionPayControllerPolymarketGetDepositWalletAddressAction, TransactionPayControllerPolymarketSubmitDepositWalletBatchAction, TransactionPayControllerSetTransactionConfigAction, TransactionPayControllerUpdatePaymentTokenAction, TransactionPayControllerUpdateFiatPaymentAction, } from './TransactionPayController-method-action-types.js';
|
|
3
3
|
export { PaymentOverride, TransactionPayClientId, TransactionPayStrategy, } from './constants.js';
|
|
4
4
|
export { TransactionPayController } from './TransactionPayController.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC7B,8BAA8B,EAC9B,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,8BAA8B,EAC9B,sCAAsC,EACtC,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,6BAA6B,EAC7B,8BAA8B,EAC9B,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,8BAA8B,EAC9B,sCAAsC,EACtC,iCAAiC,EACjC,+BAA+B,EAC/B,6BAA6B,EAC7B,wCAAwC,EACxC,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,2CAA2C,EAC3C,yCAAyC,EACzC,sDAAsD,EACtD,4CAA4C,EAC5C,yCAAyC,EACzC,+DAA+D,EAC/D,gEAAgE,EAChE,kDAAkD,EAClD,gDAAgD,EAChD,+CAA+C,GAChD,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6CA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["export type {\n GetAmountDataCallback,\n GetAmountDataRequest,\n GetAmountDataResponse,\n GetBalanceCallback,\n GetBalanceRequest,\n GetBalanceResponse,\n GetPaymentOverrideDataRequest,\n GetPaymentOverrideDataResponse,\n TransactionConfig,\n TransactionConfigCallback,\n TransactionData,\n TransactionFiatPayment,\n TransactionFiatPaymentCallback,\n TransactionPayFiatOptions,\n TransactionPayControllerActions,\n TransactionPayControllerEvents,\n TransactionPayControllerGetStateAction,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6CA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["export type {\n GetAmountDataCallback,\n GetAmountDataRequest,\n GetAmountDataResponse,\n GetBalanceCallback,\n GetBalanceRequest,\n GetBalanceResponse,\n GetPaymentOverrideDataRequest,\n GetPaymentOverrideDataResponse,\n PolymarketCallbacks,\n QuoteErrorInfo,\n QuoteErrorReason,\n TransactionConfig,\n TransactionConfigCallback,\n TransactionData,\n TransactionFiatPayment,\n TransactionFiatPaymentCallback,\n TransactionPayFiatOptions,\n TransactionPayControllerActions,\n TransactionPayControllerEvents,\n TransactionPayControllerGetStateAction,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerState,\n TransactionPayControllerStateChangeEvent,\n TransactionPaymentToken,\n TransactionPayQuote,\n TransactionPayRequiredToken,\n TransactionPaySourceAmount,\n TransactionPayTotals,\n UpdateFiatPaymentRequest,\n UpdatePaymentTokenRequest,\n} from './types.js';\nexport type {\n TransactionPayControllerGetAmountDataAction,\n TransactionPayControllerGetClientIdAction,\n TransactionPayControllerGetDelegationTransactionAction,\n TransactionPayControllerGetFiatOptionsAction,\n TransactionPayControllerGetStrategyAction,\n TransactionPayControllerPolymarketGetDepositWalletAddressAction,\n TransactionPayControllerPolymarketSubmitDepositWalletBatchAction,\n TransactionPayControllerSetTransactionConfigAction,\n TransactionPayControllerUpdatePaymentTokenAction,\n TransactionPayControllerUpdateFiatPaymentAction,\n} from './TransactionPayController-method-action-types.js';\nexport {\n PaymentOverride,\n TransactionPayClientId,\n TransactionPayStrategy,\n} from './constants.js';\nexport { TransactionPayController } from './TransactionPayController.js';\nexport { TransactionPayPublishHook } from './helpers/TransactionPayPublishHook.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcrossStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"AcrossStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,mCAAmC,EACnC,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAYxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,qBAAa,cAAe,YAAW,WAAW,CAAC,WAAW,CAAC;IAC7D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CA6DtD;IAED,iBAAiB,CACf,OAAO,EAAE,mCAAmC,CAAC,WAAW,CAAC,GACxD,OAAO,CA4BT;IAEK,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAE7C;IAEK,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,CAEjD;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TransactionType, hasTransactionType, } from '@metamask/transaction-controller';
|
|
2
2
|
import { getPayStrategiesConfig } from '../../utils/feature-flags.js';
|
|
3
3
|
import { isPerpsDepositRequest, isPerpsDepositTransaction, } from '../../utils/perps.js';
|
|
4
|
+
import { getEvmQuoteSource, isEvmQuoteRequest } from '../../utils/token.js';
|
|
4
5
|
import { getAcrossDestination } from './across-actions.js';
|
|
5
6
|
import { getAcrossQuotes } from './across-quotes.js';
|
|
6
7
|
import { submitAcrossQuotes } from './across-submit.js';
|
|
@@ -12,6 +13,9 @@ export class AcrossStrategy {
|
|
|
12
13
|
if (!config.across.enabled) {
|
|
13
14
|
return false;
|
|
14
15
|
}
|
|
16
|
+
if (!request.requests.every(isEvmQuoteRequest)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
15
19
|
const actionableRequests = request.requests.filter(isAcrossQuoteRequest);
|
|
16
20
|
if (actionableRequests.length === 0) {
|
|
17
21
|
return false;
|
|
@@ -24,7 +28,8 @@ export class AcrossStrategy {
|
|
|
24
28
|
}
|
|
25
29
|
else {
|
|
26
30
|
// Across doesn't support same-chain swaps (e.g. mUSD conversions).
|
|
27
|
-
const hasSameChainRequest = actionableRequests.some((singleRequest) => singleRequest.
|
|
31
|
+
const hasSameChainRequest = actionableRequests.some((singleRequest) => getEvmQuoteSource(singleRequest).chainId ===
|
|
32
|
+
singleRequest.targetChainId);
|
|
28
33
|
if (hasSameChainRequest) {
|
|
29
34
|
return false;
|
|
30
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcrossStrategy.js","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,GACnB,MAAM,kCAAkC,CAAC;AAS1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0CAA0C,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,OAAO,cAAc;IACzB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,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,oBAAoB,CAAC,CAAC;QAEzE,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,EAAE,CACtE,qBAAqB,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,CAC1D,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,
|
|
1
|
+
{"version":3,"file":"AcrossStrategy.js","sourceRoot":"","sources":["../../../src/strategy/across/AcrossStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TransactionType,\n hasTransactionType,\n} from '@metamask/transaction-controller';\n\nimport type {\n PayStrategy,\n PayStrategyCheckQuoteSupportRequest,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags.js';\nimport {\n isPerpsDepositRequest,\n isPerpsDepositTransaction,\n} from '../../utils/perps.js';\nimport { getEvmQuoteSource, isEvmQuoteRequest } from '../../utils/token.js';\nimport { getAcrossDestination } from './across-actions.js';\nimport { getAcrossQuotes } from './across-quotes.js';\nimport { submitAcrossQuotes } from './across-submit.js';\nimport { hasUnsupportedTransactionAuthorizationList } from './authorization-list.js';\nimport { isAcrossQuoteRequest } from './requests.js';\nimport type { AcrossQuote } from './types.js';\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 if (!request.requests.every(isEvmQuoteRequest)) {\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 (isPerpsDepositTransaction(request.transaction)) {\n const supportsPerpsDeposit = actionableRequests.every((singleRequest) =>\n isPerpsDepositRequest(singleRequest, request.transaction),\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 getEvmQuoteSource(singleRequest).chainId ===\n singleRequest.targetChainId,\n );\n\n if (hasSameChainRequest) {\n return false;\n }\n }\n\n if (\n hasUnsupportedTransactionAuthorizationList(\n request.transaction,\n actionableRequests,\n )\n ) {\n return false;\n }\n\n return actionableRequests.every((singleRequest) => {\n if (singleRequest.isPostQuote) {\n return hasTransactionType(request.transaction, [\n TransactionType.predictWithdraw,\n ]);\n }\n\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 const requiresAuthorizationList = request.quotes.some(\n (quote) => quote.original.metamask.requiresAuthorizationList,\n );\n\n if (!requiresAuthorizationList) {\n return true;\n }\n\n if (\n !hasTransactionType(request.transaction, [\n TransactionType.predictWithdraw,\n ])\n ) {\n return false;\n }\n\n // A first-time 7702 authorization list is acceptable here only because it is\n // attached to MetaMask's source-chain batch transaction. It must not be\n // smuggled into Across destination post-swap actions.\n return request.quotes.every(\n (quote) =>\n quote.request.isPostQuote === true &&\n quote.original.request.actions.length === 0,\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"]}
|
|
@@ -9,7 +9,7 @@ import { getPayStrategiesConfig, getSlippage, } from '../../utils/feature-flags.
|
|
|
9
9
|
import { resolveGasStationCost } from '../../utils/gas-payment.js';
|
|
10
10
|
import { calculateGasCost } from '../../utils/gas.js';
|
|
11
11
|
import { estimateQuoteGasLimits } from '../../utils/quote-gas.js';
|
|
12
|
-
import { getTokenFiatRate } from '../../utils/token.js';
|
|
12
|
+
import { getEvmQuoteSource, getTokenFiatRate } from '../../utils/token.js';
|
|
13
13
|
import { getAcrossDestination } from './across-actions.js';
|
|
14
14
|
import { hasUnsupportedTransactionAuthorizationList } from './authorization-list.js';
|
|
15
15
|
import { normalizeAcrossRequest, validateAcrossPerpsQuote } from './perps.js';
|
|
@@ -44,7 +44,8 @@ export async function getAcrossQuotes(request) {
|
|
|
44
44
|
async function getSingleQuote(request, fullRequest) {
|
|
45
45
|
const { messenger, signal, transaction } = fullRequest;
|
|
46
46
|
const normalizedRequest = normalizeAcrossRequest(request, transaction);
|
|
47
|
-
const { from, isMaxAmount,
|
|
47
|
+
const { from, isMaxAmount, sourceTokenAmount, targetAmountMinimum, targetChainId, targetTokenAddress, } = normalizedRequest;
|
|
48
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(normalizedRequest);
|
|
48
49
|
const config = getPayStrategiesConfig(messenger);
|
|
49
50
|
const slippageDecimal = getSlippage(messenger, sourceChainId, sourceTokenAddress);
|
|
50
51
|
const useExactInput = isMaxAmount
|
|
@@ -297,7 +298,8 @@ function getAmountFromTokenAmount({ amountRaw, decimals, fiatRate, }) {
|
|
|
297
298
|
}
|
|
298
299
|
async function calculateSourceNetworkCost(quote, messenger, request, transaction, accountSupports7702) {
|
|
299
300
|
const acrossFallbackGas = getPayStrategiesConfig(messenger).across.fallbackGas;
|
|
300
|
-
const { from
|
|
301
|
+
const { from } = request;
|
|
302
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(request);
|
|
301
303
|
const orderedTransactions = getAcrossOrderedTransactions({ quote });
|
|
302
304
|
const { swapTx } = quote;
|
|
303
305
|
const swapChainId = toHex(swapTx.chainId);
|
|
@@ -446,7 +448,8 @@ async function calculateSourceNetworkCost(quote, messenger, request, transaction
|
|
|
446
448
|
};
|
|
447
449
|
}
|
|
448
450
|
function calculateSourceGasFeeTokenNetworkFallback({ messenger, nativeSourceNetwork, quote, request, }) {
|
|
449
|
-
const
|
|
451
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(request);
|
|
452
|
+
const sourceFiatRate = getTokenFiatRate(messenger, sourceTokenAddress, sourceChainId);
|
|
450
453
|
if (!sourceFiatRate) {
|
|
451
454
|
return undefined;
|
|
452
455
|
}
|