@metamask-previews/transaction-pay-controller 31.1.0-preview-616796faf → 31.1.0-preview-d1da3c817
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 +5 -0
- package/dist/TransactionPayController-method-action-types.d.ts +14 -1
- package/dist/TransactionPayController-method-action-types.d.ts.map +1 -1
- package/dist/TransactionPayController-method-action-types.js.map +1 -1
- package/dist/TransactionPayController.d.ts +11 -1
- package/dist/TransactionPayController.d.ts.map +1 -1
- package/dist/TransactionPayController.js +39 -0
- package/dist/TransactionPayController.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/strategy/relay/relay-submit-non-evm.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit-non-evm.js +1 -0
- package/dist/strategy/relay/relay-submit-non-evm.js.map +1 -1
- package/dist/strategy/relay/solana-pay-diagnostics.d.ts +22 -0
- package/dist/strategy/relay/solana-pay-diagnostics.d.ts.map +1 -0
- package/dist/strategy/relay/solana-pay-diagnostics.js +98 -0
- package/dist/strategy/relay/solana-pay-diagnostics.js.map +1 -0
- package/dist/strategy/relay/solana-pay.d.ts.map +1 -1
- package/dist/strategy/relay/solana-pay.js +4 -1
- package/dist/strategy/relay/solana-pay.js.map +1 -1
- package/dist/strategy/relay/solana-transaction.d.ts +2 -0
- package/dist/strategy/relay/solana-transaction.d.ts.map +1 -1
- package/dist/strategy/relay/solana-transaction.js +3 -1
- package/dist/strategy/relay/solana-transaction.js.map +1 -1
- package/dist/types.d.ts +32 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -34,6 +34,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
34
34
|
- Add `infuraProjectId` option to `TransactionPayControllerOptions`, and the `getInfuraProjectId` method and `TransactionPayController:getInfuraProjectId` messenger action ([#10273](https://github.com/MetaMask/core/pull/10273))
|
|
35
35
|
- Clients must pass their Infura project ID to quote and submit Solana payment tokens. Core replaces the `{infuraProjectId}` placeholder in the `ConfigRegistryController` Solana RPC URL with it, and throws if the URL has the placeholder and no project ID is configured.
|
|
36
36
|
- Add the `TransactionPayControllerGetInfuraProjectIdAction` type.
|
|
37
|
+
- Add Solana Pay support diagnostics and lifecycle analytics event ([#10274](https://github.com/MetaMask/core/pull/10274))
|
|
38
|
+
- Add the `getSolanaPaySupportDiagnostics(transactionId)` method and `TransactionPayController:getSolanaPaySupportDiagnostics` messenger action. It returns a privacy-safe projection of the persisted `metamaskPay.solanaExecution` checkpoint: categorical phase, source, Relay, notification and follow-up statuses, the derived outcome, the source asset class (`native` or `token`), identifier-presence flags and a stable `errorCode`. It never includes accounts, assets, amounts, request or transaction IDs, provider payloads or failure text.
|
|
39
|
+
- Add the `TransactionPayController:solanaPayLifecycle` event. It is published with the same diagnostics plus `isRecovery` whenever a categorical value of a transaction's Solana execution checkpoint changes, including the failed or expired source and interrupted follow-up states. `isRecovery` is `true` for transitions observed by `recoverSolanaPayStatus`.
|
|
40
|
+
- Add the `SolanaPayErrorCode`, `SolanaPaySupportDiagnostics`, `SolanaPayLifecyclePayload`, `TransactionPayControllerSolanaPayLifecycleEvent` and `TransactionPayControllerGetSolanaPaySupportDiagnosticsAction` types.
|
|
41
|
+
- Relay statuses that Core does not recognize are now recorded as `unknown` instead of `pending`.
|
|
37
42
|
|
|
38
43
|
### Changed
|
|
39
44
|
|
|
@@ -180,8 +180,21 @@ export type TransactionPayControllerRecoverSolanaPayStatusAction = {
|
|
|
180
180
|
type: `TransactionPayController:recoverSolanaPayStatus`;
|
|
181
181
|
handler: TransactionPayController['recoverSolanaPayStatus'];
|
|
182
182
|
};
|
|
183
|
+
/**
|
|
184
|
+
* Returns the privacy-safe support diagnostics of a Solana Pay execution.
|
|
185
|
+
*
|
|
186
|
+
* The diagnostics only carry categorical values and identifier-presence
|
|
187
|
+
* flags, never accounts, assets, amounts, identifiers or failure text.
|
|
188
|
+
*
|
|
189
|
+
* @param transactionId - Target transaction ID.
|
|
190
|
+
* @returns Categorical diagnostics of the persisted execution checkpoint.
|
|
191
|
+
*/
|
|
192
|
+
export type TransactionPayControllerGetSolanaPaySupportDiagnosticsAction = {
|
|
193
|
+
type: `TransactionPayController:getSolanaPaySupportDiagnostics`;
|
|
194
|
+
handler: TransactionPayController['getSolanaPaySupportDiagnostics'];
|
|
195
|
+
};
|
|
183
196
|
/**
|
|
184
197
|
* Union of all TransactionPayController action types.
|
|
185
198
|
*/
|
|
186
|
-
export type TransactionPayControllerMethodActions = TransactionPayControllerSetTransactionConfigAction | TransactionPayControllerUpdatePaymentTokenAction | TransactionPayControllerUpdateFiatPaymentAction | TransactionPayControllerGetClientIdAction | TransactionPayControllerGetDelegationTransactionAction | TransactionPayControllerGetAmountDataAction | TransactionPayControllerGetFiatOptionsAction | TransactionPayControllerGetInfuraProjectIdAction | TransactionPayControllerGetPaymentOverrideDataAction | TransactionPayControllerGetStrategyAction | TransactionPayControllerPolymarketGetDepositWalletAddressAction | TransactionPayControllerPolymarketSubmitDepositWalletBatchAction | TransactionPayControllerReconcileSolanaPayAction | TransactionPayControllerRecoverSolanaPayStatusAction;
|
|
199
|
+
export type TransactionPayControllerMethodActions = TransactionPayControllerSetTransactionConfigAction | TransactionPayControllerUpdatePaymentTokenAction | TransactionPayControllerUpdateFiatPaymentAction | TransactionPayControllerGetClientIdAction | TransactionPayControllerGetDelegationTransactionAction | TransactionPayControllerGetAmountDataAction | TransactionPayControllerGetFiatOptionsAction | TransactionPayControllerGetInfuraProjectIdAction | TransactionPayControllerGetPaymentOverrideDataAction | TransactionPayControllerGetStrategyAction | TransactionPayControllerPolymarketGetDepositWalletAddressAction | TransactionPayControllerPolymarketSubmitDepositWalletBatchAction | TransactionPayControllerReconcileSolanaPayAction | TransactionPayControllerRecoverSolanaPayStatusAction | TransactionPayControllerGetSolanaPaySupportDiagnosticsAction;
|
|
187
200
|
//# sourceMappingURL=TransactionPayController-method-action-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController-method-action-types.d.ts","sourceRoot":"","sources":["../src/TransactionPayController-method-action-types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TransactionPayController-method-action-types.d.ts","sourceRoot":"","sources":["../src/TransactionPayController-method-action-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController-method-action-types.js","sourceRoot":"","sources":["../src/TransactionPayController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { TransactionPayController } from './TransactionPayController.js';\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 */\nexport type TransactionPayControllerSetTransactionConfigAction = {\n type: `TransactionPayController:setTransactionConfig`;\n handler: TransactionPayController['setTransactionConfig'];\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 */\nexport type TransactionPayControllerUpdatePaymentTokenAction = {\n type: `TransactionPayController:updatePaymentToken`;\n handler: TransactionPayController['updatePaymentToken'];\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 */\nexport type TransactionPayControllerUpdateFiatPaymentAction = {\n type: `TransactionPayController:updateFiatPayment`;\n handler: TransactionPayController['updateFiatPayment'];\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 */\nexport type TransactionPayControllerGetClientIdAction = {\n type: `TransactionPayController:getClientId`;\n handler: TransactionPayController['getClientId'];\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 */\nexport type TransactionPayControllerGetDelegationTransactionAction = {\n type: `TransactionPayController:getDelegationTransaction`;\n handler: TransactionPayController['getDelegationTransaction'];\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 */\nexport type TransactionPayControllerGetAmountDataAction = {\n type: `TransactionPayController:getAmountData`;\n handler: TransactionPayController['getAmountData'];\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 */\nexport type TransactionPayControllerGetFiatOptionsAction = {\n type: `TransactionPayController:getFiatOptions`;\n handler: TransactionPayController['getFiatOptions'];\n};\n\n/**\n * Returns the Infura project ID used to resolve `{infuraProjectId}`\n * placeholders in RPC URLs.\n *\n * @returns The Infura project ID, if configured.\n */\nexport type TransactionPayControllerGetInfuraProjectIdAction = {\n type: `TransactionPayController:getInfuraProjectId`;\n handler: TransactionPayController['getInfuraProjectId'];\n};\n\nexport type TransactionPayControllerGetPaymentOverrideDataAction = {\n type: `TransactionPayController:getPaymentOverrideData`;\n handler: TransactionPayController['getPaymentOverrideData'];\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 */\nexport type TransactionPayControllerGetStrategyAction = {\n type: `TransactionPayController:getStrategy`;\n handler: TransactionPayController['getStrategy'];\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 */\nexport type TransactionPayControllerPolymarketGetDepositWalletAddressAction = {\n type: `TransactionPayController:polymarketGetDepositWalletAddress`;\n handler: TransactionPayController['polymarketGetDepositWalletAddress'];\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 */\nexport type TransactionPayControllerPolymarketSubmitDepositWalletBatchAction = {\n type: `TransactionPayController:polymarketSubmitDepositWalletBatch`;\n handler: TransactionPayController['polymarketSubmitDepositWalletBatch'];\n};\n\n/**\n * Observes a Solana Pay execution through Relay status and finalizes the\n * externally published target transaction once the outcome is terminal.\n * While Relay has not observed the source transaction, its on-chain status\n * is read once from the Solana RPC to detect a failed or expired source.\n * Once Relay delivered the funds of a Money Account deposit, the non-atomic\n * second leg runs once, guarded by the follow-up checkpoint.\n *\n * This method never signs or broadcasts the Solana source transaction, and\n * never notifies Relay.\n *\n * @param transactionId - Target transaction ID.\n * @returns The latest observed status.\n */\nexport type TransactionPayControllerReconcileSolanaPayAction = {\n type: `TransactionPayController:reconcileSolanaPay`;\n handler: TransactionPayController['reconcileSolanaPay'];\n};\n\n/**\n * Observes every persisted Solana Pay execution that is not terminal once,\n * independently of each other. Clients call it again on foreground or\n * startup to keep observing.\n *\n * This method never signs, broadcasts, or notifies Relay.\n *\n * @returns Latest statuses keyed by target transaction ID, omitting\n * executions whose observation failed.\n */\nexport type TransactionPayControllerRecoverSolanaPayStatusAction = {\n type: `TransactionPayController:recoverSolanaPayStatus`;\n handler: TransactionPayController['recoverSolanaPayStatus'];\n};\n\n/**\n * Union of all TransactionPayController action types.\n */\nexport type TransactionPayControllerMethodActions =\n | TransactionPayControllerSetTransactionConfigAction\n | TransactionPayControllerUpdatePaymentTokenAction\n | TransactionPayControllerUpdateFiatPaymentAction\n | TransactionPayControllerGetClientIdAction\n | TransactionPayControllerGetDelegationTransactionAction\n | TransactionPayControllerGetAmountDataAction\n | TransactionPayControllerGetFiatOptionsAction\n | TransactionPayControllerGetInfuraProjectIdAction\n | TransactionPayControllerGetPaymentOverrideDataAction\n | TransactionPayControllerGetStrategyAction\n | TransactionPayControllerPolymarketGetDepositWalletAddressAction\n | TransactionPayControllerPolymarketSubmitDepositWalletBatchAction\n | TransactionPayControllerReconcileSolanaPayAction\n | TransactionPayControllerRecoverSolanaPayStatusAction;\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionPayController-method-action-types.js","sourceRoot":"","sources":["../src/TransactionPayController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { TransactionPayController } from './TransactionPayController.js';\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 */\nexport type TransactionPayControllerSetTransactionConfigAction = {\n type: `TransactionPayController:setTransactionConfig`;\n handler: TransactionPayController['setTransactionConfig'];\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 */\nexport type TransactionPayControllerUpdatePaymentTokenAction = {\n type: `TransactionPayController:updatePaymentToken`;\n handler: TransactionPayController['updatePaymentToken'];\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 */\nexport type TransactionPayControllerUpdateFiatPaymentAction = {\n type: `TransactionPayController:updateFiatPayment`;\n handler: TransactionPayController['updateFiatPayment'];\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 */\nexport type TransactionPayControllerGetClientIdAction = {\n type: `TransactionPayController:getClientId`;\n handler: TransactionPayController['getClientId'];\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 */\nexport type TransactionPayControllerGetDelegationTransactionAction = {\n type: `TransactionPayController:getDelegationTransaction`;\n handler: TransactionPayController['getDelegationTransaction'];\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 */\nexport type TransactionPayControllerGetAmountDataAction = {\n type: `TransactionPayController:getAmountData`;\n handler: TransactionPayController['getAmountData'];\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 */\nexport type TransactionPayControllerGetFiatOptionsAction = {\n type: `TransactionPayController:getFiatOptions`;\n handler: TransactionPayController['getFiatOptions'];\n};\n\n/**\n * Returns the Infura project ID used to resolve `{infuraProjectId}`\n * placeholders in RPC URLs.\n *\n * @returns The Infura project ID, if configured.\n */\nexport type TransactionPayControllerGetInfuraProjectIdAction = {\n type: `TransactionPayController:getInfuraProjectId`;\n handler: TransactionPayController['getInfuraProjectId'];\n};\n\nexport type TransactionPayControllerGetPaymentOverrideDataAction = {\n type: `TransactionPayController:getPaymentOverrideData`;\n handler: TransactionPayController['getPaymentOverrideData'];\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 */\nexport type TransactionPayControllerGetStrategyAction = {\n type: `TransactionPayController:getStrategy`;\n handler: TransactionPayController['getStrategy'];\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 */\nexport type TransactionPayControllerPolymarketGetDepositWalletAddressAction = {\n type: `TransactionPayController:polymarketGetDepositWalletAddress`;\n handler: TransactionPayController['polymarketGetDepositWalletAddress'];\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 */\nexport type TransactionPayControllerPolymarketSubmitDepositWalletBatchAction = {\n type: `TransactionPayController:polymarketSubmitDepositWalletBatch`;\n handler: TransactionPayController['polymarketSubmitDepositWalletBatch'];\n};\n\n/**\n * Observes a Solana Pay execution through Relay status and finalizes the\n * externally published target transaction once the outcome is terminal.\n * While Relay has not observed the source transaction, its on-chain status\n * is read once from the Solana RPC to detect a failed or expired source.\n * Once Relay delivered the funds of a Money Account deposit, the non-atomic\n * second leg runs once, guarded by the follow-up checkpoint.\n *\n * This method never signs or broadcasts the Solana source transaction, and\n * never notifies Relay.\n *\n * @param transactionId - Target transaction ID.\n * @returns The latest observed status.\n */\nexport type TransactionPayControllerReconcileSolanaPayAction = {\n type: `TransactionPayController:reconcileSolanaPay`;\n handler: TransactionPayController['reconcileSolanaPay'];\n};\n\n/**\n * Observes every persisted Solana Pay execution that is not terminal once,\n * independently of each other. Clients call it again on foreground or\n * startup to keep observing.\n *\n * This method never signs, broadcasts, or notifies Relay.\n *\n * @returns Latest statuses keyed by target transaction ID, omitting\n * executions whose observation failed.\n */\nexport type TransactionPayControllerRecoverSolanaPayStatusAction = {\n type: `TransactionPayController:recoverSolanaPayStatus`;\n handler: TransactionPayController['recoverSolanaPayStatus'];\n};\n\n/**\n * Returns the privacy-safe support diagnostics of a Solana Pay execution.\n *\n * The diagnostics only carry categorical values and identifier-presence\n * flags, never accounts, assets, amounts, identifiers or failure text.\n *\n * @param transactionId - Target transaction ID.\n * @returns Categorical diagnostics of the persisted execution checkpoint.\n */\nexport type TransactionPayControllerGetSolanaPaySupportDiagnosticsAction = {\n type: `TransactionPayController:getSolanaPaySupportDiagnostics`;\n handler: TransactionPayController['getSolanaPaySupportDiagnostics'];\n};\n\n/**\n * Union of all TransactionPayController action types.\n */\nexport type TransactionPayControllerMethodActions =\n | TransactionPayControllerSetTransactionConfigAction\n | TransactionPayControllerUpdatePaymentTokenAction\n | TransactionPayControllerUpdateFiatPaymentAction\n | TransactionPayControllerGetClientIdAction\n | TransactionPayControllerGetDelegationTransactionAction\n | TransactionPayControllerGetAmountDataAction\n | TransactionPayControllerGetFiatOptionsAction\n | TransactionPayControllerGetInfuraProjectIdAction\n | TransactionPayControllerGetPaymentOverrideDataAction\n | TransactionPayControllerGetStrategyAction\n | TransactionPayControllerPolymarketGetDepositWalletAddressAction\n | TransactionPayControllerPolymarketSubmitDepositWalletBatchAction\n | TransactionPayControllerReconcileSolanaPayAction\n | TransactionPayControllerRecoverSolanaPayStatusAction\n | TransactionPayControllerGetSolanaPaySupportDiagnosticsAction;\n"]}
|
|
@@ -2,7 +2,7 @@ import { BaseController } from '@metamask/base-controller';
|
|
|
2
2
|
import type { TransactionMeta } from '@metamask/transaction-controller';
|
|
3
3
|
import { CONTROLLER_NAME, TransactionPayStrategy } from './constants.js';
|
|
4
4
|
import type { TransactionPayClientId } from './constants.js';
|
|
5
|
-
import type { GetAmountDataCallback, GetDelegationTransactionCallback, GetPaymentOverrideDataCallback, PolymarketCallbacks, SolanaPayStatus, TransactionConfigCallback, TransactionPayControllerMessenger, TransactionPayFiatOptions, TransactionPayControllerOptions, TransactionPayControllerState, UpdateFiatPaymentRequest, UpdatePaymentTokenRequest } from './types.js';
|
|
5
|
+
import type { GetAmountDataCallback, GetDelegationTransactionCallback, GetPaymentOverrideDataCallback, PolymarketCallbacks, SolanaPayStatus, SolanaPaySupportDiagnostics, TransactionConfigCallback, TransactionPayControllerMessenger, TransactionPayFiatOptions, TransactionPayControllerOptions, TransactionPayControllerState, UpdateFiatPaymentRequest, UpdatePaymentTokenRequest } from './types.js';
|
|
6
6
|
export declare class TransactionPayController extends BaseController<typeof CONTROLLER_NAME, TransactionPayControllerState, TransactionPayControllerMessenger> {
|
|
7
7
|
#private;
|
|
8
8
|
constructor({ clientId, fiatOptions, getAmountData, getBalance, getDelegationTransaction, getPaymentOverrideData, getStrategy, getStrategies, infuraProjectId, messenger, polymarket, state, }: TransactionPayControllerOptions);
|
|
@@ -141,5 +141,15 @@ export declare class TransactionPayController extends BaseController<typeof CONT
|
|
|
141
141
|
* executions whose observation failed.
|
|
142
142
|
*/
|
|
143
143
|
recoverSolanaPayStatus(): Promise<Record<string, SolanaPayStatus>>;
|
|
144
|
+
/**
|
|
145
|
+
* Returns the privacy-safe support diagnostics of a Solana Pay execution.
|
|
146
|
+
*
|
|
147
|
+
* The diagnostics only carry categorical values and identifier-presence
|
|
148
|
+
* flags, never accounts, assets, amounts, identifiers or failure text.
|
|
149
|
+
*
|
|
150
|
+
* @param transactionId - Target transaction ID.
|
|
151
|
+
* @returns Categorical diagnostics of the persisted execution checkpoint.
|
|
152
|
+
*/
|
|
153
|
+
getSolanaPaySupportDiagnostics(transactionId: string): SolanaPaySupportDiagnostics;
|
|
144
154
|
}
|
|
145
155
|
//# sourceMappingURL=TransactionPayController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPayController.d.ts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionPayController.d.ts","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAM1C,OAAO,EACL,eAAe,EAEf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAiB7D,OAAO,KAAK,EACV,qBAAqB,EAErB,gCAAgC,EAChC,8BAA8B,EAC9B,mBAAmB,EACnB,eAAe,EACf,2BAA2B,EAE3B,yBAAyB,EAEzB,iCAAiC,EACjC,yBAAyB,EACzB,+BAA+B,EAC/B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AA2CpB,qBAAa,wBAAyB,SAAQ,cAAc,CAC1D,OAAO,eAAe,EACtB,6BAA6B,EAC7B,iCAAiC,CAClC;;IA2BC,YAAY,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,eAAe,EACf,SAAS,EACT,UAAU,EACV,KAAK,GACN,EAAE,+BAA+B,EAiDjC;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;;;;;OAKG;IACH,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvC;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;IAED;;;;;;;;;;;;;OAaG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqCxE;IAED;;;;;;;;;OASG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAmCvE;IAED;;;;;;;;OAQG;IACH,8BAA8B,CAC5B,aAAa,EAAE,MAAM,GACpB,2BAA2B,CAO7B;CAgPF"}
|
|
@@ -6,6 +6,7 @@ import { updatePaymentToken } from './actions/update-payment-token.js';
|
|
|
6
6
|
import { CONTROLLER_NAME, isTransactionPayStrategy, } from './constants.js';
|
|
7
7
|
import { QuoteRefresher } from './helpers/QuoteRefresher.js';
|
|
8
8
|
import { getRelayStatus } from './strategy/relay/relay-api.js';
|
|
9
|
+
import { getSolanaPaySupportDiagnostics, isSolanaPayLifecycleTransition, } from './strategy/relay/solana-pay-diagnostics.js';
|
|
9
10
|
import { applyRelayStatusObservation, applySolanaSourceFailure, getSolanaPayFailure, getSolanaPayStatus, isTerminalSolanaPayOutcome, persistSolanaExecution, readSolanaSourceFailure, submitSolanaPayFollowUp, } from './strategy/relay/solana-pay.js';
|
|
10
11
|
import { getStrategyOrder } from './utils/feature-flags.js';
|
|
11
12
|
import { updateQuotes } from './utils/quotes.js';
|
|
@@ -19,6 +20,7 @@ const MESSENGER_EXPOSED_METHODS = [
|
|
|
19
20
|
'getFiatOptions',
|
|
20
21
|
'getInfuraProjectId',
|
|
21
22
|
'getPaymentOverrideData',
|
|
23
|
+
'getSolanaPaySupportDiagnostics',
|
|
22
24
|
'getStrategy',
|
|
23
25
|
'polymarketGetDepositWalletAddress',
|
|
24
26
|
'polymarketSubmitDepositWalletBatch',
|
|
@@ -50,6 +52,7 @@ export class TransactionPayController extends BaseController {
|
|
|
50
52
|
#getStrategies;
|
|
51
53
|
#infuraProjectId;
|
|
52
54
|
#polymarket;
|
|
55
|
+
#recoveringSolanaPayTransactionIds = new Set();
|
|
53
56
|
constructor({ clientId, fiatOptions, getAmountData, getBalance, getDelegationTransaction, getPaymentOverrideData, getStrategy, getStrategies, infuraProjectId, messenger, polymarket, state, }) {
|
|
54
57
|
super({
|
|
55
58
|
name: CONTROLLER_NAME,
|
|
@@ -69,6 +72,7 @@ export class TransactionPayController extends BaseController {
|
|
|
69
72
|
this.#polymarket = polymarket;
|
|
70
73
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
71
74
|
subscribeTransactionChanges(messenger, this.#updateTransactionData.bind(this), this.#removeTransactionData.bind(this));
|
|
75
|
+
messenger.subscribe('TransactionController:stateChange', this.#publishSolanaPayLifecycle.bind(this), (transactionControllerState) => transactionControllerState.transactions);
|
|
72
76
|
subscribeAssetChanges(messenger, () => this.state, this.#updateTransactionData.bind(this));
|
|
73
77
|
// eslint-disable-next-line no-new
|
|
74
78
|
new QuoteRefresher({
|
|
@@ -276,7 +280,9 @@ export class TransactionPayController extends BaseController {
|
|
|
276
280
|
const execution = transaction.metamaskPay?.solanaExecution;
|
|
277
281
|
return (execution && !isTerminalSolanaPayOutcome(getSolanaPayStatus(execution)));
|
|
278
282
|
});
|
|
283
|
+
pending.forEach(({ id }) => this.#recoveringSolanaPayTransactionIds.add(id));
|
|
279
284
|
const observations = await Promise.allSettled(pending.map((transaction) => this.reconcileSolanaPay(transaction.id)));
|
|
285
|
+
pending.forEach(({ id }) => this.#recoveringSolanaPayTransactionIds.delete(id));
|
|
280
286
|
return observations.reduce((results, observation, index) => {
|
|
281
287
|
if (observation.status === 'fulfilled') {
|
|
282
288
|
results[pending[index].id] = observation.value;
|
|
@@ -284,6 +290,39 @@ export class TransactionPayController extends BaseController {
|
|
|
284
290
|
return results;
|
|
285
291
|
}, {});
|
|
286
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* Returns the privacy-safe support diagnostics of a Solana Pay execution.
|
|
295
|
+
*
|
|
296
|
+
* The diagnostics only carry categorical values and identifier-presence
|
|
297
|
+
* flags, never accounts, assets, amounts, identifiers or failure text.
|
|
298
|
+
*
|
|
299
|
+
* @param transactionId - Target transaction ID.
|
|
300
|
+
* @returns Categorical diagnostics of the persisted execution checkpoint.
|
|
301
|
+
*/
|
|
302
|
+
getSolanaPaySupportDiagnostics(transactionId) {
|
|
303
|
+
const execution = this.#requireSolanaExecution(transactionId);
|
|
304
|
+
return getSolanaPaySupportDiagnostics(getSolanaPayStatus(execution), execution);
|
|
305
|
+
}
|
|
306
|
+
#publishSolanaPayLifecycle(transactions, previousTransactions) {
|
|
307
|
+
for (const transaction of transactions) {
|
|
308
|
+
const execution = transaction.metamaskPay?.solanaExecution;
|
|
309
|
+
if (!execution) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
const previousTransaction = previousTransactions?.find((previous) => previous.id === transaction.id);
|
|
313
|
+
const previousExecution = previousTransaction?.metamaskPay?.solanaExecution;
|
|
314
|
+
const diagnostics = getSolanaPaySupportDiagnostics(getSolanaPayStatus(execution), execution);
|
|
315
|
+
const previousDiagnostics = previousExecution &&
|
|
316
|
+
getSolanaPaySupportDiagnostics(getSolanaPayStatus(previousExecution), previousExecution);
|
|
317
|
+
if (!isSolanaPayLifecycleTransition(previousDiagnostics, diagnostics)) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
this.messenger.publish('TransactionPayController:solanaPayLifecycle', {
|
|
321
|
+
...diagnostics,
|
|
322
|
+
isRecovery: this.#recoveringSolanaPayTransactionIds.has(transaction.id),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
287
326
|
#finalizeSolanaPayTransaction(transactionId, status) {
|
|
288
327
|
const transaction = getTransaction(transactionId, this.messenger);
|
|
289
328
|
if (transaction?.status !== TransactionStatus.submitted ||
|
|
@@ -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 { TransactionStatus } from '@metamask/transaction-controller';\nimport type {\n MetamaskPaySolanaExecution,\n TransactionMeta,\n} 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 { getRelayStatus } from './strategy/relay/relay-api.js';\nimport {\n applyRelayStatusObservation,\n applySolanaSourceFailure,\n getSolanaPayFailure,\n getSolanaPayStatus,\n isTerminalSolanaPayOutcome,\n persistSolanaExecution,\n readSolanaSourceFailure,\n submitSolanaPayFollowUp,\n} from './strategy/relay/solana-pay.js';\nimport type {\n GetAmountDataCallback,\n GetBalanceCallback,\n GetDelegationTransactionCallback,\n GetPaymentOverrideDataCallback,\n PolymarketCallbacks,\n SolanaPayStatus,\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 getTransaction,\n subscribeAssetChanges,\n subscribeTransactionChanges,\n updateTransaction,\n} from './utils/transaction.js';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getAmountData',\n 'getClientId',\n 'getDelegationTransaction',\n 'getFiatOptions',\n 'getInfuraProjectId',\n 'getPaymentOverrideData',\n 'getStrategy',\n 'polymarketGetDepositWalletAddress',\n 'polymarketSubmitDepositWalletBatch',\n 'reconcileSolanaPay',\n 'recoverSolanaPayStatus',\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 #infuraProjectId?: string;\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 infuraProjectId,\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.#infuraProjectId = infuraProjectId;\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 /**\n * Returns the Infura project ID used to resolve `{infuraProjectId}`\n * placeholders in RPC URLs.\n *\n * @returns The Infura project ID, if configured.\n */\n getInfuraProjectId(): string | undefined {\n return this.#infuraProjectId;\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 /**\n * Observes a Solana Pay execution through Relay status and finalizes the\n * externally published target transaction once the outcome is terminal.\n * While Relay has not observed the source transaction, its on-chain status\n * is read once from the Solana RPC to detect a failed or expired source.\n * Once Relay delivered the funds of a Money Account deposit, the non-atomic\n * second leg runs once, guarded by the follow-up checkpoint.\n *\n * This method never signs or broadcasts the Solana source transaction, and\n * never notifies Relay.\n *\n * @param transactionId - Target transaction ID.\n * @returns The latest observed status.\n */\n async reconcileSolanaPay(transactionId: string): Promise<SolanaPayStatus> {\n const { requestId } = this.#requireSolanaExecution(transactionId);\n\n const relayStatus = await getRelayStatus(this.messenger, requestId).then(\n (status) => status,\n () => undefined,\n );\n\n const sourceFailureReason = await readSolanaSourceFailure(\n this.messenger,\n applyRelayStatusObservation(\n this.#requireSolanaExecution(transactionId),\n relayStatus,\n ),\n );\n\n persistSolanaExecution(\n this.messenger,\n transactionId,\n applySolanaSourceFailure(\n applyRelayStatusObservation(\n this.#requireSolanaExecution(transactionId),\n relayStatus,\n ),\n sourceFailureReason,\n ),\n 'Observe Relay Solana status',\n );\n\n await submitSolanaPayFollowUp(this.messenger, transactionId);\n\n const status = getSolanaPayStatus(\n this.#requireSolanaExecution(transactionId),\n );\n\n this.#finalizeSolanaPayTransaction(transactionId, status);\n return status;\n }\n\n /**\n * Observes every persisted Solana Pay execution that is not terminal once,\n * independently of each other. Clients call it again on foreground or\n * startup to keep observing.\n *\n * This method never signs, broadcasts, or notifies Relay.\n *\n * @returns Latest statuses keyed by target transaction ID, omitting\n * executions whose observation failed.\n */\n async recoverSolanaPayStatus(): Promise<Record<string, SolanaPayStatus>> {\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n\n const pending = transactions.filter((transaction) => {\n const execution = transaction.metamaskPay?.solanaExecution;\n\n return (\n execution && !isTerminalSolanaPayOutcome(getSolanaPayStatus(execution))\n );\n });\n\n const observations = await Promise.allSettled(\n pending.map((transaction) => this.reconcileSolanaPay(transaction.id)),\n );\n\n return observations.reduce<Record<string, SolanaPayStatus>>(\n (results, observation, index) => {\n if (observation.status === 'fulfilled') {\n results[pending[index].id] = observation.value;\n }\n\n return results;\n },\n {},\n );\n }\n\n #finalizeSolanaPayTransaction(\n transactionId: string,\n status: SolanaPayStatus,\n ): void {\n const transaction = getTransaction(transactionId, this.messenger);\n\n if (\n transaction?.status !== TransactionStatus.submitted ||\n !transaction.isExternalPublish\n ) {\n return;\n }\n\n const failure = getSolanaPayFailure(status);\n\n if (failure) {\n this.messenger.call(\n 'TransactionController:failTransaction',\n transactionId,\n new Error(failure),\n );\n return;\n }\n\n if (status.outcome !== 'succeeded') {\n return;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: this.messenger,\n note: 'Intent complete after Relay Solana completion',\n },\n (draft) => {\n draft.isIntentComplete = true;\n },\n );\n\n this.messenger.call(\n 'TransactionController:confirmTransaction',\n transactionId,\n );\n }\n\n #requireSolanaExecution(transactionId: string): MetamaskPaySolanaExecution {\n const execution = getTransaction(transactionId, this.messenger)?.metamaskPay\n ?.solanaExecution;\n\n if (!execution) {\n throw new Error('TransactionPayController: Solana execution missing');\n }\n\n return execution;\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
|
+
{"version":3,"file":"TransactionPayController.js","sourceRoot":"","sources":["../src/TransactionPayController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAMrE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,eAAe,EACf,wBAAwB,GAEzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAmBxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,yBAAyB,GAAG;IAChC,eAAe;IACf,aAAa;IACb,0BAA0B;IAC1B,gBAAgB;IAChB,oBAAoB;IACpB,wBAAwB;IACxB,gCAAgC;IAChC,aAAa;IACb,mCAAmC;IACnC,oCAAoC;IACpC,oBAAoB;IACpB,wBAAwB;IACxB,sBAAsB;IACtB,mBAAmB;IACnB,oBAAoB;CACZ,CAAC;AAEX,MAAM,aAAa,GAAiD;IAClE,eAAe,EAAE;QACf,sBAAsB,EAAE,KAAK;QAC7B,kBAAkB,EAAE,IAAI;QACxB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,GAAkC,EAAE,CAAC,CAAC;IAC5D,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,OAAO,wBAAyB,SAAQ,cAI7C;IACU,SAAS,CAA0B;IAEnC,YAAY,CAA6B;IAEzC,cAAc,CAAyB;IAEvC,WAAW,CAAsB;IAEjC,yBAAyB,CAAmC;IAE5D,uBAAuB,CAAkC;IAEzD,YAAY,CAEO;IAEnB,cAAc,CAEO;IAErB,gBAAgB,CAAU;IAE1B,WAAW,CAAuB;IAElC,kCAAkC,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhE,YAAY,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,eAAe,EACf,SAAS,EACT,UAAU,EACV,KAAK,GAC2B;QAChC,KAAK,CAAC;YACJ,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,GAAG,eAAe,EAAE,EAAE,GAAG,KAAK,EAAE;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAC;QAC1D,IAAI,CAAC,uBAAuB,GAAG,sBAAsB,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,CAAC,SAAS,CAAC,4BAA4B,CACzC,IAAI,EACJ,yBAAyB,CAC1B,CAAC;QAEF,2BAA2B,CACzB,SAAS,EACT,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EACtC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;QAEF,SAAS,CAAC,SAAS,CACjB,mCAAmC,EACnC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAC1C,CAAC,0BAA0B,EAAE,EAAE,CAAC,0BAA0B,CAAC,YAAY,CACxE,CAAC;QAEF,qBAAqB,CACnB,SAAS,EACT,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAChB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;QAEF,kCAAkC;QAClC,IAAI,cAAc,CAAC;YACjB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,SAAS;YACT,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,oBAAoB,CAClB,aAAqB,EACrB,QAAmC;QAEnC,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,CAAC,eAAe,EAAE,EAAE;YAC7D,MAAM,MAAM,GAAsB;gBAChC,eAAe,EAAE,eAAe,CAAC,eAAe;gBAChD,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,mBAAmB,EAAE,eAAe,CAAC,mBAAmB;gBACxD,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,yBAAyB,EAAE,eAAe,CAAC,yBAAyB;gBACpE,WAAW,EAAE,eAAe,CAAC,WAAW;gBACxC,eAAe,EAAE,eAAe,CAAC,eAAe;gBAChD,eAAe,EAAE,eAAe,CAAC,eAAe;gBAChD,QAAQ,EAAE,eAAe,CAAC,QAAQ;aACnC,CAAC;YAEF,MAAM,uBAAuB,GAAG,MAAM,CAAC,eAAe,CAAC;YAEvD,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEjB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAEvC,IACE,CAAC,MAAM,CAAC,WAAW;gBACnB,MAAM,CAAC,eAAe,KAAK,uBAAuB,EAClD,CAAC;gBACD,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,kBAAkB,CAAC,OAAkC;QACnD,kBAAkB,CAAC,OAAO,EAAE;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAiC;QACjD,iBAAiB,CAAC,OAAO,EAAE;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,wBAAwB,CACtB,GAAG,IAAkD;QAErD,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;;;OASG;IACH,aAAa,CACX,GAAG,IAAuC;QAE1C,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;OAMG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,sBAAsB,CACpB,GAAG,IAAgD;QAEnD,OAAO,CACL,IAAI,CAAC,uBAAuB,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC1E,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,WAA4B;QACtC,OAAO,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACH,iCAAiC,CAC/B,GAAG,IAAgE;QAEnE,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;OAMG;IACH,kCAAkC,CAChC,GAAG,IAAiE;QAEpE,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,kBAAkB,CAAC,aAAqB;QAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CACtE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAClB,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QAEF,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CACvD,IAAI,CAAC,SAAS,EACd,2BAA2B,CACzB,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAC3C,WAAW,CACZ,CACF,CAAC;QAEF,sBAAsB,CACpB,IAAI,CAAC,SAAS,EACd,aAAa,EACb,wBAAwB,CACtB,2BAA2B,CACzB,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAC3C,WAAW,CACZ,EACD,mBAAmB,CACpB,EACD,6BAA6B,CAC9B,CAAC;QAEF,MAAM,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAC5C,CAAC;QAEF,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,sBAAsB;QAC1B,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAC1C,gCAAgC,CACjC,CAAC;QAEF,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE;YAClD,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,eAAe,CAAC;YAE3D,OAAO,CACL,SAAS,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CACxE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CACzB,IAAI,CAAC,kCAAkC,CAAC,GAAG,CAAC,EAAE,CAAC,CAChD,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,UAAU,CAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CACtE,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CACzB,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAAC,EAAE,CAAC,CACnD,CAAC;QAEF,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;YAC9B,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;YACjD,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC,EACD,EAAE,CACH,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,8BAA8B,CAC5B,aAAqB;QAErB,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAE9D,OAAO,8BAA8B,CACnC,kBAAkB,CAAC,SAAS,CAAC,EAC7B,SAAS,CACV,CAAC;IACJ,CAAC;IAED,0BAA0B,CACxB,YAA+B,EAC/B,oBAAmD;QAEnD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,eAAe,CAAC;YAE3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,MAAM,mBAAmB,GAAG,oBAAoB,EAAE,IAAI,CACpD,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAC7C,CAAC;YAEF,MAAM,iBAAiB,GACrB,mBAAmB,EAAE,WAAW,EAAE,eAAe,CAAC;YAEpD,MAAM,WAAW,GAAG,8BAA8B,CAChD,kBAAkB,CAAC,SAAS,CAAC,EAC7B,SAAS,CACV,CAAC;YAEF,MAAM,mBAAmB,GACvB,iBAAiB;gBACjB,8BAA8B,CAC5B,kBAAkB,CAAC,iBAAiB,CAAC,EACrC,iBAAiB,CAClB,CAAC;YAEJ,IAAI,CAAC,8BAA8B,CAAC,mBAAmB,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6CAA6C,EAAE;gBACpE,GAAG,WAAW;gBACd,UAAU,EAAE,IAAI,CAAC,kCAAkC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6BAA6B,CAC3B,aAAqB,EACrB,MAAuB;QAEvB,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAElE,IACE,WAAW,EAAE,MAAM,KAAK,iBAAiB,CAAC,SAAS;YACnD,CAAC,WAAW,CAAC,iBAAiB,EAC9B,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,uCAAuC,EACvC,aAAa,EACb,IAAI,KAAK,CAAC,OAAO,CAAC,CACnB,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,iBAAiB,CACf;YACE,aAAa;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,+CAA+C;SACtD,EACD,CAAC,KAAK,EAAE,EAAE;YACR,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAChC,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,0CAA0C,EAC1C,aAAa,CACd,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,aAAqB;QAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW;YAC1E,EAAE,eAAe,CAAC;QAEpB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,sBAAsB,CAAC,aAAqB;QAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,OAAO,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB,CACpB,aAAqB,EACrB,EAAqD;QAErD,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;YAClC,IAAI,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,oBAAoB,GAAG,OAAO,EAAE,YAAY,CAAC;YACnD,MAAM,cAAc,GAAG,OAAO,EAAE,MAAM,CAAC;YACvC,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;YACjD,MAAM,mBAAmB,GAAG,OAAO,EAAE,WAAW,CAAC;YACjD,MAAM,uBAAuB,GAAG,OAAO,EAAE,eAAe,CAAC;YACzD,MAAM,yBAAyB,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC;YACnE,MAAM,2BAA2B,GAC/B,OAAO,EAAE,WAAW,EAAE,uBAAuB,CAAC;YAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,eAAe,CAAC,aAAa,CAAC,GAAG;oBAC/B,WAAW,EAAE,EAAE;oBACf,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,EAAE;iBACX,CAAC;gBAEF,OAAO,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;YAC3C,CAAC;YAED,EAAE,CAAC,OAAO,CAAC,CAAC;YAEZ,MAAM,qBAAqB,GACzB,OAAO,CAAC,YAAY,EAAE,OAAO,KAAK,oBAAoB,EAAE,OAAO,CAAC;YAElE,MAAM,4BAA4B,GAChC,OAAO,CAAC,YAAY,EAAE,UAAU,KAAK,oBAAoB,EAAE,UAAU,CAAC;YAExE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC;YAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;YACnE,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,KAAK,mBAAmB,CAAC;YACvE,MAAM,wBAAwB,GAC5B,OAAO,CAAC,eAAe,KAAK,uBAAuB,CAAC;YACtD,MAAM,mBAAmB,GACvB,OAAO,CAAC,WAAW,EAAE,UAAU,KAAK,yBAAyB,CAAC;YAChE,MAAM,0BAA0B,GAC9B,OAAO,CAAC,WAAW,EAAE,uBAAuB;gBAC5C,2BAA2B,CAAC;YAE9B,IACE,qBAAqB;gBACrB,cAAc;gBACd,eAAe;gBACf,kBAAkB;gBAClB,wBAAwB,EACxB,CAAC;gBACD,mBAAmB,CACjB,aAAa;gBACb,6DAA6D;gBAC7D,OAAgB;gBAChB,4DAA4D;gBAC5D,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,CACjB,CAAC;gBAEF,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,IACL,4BAA4B;gBAC5B,OAAO,CAAC,WAAW;gBACnB,CAAC,OAAO,CAAC,WAAW,EACpB,CAAC;gBACD,8DAA8D;gBAC9D,qEAAqE;gBACrE,uEAAuE;gBACvE,mEAAmE;gBACnE,uEAAuE;gBACvE,mBAAmB,CACjB,aAAa;gBACb,6DAA6D;gBAC7D,OAAgB;gBAChB,4DAA4D;gBAC5D,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,CACjB,CAAC;YACJ,CAAC;YAED,IAAI,mBAAmB,IAAI,0BAA0B,EAAE,CAAC;gBACtD,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,kBAAkB,EAAE,CAAC;YACvB,YAAY,CAAC;gBACX,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;gBACzD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;gBAC1D,aAAa;gBACb,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC9D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,0BAA0B,CACxB,WAA4B;QAE5B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEnE,MAAM,kBAAkB,GACtB,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC;YAClC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9D,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAC/C,CAAC,QAAQ,EAAsC,EAAE,CAC/C,wBAAwB,CAAC,QAAQ,CAAC,CACrC,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAE1E,OAAO,gBAAgB,CACrB,IAAI,CAAC,SAAS,EACd,eAAe,EAAE,OAAO,EACxB,eAAe,EAAE,OAAO,EACxB,WAAW,CAAC,IAAI,EAChB,eAAe,EAAE,WAAW,EAAE,uBAAuB,CACtD,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { StateMetadata } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { TransactionStatus } from '@metamask/transaction-controller';\nimport type {\n MetamaskPaySolanaExecution,\n TransactionMeta,\n} 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 { getRelayStatus } from './strategy/relay/relay-api.js';\nimport {\n getSolanaPaySupportDiagnostics,\n isSolanaPayLifecycleTransition,\n} from './strategy/relay/solana-pay-diagnostics.js';\nimport {\n applyRelayStatusObservation,\n applySolanaSourceFailure,\n getSolanaPayFailure,\n getSolanaPayStatus,\n isTerminalSolanaPayOutcome,\n persistSolanaExecution,\n readSolanaSourceFailure,\n submitSolanaPayFollowUp,\n} from './strategy/relay/solana-pay.js';\nimport type {\n GetAmountDataCallback,\n GetBalanceCallback,\n GetDelegationTransactionCallback,\n GetPaymentOverrideDataCallback,\n PolymarketCallbacks,\n SolanaPayStatus,\n SolanaPaySupportDiagnostics,\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 getTransaction,\n subscribeAssetChanges,\n subscribeTransactionChanges,\n updateTransaction,\n} from './utils/transaction.js';\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getAmountData',\n 'getClientId',\n 'getDelegationTransaction',\n 'getFiatOptions',\n 'getInfuraProjectId',\n 'getPaymentOverrideData',\n 'getSolanaPaySupportDiagnostics',\n 'getStrategy',\n 'polymarketGetDepositWalletAddress',\n 'polymarketSubmitDepositWalletBatch',\n 'reconcileSolanaPay',\n 'recoverSolanaPayStatus',\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 #infuraProjectId?: string;\n\n readonly #polymarket?: PolymarketCallbacks;\n\n readonly #recoveringSolanaPayTransactionIds = new Set<string>();\n\n constructor({\n clientId,\n fiatOptions,\n getAmountData,\n getBalance,\n getDelegationTransaction,\n getPaymentOverrideData,\n getStrategy,\n getStrategies,\n infuraProjectId,\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.#infuraProjectId = infuraProjectId;\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 messenger.subscribe(\n 'TransactionController:stateChange',\n this.#publishSolanaPayLifecycle.bind(this),\n (transactionControllerState) => transactionControllerState.transactions,\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 /**\n * Returns the Infura project ID used to resolve `{infuraProjectId}`\n * placeholders in RPC URLs.\n *\n * @returns The Infura project ID, if configured.\n */\n getInfuraProjectId(): string | undefined {\n return this.#infuraProjectId;\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 /**\n * Observes a Solana Pay execution through Relay status and finalizes the\n * externally published target transaction once the outcome is terminal.\n * While Relay has not observed the source transaction, its on-chain status\n * is read once from the Solana RPC to detect a failed or expired source.\n * Once Relay delivered the funds of a Money Account deposit, the non-atomic\n * second leg runs once, guarded by the follow-up checkpoint.\n *\n * This method never signs or broadcasts the Solana source transaction, and\n * never notifies Relay.\n *\n * @param transactionId - Target transaction ID.\n * @returns The latest observed status.\n */\n async reconcileSolanaPay(transactionId: string): Promise<SolanaPayStatus> {\n const { requestId } = this.#requireSolanaExecution(transactionId);\n\n const relayStatus = await getRelayStatus(this.messenger, requestId).then(\n (status) => status,\n () => undefined,\n );\n\n const sourceFailureReason = await readSolanaSourceFailure(\n this.messenger,\n applyRelayStatusObservation(\n this.#requireSolanaExecution(transactionId),\n relayStatus,\n ),\n );\n\n persistSolanaExecution(\n this.messenger,\n transactionId,\n applySolanaSourceFailure(\n applyRelayStatusObservation(\n this.#requireSolanaExecution(transactionId),\n relayStatus,\n ),\n sourceFailureReason,\n ),\n 'Observe Relay Solana status',\n );\n\n await submitSolanaPayFollowUp(this.messenger, transactionId);\n\n const status = getSolanaPayStatus(\n this.#requireSolanaExecution(transactionId),\n );\n\n this.#finalizeSolanaPayTransaction(transactionId, status);\n return status;\n }\n\n /**\n * Observes every persisted Solana Pay execution that is not terminal once,\n * independently of each other. Clients call it again on foreground or\n * startup to keep observing.\n *\n * This method never signs, broadcasts, or notifies Relay.\n *\n * @returns Latest statuses keyed by target transaction ID, omitting\n * executions whose observation failed.\n */\n async recoverSolanaPayStatus(): Promise<Record<string, SolanaPayStatus>> {\n const { transactions } = this.messenger.call(\n 'TransactionController:getState',\n );\n\n const pending = transactions.filter((transaction) => {\n const execution = transaction.metamaskPay?.solanaExecution;\n\n return (\n execution && !isTerminalSolanaPayOutcome(getSolanaPayStatus(execution))\n );\n });\n\n pending.forEach(({ id }) =>\n this.#recoveringSolanaPayTransactionIds.add(id),\n );\n\n const observations = await Promise.allSettled(\n pending.map((transaction) => this.reconcileSolanaPay(transaction.id)),\n );\n\n pending.forEach(({ id }) =>\n this.#recoveringSolanaPayTransactionIds.delete(id),\n );\n\n return observations.reduce<Record<string, SolanaPayStatus>>(\n (results, observation, index) => {\n if (observation.status === 'fulfilled') {\n results[pending[index].id] = observation.value;\n }\n\n return results;\n },\n {},\n );\n }\n\n /**\n * Returns the privacy-safe support diagnostics of a Solana Pay execution.\n *\n * The diagnostics only carry categorical values and identifier-presence\n * flags, never accounts, assets, amounts, identifiers or failure text.\n *\n * @param transactionId - Target transaction ID.\n * @returns Categorical diagnostics of the persisted execution checkpoint.\n */\n getSolanaPaySupportDiagnostics(\n transactionId: string,\n ): SolanaPaySupportDiagnostics {\n const execution = this.#requireSolanaExecution(transactionId);\n\n return getSolanaPaySupportDiagnostics(\n getSolanaPayStatus(execution),\n execution,\n );\n }\n\n #publishSolanaPayLifecycle(\n transactions: TransactionMeta[],\n previousTransactions: TransactionMeta[] | undefined,\n ): void {\n for (const transaction of transactions) {\n const execution = transaction.metamaskPay?.solanaExecution;\n\n if (!execution) {\n continue;\n }\n\n const previousTransaction = previousTransactions?.find(\n (previous) => previous.id === transaction.id,\n );\n\n const previousExecution =\n previousTransaction?.metamaskPay?.solanaExecution;\n\n const diagnostics = getSolanaPaySupportDiagnostics(\n getSolanaPayStatus(execution),\n execution,\n );\n\n const previousDiagnostics =\n previousExecution &&\n getSolanaPaySupportDiagnostics(\n getSolanaPayStatus(previousExecution),\n previousExecution,\n );\n\n if (!isSolanaPayLifecycleTransition(previousDiagnostics, diagnostics)) {\n continue;\n }\n\n this.messenger.publish('TransactionPayController:solanaPayLifecycle', {\n ...diagnostics,\n isRecovery: this.#recoveringSolanaPayTransactionIds.has(transaction.id),\n });\n }\n }\n\n #finalizeSolanaPayTransaction(\n transactionId: string,\n status: SolanaPayStatus,\n ): void {\n const transaction = getTransaction(transactionId, this.messenger);\n\n if (\n transaction?.status !== TransactionStatus.submitted ||\n !transaction.isExternalPublish\n ) {\n return;\n }\n\n const failure = getSolanaPayFailure(status);\n\n if (failure) {\n this.messenger.call(\n 'TransactionController:failTransaction',\n transactionId,\n new Error(failure),\n );\n return;\n }\n\n if (status.outcome !== 'succeeded') {\n return;\n }\n\n updateTransaction(\n {\n transactionId,\n messenger: this.messenger,\n note: 'Intent complete after Relay Solana completion',\n },\n (draft) => {\n draft.isIntentComplete = true;\n },\n );\n\n this.messenger.call(\n 'TransactionController:confirmTransaction',\n transactionId,\n );\n }\n\n #requireSolanaExecution(transactionId: string): MetamaskPaySolanaExecution {\n const execution = getTransaction(transactionId, this.messenger)?.metamaskPay\n ?.solanaExecution;\n\n if (!execution) {\n throw new Error('TransactionPayController: Solana execution missing');\n }\n\n return execution;\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"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type { GetAmountDataCallback, GetAmountDataRequest, GetAmountDataResponse, GetBalanceCallback, GetBalanceRequest, GetBalanceResponse, GetPaymentOverrideDataRequest, GetPaymentOverrideDataResponse, PayStrategyExecuteResult, PolymarketCallbacks, QuoteErrorInfo, QuoteErrorReason, SolanaPayOutcome, SolanaPayStatus, TransactionConfig, TransactionConfigCallback, TransactionData, TransactionFiatPayment, TransactionFiatPaymentCallback, TransactionPayFiatOptions, TransactionPayControllerActions, TransactionPayControllerEvents, TransactionPayControllerGetStateAction, TransactionPayControllerMessenger, TransactionPayControllerOptions, TransactionPayControllerState, TransactionPayControllerStateChangeEvent, TransactionPaymentToken, TransactionPayQuote, TransactionPayRequiredToken, TransactionPaySourceAmount, TransactionPayTotals, UpdateFiatPaymentRequest, UpdatePaymentTokenRequest, } from './types.js';
|
|
2
|
-
export type { TransactionPayControllerGetAmountDataAction, TransactionPayControllerGetClientIdAction, TransactionPayControllerGetDelegationTransactionAction, TransactionPayControllerGetFiatOptionsAction, TransactionPayControllerGetInfuraProjectIdAction, TransactionPayControllerGetStrategyAction, TransactionPayControllerPolymarketGetDepositWalletAddressAction, TransactionPayControllerPolymarketSubmitDepositWalletBatchAction, TransactionPayControllerReconcileSolanaPayAction, TransactionPayControllerRecoverSolanaPayStatusAction, TransactionPayControllerSetTransactionConfigAction, TransactionPayControllerUpdatePaymentTokenAction, TransactionPayControllerUpdateFiatPaymentAction, } from './TransactionPayController-method-action-types.js';
|
|
1
|
+
export type { GetAmountDataCallback, GetAmountDataRequest, GetAmountDataResponse, GetBalanceCallback, GetBalanceRequest, GetBalanceResponse, GetPaymentOverrideDataRequest, GetPaymentOverrideDataResponse, PayStrategyExecuteResult, PolymarketCallbacks, QuoteErrorInfo, QuoteErrorReason, SolanaPayErrorCode, SolanaPayLifecyclePayload, SolanaPayOutcome, SolanaPayStatus, SolanaPaySupportDiagnostics, TransactionConfig, TransactionConfigCallback, TransactionData, TransactionFiatPayment, TransactionFiatPaymentCallback, TransactionPayFiatOptions, TransactionPayControllerActions, TransactionPayControllerEvents, TransactionPayControllerGetStateAction, TransactionPayControllerMessenger, TransactionPayControllerOptions, TransactionPayControllerSolanaPayLifecycleEvent, TransactionPayControllerState, TransactionPayControllerStateChangeEvent, TransactionPaymentToken, TransactionPayQuote, TransactionPayRequiredToken, TransactionPaySourceAmount, TransactionPayTotals, UpdateFiatPaymentRequest, UpdatePaymentTokenRequest, } from './types.js';
|
|
2
|
+
export type { TransactionPayControllerGetAmountDataAction, TransactionPayControllerGetClientIdAction, TransactionPayControllerGetDelegationTransactionAction, TransactionPayControllerGetFiatOptionsAction, TransactionPayControllerGetInfuraProjectIdAction, TransactionPayControllerGetSolanaPaySupportDiagnosticsAction, TransactionPayControllerGetStrategyAction, TransactionPayControllerPolymarketGetDepositWalletAddressAction, TransactionPayControllerPolymarketSubmitDepositWalletBatchAction, TransactionPayControllerReconcileSolanaPayAction, TransactionPayControllerRecoverSolanaPayStatusAction, 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';
|
|
5
5
|
export { TransactionPayPublishHook } from './helpers/TransactionPayPublishHook.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,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,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,gDAAgD,EAChD,yCAAyC,EACzC,+DAA+D,EAC/D,gEAAgE,EAChE,gDAAgD,EAChD,oDAAoD,EACpD,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"}
|
|
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,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,2BAA2B,EAC3B,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,+CAA+C,EAC/C,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,gDAAgD,EAChD,4DAA4D,EAC5D,yCAAyC,EACzC,+DAA+D,EAC/D,gEAAgE,EAChE,gDAAgD,EAChD,oDAAoD,EACpD,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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwDA,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 PayStrategyExecuteResult,\n PolymarketCallbacks,\n QuoteErrorInfo,\n QuoteErrorReason,\n SolanaPayErrorCode,\n SolanaPayLifecyclePayload,\n SolanaPayOutcome,\n SolanaPayStatus,\n SolanaPaySupportDiagnostics,\n TransactionConfig,\n TransactionConfigCallback,\n TransactionData,\n TransactionFiatPayment,\n TransactionFiatPaymentCallback,\n TransactionPayFiatOptions,\n TransactionPayControllerActions,\n TransactionPayControllerEvents,\n TransactionPayControllerGetStateAction,\n TransactionPayControllerMessenger,\n TransactionPayControllerOptions,\n TransactionPayControllerSolanaPayLifecycleEvent,\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 TransactionPayControllerGetInfuraProjectIdAction,\n TransactionPayControllerGetSolanaPaySupportDiagnosticsAction,\n TransactionPayControllerGetStrategyAction,\n TransactionPayControllerPolymarketGetDepositWalletAddressAction,\n TransactionPayControllerPolymarketSubmitDepositWalletBatchAction,\n TransactionPayControllerReconcileSolanaPayAction,\n TransactionPayControllerRecoverSolanaPayStatusAction,\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":"relay-submit-non-evm.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-non-evm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAK1C,OAAO,KAAK,EACV,wBAAwB,EACxB,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAwBxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgBtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAAC,EAC3C,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IAChD,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"relay-submit-non-evm.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-non-evm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAK1C,OAAO,KAAK,EACV,wBAAwB,EACxB,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAwBxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgBtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAAC,EAC3C,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IAChD,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA0HpC"}
|
|
@@ -84,6 +84,7 @@ export async function submitRelayNonEvmQuote({ messenger, quote, transaction, })
|
|
|
84
84
|
targetChainId: request.targetChainId,
|
|
85
85
|
targetTokenAddress: request.targetTokenAddress,
|
|
86
86
|
sourceAmountRaw: quote.sourceAmount.raw,
|
|
87
|
+
sourceAssetId: request.sourceAssetId,
|
|
87
88
|
sourceChainId: scope,
|
|
88
89
|
sourceStatus: 'not-observed',
|
|
89
90
|
sourceWalletAccountId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit-non-evm.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-non-evm.ts"],"names":[],"mappings":"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","sourcesContent":["import { errorCodes } from '@metamask/rpc-errors';\nimport type {\n MetamaskPaySolanaExecution,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger, isObject } from '@metamask/utils';\n\nimport { DEFAULT_QUOTE_REFRESH_INTERVAL } from '../../constants.js';\nimport { projectLogger } from '../../logger.js';\nimport type {\n PayStrategyExecuteResult,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getTransaction, updateTransaction } from '../../utils/transaction.js';\nimport { RELAY_SOLANA_CHAIN_ID } from './constants.js';\nimport { notifyRelayTransaction } from './relay-api.js';\nimport { waitForRelayCompletion } from './relay-submit.js';\nimport {\n applyRelayCompletion,\n applySolanaSourceFailure,\n getRelaySolanaTransaction,\n getSolanaPayFailure,\n getSolanaSourceAddress,\n getSolanaSourceChainId,\n isHypercoreDepositQuoteRequest,\n isMoneyAccountRequest,\n isSolanaPayProductTransaction,\n persistSolanaExecution,\n readSolanaSourceFailure,\n} from './solana-pay.js';\nimport {\n compileRelaySolanaTransaction,\n getAccountSnapId,\n getSourceWalletAccountId,\n signAndSendSolanaTransaction,\n} from './solana-transaction.js';\nimport type { RelaySolanaPayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-submit-non-evm');\n\n/**\n * Time a quote stays executable after the refresh interval elapses, covering\n * the in-flight refresh and the hand-off from approval to the publish hook.\n */\nconst QUOTE_EXPIRY_GRACE_PERIOD = 10 * 1000; // 10 Seconds\n\n/** Snap errors guaranteed to have happened before broadcast. */\nconst NOT_SUBMITTED_ERROR_CODES: number[] = [\n errorCodes.rpc.invalidRequest,\n errorCodes.rpc.invalidParams,\n];\n\n/**\n * Executes a Relay quote paid with a non-EVM payment token.\n *\n * Modelled on bridge-status-controller `submitNonEvmHandler`: Core signs and\n * broadcasts through the account Snap with exactly one `signAndSendTransaction`\n * request, then observes settlement through Relay. The `attempting` checkpoint\n * is persisted before crossing the Snap boundary so a restart never signs a\n * second time.\n *\n * Blockhash lifetime: the transaction is compiled at quote time and quotes are\n * refreshed every 30 seconds, well inside the ~60 to 90 second blockhash\n * validity. The transaction is recompiled with a fresh blockhash before\n * signing so the user approval is never rejected for an expired blockhash.\n *\n * @param request - Execution request.\n * @param request.messenger - Controller messenger.\n * @param request.quote - Non-EVM Relay quote to execute.\n * @param request.transaction - Target transaction.\n * @returns An externally handled publish result.\n */\nexport async function submitRelayNonEvmQuote({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelaySolanaPayQuote>;\n transaction: TransactionMeta;\n}): Promise<PayStrategyExecuteResult> {\n const { id: transactionId } = transaction;\n\n // A persisted checkpoint means a previous attempt may have crossed the Snap\n // boundary, so only observe it and never sign again.\n if (getTransaction(transactionId, messenger)?.metamaskPay?.solanaExecution) {\n const status = await messenger.call(\n 'TransactionPayController:reconcileSolanaPay',\n transactionId,\n );\n\n return {\n externallyHandled: true,\n outcome: status.submissionOutcome ?? 'ambiguous',\n };\n }\n\n if (!quote.original.metamask.affordability.isAffordable) {\n throw new Error('Solana source is not affordable');\n }\n\n const { quotesLastUpdated } = messenger.call(\n 'TransactionPayController:getState',\n ).transactionData[transactionId];\n\n if (\n Date.now() - (quotesLastUpdated ?? 0) >\n DEFAULT_QUOTE_REFRESH_INTERVAL + QUOTE_EXPIRY_GRACE_PERIOD\n ) {\n throw new Error('Solana quote expired');\n }\n\n const { request } = quote;\n const scope = getSolanaSourceChainId(request);\n const sourceWalletAccountId = getSourceWalletAccountId(messenger, request);\n const snapId = getAccountSnapId(messenger, sourceWalletAccountId);\n\n const { lastValidBlockHeight, transaction: unsignedTransaction } =\n await compileRelaySolanaTransaction({\n messenger,\n payer: getSolanaSourceAddress(request),\n scope,\n transaction: getRelaySolanaTransaction(quote.original),\n });\n\n const requiresNonAtomicFollowUp = isMoneyAccountRequest(request);\n\n const execution: MetamaskPaySolanaExecution = {\n // A direct HyperCore deposit is the product action itself.\n atomicProductActionIncluded:\n Boolean(quote.original.request.txs?.length) ||\n isHypercoreDepositQuoteRequest(quote.original.request),\n atomicProductActionRequired:\n isSolanaPayProductTransaction(transaction) && !requiresNonAtomicFollowUp,\n followUpStatus: requiresNonAtomicFollowUp ? 'not-started' : 'not-required',\n lastValidBlockHeight,\n notificationStatus: 'not-ready',\n phase: 'attempting',\n relayStatus: 'not-observed',\n requestId: quote.original.requestId,\n requiresNonAtomicFollowUp,\n targetChainId: request.targetChainId,\n targetTokenAddress: request.targetTokenAddress,\n sourceAmountRaw: quote.sourceAmount.raw,\n sourceChainId: scope,\n sourceStatus: 'not-observed',\n sourceWalletAccountId,\n };\n\n persistSolanaExecution(\n messenger,\n transactionId,\n execution,\n 'Start one Solana source attempt',\n );\n\n let snapResponse: unknown;\n\n try {\n snapResponse = await signAndSendSolanaTransaction({\n accountId: sourceWalletAccountId,\n messenger,\n scope,\n snapId,\n transaction: unsignedTransaction,\n });\n } catch (error) {\n return recordSnapFailure(messenger, transactionId, execution, error);\n }\n\n const sourceTransactionId = getSnapTransactionId(snapResponse);\n\n if (!sourceTransactionId) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'unknown', sourceStatus: 'unknown' },\n 'Record ambiguous Solana source outcome',\n );\n\n return { externallyHandled: true, outcome: 'ambiguous' };\n }\n\n const submitted: MetamaskPaySolanaExecution = {\n ...execution,\n notificationStatus: 'pending',\n phase: 'submitted',\n sourceStatus: 'pending',\n sourceTransactionId,\n };\n\n persistSolanaExecution(\n messenger,\n transactionId,\n submitted,\n 'Record submitted Solana source transaction',\n );\n\n await notifyRelay(messenger, transactionId, submitted, sourceTransactionId);\n\n return await completeExecution({ messenger, quote, transaction });\n}\n\n/**\n * Waits for Relay settlement, then reconciles the checkpoint, which runs the\n * optional non-atomic second leg, and marks the intent complete once every\n * leg has landed.\n *\n * @param request - Completion request.\n * @param request.messenger - Controller messenger.\n * @param request.quote - Submitted non-EVM Relay quote.\n * @param request.transaction - Target transaction.\n * @returns An externally handled publish result.\n */\nasync function completeExecution({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelaySolanaPayQuote>;\n transaction: TransactionMeta;\n}): Promise<PayStrategyExecuteResult> {\n const { id: transactionId } = transaction;\n\n const completion = await waitForRelayCompletion(quote.original, messenger, {\n isSourceFailed: async () =>\n await observeSolanaSourceFailure(messenger, transactionId),\n tolerateFailure: true,\n });\n\n log('Relay Solana request completed', completion);\n\n persistSolanaExecution(\n messenger,\n transactionId,\n applyRelayCompletion(\n requireSolanaExecution(messenger, transactionId),\n completion,\n ),\n 'Record Relay Solana completion',\n );\n\n const status = await messenger.call(\n 'TransactionPayController:reconcileSolanaPay',\n transactionId,\n );\n\n const failure = getSolanaPayFailure(status);\n\n if (failure) {\n throw new Error(failure);\n }\n\n if (status.outcome !== 'succeeded') {\n // Polling timed out or a leg has not landed yet; restart-safe recovery\n // keeps observing.\n return { externallyHandled: true, outcome: 'submitted' };\n }\n\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Intent complete after Relay Solana completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { externallyHandled: true, outcome: 'submitted' };\n}\n\n/**\n * Reads the on-chain status of the submitted source transaction while Relay\n * has not indexed it, and persists a failed or expired source.\n *\n * @param messenger - Controller messenger.\n * @param transactionId - Target transaction ID.\n * @returns True if the source transaction failed.\n */\nasync function observeSolanaSourceFailure(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n): Promise<boolean> {\n const sourceFailureReason = await readSolanaSourceFailure(\n messenger,\n requireSolanaExecution(messenger, transactionId),\n );\n\n if (!sourceFailureReason) {\n return false;\n }\n\n persistSolanaExecution(\n messenger,\n transactionId,\n applySolanaSourceFailure(\n requireSolanaExecution(messenger, transactionId),\n sourceFailureReason,\n ),\n 'Record Solana source outcome: failed',\n );\n\n return true;\n}\n\nfunction requireSolanaExecution(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n): MetamaskPaySolanaExecution {\n const execution = getTransaction(transactionId, messenger)?.metamaskPay\n ?.solanaExecution;\n\n if (!execution) {\n throw new Error('Solana execution missing');\n }\n\n return execution;\n}\n\nasync function notifyRelay(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n execution: MetamaskPaySolanaExecution,\n sourceTransactionId: string,\n): Promise<void> {\n const notificationStatus = await notifyRelayTransaction(messenger, {\n chainId: String(RELAY_SOLANA_CHAIN_ID),\n requestId: execution.requestId,\n txHash: sourceTransactionId,\n }).then(\n () => 'success' as const,\n () => 'failure' as const,\n );\n\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, notificationStatus },\n 'Record Relay indexing notification result',\n );\n}\n\nfunction recordSnapFailure(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n execution: MetamaskPaySolanaExecution,\n error: unknown,\n): PayStrategyExecuteResult {\n const code = isObject(error) ? error.code : undefined;\n const reason = error instanceof Error ? error.message : String(error);\n\n if (code === errorCodes.provider.userRejectedRequest) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'user-rejected' },\n 'Record Solana source outcome: user-rejected',\n );\n\n return { externallyHandled: true, outcome: 'user-rejected' };\n }\n\n if (typeof code === 'number' && NOT_SUBMITTED_ERROR_CODES.includes(code)) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'not-submitted', sourceFailureReason: reason },\n 'Record Solana source outcome: not-submitted',\n );\n\n return { error: reason, externallyHandled: true, outcome: 'not-submitted' };\n }\n\n persistSolanaExecution(\n messenger,\n transactionId,\n {\n ...execution,\n phase: 'unknown',\n sourceFailureReason: reason,\n sourceStatus: 'unknown',\n },\n 'Record ambiguous Solana source outcome',\n );\n\n return { externallyHandled: true, outcome: 'ambiguous' };\n}\n\nfunction getSnapTransactionId(response: unknown): string | undefined {\n if (!isObject(response)) {\n return undefined;\n }\n\n const { transactionId, signature } = response;\n\n if (typeof transactionId === 'string' && transactionId) {\n return transactionId;\n }\n\n return typeof signature === 'string' && signature ? signature : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-submit-non-evm.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-non-evm.ts"],"names":[],"mappings":"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","sourcesContent":["import { errorCodes } from '@metamask/rpc-errors';\nimport type {\n MetamaskPaySolanaExecution,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger, isObject } from '@metamask/utils';\n\nimport { DEFAULT_QUOTE_REFRESH_INTERVAL } from '../../constants.js';\nimport { projectLogger } from '../../logger.js';\nimport type {\n PayStrategyExecuteResult,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getTransaction, updateTransaction } from '../../utils/transaction.js';\nimport { RELAY_SOLANA_CHAIN_ID } from './constants.js';\nimport { notifyRelayTransaction } from './relay-api.js';\nimport { waitForRelayCompletion } from './relay-submit.js';\nimport {\n applyRelayCompletion,\n applySolanaSourceFailure,\n getRelaySolanaTransaction,\n getSolanaPayFailure,\n getSolanaSourceAddress,\n getSolanaSourceChainId,\n isHypercoreDepositQuoteRequest,\n isMoneyAccountRequest,\n isSolanaPayProductTransaction,\n persistSolanaExecution,\n readSolanaSourceFailure,\n} from './solana-pay.js';\nimport {\n compileRelaySolanaTransaction,\n getAccountSnapId,\n getSourceWalletAccountId,\n signAndSendSolanaTransaction,\n} from './solana-transaction.js';\nimport type { RelaySolanaPayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-submit-non-evm');\n\n/**\n * Time a quote stays executable after the refresh interval elapses, covering\n * the in-flight refresh and the hand-off from approval to the publish hook.\n */\nconst QUOTE_EXPIRY_GRACE_PERIOD = 10 * 1000; // 10 Seconds\n\n/** Snap errors guaranteed to have happened before broadcast. */\nconst NOT_SUBMITTED_ERROR_CODES: number[] = [\n errorCodes.rpc.invalidRequest,\n errorCodes.rpc.invalidParams,\n];\n\n/**\n * Executes a Relay quote paid with a non-EVM payment token.\n *\n * Modelled on bridge-status-controller `submitNonEvmHandler`: Core signs and\n * broadcasts through the account Snap with exactly one `signAndSendTransaction`\n * request, then observes settlement through Relay. The `attempting` checkpoint\n * is persisted before crossing the Snap boundary so a restart never signs a\n * second time.\n *\n * Blockhash lifetime: the transaction is compiled at quote time and quotes are\n * refreshed every 30 seconds, well inside the ~60 to 90 second blockhash\n * validity. The transaction is recompiled with a fresh blockhash before\n * signing so the user approval is never rejected for an expired blockhash.\n *\n * @param request - Execution request.\n * @param request.messenger - Controller messenger.\n * @param request.quote - Non-EVM Relay quote to execute.\n * @param request.transaction - Target transaction.\n * @returns An externally handled publish result.\n */\nexport async function submitRelayNonEvmQuote({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelaySolanaPayQuote>;\n transaction: TransactionMeta;\n}): Promise<PayStrategyExecuteResult> {\n const { id: transactionId } = transaction;\n\n // A persisted checkpoint means a previous attempt may have crossed the Snap\n // boundary, so only observe it and never sign again.\n if (getTransaction(transactionId, messenger)?.metamaskPay?.solanaExecution) {\n const status = await messenger.call(\n 'TransactionPayController:reconcileSolanaPay',\n transactionId,\n );\n\n return {\n externallyHandled: true,\n outcome: status.submissionOutcome ?? 'ambiguous',\n };\n }\n\n if (!quote.original.metamask.affordability.isAffordable) {\n throw new Error('Solana source is not affordable');\n }\n\n const { quotesLastUpdated } = messenger.call(\n 'TransactionPayController:getState',\n ).transactionData[transactionId];\n\n if (\n Date.now() - (quotesLastUpdated ?? 0) >\n DEFAULT_QUOTE_REFRESH_INTERVAL + QUOTE_EXPIRY_GRACE_PERIOD\n ) {\n throw new Error('Solana quote expired');\n }\n\n const { request } = quote;\n const scope = getSolanaSourceChainId(request);\n const sourceWalletAccountId = getSourceWalletAccountId(messenger, request);\n const snapId = getAccountSnapId(messenger, sourceWalletAccountId);\n\n const { lastValidBlockHeight, transaction: unsignedTransaction } =\n await compileRelaySolanaTransaction({\n messenger,\n payer: getSolanaSourceAddress(request),\n scope,\n transaction: getRelaySolanaTransaction(quote.original),\n });\n\n const requiresNonAtomicFollowUp = isMoneyAccountRequest(request);\n\n const execution: MetamaskPaySolanaExecution = {\n // A direct HyperCore deposit is the product action itself.\n atomicProductActionIncluded:\n Boolean(quote.original.request.txs?.length) ||\n isHypercoreDepositQuoteRequest(quote.original.request),\n atomicProductActionRequired:\n isSolanaPayProductTransaction(transaction) && !requiresNonAtomicFollowUp,\n followUpStatus: requiresNonAtomicFollowUp ? 'not-started' : 'not-required',\n lastValidBlockHeight,\n notificationStatus: 'not-ready',\n phase: 'attempting',\n relayStatus: 'not-observed',\n requestId: quote.original.requestId,\n requiresNonAtomicFollowUp,\n targetChainId: request.targetChainId,\n targetTokenAddress: request.targetTokenAddress,\n sourceAmountRaw: quote.sourceAmount.raw,\n sourceAssetId: request.sourceAssetId,\n sourceChainId: scope,\n sourceStatus: 'not-observed',\n sourceWalletAccountId,\n };\n\n persistSolanaExecution(\n messenger,\n transactionId,\n execution,\n 'Start one Solana source attempt',\n );\n\n let snapResponse: unknown;\n\n try {\n snapResponse = await signAndSendSolanaTransaction({\n accountId: sourceWalletAccountId,\n messenger,\n scope,\n snapId,\n transaction: unsignedTransaction,\n });\n } catch (error) {\n return recordSnapFailure(messenger, transactionId, execution, error);\n }\n\n const sourceTransactionId = getSnapTransactionId(snapResponse);\n\n if (!sourceTransactionId) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'unknown', sourceStatus: 'unknown' },\n 'Record ambiguous Solana source outcome',\n );\n\n return { externallyHandled: true, outcome: 'ambiguous' };\n }\n\n const submitted: MetamaskPaySolanaExecution = {\n ...execution,\n notificationStatus: 'pending',\n phase: 'submitted',\n sourceStatus: 'pending',\n sourceTransactionId,\n };\n\n persistSolanaExecution(\n messenger,\n transactionId,\n submitted,\n 'Record submitted Solana source transaction',\n );\n\n await notifyRelay(messenger, transactionId, submitted, sourceTransactionId);\n\n return await completeExecution({ messenger, quote, transaction });\n}\n\n/**\n * Waits for Relay settlement, then reconciles the checkpoint, which runs the\n * optional non-atomic second leg, and marks the intent complete once every\n * leg has landed.\n *\n * @param request - Completion request.\n * @param request.messenger - Controller messenger.\n * @param request.quote - Submitted non-EVM Relay quote.\n * @param request.transaction - Target transaction.\n * @returns An externally handled publish result.\n */\nasync function completeExecution({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelaySolanaPayQuote>;\n transaction: TransactionMeta;\n}): Promise<PayStrategyExecuteResult> {\n const { id: transactionId } = transaction;\n\n const completion = await waitForRelayCompletion(quote.original, messenger, {\n isSourceFailed: async () =>\n await observeSolanaSourceFailure(messenger, transactionId),\n tolerateFailure: true,\n });\n\n log('Relay Solana request completed', completion);\n\n persistSolanaExecution(\n messenger,\n transactionId,\n applyRelayCompletion(\n requireSolanaExecution(messenger, transactionId),\n completion,\n ),\n 'Record Relay Solana completion',\n );\n\n const status = await messenger.call(\n 'TransactionPayController:reconcileSolanaPay',\n transactionId,\n );\n\n const failure = getSolanaPayFailure(status);\n\n if (failure) {\n throw new Error(failure);\n }\n\n if (status.outcome !== 'succeeded') {\n // Polling timed out or a leg has not landed yet; restart-safe recovery\n // keeps observing.\n return { externallyHandled: true, outcome: 'submitted' };\n }\n\n updateTransaction(\n {\n transactionId,\n messenger,\n note: 'Intent complete after Relay Solana completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { externallyHandled: true, outcome: 'submitted' };\n}\n\n/**\n * Reads the on-chain status of the submitted source transaction while Relay\n * has not indexed it, and persists a failed or expired source.\n *\n * @param messenger - Controller messenger.\n * @param transactionId - Target transaction ID.\n * @returns True if the source transaction failed.\n */\nasync function observeSolanaSourceFailure(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n): Promise<boolean> {\n const sourceFailureReason = await readSolanaSourceFailure(\n messenger,\n requireSolanaExecution(messenger, transactionId),\n );\n\n if (!sourceFailureReason) {\n return false;\n }\n\n persistSolanaExecution(\n messenger,\n transactionId,\n applySolanaSourceFailure(\n requireSolanaExecution(messenger, transactionId),\n sourceFailureReason,\n ),\n 'Record Solana source outcome: failed',\n );\n\n return true;\n}\n\nfunction requireSolanaExecution(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n): MetamaskPaySolanaExecution {\n const execution = getTransaction(transactionId, messenger)?.metamaskPay\n ?.solanaExecution;\n\n if (!execution) {\n throw new Error('Solana execution missing');\n }\n\n return execution;\n}\n\nasync function notifyRelay(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n execution: MetamaskPaySolanaExecution,\n sourceTransactionId: string,\n): Promise<void> {\n const notificationStatus = await notifyRelayTransaction(messenger, {\n chainId: String(RELAY_SOLANA_CHAIN_ID),\n requestId: execution.requestId,\n txHash: sourceTransactionId,\n }).then(\n () => 'success' as const,\n () => 'failure' as const,\n );\n\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, notificationStatus },\n 'Record Relay indexing notification result',\n );\n}\n\nfunction recordSnapFailure(\n messenger: TransactionPayControllerMessenger,\n transactionId: string,\n execution: MetamaskPaySolanaExecution,\n error: unknown,\n): PayStrategyExecuteResult {\n const code = isObject(error) ? error.code : undefined;\n const reason = error instanceof Error ? error.message : String(error);\n\n if (code === errorCodes.provider.userRejectedRequest) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'user-rejected' },\n 'Record Solana source outcome: user-rejected',\n );\n\n return { externallyHandled: true, outcome: 'user-rejected' };\n }\n\n if (typeof code === 'number' && NOT_SUBMITTED_ERROR_CODES.includes(code)) {\n persistSolanaExecution(\n messenger,\n transactionId,\n { ...execution, phase: 'not-submitted', sourceFailureReason: reason },\n 'Record Solana source outcome: not-submitted',\n );\n\n return { error: reason, externallyHandled: true, outcome: 'not-submitted' };\n }\n\n persistSolanaExecution(\n messenger,\n transactionId,\n {\n ...execution,\n phase: 'unknown',\n sourceFailureReason: reason,\n sourceStatus: 'unknown',\n },\n 'Record ambiguous Solana source outcome',\n );\n\n return { externallyHandled: true, outcome: 'ambiguous' };\n}\n\nfunction getSnapTransactionId(response: unknown): string | undefined {\n if (!isObject(response)) {\n return undefined;\n }\n\n const { transactionId, signature } = response;\n\n if (typeof transactionId === 'string' && transactionId) {\n return transactionId;\n }\n\n return typeof signature === 'string' && signature ? signature : undefined;\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MetamaskPaySolanaExecution } from '@metamask/transaction-controller';
|
|
2
|
+
import type { SolanaPayStatus, SolanaPaySupportDiagnostics } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates the privacy-safe support projection of a Solana Pay execution.
|
|
5
|
+
*
|
|
6
|
+
* Accounts, assets, amounts, request IDs, transaction IDs, provider payloads
|
|
7
|
+
* and free-form failure reasons are deliberately left out.
|
|
8
|
+
*
|
|
9
|
+
* @param status - Observable status derived from the checkpoint.
|
|
10
|
+
* @param execution - Durable Solana execution checkpoint.
|
|
11
|
+
* @returns Categorical support and analytics diagnostics.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSolanaPaySupportDiagnostics(status: SolanaPayStatus, execution: MetamaskPaySolanaExecution): SolanaPaySupportDiagnostics;
|
|
14
|
+
/**
|
|
15
|
+
* Whether any categorical diagnostics value changed between two checkpoints.
|
|
16
|
+
*
|
|
17
|
+
* @param previous - Diagnostics of the previous checkpoint, if any.
|
|
18
|
+
* @param next - Diagnostics of the next checkpoint.
|
|
19
|
+
* @returns True if a lifecycle event should be emitted.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isSolanaPayLifecycleTransition(previous: SolanaPaySupportDiagnostics | undefined, next: SolanaPaySupportDiagnostics): boolean;
|
|
22
|
+
//# sourceMappingURL=solana-pay-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-pay-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/solana-pay-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAInF,OAAO,KAAK,EAEV,eAAe,EACf,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAKxB;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,0BAA0B,GACpC,2BAA2B,CAqB7B;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,2BAA2B,GAAG,SAAS,EACjD,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAET"}
|