@@ -16,7 +16,7 @@ import {
1616 type PhantomTokenContractType ,
1717} from "../index.js" ;
1818import type { Asset } from "../router/index.js" ;
19- import { AddressMap , formatBN } from "../utils/index.js" ;
19+ import { AddressMap , AddressSet , formatBN } from "../utils/index.js" ;
2020import type {
2121 KYCDefaultTokenMeta ,
2222 KYCOnDemandTokenMeta ,
@@ -32,7 +32,7 @@ export interface FormatBNOptions {
3232
3333export class TokensMeta extends AddressMap < TokenMetaData > {
3434 #client: PublicClient < Transport , Chain > ;
35- #tokenDataLoaded: boolean = false ;
35+ #tokenDataLoaded = new AddressSet ( ) ;
3636
3737 constructor ( client : PublicClient < Transport , Chain > ) {
3838 super ( undefined , "tokensMeta" ) ;
@@ -41,7 +41,7 @@ export class TokensMeta extends AddressMap<TokenMetaData> {
4141
4242 public reset ( ) : void {
4343 this . clear ( ) ;
44- this . #tokenDataLoaded = false ;
44+ this . #tokenDataLoaded. clear ( ) ;
4545 }
4646
4747 public symbol ( token : Address ) : string {
@@ -53,15 +53,19 @@ export class TokensMeta extends AddressMap<TokenMetaData> {
5353 }
5454
5555 public isPhantomToken ( t : TokenMetaData ) : t is PhantomTokenMeta {
56- if ( ! this . #tokenDataLoaded) {
57- throw new Error ( "extended token data not loaded" ) ;
56+ if ( ! this . #tokenDataLoaded. has ( t . addr ) ) {
57+ throw new Error (
58+ `extended token data not loaded for ${ t . symbol } (${ t . addr } )` ,
59+ ) ;
5860 }
5961 return "contractType" in t && t . contractType . startsWith ( "PHANTOM_TOKEN::" ) ;
6062 }
6163
6264 public isKYCUnderlying ( t : TokenMetaData ) : t is KYCTokenMeta {
63- if ( ! this . #tokenDataLoaded) {
64- throw new Error ( "extended token data not loaded" ) ;
65+ if ( ! this . #tokenDataLoaded. has ( t . addr ) ) {
66+ throw new Error (
67+ `extended token data not loaded for ${ t . symbol } (${ t . addr } )` ,
68+ ) ;
6569 }
6670 return "contractType" in t && t . contractType . startsWith ( "KYC_UNDERLYING::" ) ;
6771 }
@@ -127,11 +131,18 @@ export class TokensMeta extends AddressMap<TokenMetaData> {
127131
128132 /**
129133 * Loads token information about phantom token and KYC underlying tokens
134+ *
135+ * @param tokens - tokens to load data for, defaults to all tokens
130136 */
131- public async loadTokenData ( ) : Promise < void > {
132- const tokens = this . keys ( ) ;
137+ public async loadTokenData ( ...tokens : Address [ ] ) : Promise < void > {
138+ const tokenz = new AddressSet ( tokens . length > 0 ? tokens : this . keys ( ) ) ;
139+ const tokensToLoad = Array . from ( tokenz . difference ( this . #tokenDataLoaded) ) ;
140+ if ( tokensToLoad . length === 0 ) {
141+ return ;
142+ }
143+
133144 const resp = await this . #client. multicall ( {
134- contracts : tokens . flatMap (
145+ contracts : tokensToLoad . flatMap (
135146 t =>
136147 [
137148 {
@@ -149,10 +160,10 @@ export class TokensMeta extends AddressMap<TokenMetaData> {
149160 allowFailure : true ,
150161 batchSize : 0 ,
151162 } ) ;
152- for ( let i = 0 ; i < tokens . length ; i ++ ) {
153- this . #overrideTokenMeta( tokens [ i ] , resp [ i ] , resp [ i + 1 ] ) ;
163+ for ( let i = 0 ; i < tokensToLoad . length ; i ++ ) {
164+ this . #overrideTokenMeta( tokensToLoad [ i ] , resp [ i ] , resp [ i + 1 ] ) ;
165+ this . #tokenDataLoaded. add ( tokensToLoad [ i ] ) ;
154166 }
155- this . #tokenDataLoaded = true ;
156167 }
157168
158169 #overrideTokenMeta(
0 commit comments