@merkl/api 0.21.15 → 0.21.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/database/api/.generated/drizzle/schema.d.ts +3 -3
  2. package/dist/database/api/.generated/drizzle/schema.js +1 -1
  3. package/dist/database/api/.generated/drizzle/schema.ts +1 -1
  4. package/dist/database/api/.generated/edge.js +5 -4
  5. package/dist/database/api/.generated/index-browser.js +2 -1
  6. package/dist/database/api/.generated/index.d.ts +2 -1
  7. package/dist/database/api/.generated/index.js +5 -4
  8. package/dist/database/api/.generated/package.json +1 -1
  9. package/dist/database/api/.generated/schema.prisma +1 -0
  10. package/dist/database/api/.generated/wasm.js +2 -1
  11. package/dist/src/eden/index.d.ts +12 -33
  12. package/dist/src/index.d.ts +4 -11
  13. package/dist/src/modules/v4/chain/chain.repository.d.ts +13 -3
  14. package/dist/src/modules/v4/chain/chain.repository.js +9 -3
  15. package/dist/src/modules/v4/chain/chain.service.d.ts +13 -1
  16. package/dist/src/modules/v4/chain/chain.service.js +6 -4
  17. package/dist/src/modules/v4/merklRoot/merklRoot.controller.d.ts +2 -9
  18. package/dist/src/modules/v4/merklRoot/merklRoot.service.d.ts +1 -7
  19. package/dist/src/modules/v4/price/price.controller.d.ts +2 -2
  20. package/dist/src/modules/v4/price/price.model.d.ts +2 -0
  21. package/dist/src/modules/v4/programPayload/programPayload.repository.js +1 -1
  22. package/dist/src/modules/v4/reward/reward.service.js +1 -1
  23. package/dist/src/modules/v4/router.d.ts +4 -11
  24. package/dist/src/utils/prices/priceFetcherFactory.js +3 -0
  25. package/dist/src/utils/prices/services/OnChainCallService.d.ts +8 -0
  26. package/dist/src/utils/prices/services/OnChainCallService.js +37 -0
  27. package/dist/tsconfig.package.tsbuildinfo +1 -1
  28. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "prisma-client-419016964ef3e36746ac9f349139831509fb50b2bea88e1ae7f856888042729c",
2
+ "name": "prisma-client-ceb673435ac7b0a8d136ed733f33a74af9a61f67dd386904f58de5597ef156f1",
3
3
  "main": "index.js",
4
4
  "types": "index.d.ts",
5
5
  "browser": "index-browser.js",
@@ -452,6 +452,7 @@ enum PriceSourceMethod {
452
452
  DEXSCREENER
453
453
  INDEXCOOP
454
454
  DEFILLAMA
455
+ ONCHAIN_CALL
455
456
  }
456
457
 
