@@ -5,7 +5,6 @@ import { HttpService } from '@nestjs/axios';
5
5
import {
6
6
BadGatewayException ,
7
7
Injectable ,
8
- NotFoundException ,
9
8
} from '@nestjs/common' ;
10
9
import { AxiosError , AxiosResponse } from 'axios' ;
11
10
import Joi from 'joi' ;
@@ -70,6 +69,34 @@ const chainportTokenSchema = Joi.object<ChainportToken>({
70
69
is_lifi : Joi . boolean ( ) . required ( ) ,
71
70
} ) ;
72
71
72
+ export type ChainportTokenWithNetwork = ChainportToken & ChainportNetwork ;
73
+
74
+ const chainportTokenWithNetworkSchema = Joi . object < ChainportTokenWithNetwork > ( {
75
+ // Network
76
+ chainport_network_id : Joi . number ( ) . positive ( ) . integer ( ) . required ( ) ,
77
+ explorer_url : Joi . string ( ) . required ( ) ,
78
+ label : Joi . string ( ) . required ( ) ,
79
+ network_icon : Joi . string ( ) . required ( ) ,
80
+ // Token
81
+ id : Joi . number ( ) . required ( ) ,
82
+ decimals : Joi . number ( ) . required ( ) ,
83
+ name : Joi . string ( ) . required ( ) ,
84
+ pinned : Joi . boolean ( ) . required ( ) ,
85
+ web3_address : Joi . string ( ) . required ( ) ,
86
+ symbol : Joi . string ( ) . required ( ) ,
87
+ token_image : Joi . string ( ) . required ( ) ,
88
+ chain_id : Joi . number ( ) . allow ( null ) . required ( ) ,
89
+ network_name : Joi . string ( ) . required ( ) ,
90
+ network_id : Joi . number ( ) . required ( ) ,
91
+ blockchain_type : Joi . string ( ) . required ( ) ,
92
+ is_stable : Joi . boolean ( ) . required ( ) ,
93
+ is_lifi : Joi . boolean ( ) . required ( ) ,
94
+ } ) ;
95
+
96
+ const chainportTokenWithNetworkArraySchema = Joi . array <
97
+ ChainportTokenWithNetwork [ ]
98
+ > ( ) . items ( chainportTokenWithNetworkSchema ) ;
99
+
73
100
const chainportTokenArraySchema =
74
101
Joi . array < ChainportToken [ ] > ( ) . items ( chainportTokenSchema ) ;
75
102
@@ -269,63 +296,37 @@ Chainport: ${token.decimals}`;
269
296
return verifiedTokens ;
270
297
}
271
298
272
- async getTokenPaths ( tokenId : number ) : Promise < ChainportNetwork [ ] > {
273
- const version = this . config . get < number > ( 'CHAINPORT_API_VERSION' ) ;
299
+ async getTokenPaths ( tokenId : number ) : Promise < ChainportTokenWithNetwork [ ] > {
274
300
const apiurl = this . config . get < string > ( 'CHAINPORT_API_URL' ) ;
275
301
276
- const metaResult = await this . getMeta ( ) ;
302
+ const tokenPathUrl = new URL ( `/token/paths` , apiurl ) ;
303
+ tokenPathUrl . searchParams . append ( 'token_id' , tokenId . toString ( ) ) ;
277
304
278
- let networkList : { label : string } [ ] = [ ] ;
279
- if ( version === 1 ) {
280
- const tokenListUrl = new URL ( `/token/list` , apiurl ) ;
281
- tokenListUrl . searchParams . append ( 'network_name' , 'IRONFISH' ) ;
282
-
283
- const tokenListResult = await this . makeChainportRequest < {
284
- verified_tokens : { id : number ; target_networks : number [ ] } [ ] ;
285
- } > ( tokenListUrl . toString ( ) ) ;
286
- const sourceToken = tokenListResult . data . verified_tokens . find (
287
- ( t ) => t . id === tokenId ,
288
- ) ;
305
+ const tokenPathResult = await this . makeChainportRequest < ChainportToken [ ] > (
306
+ tokenPathUrl . toString ( ) ,
307
+ ) ;
308
+ const metaResult = await this . getMeta ( ) ;
289
309
290
- if ( ! sourceToken ) {
291
- throw new NotFoundException ( ) ;
310
+ const networkList : ChainportTokenWithNetwork [ ] = [ ] ;
311
+ for ( const token of tokenPathResult . data ) {
312
+ const network = metaResult . cp_network_ids [ token . network_id . toString ( ) ] ;
313
+ if ( ! network ) {
314
+ this . logger . error (
315
+ `Network ${ token . network_id } for token ${ tokenId } not found in meta` ,
316
+ new Error ( ) . stack ?? '' ,
317
+ ) ;
318
+ continue ;
292
319
}
293
320
294
- networkList = sourceToken . target_networks . flatMap ( ( n ) => {
295
- const network = metaResult . cp_network_ids [ n . toString ( ) ] ;
296
- if ( ! network ) {
297
- this . logger . error (
298
- `Network ${ n } for token ${ tokenId } not found in meta` ,
299
- new Error ( ) . stack ?? '' ,
300
- ) ;
301
- return [ ] ;
302
- }
303
- return [ network ] ;
304
- } ) ;
305
- } else {
306
- const tokenPathUrl = new URL ( `/token/paths` , apiurl ) ;
307
-
308
- tokenPathUrl . searchParams . append ( 'token_id' , tokenId . toString ( ) ) ;
309
- const tokenPathResult = await this . makeChainportRequest < ChainportToken [ ] > (
310
- tokenPathUrl . toString ( ) ,
311
- ) ;
312
-
313
- networkList = tokenPathResult . data . flatMap ( ( t ) => {
314
- const network = metaResult . cp_network_ids [ t . network_id . toString ( ) ] ;
315
- if ( ! network ) {
316
- this . logger . error (
317
- `Network ${ t . network_id } for token ${ tokenId } not found in meta` ,
318
- new Error ( ) . stack ?? '' ,
319
- ) ;
320
- return [ ] ;
321
- }
322
- return [ network ] ;
323
- } ) ;
321
+ networkList . push ( { ...token , ...network } ) ;
324
322
}
325
323
326
- const validateResult = chainportNetworkArraySchema . validate ( networkList , {
327
- stripUnknown : true ,
328
- } ) ;
324
+ const validateResult = chainportTokenWithNetworkArraySchema . validate (
325
+ networkList ,
326
+ {
327
+ stripUnknown : true ,
328
+ } ,
329
+ ) ;
329
330
330
331
if ( validateResult . error ) {
331
332
throw new BadGatewayException (
0 commit comments