Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions packages/transaction-pay-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Add optional `getAmountData` callback to `TransactionPayControllerOptions` for client-side nested calldata re-encoding ([#8987](https://github.com/MetaMask/core/pull/8987))
- Add `TransactionPayController:getAmountData` messenger action ([#8987](https://github.com/MetaMask/core/pull/8987))
- Add `@metamask/keyring-controller` `^26.0.0` as a dependency ([#8972](https://github.com/MetaMask/core/pull/8972))
- The package was already imported at runtime by `src/strategy/relay/hyperliquid-withdraw.ts` but wasn't declared in `package.json`; this PR fixes the omission.

### Changed

- Fiat submit now uses a three-phase relay flow after on-ramp settlement: discovery quote, calldata update via `getAmountData`, then delegation quote ([#8987](https://github.com/MetaMask/core/pull/8987))
- Fix fiat `moneyAccountDeposit` failing by using `isMaxAmount: false` in the re-quote ([#8987](https://github.com/MetaMask/core/pull/8987))

### Fixed

- Bump `@metamask/assets-controllers` from `^108.3.0` to `^108.4.0` ([#8981](https://github.com/MetaMask/core/pull/8981))
- Bump `@metamask/assets-controller` from `^8.0.2` to `^8.3.1` ([#8981](https://github.com/MetaMask/core/pull/8981), [#8985](https://github.com/MetaMask/core/pull/8985))
- Bump `@metamask/remote-feature-flag-controller` from `^4.2.1` to `^4.2.2` ([#8986](https://github.com/MetaMask/core/pull/8986))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ export type TransactionPayControllerGetDelegationTransactionAction = {
* @param args - The arguments forwarded to the {@link GetPaymentOverrideDataCallback}.
* @returns A promise resolving to the additional transactions array.
*/
export type TransactionPayControllerGetAmountDataAction = {
type: `TransactionPayController:getAmountData`;
handler: TransactionPayController['getAmountData'];
};

export type TransactionPayControllerGetPaymentOverrideDataAction = {
type: `TransactionPayController:getPaymentOverrideData`;
handler: TransactionPayController['getPaymentOverrideData'];
Expand Down Expand Up @@ -128,6 +133,7 @@ export type TransactionPayControllerMethodActions =
| TransactionPayControllerUpdatePaymentTokenAction
| TransactionPayControllerUpdateFiatPaymentAction
| TransactionPayControllerGetDelegationTransactionAction
| TransactionPayControllerGetAmountDataAction
| TransactionPayControllerGetPaymentOverrideDataAction
| TransactionPayControllerGetStrategyAction
| TransactionPayControllerPolymarketGetDepositWalletAddressAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,51 @@ describe('TransactionPayController', () => {
});
});

describe('getAmountData', () => {
it('delegates to the callback', async () => {
const resultMock = {
updates: [{ nestedTransactionIndex: 0, data: '0xabc' as const }],
};
const getAmountDataMock = jest.fn().mockResolvedValue(resultMock);

new TransactionPayController({
getAmountData: getAmountDataMock,
getDelegationTransaction: jest.fn(),
messenger,
});

const requestMock = {
amount: '5000000',
transaction: TRANSACTION_META_MOCK,
};

const result = await messenger.call(
'TransactionPayController:getAmountData',
requestMock,
);

expect(getAmountDataMock).toHaveBeenCalledWith(requestMock);
expect(result).toStrictEqual(resultMock);
});

it('returns empty updates when no callback is configured', async () => {
new TransactionPayController({
getDelegationTransaction: jest.fn(),
messenger,
});

const result = await messenger.call(
'TransactionPayController:getAmountData',
{
amount: '5000000',
transaction: TRANSACTION_META_MOCK,
},
);

expect(result).toStrictEqual({ updates: [] });
});
});

describe('polymarket callbacks', () => {
const EOA_MOCK = '0x1111111111111111111111111111111111111111' as Hex;
const DEPOSIT_WALLET_MOCK =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
import { QuoteRefresher } from './helpers/QuoteRefresher';
import { deriveFiatAssetForFiatPayment } from './strategy/fiat/utils';
import type {
GetAmountDataCallback,
GetDelegationTransactionCallback,
GetPaymentOverrideDataCallback,
PolymarketCallbacks,
Expand All @@ -36,6 +37,7 @@ import {
} from './utils/transaction';

const MESSENGER_EXPOSED_METHODS = [
'getAmountData',
'getDelegationTransaction',
'getPaymentOverrideData',
'getStrategy',
Expand Down Expand Up @@ -64,6 +66,8 @@ export class TransactionPayController extends BaseController<
TransactionPayControllerState,
TransactionPayControllerMessenger
> {
readonly #getAmountData?: GetAmountDataCallback;

readonly #getDelegationTransaction: GetDelegationTransactionCallback;

readonly #getPaymentOverrideData?: GetPaymentOverrideDataCallback;
Expand All @@ -79,6 +83,7 @@ export class TransactionPayController extends BaseController<
readonly #polymarket?: PolymarketCallbacks;

constructor({
getAmountData,
getDelegationTransaction,
getPaymentOverrideData,
getStrategy,
Expand All @@ -94,6 +99,7 @@ export class TransactionPayController extends BaseController<
state: { ...getDefaultState(), ...state },
});

this.#getAmountData = getAmountData;
this.#getDelegationTransaction = getDelegationTransaction;
this.#getPaymentOverrideData = getPaymentOverrideData;
this.#getStrategy = getStrategy;
Expand Down Expand Up @@ -233,6 +239,12 @@ export class TransactionPayController extends BaseController<
* @param args - The arguments forwarded to the {@link GetPaymentOverrideDataCallback}.
* @returns A promise resolving to the additional transactions array.
*/
getAmountData(
...args: Parameters<GetAmountDataCallback>
): ReturnType<GetAmountDataCallback> {
return this.#getAmountData?.(...args) ?? Promise.resolve({ updates: [] });
}

getPaymentOverrideData(
...args: Parameters<GetPaymentOverrideDataCallback>
): ReturnType<GetPaymentOverrideDataCallback> {
Expand Down
4 changes: 4 additions & 0 deletions packages/transaction-pay-controller/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
export type {
GetAmountDataCallback,
GetAmountDataRequest,
GetAmountDataResponse,
GetPaymentOverrideDataRequest,
GetPaymentOverrideDataResponse,
TransactionConfig,
Expand All @@ -23,6 +26,7 @@ export type {
UpdatePaymentTokenRequest,
} from './types';
export type {
TransactionPayControllerGetAmountDataAction,
TransactionPayControllerGetDelegationTransactionAction,
TransactionPayControllerGetStrategyAction,
TransactionPayControllerPolymarketGetDepositWalletAddressAction,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ export async function getFiatQuotes(
const state = messenger.call('TransactionPayController:getState');
const transactionData = state.transactionData[transactionId];
const amountFiat = transactionData?.fiatPayment?.amountFiat;
const walletAddress = transaction.txParams.from as Hex;
const walletAddress =
transactionData?.accountOverride ?? (transaction.txParams.from as Hex);
const requiredTokens = getRequiredTokens(transactionData?.tokens);
const fiatAsset = deriveFiatAssetForFiatPayment(transaction, messenger);

Expand Down
Loading
Loading