457
458
  enum CampaignManualOverride {
@@ -622,7 +622,8 @@ exports.PriceSourceMethod = exports.$Enums.PriceSourceMethod = {
622
622
  ERC4626: 'ERC4626',
623
623
  DEXSCREENER: 'DEXSCREENER',
624
624
  INDEXCOOP: 'INDEXCOOP',
625
- DEFILLAMA: 'DEFILLAMA'
625
+ DEFILLAMA: 'DEFILLAMA',
626
+ ONCHAIN_CALL: 'ONCHAIN_CALL'
626
627
  };
627
628
 
628
629
  exports.LoggedEntityType = exports.$Enums.LoggedEntityType = {
@@ -3204,7 +3204,7 @@ declare const eden: {
3204
3204
  }>>;
3205
3205
  post: (body: {
3206
3206
  symbol: string;
3207
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
3207
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
3208
3208
  args: {};
3209
3209
  }, options: {
3210
3210
  headers: {
@@ -3233,7 +3233,7 @@ declare const eden: {
3233
3233
  }>>;
3234
3234
  patch: (body: {
3235
3235
  symbol?: string | undefined;
3236
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
3236
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
3237
3237
  args?: {} | undefined;
3238
3238
  }, options: {
3239
3239
  headers: {
@@ -3700,15 +3700,8 @@ declare const eden: {
3700
3700
  query?: Record<string, unknown> | undefined;
3701
3701
  fetch?: RequestInit | undefined;
3702
3702
  } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
3703
- 200: {
3704
- [x: number]: {
3705
- live: string;
3706
- tree: string;
3707
- lastTree: string;
3708
- endOfDisputePeriod: number;
3709
- disputer: string;
3710
- };
3711
- };
3703
+ [x: string]: any;
3704
+ 200: any;
3712
3705
  }>>;
3713
3706
  };
3714
3707
  engine: {
@@ -9443,7 +9436,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
9443
9436
  post: {
9444
9437
  body: {
9445
9438
  symbol: string;
9446
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
9439
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
9447
9440
  args: {};
9448
9441
  };
9449
9442
  params: {};
@@ -9464,7 +9457,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
9464
9457
  patch: {
9465
9458
  body: {
9466
9459
  symbol?: string | undefined;
9467
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
9460
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
9468
9461
  args?: {} | undefined;
9469
9462
  };
9470
9463
  params: {
@@ -10052,15 +10045,8 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
10052
10045
  query: unknown;
10053
10046
  headers: unknown;
10054
10047
  response: {
10055
- 200: {
10056
- [x: number]: {
10057
- live: string;
10058
- tree: string;
10059
- lastTree: string;
10060
- endOfDisputePeriod: number;
10061
- disputer: string;
10062
- };
10063
- };
10048
+ [x: string]: any;
10049
+ 200: any;
10064
10050
  };
10065
10051
  };
10066
10052
  };
@@ -15670,7 +15656,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
15670
15656
  }>>;
15671
15657
  post: (body: {
15672
15658
  symbol: string;
15673
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
15659
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
15674
15660
  args: {};
15675
15661
  }, options: {
15676
15662
  headers: {
@@ -15699,7 +15685,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
15699
15685
  }>>;
15700
15686
  patch: (body: {
15701
15687
  symbol?: string | undefined;
15702
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
15688
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
15703
15689
  args?: {} | undefined;
15704
15690
  }, options: {
15705
15691
  headers: {
@@ -16166,15 +16152,8 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
16166
16152
  query?: Record<string, unknown> | undefined;
16167
16153
  fetch?: RequestInit | undefined;
16168
16154
  } | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
16169
- 200: {
16170
- [x: number]: {
16171
- live: string;
16172
- tree: string;
16173
- lastTree: string;
16174
- endOfDisputePeriod: number;
16175
- disputer: string;
16176
- };
16177
- };
16155
+ [x: string]: any;
16156
+ 200: any;
16178
16157
  }>>;
16179
16158
  };
16180
16159
  engine: {
@@ -3854,7 +3854,7 @@ declare const app: Elysia<"", false, {
3854
3854
  post: {
3855
3855
  body: {
3856
3856
  symbol: string;
3857
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
3857
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
3858
3858
  args: {};
3859
3859
  };
3860
3860
  params: {};
@@ -3875,7 +3875,7 @@ declare const app: Elysia<"", false, {
3875
3875
  patch: {
3876
3876
  body: {
3877
3877
  symbol?: string | undefined;
3878
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
3878
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
3879
3879
  args?: {} | undefined;
3880
3880
  };
3881
3881
  params: {
@@ -4463,15 +4463,8 @@ declare const app: Elysia<"", false, {
4463
4463
  query: unknown;
4464
4464
  headers: unknown;
4465
4465
  response: {
4466
- 200: {
4467
- [x: number]: {
4468
- live: string;
4469
- tree: string;
4470
- lastTree: string;
4471
- endOfDisputePeriod: number;
4472
- disputer: string;
4473
- };
4474
- };
4466
+ [x: string]: any;
4467
+ 200: any;
4475
4468
  };
4476
4469
  };
4477
4470
  };
@@ -51,12 +51,22 @@ export declare class ChainRepository {
51
51
  id: number;
52
52
  icon: string;
53
53
  })[]>;
54
+ static findAll(): Promise<({
55
+ Explorer: {
56
+ url: string;
57
+ type: import("@db/api").$Enums.ExplorerType;
58
+ id: string;
59
+ chainId: number;
60
+ }[];
61
+ } & {
62
+ name: string;
63
+ id: number;
64
+ icon: string;
65
+ })[]>;
54
66
  static countMany(query: ChainSearchDto): Promise<number>;
55
67
  /** Returns all chainIds in the database
56
68
  */
57
- static readIds(): Promise<{
58
- id: number;
59
- }[]>;
69
+ static findManyIds(): Promise<number[]>;
60
70
  /**
61
71
  * Creates a new chain
62
72
  * @param template for chain creation
@@ -28,6 +28,12 @@ export class ChainRepository {
28
28
  ...args,
29
29
  });
30
30
  }
31
+ static async findAll() {
32
+ return await apiDbClient.chain.findMany({
33
+ include: { Explorer: { take: 5 } },
34
+ orderBy: { id: "asc" },
35
+ });
36
+ }
31
37
  static async countMany(query) {
32
38
  const args = ChainRepository.transformQueryToPrismaFilters(query);
33
39
  return apiDbClient.chain.count({
@@ -36,10 +42,10 @@ export class ChainRepository {
36
42
  }
37
43
  /** Returns all chainIds in the database
38
44
  */
39
- static async readIds() {
40
- return apiDbClient.chain.findMany({
45
+ static async findManyIds() {
46
+ return (await apiDbClient.chain.findMany({
41
47
  select: { id: true },
42
- });
48
+ })).map(({ id }) => id);
43
49
  }
44
50
  /**
45
51
  * Creates a new chain
@@ -12,6 +12,18 @@ export declare abstract class ChainService {
12
12
  id: number;
13
13
  icon: string;
14
14
  }) | null>;
15
+ static findAll(): Promise<({
16
+ Explorer: {
17
+ url: string;
18
+ type: import("@db/api").$Enums.ExplorerType;
19
+ id: string;
20
+ chainId: number;
21
+ }[];
22
+ } & {
23
+ name: string;
24
+ id: number;
25
+ icon: string;
26
+ })[]>;
15
27
  static findMany(query: ChainSearchDto): Promise<({
16
28
  Explorer: {
17
29
  url: string;
@@ -41,7 +53,7 @@ export declare abstract class ChainService {
41
53
  * @warning some chains may not be fully integrated yet
42
54
  * @returns an array of chainId
43
55
  */
44
- static getIds(): Promise<number[]>;
56
+ static findManyIds(): Promise<number[]>;
45
57
  /** List all chainIds which have a distribituor (i.e. which is fully integrated)
46
58
  * @returns an array of chainId
47
59
  */
@@ -6,6 +6,9 @@ export class ChainService {
6
6
  static async get(chainId) {
7
7
  return ChainRepository.read(chainId);
8
8
  }
9
+ static async findAll() {
10
+ return await CacheService.wrap(TTLPresets.MIN_10, ChainRepository.findAll);
11
+ }
9
12
  static async findMany(query) {
10
13
  // Bypass cache in test mode
11
14
  if (query.test)
@@ -22,15 +25,14 @@ export class ChainService {
22
25
  * @warning some chains may not be fully integrated yet
23
26
  * @returns an array of chainId
24
27
  */
25
- static async getIds() {
26
- const ids = await ChainRepository.readIds();
27
- return ids.map(({ id }) => id);
28
+ static async findManyIds() {
29
+ return ChainRepository.findManyIds();
28
30
  }
29
31
  /** List all chainIds which have a distribituor (i.e. which is fully integrated)
30
32
  * @returns an array of chainId
31
33
  */
32
34
  static async getSupportedIds() {
33
- const ids = await ChainService.getIds();
35
+ const ids = await ChainService.findManyIds();
34
36
  const supportedIds = [];
35
37
  for (const chainId of ids) {
36
38
  try {
@@ -43,15 +43,8 @@ export declare const MerklRootController: Elysia<"/roots", false, {
43
43
  query: unknown;
44
44
  headers: unknown;
45
45
  response: {
46
- 200: {
47
- [x: number]: {
48
- live: string;
49
- tree: string;
50
- lastTree: string;
51
- endOfDisputePeriod: number;
52
- disputer: string;
53
- };
54
- };
46
+ [x: string]: any;
47
+ 200: any;
55
48
  };
56
49
  };
57
50
  };
@@ -19,13 +19,7 @@ export declare class MerklRootService {
19
19
  * @param chainIds to fetch roots for
20
20
  * @returns record of chains to object with live and last tree roots
21
21
  */
22
- static fetchAll(chainIds?: ChainId[]): Promise<Record<number, {
23
- live: string;
24
- tree: string;
25
- lastTree: string;
26
- endOfDisputePeriod: number;
27
- disputer: string;
28
- }>>;
22
+ static fetchAll(chainIds?: ChainId[]): Promise<any>;
29
23
  static create(x: CreateRootModel): Promise<{
30
24
  chainId: number;
31
25
  timestamp: bigint;
@@ -105,7 +105,7 @@ export declare const PriceController: Elysia<"/prices", false, {
105
105
  post: {
106
106
  body: {
107
107
  symbol: string;
108
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
108
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
109
109
  args: {};
110
110
  };
111
111
  params: {};
@@ -126,7 +126,7 @@ export declare const PriceController: Elysia<"/prices", false, {
126
126
  patch: {
127
127
  body: {
128
128
  symbol?: string | undefined;
129
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
129
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
130
130
  args?: {} | undefined;
131
131
  };
132
132
  params: {
@@ -8,6 +8,7 @@ export declare const CreatePriceSourceDto: import("@sinclair/typebox").TObject<{
8
8
  DEXSCREENER: "DEXSCREENER";
9
9
  INDEXCOOP: "INDEXCOOP";
10
10
  DEFILLAMA: "DEFILLAMA";
11
+ ONCHAIN_CALL: "ONCHAIN_CALL";
11
12
  }>;
12
13
  args: import("@sinclair/typebox").TObject<{}>;
13
14
  }>;
@@ -21,6 +22,7 @@ export declare const UpdatePriceSourceDto: import("@sinclair/typebox").TObject<{
21
22
  DEXSCREENER: "DEXSCREENER";
22
23
  INDEXCOOP: "INDEXCOOP";
23
24
  DEFILLAMA: "DEFILLAMA";
25
+ ONCHAIN_CALL: "ONCHAIN_CALL";
24
26
  }>>;
25
27
  args: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{}>>;
26
28
  }>;
@@ -706,7 +706,7 @@ const CornInterfaceCampaigns = {
706
706
  },
707
707
  [cornCampaigns.Concrete_CornUSDT_Vault_Corn]: {
708
708
  campaignType: Campaign.ERC20,
709
- computeChainId: ChainId.CORN,
709
+ computeChainId: ChainId.MAINNET,
710
710
  hooks: [],
711
711
  targetToken: "0x3Eb6464A77D7B619AaAfa7e9FFC0fBe3ed7084B3",
712
712
  whitelist: [],
@@ -229,7 +229,7 @@ export class RewardService {
229
229
  return rewards;
230
230
  }
231
231
  static async getUserRewardsByChain(user, withToken, chainFilter = [], connectedChainId = null, withTestTokens = false, claimableOnly = false) {
232
- const chains = await ChainService.findMany({});
232
+ const chains = await ChainService.findAll();
233
233
  let chainIds = !chainFilter || !chainFilter.length
234
234
  ? chains.map(({ id }) => id)
235
235
  : chains.map(({ id }) => id).filter(id => chainFilter.includes(id));
@@ -3724,7 +3724,7 @@ export declare const v4: Elysia<"/v4", false, {
3724
3724
  post: {
3725
3725
  body: {
3726
3726
  symbol: string;
3727
- method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
3727
+ method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
3728
3728
  args: {};
3729
3729
  };
3730
3730
  params: {};
@@ -3745,7 +3745,7 @@ export declare const v4: Elysia<"/v4", false, {
3745
3745
  patch: {
3746
3746
  body: {
3747
3747
  symbol?: string | undefined;
3748
- method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
3748
+ method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
3749
3749
  args?: {} | undefined;
3750
3750
  };
3751
3751
  params: {
@@ -4333,15 +4333,8 @@ export declare const v4: Elysia<"/v4", false, {
4333
4333
  query: unknown;
4334
4334
  headers: unknown;
4335
4335
  response: {
4336
- 200: {
4337
- [x: number]: {
4338
- live: string;
4339
- tree: string;
4340
- lastTree: string;
4341
- endOfDisputePeriod: number;
4342
- disputer: string;
4343
- };
4344
- };
4336
+ [x: string]: any;
4337
+ 200: any;
4345
4338
  };
4346
4339
  };
4347
4340
  };
@@ -1,4 +1,5 @@
1
1
  import { PriceSourceMethod } from "@db/api";
2
+ import OnChainCall from "./services/OnChainCallService";
2
3
  import CoingeckoService from "./services/coinGeckoService";
3
4
  import DefillamaService from "./services/defillamaService";
4
5
  import DexScreenerService from "./services/dexScreenerService";
@@ -22,6 +23,8 @@ export default class PriceFetcherFactory {
22
23
  return DexScreenerService.instance;
23
24
  case PriceSourceMethod.INDEXCOOP:
24
25
  return IndexCoop.instance;
26
+ case PriceSourceMethod.ONCHAIN_CALL:
27
+ return OnChainCall.instance;
25
28
  default:
26
29
  throw new Error(`Price reader service not found for ${type}`);
27
30
  }
@@ -0,0 +1,8 @@
1
+ import { type PriceSource } from "@db/api";
2
+ import type PriceFetcher from "./priceFetcher";
3
+ import type { ResponsePriceType } from "./priceFetcher";
4
+ export default class OnChainCallService implements PriceFetcher {
5
+ static readonly instance: PriceFetcher;
6
+ private constructor();
7
+ getPrice(tokens: PriceSource[]): Promise<ResponsePriceType[]>;
8
+ }
@@ -0,0 +1,37 @@
1
+ import { PriceService } from "@/modules/v4/price/price.service";
2
+ import { PriceSourceMethod } from "@db/api";
3
+ import { BN2Number, ChainInteractionService } from "@sdk";
4
+ import { Contract } from "ethers";
5
+ import { log } from "../../logger";
6
+ export default class OnChainCallService {
7
+ static instance = new OnChainCallService();
8
+ constructor() { }
9
+ async getPrice(tokens) {
10
+ const pricePromises = tokens
11
+ .filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.ONCHAIN_CALL)
12
+ .map(async (token) => {
13
+ const args = token.args;
14
+ if (!args?.chainId || !args.address || !args.abi || !args.call) {
15
+ log.warn(`❌ ONCHAIN_CALL price source incorrectly implemented for ${token.symbol}`);
16
+ return undefined;
17
+ }
18
+ try {
19
+ const multiplicator = BN2Number(new Contract(args.address, args.abi, ChainInteractionService(args.chainId).provider())[args.call], args.decimals ?? 18);
20
+ const base = await PriceService.fetchPriceBySymbol(args.base);
21
+ const price = base * multiplicator;
22
+ // 2 returned tokens as stUSD and STUSD (business requirement)
23
+ const res = [
24
+ { token: token.symbol, rate: price },
25
+ { token: token.symbol.toUpperCase(), rate: price },
26
+ ];
27
+ return res;
28
+ }
29
+ catch (error) {
30
+ log.warn(`❌ ONCHAIN_CALL price source failed for ${token.symbol} with error: ${error}`);
31
+ return undefined;
32
+ }
33
+ });
34
+ const resolvedPrices = (await Promise.all(pricePromises)).filter(result => !!result);
35
+ return resolvedPrices.flat();
36
+ }
37
+ }