@@ -70,6 +70,39 @@ const chainportTokenSchema = Joi.object<ChainportToken>({
70
70
is_lifi : Joi . boolean ( ) . required ( ) ,
71
71
} ) ;
72
72
73
+ export type ChainportTokenWithNetwork = {
74
+ network : ChainportNetwork ;
75
+ token : ChainportToken ;
76
+ } ;
77
+
78
+ const chainportTokenWithNetworkSchema = Joi . object < ChainportTokenWithNetwork > ( {
79
+ network : Joi . object < ChainportNetwork > ( {
80
+ chainport_network_id : Joi . number ( ) . positive ( ) . integer ( ) . required ( ) ,
81
+ explorer_url : Joi . string ( ) . required ( ) ,
82
+ label : Joi . string ( ) . required ( ) ,
83
+ network_icon : Joi . string ( ) . required ( ) ,
84
+ } ) ,
85
+ token : Joi . object < ChainportToken > ( {
86
+ id : Joi . number ( ) . required ( ) ,
87
+ decimals : Joi . number ( ) . required ( ) ,
88
+ name : Joi . string ( ) . required ( ) ,
89
+ pinned : Joi . boolean ( ) . required ( ) ,
90
+ web3_address : Joi . string ( ) . required ( ) ,
91
+ symbol : Joi . string ( ) . required ( ) ,
92
+ token_image : Joi . string ( ) . required ( ) ,
93
+ chain_id : Joi . number ( ) . allow ( null ) . required ( ) ,
94
+ network_name : Joi . string ( ) . required ( ) ,
95
+ network_id : Joi . number ( ) . required ( ) ,
96
+ blockchain_type : Joi . string ( ) . required ( ) ,
97
+ is_stable : Joi . boolean ( ) . required ( ) ,
98
+ is_lifi : Joi . boolean ( ) . required ( ) ,
99
+ } ) ,
100
+ } ) ;
101
+
102
+ const chainportTokenWithNetworkArraySchema = Joi . array <
103
+ ChainportTokenWithNetwork [ ]
104
+ > ( ) . items ( chainportTokenWithNetworkSchema ) ;
105
+
73
106
const chainportTokenArraySchema =
74
107
Joi . array < ChainportToken [ ] > ( ) . items ( chainportTokenSchema ) ;
75
108
@@ -269,13 +302,17 @@ Chainport: ${token.decimals}`;
269
302
return verifiedTokens ;
270
303
}
271
304
272
- async getTokenPaths ( tokenId : number ) : Promise < ChainportNetwork [ ] > {
273
- const version = this . config . get < number > ( 'CHAINPORT_API_VERSION' ) ;
305
+ async getTokenPaths (
306
+ tokenId : number ,
307
+ withTokens = false ,
308
+ ) : Promise < ChainportNetwork [ ] | ChainportTokenWithNetwork [ ] > {
274
309
const apiurl = this . config . get < string > ( 'CHAINPORT_API_URL' ) ;
275
310
276
311
const metaResult = await this . getMeta ( ) ;
312
+ const networkList : ChainportNetwork [ ] = [ ] ;
313
+ const networkListWithTokens : ChainportTokenWithNetwork [ ] = [ ] ;
277
314
278
- let networkList : { label : string } [ ] = [ ] ;
315
+ const version = this . config . get < number > ( 'CHAINPORT_API_VERSION' ) ;
279
316
if ( version === 1 ) {
280
317
const tokenListUrl = new URL ( `/token/list` , apiurl ) ;
281
318
tokenListUrl . searchParams . append ( 'network_name' , 'IRONFISH' ) ;
@@ -291,41 +328,72 @@ Chainport: ${token.decimals}`;
291
328
throw new NotFoundException ( ) ;
292
329
}
293
330
294
- networkList = sourceToken . target_networks . flatMap ( ( n ) => {
331
+ for ( const n of sourceToken . target_networks ) {
295
332
const network = metaResult . cp_network_ids [ n . toString ( ) ] ;
296
333
if ( ! network ) {
297
334
this . logger . error (
298
335
`Network ${ n } for token ${ tokenId } not found in meta` ,
299
336
new Error ( ) . stack ?? '' ,
300
337
) ;
301
- return [ ] ;
338
+ continue ;
302
339
}
303
- return [ network ] ;
304
- } ) ;
340
+
341
+ networkList . push ( network ) ;
342
+ networkListWithTokens . push ( {
343
+ network,
344
+ token : {
345
+ id : 0 ,
346
+ decimals : 0 ,
347
+ name : '' ,
348
+ pinned : false ,
349
+ web3_address : '' ,
350
+ symbol : '' ,
351
+ token_image : '' ,
352
+ chain_id : 0 ,
353
+ network_name : '' ,
354
+ network_id : 0 ,
355
+ blockchain_type : '' ,
356
+ is_stable : false ,
357
+ is_lifi : false ,
358
+ } ,
359
+ } ) ;
360
+ }
305
361
} else {
306
362
const tokenPathUrl = new URL ( `/token/paths` , apiurl ) ;
307
-
308
363
tokenPathUrl . searchParams . append ( 'token_id' , tokenId . toString ( ) ) ;
309
364
const tokenPathResult = await this . makeChainportRequest < ChainportToken [ ] > (
310
365
tokenPathUrl . toString ( ) ,
311
366
) ;
312
367
313
- networkList = tokenPathResult . data . flatMap ( ( t ) => {
314
- const network = metaResult . cp_network_ids [ t . network_id . toString ( ) ] ;
368
+ for ( const token of tokenPathResult . data ) {
369
+ const network = metaResult . cp_network_ids [ token . network_id . toString ( ) ] ;
315
370
if ( ! network ) {
316
371
this . logger . error (
317
- `Network ${ t . network_id } for token ${ tokenId } not found in meta` ,
372
+ `Network ${ token . network_id } for token ${ tokenId } not found in meta` ,
318
373
new Error ( ) . stack ?? '' ,
319
374
) ;
320
- return [ ] ;
375
+ continue ;
321
376
}
322
- return [ network ] ;
323
- } ) ;
377
+
378
+ networkList . push ( network ) ;
379
+ networkListWithTokens . push ( { token, network } ) ;
380
+ }
324
381
}
325
382
326
- const validateResult = chainportNetworkArraySchema . validate ( networkList , {
327
- stripUnknown : true ,
328
- } ) ;
383
+ let validateResult ;
384
+
385
+ if ( withTokens ) {
386
+ validateResult = chainportTokenWithNetworkArraySchema . validate (
387
+ networkListWithTokens ,
388
+ {
389
+ stripUnknown : true ,
390
+ } ,
391
+ ) ;
392
+ } else {
393
+ validateResult = chainportNetworkArraySchema . validate ( networkList , {
394
+ stripUnknown : true ,
395
+ } ) ;
396
+ }
329
397
330
398
if ( validateResult . error ) {
331
399
throw new BadGatewayException (
0 commit comments