mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-25 03:20:23 +01:00
228 lines
9.4 KiB
JavaScript
228 lines
9.4 KiB
JavaScript
|
import nock from 'nock';
|
||
|
import { CHAIN_IDS } from '../constants/network';
|
||
|
import {
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP,
|
||
|
WETH_CONTRACT_ADDRESS,
|
||
|
WBNB_CONTRACT_ADDRESS,
|
||
|
WMATIC_CONTRACT_ADDRESS,
|
||
|
} from '../constants/swaps';
|
||
|
import {
|
||
|
TOKENS,
|
||
|
MOCK_TRADE_RESPONSE_2,
|
||
|
} from '../../ui/pages/swaps/swaps-util-test-constants';
|
||
|
import { fetchTradesInfo, shouldEnableDirectWrapping } from './swaps-utils';
|
||
|
|
||
|
jest.mock('./storage-helpers', () => ({
|
||
|
getStorageItem: jest.fn(),
|
||
|
setStorageItem: jest.fn(),
|
||
|
}));
|
||
|
|
||
|
describe('Swaps Utils', () => {
|
||
|
afterEach(() => {
|
||
|
nock.cleanAll();
|
||
|
});
|
||
|
|
||
|
describe('fetchTradesInfo', () => {
|
||
|
const expectedResult1 = {
|
||
|
zeroEx: {
|
||
|
trade: {
|
||
|
// the ethereum transaction data for the swap
|
||
|
data: '0xa6c3bf330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000005591360f8c7640fea5771c9682d6b5ecb776e1f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021486a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005efe3c3b5dfc3a75ffc8add04bbdbac1e42fa234bf4549d8dab1bc44c8056eaf0e1dfe8600000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000001c4dc1600f3000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000005591360f8c7640fea5771c9682d6b5ecb776e1f800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000036691c4f426eb8f42f150ebde43069a31cb080ad000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000021486a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000000869584cd0000000000000000000000001000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000005efe201b',
|
||
|
from: '0x2369267687A84ac7B494daE2f1542C40E37f4455',
|
||
|
value: '0x14401eab384000',
|
||
|
to: '0x61935cbdd02287b511119ddb11aeb42f1593b7ef',
|
||
|
gas: '0xa',
|
||
|
gasPrice: undefined,
|
||
|
},
|
||
|
sourceAmount: '10000000000000000',
|
||
|
destinationAmount: '2248687',
|
||
|
error: null,
|
||
|
fee: 0.875,
|
||
|
sourceToken: TOKENS[0].address,
|
||
|
destinationToken: TOKENS[1].address,
|
||
|
fetchTime: 553,
|
||
|
aggregator: 'zeroEx',
|
||
|
aggType: 'AGG',
|
||
|
approvalNeeded: {
|
||
|
data: '0x095ea7b300000000000000000000000095e6f48254609a6ee006f7d493c8e5fb97094cef0000000000000000000000000000000000000000004a817c7ffffffdabf41c00',
|
||
|
to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||
|
value: '0x0',
|
||
|
from: '0x2369267687A84ac7B494daE2f1542C40E37f4455',
|
||
|
gas: '0x12',
|
||
|
gasPrice: '0x34',
|
||
|
},
|
||
|
maxGas: 10,
|
||
|
averageGas: 1,
|
||
|
slippage: '3',
|
||
|
},
|
||
|
};
|
||
|
const expectedResult2 = {
|
||
|
zeroEx: {
|
||
|
...expectedResult1.zeroEx,
|
||
|
sourceAmount: '20000000000000000',
|
||
|
},
|
||
|
};
|
||
|
it('should fetch trade info on prod', async () => {
|
||
|
nock('https://swap.metaswap.codefi.network')
|
||
|
.get('/networks/1/trades')
|
||
|
.query(true)
|
||
|
.reply(200, MOCK_TRADE_RESPONSE_2);
|
||
|
|
||
|
const result = await fetchTradesInfo(
|
||
|
{
|
||
|
TOKENS,
|
||
|
slippage: '3',
|
||
|
sourceToken: TOKENS[0].address,
|
||
|
destinationToken: TOKENS[1].address,
|
||
|
value: '2000000000000000000',
|
||
|
fromAddress: '0xmockAddress',
|
||
|
sourceSymbol: TOKENS[0].symbol,
|
||
|
sourceDecimals: TOKENS[0].decimals,
|
||
|
sourceTokenInfo: { ...TOKENS[0] },
|
||
|
destinationTokenInfo: { ...TOKENS[1] },
|
||
|
},
|
||
|
{ chainId: CHAIN_IDS.MAINNET },
|
||
|
);
|
||
|
expect(result).toStrictEqual(expectedResult2);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('shouldEnableDirectWrapping', () => {
|
||
|
const randomTokenAddress = '0x881d40237659c251811cec9c364ef91234567890';
|
||
|
|
||
|
it('returns true if swapping from ETH to WETH', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.MAINNET]?.address,
|
||
|
WETH_CONTRACT_ADDRESS,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from ETH with uppercase chars to WETH', () => {
|
||
|
const ethAddressWithUpperCaseChars =
|
||
|
'0X0000000000000000000000000000000000000000';
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
ethAddressWithUpperCaseChars,
|
||
|
WETH_CONTRACT_ADDRESS,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from WETH to ETH', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
WETH_CONTRACT_ADDRESS,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.MAINNET]?.address,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from WETH with uppercase chars to ETH', () => {
|
||
|
const wethContractAddressWithUpperCaseChars =
|
||
|
'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
wethContractAddressWithUpperCaseChars,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.MAINNET]?.address,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns false if swapping from ETH to a non-WETH token', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.MAINNET]?.address,
|
||
|
randomTokenAddress,
|
||
|
),
|
||
|
).toBe(false);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from BNB to WBNB', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.BSC,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.BSC]?.address,
|
||
|
WBNB_CONTRACT_ADDRESS,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from WBNB to BNB', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.BSC,
|
||
|
WBNB_CONTRACT_ADDRESS,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.BSC]?.address,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns false if swapping from BNB to a non-WBNB token', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.BSC,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.BSC]?.address,
|
||
|
randomTokenAddress,
|
||
|
),
|
||
|
).toBe(false);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from MATIC to WMATIC', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.POLYGON,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.POLYGON]?.address,
|
||
|
WMATIC_CONTRACT_ADDRESS,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns true if swapping from WMATIC to MATIC', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.POLYGON,
|
||
|
WMATIC_CONTRACT_ADDRESS,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.POLYGON]?.address,
|
||
|
),
|
||
|
).toBe(true);
|
||
|
});
|
||
|
|
||
|
it('returns false if swapping from MATIC to a non-WMATIC token', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.POLYGON,
|
||
|
SWAPS_CHAINID_DEFAULT_TOKEN_MAP[CHAIN_IDS.POLYGON]?.address,
|
||
|
randomTokenAddress,
|
||
|
),
|
||
|
).toBe(false);
|
||
|
});
|
||
|
|
||
|
it('returns false if a source token is undefined', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(
|
||
|
CHAIN_IDS.MAINNET,
|
||
|
undefined,
|
||
|
WETH_CONTRACT_ADDRESS,
|
||
|
),
|
||
|
).toBe(false);
|
||
|
});
|
||
|
|
||
|
it('returns false if a destination token is undefined', () => {
|
||
|
expect(
|
||
|
shouldEnableDirectWrapping(CHAIN_IDS.MAINNET, WETH_CONTRACT_ADDRESS),
|
||
|
).toBe(false);
|
||
|
});
|
||
|
|
||
|
it('returns false if source and destination tokens are undefined', () => {
|
||
|
expect(shouldEnableDirectWrapping(CHAIN_IDS.MAINNET)).toBe(false);
|
||
|
});
|
||
|
});
|
||
|
});
|