Skip to content

Commit 6c8f2de

Browse files
authored
Exclude tokens not bridged via native bridge from widget (#2512)
1 parent 17c1077 commit 6c8f2de

File tree

7 files changed

+64
-14
lines changed

7 files changed

+64
-14
lines changed

packages/checkout/sdk/src/config/tokensFetcher.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ describe('TokensFetcher', () => {
5454
'0xfe9df9ebe5fbd94b00247613b6cf7629891954e2',
5555
symbol: 'GOG',
5656
verification_status: 'verified',
57+
bridge_used: 'native',
5758
},
5859
{
5960
chain: {
@@ -71,6 +72,7 @@ describe('TokensFetcher', () => {
7172
'0x0000000000000000000000000000000000000eee',
7273
symbol: 'ETH',
7374
verification_status: 'verified',
75+
bridge_used: 'native',
7476
},
7577
{
7678
chain: {
@@ -87,6 +89,7 @@ describe('TokensFetcher', () => {
8789
root_contract_address: null,
8890
symbol: 'USDZ',
8991
verification_status: 'verified',
92+
bridge_used: 'axelar-its',
9093
},
9194
{
9295
chain: {
@@ -96,6 +99,7 @@ describe('TokensFetcher', () => {
9699
contract_address: '0xinvalid',
97100
symbol: null,
98101
decimals: null,
102+
bridge_used: null,
99103
},
100104
],
101105
},
@@ -136,6 +140,7 @@ describe('TokensFetcher', () => {
136140
icon: 'https://example.com/gog.svg',
137141
name: 'Guild of Guardians',
138142
symbol: 'GOG',
143+
bridge: 'native',
139144
});
140145

141146
// Tokens with invalid info are ignored

packages/checkout/sdk/src/config/tokensFetcher.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ChainSlug,
66
ChainTokensConfig,
77
ImxAddressConfig,
8-
TokenInfo,
8+
TokenBridgeInfo,
99
} from '../types';
1010
import { ENV_DEVELOPMENT, IMMUTABLE_API_BASE_URL } from '../env';
1111
import { HttpClient } from '../api/http';
@@ -27,6 +27,7 @@ type TokensEndpointResult = {
2727
symbol: string;
2828
root_chain_id: string | null;
2929
root_contract_address: string | null;
30+
bridge_used: string | null;
3031
};
3132

3233
type TokensEndpointResponse = {
@@ -104,7 +105,7 @@ export class TokensFetcher {
104105
return config ?? {};
105106
}
106107

107-
public async getTokensConfig(chainId: ChainId): Promise<TokenInfo[]> {
108+
public async getTokensConfig(chainId: ChainId): Promise<TokenBridgeInfo[]> {
108109
const config = await this.loadTokens();
109110
if (!config || !config[chainId]) return [];
110111

@@ -127,6 +128,7 @@ export class TokensFetcher {
127128
decimals: 18,
128129
name: 'IMX',
129130
symbol: 'IMX',
131+
bridge: null,
130132
});
131133
});
132134

@@ -144,12 +146,13 @@ export class TokensFetcher {
144146
tokens[chainId] = [];
145147
}
146148

147-
const tokenInfo: TokenInfo = {
149+
const tokenInfo: TokenBridgeInfo = {
148150
address: token.contract_address.toLowerCase(),
149151
decimals: token.decimals,
150152
name: token.name,
151153
symbol: token.symbol,
152154
icon: token.image_url ?? undefined,
155+
bridge: token.bridge_used ?? null,
153156
};
154157

155158
tokens[chainId]?.push(tokenInfo);

packages/checkout/sdk/src/smartCheckout/allowList/allowListCheck.test.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import {
1111
ChainId,
1212
OnRampConfig,
1313
OnRampProvider,
14-
OnRampProviderConfig, TokenInfo,
14+
OnRampProviderConfig,
15+
TokenBridgeInfo,
1516
} from '../../types';
1617
import { TokenBalanceResult } from '../routing/types';
1718
import { RemoteConfigFetcher } from '../../config/remoteConfigFetcher';
@@ -23,8 +24,8 @@ jest.mock('../../config/tokensFetcher');
2324

2425
describe('allowListCheck', () => {
2526
let config: CheckoutConfiguration;
26-
let tokensL1: TokenInfo[];
27-
let tokensL2: TokenInfo[];
27+
let tokensL1: TokenBridgeInfo[];
28+
let tokensL2: TokenBridgeInfo[];
2829
let onRampConfig: OnRampConfig;
2930
let balances: Map<ChainId, TokenBalanceResult>;
3031
let mockedHttpClient: jest.Mocked<HttpClient>;
@@ -64,12 +65,14 @@ describe('allowListCheck', () => {
6465
symbol: 'ETH',
6566
name: 'Ethereum',
6667
address: 'native',
68+
bridge: 'native',
6769
},
6870
{
6971
decimals: 18,
7072
symbol: 'IMX',
7173
name: 'IMX',
7274
address: '0xe9E96d1aad82562b7588F03f49aD34186f996478',
75+
bridge: null,
7376
},
7477
];
7578

@@ -79,12 +82,14 @@ describe('allowListCheck', () => {
7982
symbol: 'ETH',
8083
name: 'Ethereum',
8184
address: '0x52A6c53869Ce09a731CD772f245b97A4401d3348',
85+
bridge: 'native',
8286
},
8387
{
8488
decimals: 18,
8589
symbol: 'IMX',
8690
name: 'IMX',
8791
address: 'native',
92+
bridge: null,
8893
},
8994
];
9095

@@ -156,12 +161,14 @@ describe('allowListCheck', () => {
156161
symbol: 'ETH',
157162
decimals: 18,
158163
address: '0x52A6c53869Ce09a731CD772f245b97A4401d3348',
164+
bridge: 'native',
159165
},
160166
{
161167
decimals: 18,
162168
symbol: 'IMX',
163169
name: 'IMX',
164170
address: 'native',
171+
bridge: null,
165172
},
166173
],
167174
bridge: [
@@ -170,6 +177,7 @@ describe('allowListCheck', () => {
170177
symbol: 'ETH',
171178
decimals: 18,
172179
address: 'native',
180+
bridge: 'native',
173181
},
174182
],
175183
onRamp: [
@@ -192,6 +200,7 @@ describe('allowListCheck', () => {
192200
symbol: 'ETH',
193201
decimals: 18,
194202
address: 'native',
203+
bridge: 'native',
195204
}],
196205
onRamp: [],
197206
swap: [],
@@ -211,12 +220,14 @@ describe('allowListCheck', () => {
211220
symbol: 'ETH',
212221
name: 'Ethereum',
213222
address: '0x52A6c53869Ce09a731CD772f245b97A4401d3348',
223+
bridge: 'native',
214224
},
215225
{
216226
decimals: 18,
217227
symbol: 'IMX',
218228
name: 'IMX',
219229
address: 'native',
230+
bridge: null,
220231
},
221232
],
222233
});
@@ -259,6 +270,7 @@ describe('allowListCheck', () => {
259270
symbol: 'ETH',
260271
name: 'Ethereum',
261272
address: 'native',
273+
bridge: 'native',
262274
}]);
263275
});
264276

@@ -297,12 +309,14 @@ describe('allowListCheck', () => {
297309
decimals: 18,
298310
symbol: 'MEGA',
299311
name: 'Mega',
312+
bridge: 'native',
300313
},
301314
{
302315
decimals: 18,
303316
symbol: 'ETH',
304317
name: 'Ethereum',
305318
address: 'native',
319+
bridge: 'native',
306320
},
307321
];
308322

@@ -312,12 +326,14 @@ describe('allowListCheck', () => {
312326
decimals: 18,
313327
symbol: 'MEGA',
314328
name: 'Mega',
329+
bridge: 'native',
315330
},
316331
{
317332
decimals: 18,
318333
symbol: 'ETH',
319334
name: 'Ethereum',
320335
address: 'native',
336+
bridge: 'native',
321337
}]);
322338
});
323339

@@ -344,6 +360,7 @@ describe('allowListCheck', () => {
344360
decimals: 18,
345361
symbol: 'MEGA',
346362
name: 'Mega',
363+
bridge: 'native',
347364
}];
348365

349366
const result = await allowListCheckForBridge(config, balances, { bridge: true });
@@ -360,12 +377,14 @@ describe('allowListCheck', () => {
360377
symbol: 'ETH',
361378
name: 'Ethereum',
362379
address: '0x52A6c53869Ce09a731CD772f245b97A4401d3348',
380+
bridge: 'native',
363381
},
364382
{
365383
decimals: 18,
366384
symbol: 'IMX',
367385
name: 'IMX',
368386
address: 'native',
387+
bridge: null,
369388
},
370389
]);
371390
});
@@ -393,6 +412,7 @@ describe('allowListCheck', () => {
393412
decimals: 18,
394413
symbol: 'MEGA',
395414
name: 'Mega',
415+
bridge: 'native',
396416
}];
397417

398418
const result = await allowListCheckForSwap(config, balances, { swap: true });

packages/checkout/sdk/src/tokens/tokens.test.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,21 @@ describe('token related functions', () => {
6666
decimals: 18,
6767
name: 'token-aa-testnet',
6868
symbol: 'AA',
69+
bridge: 'native',
6970
},
7071
{
7172
address: '0x2',
7273
decimals: 18,
7374
name: 'token-bb-testnet',
7475
symbol: 'BB',
76+
bridge: 'native',
7577
},
7678
{
7779
address: '',
7880
decimals: 18,
7981
name: 'token-cc-testnet',
8082
symbol: 'CC',
83+
bridge: null,
8184
},
8285
]),
8386
};
@@ -94,18 +97,21 @@ describe('token related functions', () => {
9497
decimals: 18,
9598
name: 'token-aa-testnet',
9699
symbol: 'AA',
100+
bridge: 'native',
97101
},
98102
{
99103
address: '0x2',
100104
decimals: 18,
101105
name: 'token-bb-testnet',
102106
symbol: 'BB',
107+
bridge: 'native',
103108
},
104109
{
105110
address: '',
106111
decimals: 18,
107112
name: 'token-cc-testnet',
108113
symbol: 'CC',
114+
bridge: null,
109115
},
110116
],
111117
remoteConfigMockReturn,
@@ -122,12 +128,14 @@ describe('token related functions', () => {
122128
decimals: 18,
123129
name: 'token-aa-testnet',
124130
symbol: 'AA',
131+
bridge: 'native',
125132
},
126133
{
127134
address: '',
128135
decimals: 18,
129136
name: 'token-cc-testnet',
130137
symbol: 'CC',
138+
bridge: null,
131139
},
132140
],
133141
remoteConfigMockReturn,
@@ -144,12 +152,14 @@ describe('token related functions', () => {
144152
decimals: 18,
145153
name: 'token-aa-testnet',
146154
symbol: 'AA',
155+
bridge: 'native',
147156
},
148157
{
149158
address: '0x2',
150159
decimals: 18,
151160
name: 'token-bb-testnet',
152161
symbol: 'BB',
162+
bridge: 'native',
153163
},
154164
],
155165
remoteConfigMockReturn,
@@ -165,6 +175,7 @@ describe('token related functions', () => {
165175
decimals: 18,
166176
name: 'token-bb-testnet',
167177
symbol: 'BB',
178+
bridge: 'native',
168179
},
169180
],
170181
remoteConfigMockReturn: {
@@ -195,18 +206,14 @@ describe('token related functions', () => {
195206
decimals: 18,
196207
name: 'token-aa-testnet',
197208
symbol: 'AA',
209+
bridge: 'native',
198210
},
199211
{
200212
address: '0x2',
201213
decimals: 18,
202214
name: 'token-bb-testnet',
203215
symbol: 'BB',
204-
},
205-
{
206-
address: '',
207-
decimals: 18,
208-
name: 'token-cc-testnet',
209-
symbol: 'CC',
216+
bridge: 'native',
210217
},
211218
],
212219
remoteConfigMockReturn,

packages/checkout/sdk/src/tokens/tokens.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { ERC20ABI, NATIVE } from '../env';
1414
import { CheckoutErrorType, withCheckoutError } from '../errors';
1515
import { isMatchingAddress } from '../utils/utils';
1616

17+
const NATIVE_BRIDGE = 'native';
18+
1719
type TokenAllowListParams = {
1820
type: TokenFilterTypes;
1921
chainId?: ChainId;
@@ -56,6 +58,10 @@ export const getTokenAllowList = async (
5658
tokens = onRampConfig[OnRampProvider.TRANSAK]?.tokens || [];
5759
break;
5860
case TokenFilterTypes.BRIDGE:
61+
// Filter out tokens that are bridged through Axelar ITS, as they can't be bridged through the native bridge.
62+
tokens = (await config.tokens.getTokensConfig(targetChainId))
63+
.filter((token) => token.bridge === NATIVE_BRIDGE);
64+
break;
5965
case TokenFilterTypes.ALL:
6066
default:
6167
tokens = (await config.tokens.getTokensConfig(targetChainId));

packages/checkout/sdk/src/types/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Environment, ModuleConfiguration } from '@imtbl/config';
22
import { ExchangeOverrides, SecondaryFee } from '@imtbl/dex-sdk';
33
import { Passport } from '@imtbl/passport';
4-
import { TokenInfo } from './tokenInfo';
4+
import { TokenBridgeInfo, TokenInfo } from './tokenInfo';
55
import { ChainId } from './chains';
66

77
export interface CheckoutOverrides {
@@ -274,7 +274,7 @@ export type GasEstimateSwapTokenConfig = {
274274
* A type that represents the tokens configuration for chain.
275275
*/
276276
export type ChainTokensConfig = {
277-
[key in ChainId]?: TokenInfo[];
277+
[key in ChainId]?: TokenBridgeInfo[];
278278
};
279279

280280
export type CheckoutWidgetsVersionConfig = {

0 commit comments

Comments
 (0)