Skip to content

Commit 54a85b8

Browse files
committed
fix(deposit): add force update and fix faulty data migration
1 parent e897616 commit 54a85b8

File tree

8 files changed

+557
-10
lines changed

8 files changed

+557
-10
lines changed

app/components/UI/Ramp/Deposit/orderProcessor/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ export async function processDepositOrder(
7171
return {
7272
...updatedFiatOrder,
7373
account: order.account,
74-
network: order.network,
7574
lastTimeFetched: Date.now(),
7675
errorCount: 0,
7776
};

app/components/UI/Ramp/index.tsx

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import NotificationManager from '../../../core/NotificationManager';
99
import {
1010
FiatOrder,
1111
getPendingOrders,
12+
getForceUpdateOrders,
1213
addFiatOrder,
1314
updateFiatOrder,
1415
getCustomOrderIds,
@@ -119,15 +120,10 @@ function FiatOrders() {
119120
const dispatch = useDispatch();
120121
const dispatchThunk = useThunkDispatch();
121122
const navigation = useNavigation();
122-
// TODO: Replace "any" with type
123-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
124-
const pendingOrders = useSelector<any, FiatOrder[]>(getPendingOrders);
125-
// TODO: Replace "any" with type
126-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
127-
const customOrderIds = useSelector<any, CustomIdData[]>(getCustomOrderIds);
128-
// TODO: Replace "any" with type
129-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
130-
const authenticationUrls = useSelector<any, string[]>(getAuthenticationUrls);
123+
const pendingOrders = useSelector(getPendingOrders);
124+
const forceUpdateOrders = useSelector(getForceUpdateOrders);
125+
const customOrderIds = useSelector(getCustomOrderIds);
126+
const authenticationUrls = useSelector(getAuthenticationUrls);
131127

132128
const dispatchAddFiatOrder = useCallback(
133129
(order: FiatOrder) => {
@@ -196,6 +192,20 @@ function FiatOrders() {
196192
},
197193
);
198194

195+
useInterval(
196+
async () => {
197+
await Promise.all(
198+
forceUpdateOrders.map((order) =>
199+
processFiatOrder(order, dispatchUpdateFiatOrder, dispatchThunk),
200+
),
201+
);
202+
},
203+
{
204+
delay: forceUpdateOrders.length ? POLLING_FREQUENCY : null,
205+
immediate: true,
206+
},
207+
);
208+
199209
const handleNavigationStateChange = useCallback(
200210
async (navState: WebViewNavigation, authenticationUrl: string) => {
201211
if (

app/reducers/fiatOrders/index.test.ts

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import fiatOrderReducer, {
2222
getOrders,
2323
getAllDepositOrders,
2424
getPendingOrders,
25+
getForceUpdateOrders,
2526
getProviderName,
2627
getRampNetworks,
2728
initialState,
@@ -1564,6 +1565,206 @@ describe('selectors', () => {
15641565
});
15651566
});
15661567

1568+
describe('getForceUpdateOrders', () => {
1569+
it('should return the orders by forceUpdate property', () => {
1570+
const state1 = merge({}, initialRootState, {
1571+
engine: {
1572+
backgroundState: {
1573+
NetworkController: {
1574+
selectedNetworkClientId: 'binance',
1575+
networksMetadata: {
1576+
binance: {
1577+
status: 'available',
1578+
EIPS: {},
1579+
},
1580+
},
1581+
networkConfigurationsByChainId: {
1582+
'0x38': {
1583+
blockExplorerUrls: ['https://etherscan.com'],
1584+
chainId: '0x38',
1585+
defaultRpcEndpointIndex: 0,
1586+
name: 'Binance network',
1587+
nativeCurrency: 'BNB',
1588+
rpcEndpoints: [
1589+
{
1590+
networkClientId: 'binance',
1591+
type: 'Custom',
1592+
url: 'https://binance.infura.io/v3',
1593+
},
1594+
],
1595+
},
1596+
},
1597+
},
1598+
AccountsController: MOCK_ACCOUNTS_CONTROLLER_STATE_1,
1599+
},
1600+
},
1601+
fiatOrders: {
1602+
orders: [
1603+
{
1604+
...mockOrder1,
1605+
state: 'PENDING',
1606+
id: 'test-56-order-1',
1607+
network: '56',
1608+
account: MOCK_ADDRESS_1,
1609+
forceUpdate: true,
1610+
},
1611+
{
1612+
...mockOrder1,
1613+
id: 'test-56-order-2',
1614+
network: '56',
1615+
account: MOCK_ADDRESS_2,
1616+
forceUpdate: true,
1617+
},
1618+
{
1619+
...mockOrder1,
1620+
state: 'PENDING',
1621+
id: 'test-56-order-3',
1622+
network: '56',
1623+
account: MOCK_ADDRESS_1,
1624+
},
1625+
{
1626+
...mockOrder1,
1627+
id: 'test-1-order-1',
1628+
network: '1',
1629+
account: MOCK_ADDRESS_1,
1630+
},
1631+
{
1632+
...mockOrder1,
1633+
id: 'test-1-order-2',
1634+
network: '1',
1635+
account: MOCK_ADDRESS_2,
1636+
forceUpdate: true,
1637+
},
1638+
{
1639+
...mockOrder1,
1640+
id: 'test-56-order-3',
1641+
network: '1',
1642+
account: MOCK_ADDRESS_1,
1643+
},
1644+
],
1645+
},
1646+
});
1647+
1648+
const state2 = merge({}, initialRootState, {
1649+
engine: {
1650+
backgroundState: {
1651+
NetworkController: {
1652+
selectedNetworkClientId: 'mainnet',
1653+
networksMetadata: {},
1654+
networkConfigurations: {
1655+
mainnet: {
1656+
id: 'mainnet',
1657+
rpcUrl: 'https://mainnet.infura.io/v3',
1658+
chainId: '0x1',
1659+
ticker: 'ETH',
1660+
nickname: 'Ethereum network',
1661+
rpcPrefs: {
1662+
blockExplorerUrl: 'https://etherscan.com',
1663+
},
1664+
},
1665+
},
1666+
},
1667+
AccountsController: MOCK_ACCOUNTS_CONTROLLER_STATE_2,
1668+
},
1669+
},
1670+
fiatOrders: {
1671+
orders: [
1672+
{
1673+
...mockOrder1,
1674+
id: 'test-56-order-1',
1675+
network: '56',
1676+
account: MOCK_ADDRESS_1,
1677+
},
1678+
{
1679+
...mockOrder1,
1680+
id: 'test-56-order-2',
1681+
network: '56',
1682+
account: MOCK_ADDRESS_2,
1683+
forceUpdate: true,
1684+
},
1685+
{
1686+
...mockOrder1,
1687+
id: 'test-56-order-3',
1688+
network: '56',
1689+
account: MOCK_ADDRESS_1,
1690+
forceUpdate: false,
1691+
},
1692+
{
1693+
...mockOrder1,
1694+
id: 'test-1-order-1',
1695+
network: '1',
1696+
account: MOCK_ADDRESS_1,
1697+
forceUpdate: true,
1698+
},
1699+
{
1700+
...mockOrder1,
1701+
id: 'test-1-order-2',
1702+
state: 'PENDING',
1703+
network: '1',
1704+
account: MOCK_ADDRESS_2,
1705+
},
1706+
{
1707+
...mockOrder1,
1708+
id: 'test-1-order-3',
1709+
network: '1',
1710+
excludeFromPurchases: true,
1711+
account: MOCK_ADDRESS_2,
1712+
forceUpdate: true,
1713+
},
1714+
{
1715+
...mockOrder1,
1716+
id: 'test-56-order-3',
1717+
network: '1',
1718+
account: MOCK_ADDRESS_1,
1719+
},
1720+
],
1721+
},
1722+
});
1723+
1724+
expect(getForceUpdateOrders(state1)).toHaveLength(3);
1725+
expect(getForceUpdateOrders(state1).map((o) => o.id)).toEqual([
1726+
'test-56-order-1',
1727+
'test-56-order-2',
1728+
'test-1-order-2',
1729+
]);
1730+
expect(getForceUpdateOrders(state2)).toHaveLength(3);
1731+
expect(getForceUpdateOrders(state2).map((o) => o.id)).toEqual([
1732+
'test-56-order-2',
1733+
'test-1-order-1',
1734+
'test-1-order-3',
1735+
]);
1736+
});
1737+
1738+
it('it should return empty array by default', () => {
1739+
const state = merge({}, initialRootState, {
1740+
engine: {
1741+
backgroundState: {
1742+
NetworkController: {
1743+
selectedNetworkClientId: 'mainnet',
1744+
networksMetadata: {},
1745+
networkConfigurations: {
1746+
mainnet: {
1747+
id: 'mainnet',
1748+
rpcUrl: 'https://mainnet.infura.io/v3',
1749+
chainId: '0x1',
1750+
ticker: 'ETH',
1751+
nickname: 'Sepolia network',
1752+
rpcPrefs: {
1753+
blockExplorerUrl: 'https://etherscan.com',
1754+
},
1755+
},
1756+
},
1757+
},
1758+
AccountsController: MOCK_ACCOUNTS_CONTROLLER_STATE_2,
1759+
},
1760+
},
1761+
fiatOrders: {},
1762+
});
1763+
1764+
expect(getForceUpdateOrders(state)).toEqual([]);
1765+
});
1766+
});
1767+
15671768
describe('customOrdersSelector', () => {
15681769
it('should return empty array if custom order property is not defined', () => {
15691770
const state = merge({}, initialRootState, {

app/reducers/fiatOrders/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@ export const getPendingOrders = createSelector(
229229
),
230230
);
231231

232+
export const getForceUpdateOrders = createSelector(ordersSelector, (orders) =>
233+
orders.filter((order) => order.forceUpdate),
234+
);
235+
232236
const customOrdersSelector: (
233237
state: RootState,
234238
) => FiatOrdersState['customOrderIds'] = (state: RootState) =>

app/reducers/fiatOrders/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export interface FiatOrder {
5959
orderType: OrderOrderTypeEnum | DepositOrderType; // Order type
6060
errorCount?: number; // Number of errors
6161
lastTimeFetched?: number; // Last time fetched
62+
forceUpdate?: boolean; // Force update when processing
6263
data: Order | WyreOrder | DepositOrder; // Original provider data
6364
}
6465

0 commit comments

Comments
 (0)