diff --git a/packages/transaction-pay-controller/CHANGELOG.md b/packages/transaction-pay-controller/CHANGELOG.md index 5b22a8046f..60e27b3602 100644 --- a/packages/transaction-pay-controller/CHANGELOG.md +++ b/packages/transaction-pay-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `paymentOverride` property (type `PaymentOverride`) to `TransactionConfig` and `TransactionData`, settable via `setTransactionConfig` ([#8858](https://github.com/MetaMask/core/pull/8858)) + ### Changed - Bump `@metamask/assets-controller` from `^8.0.0` to `^8.0.1` ([#8874](https://github.com/MetaMask/core/pull/8874)) diff --git a/packages/transaction-pay-controller/src/TransactionPayController.test.ts b/packages/transaction-pay-controller/src/TransactionPayController.test.ts index 76d3ecd6d6..a8a93c81cc 100644 --- a/packages/transaction-pay-controller/src/TransactionPayController.test.ts +++ b/packages/transaction-pay-controller/src/TransactionPayController.test.ts @@ -6,7 +6,7 @@ import type { Hex } from '@metamask/utils'; import { TransactionPayController } from '.'; import { updateFiatPayment } from './actions/update-fiat-payment'; import { updatePaymentToken } from './actions/update-payment-token'; -import { TransactionPayStrategy } from './constants'; +import { PaymentOverride, TransactionPayStrategy } from './constants'; import { deriveFiatAssetForFiatPayment } from './strategy/fiat/utils'; import { getMessengerMock } from './tests/messenger-mock'; import type { @@ -206,6 +206,18 @@ describe('TransactionPayController', () => { ).toBe(true); }); + it('updates paymentOverride in state', () => { + const controller = createController(); + + controller.setTransactionConfig(TRANSACTION_ID_MOCK, (config) => { + config.paymentOverride = PaymentOverride.MoneyAccount; + }); + + expect( + controller.state.transactionData[TRANSACTION_ID_MOCK].paymentOverride, + ).toBe(PaymentOverride.MoneyAccount); + }); + it('triggers source amounts and quotes update when only isPostQuote changes', () => { const controller = createController(); diff --git a/packages/transaction-pay-controller/src/TransactionPayController.ts b/packages/transaction-pay-controller/src/TransactionPayController.ts index 70b4b3f8d6..567bfedabc 100644 --- a/packages/transaction-pay-controller/src/TransactionPayController.ts +++ b/packages/transaction-pay-controller/src/TransactionPayController.ts @@ -140,6 +140,7 @@ export class TransactionPayController extends BaseController< isPolymarketDepositWallet: transactionData.isPolymarketDepositWallet, refundTo: transactionData.refundTo, accountOverride: transactionData.accountOverride, + paymentOverride: transactionData.paymentOverride, }; const previousAccountOverride = config.accountOverride; @@ -153,6 +154,7 @@ export class TransactionPayController extends BaseController< transactionData.isPolymarketDepositWallet = config.isPolymarketDepositWallet; transactionData.refundTo = config.refundTo; + transactionData.paymentOverride = config.paymentOverride; if ( !config.isPostQuote && diff --git a/packages/transaction-pay-controller/src/constants.ts b/packages/transaction-pay-controller/src/constants.ts index 5f05ff249b..a808fe7341 100644 --- a/packages/transaction-pay-controller/src/constants.ts +++ b/packages/transaction-pay-controller/src/constants.ts @@ -59,6 +59,12 @@ export const STABLECOINS: Record = { [CHAIN_ID_HYPERCORE]: [HYPERCORE_USDC_ADDRESS], // USDC }; +export enum PaymentOverride { + MoneyAccount = 'moneyAccount', + Perps = 'perps', + Predict = 'predict', +} + export enum TransactionPayStrategy { Across = 'across', Bridge = 'bridge', diff --git a/packages/transaction-pay-controller/src/index.ts b/packages/transaction-pay-controller/src/index.ts index c31382d8ba..44cd88e82a 100644 --- a/packages/transaction-pay-controller/src/index.ts +++ b/packages/transaction-pay-controller/src/index.ts @@ -29,7 +29,7 @@ export type { TransactionPayControllerUpdatePaymentTokenAction, TransactionPayControllerUpdateFiatPaymentAction, } from './TransactionPayController-method-action-types'; -export { TransactionPayStrategy } from './constants'; +export { PaymentOverride, TransactionPayStrategy } from './constants'; export { TransactionPayController } from './TransactionPayController'; export { TransactionPayPublishHook } from './helpers/TransactionPayPublishHook'; export type { TransactionPayBridgeQuote } from './strategy/bridge/types'; diff --git a/packages/transaction-pay-controller/src/types.ts b/packages/transaction-pay-controller/src/types.ts index 8844400512..d6795dccdf 100644 --- a/packages/transaction-pay-controller/src/types.ts +++ b/packages/transaction-pay-controller/src/types.ts @@ -58,7 +58,11 @@ import type { import type { Hex, Json } from '@metamask/utils'; import type { Draft } from 'immer'; -import type { CONTROLLER_NAME, TransactionPayStrategy } from './constants'; +import type { + CONTROLLER_NAME, + PaymentOverride, + TransactionPayStrategy, +} from './constants'; import type { TransactionPayControllerMethodActions } from './TransactionPayController-method-action-types'; export type AllowedActions = @@ -140,6 +144,9 @@ export type TransactionConfig = { * When `isPostQuote` is false, it provides the funds and pays for gas. */ accountOverride?: Hex; + + /** Overrides the payment source for the transaction. */ + paymentOverride?: PaymentOverride; }; /** Callback to update transaction config. */ @@ -246,6 +253,9 @@ export type TransactionData = { */ accountOverride?: Hex; + /** Overrides the payment source for the transaction. */ + paymentOverride?: PaymentOverride; + /** * Token selected for the transaction. * - For standard flows (isPostQuote=false): This is the SOURCE/payment token