From 9dc045fd201a97caa80a3465a2d18427c4acce83 Mon Sep 17 00:00:00 2001 From: dan437 <80175477+dan437@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:22:26 +0100 Subject: [PATCH] feat: Add types for post-quote (withdrawal) flows Add type definitions for the withdrawal-to-any-token feature: - Add `isPostQuote` and `selectedToken` to TransactionData - Add `UpdateSelectedTokenRequest` type - Add `TransactionPayControllerSetIsPostQuoteAction` action type - Add `TransactionPayControllerUpdateSelectedTokenAction` action type - Add `isPostQuote` to MetamaskPayMetadata in transaction-controller - Export new types from index.ts These types enable withdrawal flows where users can select a destination token different from the withdrawal's native token. --- packages/transaction-controller/CHANGELOG.md | 4 ++ packages/transaction-controller/src/types.ts | 6 +++ .../transaction-pay-controller/CHANGELOG.md | 5 ++ .../transaction-pay-controller/src/index.ts | 3 ++ .../transaction-pay-controller/src/types.ts | 49 ++++++++++++++++++- 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/packages/transaction-controller/CHANGELOG.md b/packages/transaction-controller/CHANGELOG.md index f9c15e0f526..86a8fd440d2 100644 --- a/packages/transaction-controller/CHANGELOG.md +++ b/packages/transaction-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `isPostQuote` field to `MetamaskPayMetadata` type for withdrawal flows ([#7773](https://github.com/MetaMask/core/pull/7773)) + ## [62.11.0] ### Added diff --git a/packages/transaction-controller/src/types.ts b/packages/transaction-controller/src/types.ts index 413bb591164..bc73c705608 100644 --- a/packages/transaction-controller/src/types.ts +++ b/packages/transaction-controller/src/types.ts @@ -2082,6 +2082,12 @@ export type MetamaskPayMetadata = { /** Chain ID of the payment token. */ chainId?: Hex; + /** + * Whether this is a post-quote transaction (e.g., withdrawal flow). + * When true, the token represents the destination rather than source. + */ + isPostQuote?: boolean; + /** Total network fee in fiat currency, including the original and bridge transactions. */ networkFeeFiat?: string; diff --git a/packages/transaction-pay-controller/CHANGELOG.md b/packages/transaction-pay-controller/CHANGELOG.md index 3254ccfca74..f6a2cbb7a8d 100644 --- a/packages/transaction-pay-controller/CHANGELOG.md +++ b/packages/transaction-pay-controller/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `isPostQuote` and `selectedToken` fields to `TransactionData` type for withdrawal flows ([#7773](https://github.com/MetaMask/core/pull/7773)) +- Add `UpdateSelectedTokenRequest` type and related action types ([#7773](https://github.com/MetaMask/core/pull/7773)) + ## [12.0.2] ### Changed diff --git a/packages/transaction-pay-controller/src/index.ts b/packages/transaction-pay-controller/src/index.ts index d3cb83c35f3..d010cdc77ab 100644 --- a/packages/transaction-pay-controller/src/index.ts +++ b/packages/transaction-pay-controller/src/index.ts @@ -7,15 +7,18 @@ export type { TransactionPayControllerMessenger, TransactionPayControllerOptions, TransactionPayControllerSetIsMaxAmountAction, + TransactionPayControllerSetIsPostQuoteAction, TransactionPayControllerState, TransactionPayControllerStateChangeEvent, TransactionPayControllerUpdatePaymentTokenAction, + TransactionPayControllerUpdateSelectedTokenAction, TransactionPaymentToken, TransactionPayQuote, TransactionPayRequiredToken, TransactionPaySourceAmount, TransactionPayTotals, UpdatePaymentTokenRequest, + UpdateSelectedTokenRequest, } from './types'; export { TransactionPayStrategy } from './constants'; export { TransactionPayController } from './TransactionPayController'; diff --git a/packages/transaction-pay-controller/src/types.ts b/packages/transaction-pay-controller/src/types.ts index 8539a6e15ff..0ce002174c5 100644 --- a/packages/transaction-pay-controller/src/types.ts +++ b/packages/transaction-pay-controller/src/types.ts @@ -85,6 +85,18 @@ export type TransactionPayControllerUpdatePaymentTokenAction = { handler: (request: UpdatePaymentTokenRequest) => void; }; +/** Action to update the selected token for a transaction (used for withdrawals). */ +export type TransactionPayControllerUpdateSelectedTokenAction = { + type: `${typeof CONTROLLER_NAME}:updateSelectedToken`; + handler: (request: UpdateSelectedTokenRequest) => void; +}; + +/** Action to set the post-quote flag for a transaction. */ +export type TransactionPayControllerSetIsPostQuoteAction = { + type: `${typeof CONTROLLER_NAME}:setIsPostQuote`; + handler: (transactionId: string, isPostQuote: boolean) => void; +}; + /** Action to set the max amount flag for a transaction. */ export type TransactionPayControllerSetIsMaxAmountAction = { type: `${typeof CONTROLLER_NAME}:setIsMaxAmount`; @@ -102,7 +114,9 @@ export type TransactionPayControllerActions = | TransactionPayControllerGetStateAction | TransactionPayControllerGetStrategyAction | TransactionPayControllerSetIsMaxAmountAction - | TransactionPayControllerUpdatePaymentTokenAction; + | TransactionPayControllerSetIsPostQuoteAction + | TransactionPayControllerUpdatePaymentTokenAction + | TransactionPayControllerUpdateSelectedTokenAction; export type TransactionPayControllerEvents = TransactionPayControllerStateChangeEvent; @@ -142,7 +156,26 @@ export type TransactionData = { /** Whether the user has selected the maximum amount. */ isMaxAmount?: boolean; - /** Source token selected for the transaction. */ + /** + * Whether this is a post-quote transaction (e.g., withdrawal flow). + * When true, the selectedToken represents the destination token, + * and the quote source is derived from the transaction's native token. + * Used for Predict/Perps withdrawals where funds flow: + * withdrawal → bridge/swap → destination token + */ + isPostQuote?: boolean; + + /** + * Token selected for the transaction. + * - For deposits (isPostQuote=false): This is the SOURCE/payment token + * - For withdrawals (isPostQuote=true): This is the DESTINATION token + */ + selectedToken?: TransactionPaymentToken; + + /** + * @deprecated Use selectedToken instead. Kept for backwards compatibility. + * Source token selected for the transaction. + */ paymentToken?: TransactionPaymentToken; /** Quotes retrieved for the transaction. */ @@ -450,6 +483,18 @@ export type UpdatePaymentTokenRequest = { chainId: Hex; }; +/** Request to update the selected token for a transaction (used for withdrawals). */ +export type UpdateSelectedTokenRequest = { + /** ID of the transaction to update. */ + transactionId: string; + + /** Address of the selected token. */ + tokenAddress: Hex; + + /** Chain ID of the selected token. */ + chainId: Hex; +}; + /** Callback to convert a transaction to a redeem delegation. */ export type GetDelegationTransactionCallback = ({ transaction,