Skip to content
Merged
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
57 changes: 54 additions & 3 deletions app/scripts/lib/dapp-swap/dapp-swap-middleware.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,19 @@ const fetchQuotes = jest.fn();
const setSwapQuotes = jest.fn();
const getNetworkConfigurationByNetworkClientId = jest.fn();

const createMiddleware = () => {
const createMiddleware = (
args: {
// eslint-disable-next-line @typescript-eslint/naming-convention
dappSwapMetricsFlag?: { enabled: boolean; bridge_quote_fees: number };
} = {},
) => {
const middlewareFunction = createDappSwapMiddleware({
fetchQuotes,
setSwapQuotes,
getNetworkConfigurationByNetworkClientId,
// eslint-disable-next-line @typescript-eslint/naming-convention
dappSwapMetricsFlag: { enabled: true, bridge_quote_fees: 250 },
...args,
});
return { middlewareFunction };
};
Expand All @@ -50,6 +58,42 @@ describe('DappSwapMiddleware', () => {
await flushPromises();
});

it('does not fetch quotes if dapp swap is not enabled', async () => {
fetchQuotes.mockReturnValueOnce(mockBridgeQuotes);
const { middlewareFunction } = createMiddleware({
// eslint-disable-next-line @typescript-eslint/naming-convention
dappSwapMetricsFlag: { enabled: false, bridge_quote_fees: 250 },
});

const req = {
...REQUEST_MOCK,
method: 'eth_sendTransaction',
origin: 'https://metamask.github.io',
securityAlertResponse: {
securityAlertId: '123',
},
params: [
{
data: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000068f0dd1b0000000000000000000000000000000000000000000000000000000000000003100604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000007ffc3dbf3b2b50ff3a1d5523bc24bb5043837b1400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000178239802520a9c99dcbd791f81326b70298d62900000000000000000000000000000000000000000000000000000000000601470c',
from: '0x12312312312312',
chainId: '1',
calls: [],
},
],
networkClientId: 'networkClientId',
};

await middlewareFunction(
req as unknown as DappSwapMiddlewareRequest<(string | { to: string })[]>,
{ ...JsonRpcResponseStruct.TYPE },
() => undefined,
);

await flushPromises();

expect(fetchQuotes).not.toHaveBeenCalled();
});

it('for correct origin, fetches quotes and sets swap quotes', async () => {
fetchQuotes.mockReturnValueOnce(mockBridgeQuotes);
getNetworkConfigurationByNetworkClientId.mockReturnValueOnce({
Expand All @@ -67,7 +111,7 @@ describe('DappSwapMiddleware', () => {
},
params: [
{
data: '0x123123123',
data: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000068f0dd1b0000000000000000000000000000000000000000000000000000000000000003100604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000007ffc3dbf3b2b50ff3a1d5523bc24bb5043837b1400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000178239802520a9c99dcbd791f81326b70298d62900000000000000000000000000000000000000000000000000000000000601470c',
from: '0x12312312312312',
calls: [],
},
Expand All @@ -84,8 +128,15 @@ describe('DappSwapMiddleware', () => {
await flushPromises();

expect(fetchQuotes).toHaveBeenCalledWith({
walletAddress: '0x12312312312312',
destChainId: '0x1',
destTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
fee: 250,
gasIncluded: false,
gasIncluded7702: false,
srcChainId: '0x1',
srcTokenAddress: '0x0000000000000000000000000000000000000000',
srcTokenAmount: '0x5af3107a4000',
walletAddress: '0x12312312312312',
});
});
});
19 changes: 17 additions & 2 deletions app/scripts/lib/dapp-swap/dapp-swap-middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export type DappSwapMiddlewareRequest<
const FOUR_BYTE_EXECUTE_SWAP_CONTRACT = '0x3593564c';
const DAPP_SWAP_COMPARISON_ORIGIN = 'https://app.uniswap.org';
const TEST_DAPP_ORIGIN = 'https://metamask.github.io';
const DEFAULT_QUOTEFEE = 250;

const getSwapDetails = (params: DappSwapMiddlewareRequest['params']) => {
if (!params?.length) {
Expand Down Expand Up @@ -67,6 +68,7 @@ export function createDappSwapMiddleware<
fetchQuotes,
setSwapQuotes,
getNetworkConfigurationByNetworkClientId,
dappSwapMetricsFlag,
}: {
fetchQuotes: (quotesInput: GenericQuoteRequest) => Promise<QuoteResponse[]>;
setSwapQuotes: (
Expand All @@ -76,13 +78,22 @@ export function createDappSwapMiddleware<
getNetworkConfigurationByNetworkClientId: (
networkClientId: NetworkClientId,
) => NetworkConfiguration | undefined;
// eslint-disable-next-line @typescript-eslint/naming-convention
dappSwapMetricsFlag: { enabled: boolean; bridge_quote_fees: number };
}) {
return async (
req: DappSwapMiddlewareRequest<Params>,
_res: JsonRpcResponse<Result>,
next: () => void,
) => {
try {
// eslint-disable-next-line @typescript-eslint/naming-convention
const { enabled: dappSwapEnabled, bridge_quote_fees: bridgeQuoteFees } =
dappSwapMetricsFlag;
if (!dappSwapEnabled) {
next();
return;
}
const { securityAlertResponse, params, origin } = req;
const { securityAlertId } = securityAlertResponse ?? {};

Expand All @@ -96,10 +107,14 @@ export function createDappSwapMiddleware<

const { data, from } = getSwapDetails(params);
if (data && securityAlertId && chainId) {
const { quotesInput } = getDataFromSwap(chainId as Hex, data, from);
const { quotesInput } = getDataFromSwap(chainId as Hex, data);
if (quotesInput) {
const startTime = new Date().getTime();
fetchQuotes(quotesInput)
fetchQuotes({
...quotesInput,
walletAddress: from,
fee: bridgeQuoteFees ?? DEFAULT_QUOTEFEE,
})
.then((quotes) => {
const endTime = new Date().getTime();
const latency = endTime - startTime;
Expand Down
3 changes: 3 additions & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -7075,6 +7075,9 @@ export default class MetamaskController extends EventEmitter {
this.networkController.getNetworkConfigurationByNetworkClientId.bind(
this.networkController,
),
dappSwapMetricsFlag:
this.remoteFeatureFlagController?.state?.remoteFeatureFlags
?.dappSwapMetrics,
}),
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,7 @@ describe('dapp-swap utils', () => {
it('returns the correct data from sweep function', () => {
const sweepData =
'0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000068f0dd1b0000000000000000000000000000000000000000000000000000000000000003100604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000007ffc3dbf3b2b50ff3a1d5523bc24bb5043837b1400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000178239802520a9c99dcbd791f81326b70298d62900000000000000000000000000000000000000000000000000000000000601470c';
const result = getDataFromSwap(
'0xa4b1',
sweepData,
'0x178239802520a9c99dcbd791f81326b70298d629',
);
const result = getDataFromSwap('0xa4b1', sweepData);
expect(result).toStrictEqual({
amountMin: '0x060147',
commands: '0x100604',
Expand All @@ -77,24 +73,18 @@ describe('dapp-swap utils', () => {
quotesInput: {
destChainId: '0xa4b1',
destTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
fee: 250,
gasIncluded: false,
gasIncluded7702: false,
srcChainId: '0xa4b1',
srcTokenAddress: '0x0000000000000000000000000000000000000000',
srcTokenAmount: '0x5af3107a4000',
walletAddress: '0x178239802520a9c99dcbd791f81326b70298d629',
},
});
});
it('returns the correct data from seaport function', () => {
const seaportData =
'0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000068f0de3c000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003070b0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9000000000000000000000000178239802520a9c99dcbd791f81326b70298d62900000000000000000000000000000000000000000000000000000000000000000c';
const result = getDataFromSwap(
'0xa4b1',
seaportData,
'0x178239802520a9c99dcbd791f81326b70298d629',
);
const result = getDataFromSwap('0xa4b1', seaportData);
expect(result).toStrictEqual({
amountMin: '0x5f',
commands: '0x10',
Expand All @@ -105,13 +95,11 @@ describe('dapp-swap utils', () => {
quotesInput: {
destChainId: '0xa4b1',
destTokenAddress: '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9',
fee: 250,
gasIncluded: false,
gasIncluded7702: false,
srcChainId: '0xa4b1',
srcTokenAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831',
srcTokenAmount: '0x64',
walletAddress: '0x178239802520a9c99dcbd791f81326b70298d629',
},
});
});
Expand Down
15 changes: 2 additions & 13 deletions shared/modules/dapp-swap-comparison/dapp-swap-comparison-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { BigNumber } from 'bignumber.js';
import { Hex } from '@metamask/utils';
import { Interface, TransactionDescription } from '@ethersproject/abi';
import {
GenericQuoteRequest,
isNativeAddress,
QuoteResponse,
TxData,
Expand All @@ -13,8 +12,6 @@ import {
} from '@metamask/transaction-controller';
import { getCommandValues } from './dapp-swap-command-utils';

const DEFAULT_QUOTEFEE = 250;

export const ABI = [
{
constant: true,
Expand Down Expand Up @@ -71,11 +68,7 @@ function parseTransactionData(data?: string) {
return { commands, commandBytes, inputs };
}

export function getDataFromSwap(
chainId: Hex,
data?: string,
walletAddress?: string,
) {
export function getDataFromSwap(chainId: Hex, data?: string) {
const { commands, commandBytes, inputs } = parseTransactionData(data);

const { amountMin, quotesInput } = getCommandValues(
Expand All @@ -87,11 +80,7 @@ export function getDataFromSwap(
return {
amountMin,
commands,
quotesInput: {
...quotesInput,
walletAddress,
fee: DEFAULT_QUOTEFEE,
} as GenericQuoteRequest,
quotesInput,
tokenAddresses: [
quotesInput?.destTokenAddress,
quotesInput?.srcTokenAddress,
Expand Down
Loading
Loading