Skip to content

Commit 33993c9

Browse files
committed
fix: granular tokens data loading
1 parent c23579b commit 33993c9

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/sdk/base/TokensMeta.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
type PhantomTokenContractType,
1717
} from "../index.js";
1818
import type { Asset } from "../router/index.js";
19-
import { AddressMap, formatBN } from "../utils/index.js";
19+
import { AddressMap, AddressSet, formatBN } from "../utils/index.js";
2020
import type {
2121
KYCDefaultTokenMeta,
2222
KYCOnDemandTokenMeta,
@@ -32,7 +32,7 @@ export interface FormatBNOptions {
3232

3333
export 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

Comments
 (0)