@paxoslabs/amplify-sdk 0.4.2 → 0.4.3-alpha.1

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 (52) hide show
  1. package/CHANGELOG.md +79 -64
  2. package/dist/{chain-utils-CRMbWzu7.d.mts → chain-utils-CpOJcWig.d.mts} +48 -29
  3. package/dist/{chain-utils-CRMbWzu7.d.ts → chain-utils-CpOJcWig.d.ts} +48 -29
  4. package/dist/{chunk-RW7PZETN.mjs → chunk-7JMQWERX.mjs} +238 -254
  5. package/dist/chunk-7JMQWERX.mjs.map +1 -0
  6. package/dist/{chunk-TPU2HZAX.mjs → chunk-HV2LE2M6.mjs} +86 -169
  7. package/dist/chunk-HV2LE2M6.mjs.map +1 -0
  8. package/dist/{chunk-WZXCJAKM.js → chunk-JTURYJHV.js} +12 -12
  9. package/dist/{chunk-WZXCJAKM.js.map → chunk-JTURYJHV.js.map} +1 -1
  10. package/dist/{chunk-5CV25BTQ.js → chunk-KXU3GSF4.mjs} +87 -4
  11. package/dist/chunk-KXU3GSF4.mjs.map +1 -0
  12. package/dist/{chunk-CQZCGPZK.mjs → chunk-MB6HYA7R.js} +96 -3
  13. package/dist/chunk-MB6HYA7R.js.map +1 -0
  14. package/dist/{chunk-BQG3XKTU.js → chunk-PKGFLHZA.js} +239 -253
  15. package/dist/chunk-PKGFLHZA.js.map +1 -0
  16. package/dist/{chunk-2YPKHXFJ.js → chunk-R35K46S5.js} +180 -263
  17. package/dist/chunk-R35K46S5.js.map +1 -0
  18. package/dist/{chunk-GMMBJB4B.mjs → chunk-UM7S7U45.mjs} +71 -46
  19. package/dist/chunk-UM7S7U45.mjs.map +1 -0
  20. package/dist/{chunk-VZED4E3L.mjs → chunk-USF4CU2K.mjs} +3 -3
  21. package/dist/{chunk-VZED4E3L.mjs.map → chunk-USF4CU2K.mjs.map} +1 -1
  22. package/dist/{chunk-OZJNKGW6.js → chunk-YEAWQB72.js} +120 -95
  23. package/dist/chunk-YEAWQB72.js.map +1 -0
  24. package/dist/core.d.mts +2 -2
  25. package/dist/core.d.ts +2 -2
  26. package/dist/core.js +16 -16
  27. package/dist/core.mjs +4 -4
  28. package/dist/display.d.mts +23 -11
  29. package/dist/display.d.ts +23 -11
  30. package/dist/display.js +10 -10
  31. package/dist/display.mjs +4 -4
  32. package/dist/index.d.mts +107 -7
  33. package/dist/index.d.ts +107 -7
  34. package/dist/index.js +75 -51
  35. package/dist/index.mjs +5 -5
  36. package/dist/utils.d.mts +1 -1
  37. package/dist/utils.d.ts +1 -1
  38. package/dist/utils.js +7 -7
  39. package/dist/utils.mjs +2 -2
  40. package/dist/vaults.d.mts +107 -94
  41. package/dist/vaults.d.ts +107 -94
  42. package/dist/vaults.js +25 -25
  43. package/dist/vaults.mjs +4 -4
  44. package/package.json +18 -11
  45. package/dist/chunk-2YPKHXFJ.js.map +0 -1
  46. package/dist/chunk-5CV25BTQ.js.map +0 -1
  47. package/dist/chunk-BQG3XKTU.js.map +0 -1
  48. package/dist/chunk-CQZCGPZK.mjs.map +0 -1
  49. package/dist/chunk-GMMBJB4B.mjs.map +0 -1
  50. package/dist/chunk-OZJNKGW6.js.map +0 -1
  51. package/dist/chunk-RW7PZETN.mjs.map +0 -1
  52. package/dist/chunk-TPU2HZAX.mjs.map +0 -1
@@ -3,6 +3,14 @@
3
3
  var viem = require('viem');
4
4
  var chains = require('viem/chains');
5
5
 
6
+ // src/utils/fetch.ts
7
+ var DEFAULT_TIMEOUT = 1e4;
8
+ function createTimeoutSignal(timeoutMs) {
9
+ const controller = new AbortController();
10
+ setTimeout(() => controller.abort(), timeoutMs);
11
+ return controller.signal;
12
+ }
13
+
6
14
  // src/types/telemetry.ts
7
15
  var LogLevel = {
8
16
  DEBUG: 0,
@@ -80,16 +88,8 @@ function setLogLevel(level) {
80
88
  }
81
89
  }
82
90
 
83
- // src/utils/fetch.ts
84
- var DEFAULT_TIMEOUT = 1e4;
85
- function createTimeoutSignal(timeoutMs) {
86
- const controller = new AbortController();
87
- setTimeout(() => controller.abort(), timeoutMs);
88
- return controller.signal;
89
- }
90
-
91
91
  // src/constants/environment.ts
92
- var BASE_URL = "https://api.paxoslabs.com";
92
+ var BASE_URL = "https://paxos-labs-monorepo.onrender.com";
93
93
  function getGraphQLEndpoint() {
94
94
  return `${BASE_URL}/graphql`;
95
95
  }
@@ -108,6 +108,8 @@ var VaultCache = class {
108
108
  constructor(ttl = DEFAULT_TTL) {
109
109
  this.vaults = /* @__PURE__ */ new Map();
110
110
  this.assets = /* @__PURE__ */ new Map();
111
+ this.vaultsByAddress = /* @__PURE__ */ new Map();
112
+ this.vaultsByName = /* @__PURE__ */ new Map();
111
113
  this.lastFetch = 0;
112
114
  this.ttl = ttl;
113
115
  this.refreshPromise = null;
@@ -124,6 +126,20 @@ var VaultCache = class {
124
126
  getVault(tokenAddress) {
125
127
  return this.vaults.get(tokenAddress);
126
128
  }
129
+ /**
130
+ * Gets a vault by its boringVaultAddress (on-chain vault contract).
131
+ * Case-insensitive lookup.
132
+ */
133
+ getVaultByAddress(address) {
134
+ return this.vaultsByAddress.get(address.toLowerCase());
135
+ }
136
+ /**
137
+ * Gets a vault by its human-readable name.
138
+ * Case-insensitive lookup.
139
+ */
140
+ getVaultByName(name) {
141
+ return this.vaultsByName.get(name.toLowerCase());
142
+ }
127
143
  /**
128
144
  * Gets asset by token address
129
145
  *
@@ -145,9 +161,15 @@ var VaultCache = class {
145
161
  * @returns Array of all AmplifyVault objects
146
162
  */
147
163
  getAllVaults() {
164
+ const seen = /* @__PURE__ */ new Set();
148
165
  const allVaults = [];
149
166
  for (const vaultArray of this.vaults.values()) {
150
- allVaults.push(...vaultArray);
167
+ for (const vault of vaultArray) {
168
+ if (!seen.has(vault.id)) {
169
+ seen.add(vault.id);
170
+ allVaults.push(vault);
171
+ }
172
+ }
151
173
  }
152
174
  return allVaults;
153
175
  }
@@ -224,13 +246,26 @@ var VaultCache = class {
224
246
  const { vaults, assets } = await fetchVaultDataFromGraphQL();
225
247
  this.vaults.clear();
226
248
  this.assets.clear();
249
+ this.vaultsByAddress.clear();
250
+ this.vaultsByName.clear();
227
251
  for (const vault of vaults) {
228
- const tokenAddress = vault.vault.baseTokenAddress;
229
- const existing = this.vaults.get(tokenAddress);
230
- if (existing) {
231
- existing.push(vault);
232
- } else {
233
- this.vaults.set(tokenAddress, [vault]);
252
+ for (const asset of vault.supportedAssets) {
253
+ const tokenAddress = asset.address;
254
+ const existing = this.vaults.get(tokenAddress);
255
+ if (existing) {
256
+ if (!existing.includes(vault)) {
257
+ existing.push(vault);
258
+ }
259
+ } else {
260
+ this.vaults.set(tokenAddress, [vault]);
261
+ }
262
+ }
263
+ this.vaultsByAddress.set(
264
+ vault.vault.boringVaultAddress.toLowerCase(),
265
+ vault
266
+ );
267
+ if (vault.name) {
268
+ this.vaultsByName.set(vault.name.toLowerCase(), vault);
234
269
  }
235
270
  }
236
271
  for (const asset of assets) {
@@ -255,6 +290,8 @@ var VaultCache = class {
255
290
  clear() {
256
291
  this.vaults.clear();
257
292
  this.assets.clear();
293
+ this.vaultsByAddress.clear();
294
+ this.vaultsByName.clear();
258
295
  this.lastFetch = 0;
259
296
  }
260
297
  /**
@@ -506,6 +543,20 @@ var VAULT_FIELDS = `
506
543
  symbol
507
544
  coinGeckoApiId
508
545
  }
546
+ withdrawalSla {
547
+ withdrawAssetAddress
548
+ externalWithdrawalQueueDelaySLA
549
+ externalAccountantRateUpdateSLA
550
+ }
551
+ supportedAssets {
552
+ address
553
+ chainId
554
+ depositable
555
+ withdrawable
556
+ symbol
557
+ tokenName
558
+ decimals
559
+ }
509
560
  `;
510
561
  var DEPOSIT_TOKEN_FIELDS = `
511
562
  id
@@ -513,6 +564,22 @@ var DEPOSIT_TOKEN_FIELDS = `
513
564
  chainId
514
565
  name
515
566
  `;
567
+ var TOKEN_METADATA_FIELDS = `
568
+ address
569
+ chainId
570
+ symbol
571
+ tokenName
572
+ decimals
573
+ coinGeckoTokenId
574
+ tokenStandard
575
+ source
576
+ firstSeenAt
577
+ metadataRefreshedAt
578
+ `;
579
+ var VAULT_ASSET_FLAGS_FIELDS = `
580
+ depositable
581
+ withdrawable
582
+ `;
516
583
  var SDK_CONFIG_CORE_FIELDS = `
517
584
  id
518
585
  chainId
@@ -531,6 +598,16 @@ function buildSdkConfigsQuery(options) {
531
598
  `depositTokenAddress { ${options.depositTokenAddress} }`
532
599
  );
533
600
  }
601
+ if (options.tokenMetadata) {
602
+ nestedFields.push(
603
+ `tokenMetadata { ${options.tokenMetadata} }`
604
+ );
605
+ }
606
+ if (options.vaultAssetFlags) {
607
+ nestedFields.push(
608
+ `vaultAssetFlags { ${options.vaultAssetFlags} }`
609
+ );
610
+ }
534
611
  const allFields = [
535
612
  ...options.fields,
536
613
  ...nestedFields
@@ -607,7 +684,9 @@ async function fetchAmplifySdkConfigs(endpoint, variables) {
607
684
  const query = buildSdkConfigsQuery({
608
685
  fields: SDK_CONFIG_CORE_FIELDS.trim().split(/\s+/),
609
686
  vault: VAULT_FIELDS,
610
- depositTokenAddress: DEPOSIT_TOKEN_FIELDS
687
+ depositTokenAddress: DEPOSIT_TOKEN_FIELDS,
688
+ tokenMetadata: TOKEN_METADATA_FIELDS,
689
+ vaultAssetFlags: VAULT_ASSET_FLAGS_FIELDS
611
690
  });
612
691
  return executeGraphQLQuery(
613
692
  endpoint,
@@ -654,10 +733,30 @@ function mapGraphQLConfigToVault(config) {
654
733
  return null;
655
734
  }
656
735
  const { vault, depositTokenAddress } = config;
736
+ const indexerAssets = vault.supportedAssets && vault.supportedAssets.length > 0 ? vault.supportedAssets.map((a) => ({
737
+ address: a.address,
738
+ symbol: a.symbol ?? a.address,
739
+ name: a.tokenName ?? a.symbol ?? a.address,
740
+ decimals: a.decimals ?? 0,
741
+ depositable: a.depositable,
742
+ withdrawable: a.withdrawable
743
+ })) : [
744
+ {
745
+ address: depositTokenAddress.address,
746
+ symbol: config.tokenMetadata?.symbol ?? depositTokenAddress.name,
747
+ name: config.tokenMetadata?.tokenName ?? depositTokenAddress.name,
748
+ decimals: config.tokenMetadata?.decimals ?? 0,
749
+ ...config.vaultAssetFlags && {
750
+ depositable: config.vaultAssetFlags.depositable,
751
+ withdrawable: config.vaultAssetFlags.withdrawable
752
+ }
753
+ }
754
+ ];
657
755
  return {
658
756
  id: config.id,
659
757
  chainId: config.chainId,
660
758
  yieldType,
759
+ name: vault.name,
661
760
  vault: {
662
761
  boringVaultAddress: vault.boringVaultAddress,
663
762
  tellerAddress: vault.tellerModuleId,
@@ -669,14 +768,25 @@ function mapGraphQLConfigToVault(config) {
669
768
  withdrawQueueAddress: vault.withdrawQueueModuleId ? vault.withdrawQueueModuleId : void 0,
670
769
  communityCodeDepositorAddress: vault.communityCodeDepositorModuleId ? vault.communityCodeDepositorModuleId : void 0
671
770
  },
672
- supportedAssets: {
673
- address: depositTokenAddress.address,
674
- symbol: depositTokenAddress.name,
675
- name: depositTokenAddress.name,
676
- decimals: 0
677
- }
771
+ supportedAssets: indexerAssets,
772
+ sla: vault.withdrawalSla && vault.withdrawalSla.length > 0 ? {
773
+ externalWithdrawalQueueDelaySLA: vault.withdrawalSla[0].externalWithdrawalQueueDelaySLA,
774
+ externalAccountantRateUpdateSLA: vault.withdrawalSla[0].externalAccountantRateUpdateSLA
775
+ } : void 0
678
776
  };
679
777
  }
778
+ function aggregateVaultConfigs(configs) {
779
+ const vaultMap = /* @__PURE__ */ new Map();
780
+ for (const config of configs) {
781
+ if (!config.vault || !config.depositTokenAddress) continue;
782
+ if (vaultMap.has(config.vaultId)) continue;
783
+ const mapped = mapGraphQLConfigToVault(config);
784
+ if (mapped) {
785
+ vaultMap.set(config.vaultId, mapped);
786
+ }
787
+ }
788
+ return Array.from(vaultMap.values());
789
+ }
680
790
  function extractSupportedAssetsFromConfigs(configs) {
681
791
  const assetMap = /* @__PURE__ */ new Map();
682
792
  for (const config of configs) {
@@ -685,12 +795,17 @@ function extractSupportedAssetsFromConfigs(configs) {
685
795
  const existing = assetMap.get(key);
686
796
  if (existing) {
687
797
  existing.chains.add(config.chainId);
798
+ if (existing.decimals === 0 && config.tokenMetadata?.decimals) {
799
+ existing.decimals = config.tokenMetadata.decimals;
800
+ existing.symbol = config.tokenMetadata.symbol ?? existing.symbol;
801
+ existing.name = config.tokenMetadata.tokenName ?? existing.name;
802
+ }
688
803
  } else {
689
804
  assetMap.set(key, {
690
805
  address: config.depositTokenAddress.address,
691
- symbol: config.depositTokenAddress.name,
692
- name: config.depositTokenAddress.name,
693
- decimals: 0,
806
+ symbol: config.tokenMetadata?.symbol ?? config.depositTokenAddress.name,
807
+ name: config.tokenMetadata?.tokenName ?? config.depositTokenAddress.name,
808
+ decimals: config.tokenMetadata?.decimals ?? 0,
694
809
  chains: /* @__PURE__ */ new Set([config.chainId])
695
810
  });
696
811
  }
@@ -704,174 +819,6 @@ function extractSupportedAssetsFromConfigs(configs) {
704
819
  }));
705
820
  }
706
821
 
707
- // src/client/vault-assets-client.ts
708
- var PAGE_SIZE = 100;
709
- var MAX_PAGES = 50;
710
- var ENDPOINT_PATH = "/amplify/vaultAssets";
711
- async function fetchVaultAssets() {
712
- const baseUrl = getRestV2BaseURL();
713
- const allVaultAssets = [];
714
- let allTokenMetadata = {};
715
- let pageToken = null;
716
- let pageCount = 0;
717
- do {
718
- let urlStr = `${baseUrl}${ENDPOINT_PATH}?pageSize=${PAGE_SIZE}`;
719
- if (pageToken) {
720
- urlStr += `&pageToken=${encodeURIComponent(pageToken)}`;
721
- }
722
- let response;
723
- try {
724
- response = await fetch(urlStr, {
725
- method: "GET",
726
- headers: getRequestHeaders(),
727
- signal: createTimeoutSignal(DEFAULT_TIMEOUT)
728
- });
729
- } catch (error) {
730
- if (error instanceof Error && error.name === "AbortError") {
731
- throw new APIError(
732
- "vaultAssets request timed out",
733
- { endpoint: ENDPOINT_PATH, cause: error }
734
- );
735
- }
736
- throw new APIError(
737
- `vaultAssets network error: ${error instanceof Error ? error.message : String(error)}`,
738
- { endpoint: ENDPOINT_PATH, cause: error }
739
- );
740
- }
741
- if (!response.ok) {
742
- throw new APIError(
743
- `vaultAssets HTTP error: ${response.status} ${response.statusText}`,
744
- {
745
- endpoint: ENDPOINT_PATH,
746
- statusCode: response.status
747
- }
748
- );
749
- }
750
- let body;
751
- try {
752
- body = await response.json();
753
- } catch (error) {
754
- throw new APIError(
755
- "vaultAssets response is not valid JSON",
756
- { endpoint: ENDPOINT_PATH, cause: error }
757
- );
758
- }
759
- allVaultAssets.push(...body.vaultAssets);
760
- allTokenMetadata = {
761
- ...allTokenMetadata,
762
- ...body.tokenMetadata
763
- };
764
- pageToken = body.nextPageToken ?? null;
765
- pageCount++;
766
- if (pageCount >= MAX_PAGES && pageToken) {
767
- throw new APIError(
768
- `vaultAssets pagination safety limit reached (${pageCount} of ${MAX_PAGES} pages)`,
769
- {
770
- endpoint: ENDPOINT_PATH,
771
- statusCode: 0,
772
- cause: new Error(
773
- `Pagination exceeded ${MAX_PAGES} pages with nextPageToken still present`
774
- )
775
- }
776
- );
777
- }
778
- } while (pageToken);
779
- return {
780
- vaultAssets: allVaultAssets,
781
- nextPageToken: null,
782
- tokenMetadata: allTokenMetadata
783
- };
784
- }
785
-
786
- // src/client/vault-data-merger.ts
787
- function buildVaultAssetKey(boringVaultAddress, chainId, assetAddress) {
788
- return `${boringVaultAddress.toLowerCase()}:${chainId}:${assetAddress.toLowerCase()}`;
789
- }
790
- function buildMetadataMap(tokenMetadata) {
791
- const map = /* @__PURE__ */ new Map();
792
- for (const [address, metadata] of Object.entries(
793
- tokenMetadata
794
- )) {
795
- map.set(address.toLowerCase(), metadata);
796
- }
797
- return map;
798
- }
799
- function enrichVaultsWithAssetData(vaults, vaultAssetsResponse) {
800
- const logger = getLogger();
801
- const vaultAssetMap = /* @__PURE__ */ new Map();
802
- for (const entry of vaultAssetsResponse.vaultAssets) {
803
- const key = buildVaultAssetKey(
804
- entry.vaultAddress,
805
- entry.chainId,
806
- entry.assetAddress
807
- );
808
- vaultAssetMap.set(key, {
809
- depositable: entry.depositable,
810
- withdrawable: entry.withdrawable
811
- });
812
- }
813
- const metadataMap = buildMetadataMap(
814
- vaultAssetsResponse.tokenMetadata
815
- );
816
- return vaults.map((vault) => {
817
- const assetAddress = vault.supportedAssets.address;
818
- const key = buildVaultAssetKey(
819
- vault.vault.boringVaultAddress,
820
- vault.chainId,
821
- assetAddress
822
- );
823
- const vaultAssetEntry = vaultAssetMap.get(key);
824
- const tokenMeta = metadataMap.get(
825
- assetAddress.toLowerCase()
826
- );
827
- if (!vaultAssetEntry && !tokenMeta) {
828
- logger.debug(
829
- `No vaultAssets match for vault ${vault.id}`
830
- );
831
- return vault;
832
- }
833
- return {
834
- ...vault,
835
- supportedAssets: {
836
- ...vault.supportedAssets,
837
- ...tokenMeta && {
838
- symbol: tokenMeta.symbol,
839
- name: tokenMeta.name,
840
- decimals: Number.parseInt(
841
- tokenMeta.decimals,
842
- 10
843
- ),
844
- coinGeckoTokenId: tokenMeta.coin_gecko_id || void 0
845
- },
846
- ...vaultAssetEntry && {
847
- depositable: vaultAssetEntry.depositable,
848
- withdrawable: vaultAssetEntry.withdrawable
849
- }
850
- }
851
- };
852
- });
853
- }
854
- function enrichAssetsWithMetadata(assets, vaultAssetsResponse) {
855
- const metadataMap = buildMetadataMap(
856
- vaultAssetsResponse.tokenMetadata
857
- );
858
- return assets.map((asset) => {
859
- const tokenMeta = metadataMap.get(
860
- asset.address.toLowerCase()
861
- );
862
- if (!tokenMeta) {
863
- return asset;
864
- }
865
- return {
866
- ...asset,
867
- symbol: tokenMeta.symbol,
868
- name: tokenMeta.name,
869
- decimals: Number.parseInt(tokenMeta.decimals, 10),
870
- coinGeckoTokenId: tokenMeta.coin_gecko_id || void 0
871
- };
872
- });
873
- }
874
-
875
822
  // src/client/amplify-sdk-client.ts
876
823
  function validateVaultFilterOptions(options) {
877
824
  if (!options) return;
@@ -932,58 +879,27 @@ function validateAssetFilterOptions(options) {
932
879
  }
933
880
  async function fetchVaultDataFromGraphQL() {
934
881
  const endpoint = getGraphQLEndpoint();
935
- const logger = getLogger();
936
- const [graphqlResult, restResult] = await Promise.allSettled([
937
- fetchAmplifySdkConfigs(endpoint),
938
- fetchVaultAssets()
939
- ]);
940
- if (graphqlResult.status === "rejected") {
941
- throw graphqlResult.reason;
942
- }
943
- const configs = graphqlResult.value.amplifySdkConfigs;
944
- let vaults = [];
945
- for (const config of configs) {
946
- const vault = mapGraphQLConfigToVault(config);
947
- if (vault) {
948
- vaults.push(vault);
949
- }
950
- }
951
- let assets = extractSupportedAssetsFromConfigs(configs);
952
- if (restResult.status === "fulfilled") {
953
- vaults = enrichVaultsWithAssetData(
954
- vaults,
955
- restResult.value
956
- );
957
- assets = enrichAssetsWithMetadata(
958
- assets,
959
- restResult.value
960
- );
961
- logger.debug(
962
- "Enriched vault data with vaultAssets metadata"
963
- );
964
- } else {
965
- logger.warn(
966
- `Failed to fetch vaultAssets, using GraphQL-only data: ${restResult.reason instanceof Error ? restResult.reason.message : String(restResult.reason)}`
967
- );
968
- }
882
+ const response = await fetchAmplifySdkConfigs(endpoint);
883
+ const configs = response.amplifySdkConfigs;
884
+ const vaults = aggregateVaultConfigs(configs);
885
+ const assets = extractSupportedAssetsFromConfigs(configs);
969
886
  return { vaults, assets };
970
887
  }
971
888
  function applyVaultFilters(vaults, options) {
972
889
  if (!options) return vaults;
973
890
  let filtered = vaults;
974
891
  if (options.chainId !== void 0) {
975
- filtered = filtered.filter(
976
- (v) => v.chainId === options.chainId
977
- );
892
+ filtered = filtered.filter((v) => v.chainId === options.chainId);
978
893
  }
979
894
  if (options.yieldType) {
980
- filtered = filtered.filter(
981
- (v) => v.yieldType === options.yieldType
982
- );
895
+ filtered = filtered.filter((v) => v.yieldType === options.yieldType);
983
896
  }
984
897
  if (options.depositTokenAddress) {
898
+ const normalized = options.depositTokenAddress.toLowerCase();
985
899
  filtered = filtered.filter(
986
- (v) => v.vault.baseTokenAddress === options.depositTokenAddress
900
+ (v) => v.supportedAssets.some(
901
+ (a) => a.address.toLowerCase() === normalized
902
+ )
987
903
  );
988
904
  }
989
905
  return filtered;
@@ -993,9 +909,7 @@ function applyAssetFilters(assets, options) {
993
909
  let filtered = assets;
994
910
  if (options.chains !== void 0 && options.chains.length > 0) {
995
911
  filtered = filtered.filter(
996
- (asset) => options.chains?.some(
997
- (chainId) => asset.chains.includes(chainId)
998
- )
912
+ (asset) => options.chains?.some((chainId) => asset.chains.includes(chainId))
999
913
  );
1000
914
  }
1001
915
  if (options.address) {
@@ -1005,9 +919,7 @@ function applyAssetFilters(assets, options) {
1005
919
  );
1006
920
  }
1007
921
  if (options.symbol) {
1008
- filtered = filtered.filter(
1009
- (asset) => asset.symbol === options.symbol
1010
- );
922
+ filtered = filtered.filter((asset) => asset.symbol === options.symbol);
1011
923
  }
1012
924
  return filtered;
1013
925
  }
@@ -1080,7 +992,9 @@ async function findVaultByConfig(params) {
1080
992
  if (!vaultsByToken) {
1081
993
  const allVaults = cache.getAllVaults();
1082
994
  const matchingVaults = allVaults.filter(
1083
- (vault) => vault.vault.baseTokenAddress.toLowerCase() === normalizedAddress
995
+ (vault) => vault.supportedAssets.some(
996
+ (a) => a.address.toLowerCase() === normalizedAddress
997
+ )
1084
998
  );
1085
999
  vaultsByToken = matchingVaults.length > 0 ? matchingVaults : void 0;
1086
1000
  }
@@ -1092,6 +1006,74 @@ async function findVaultByConfig(params) {
1092
1006
  );
1093
1007
  return matchingVault || null;
1094
1008
  }
1009
+ async function getVaultsByConfig(params) {
1010
+ const cache = getCache();
1011
+ if (cache.isEmpty() || cache.isExpired()) {
1012
+ await cache.refresh();
1013
+ }
1014
+ let vaults = cache.getAllVaults();
1015
+ if (params?.yieldType) {
1016
+ if (!isValidYieldType(params.yieldType)) {
1017
+ throw new APIError(
1018
+ `Invalid yieldType: ${params.yieldType}. Must be one of: CORE, TREASURY, FRONTIER.`,
1019
+ { endpoint: "getVaultsByConfig" }
1020
+ );
1021
+ }
1022
+ vaults = vaults.filter((v) => v.yieldType === params.yieldType);
1023
+ }
1024
+ if (params?.chainId !== void 0) {
1025
+ if (!isValidChainId(params.chainId)) {
1026
+ throw new APIError(
1027
+ `Invalid chainId: ${params.chainId}. Must be a positive integer.`,
1028
+ { endpoint: "getVaultsByConfig" }
1029
+ );
1030
+ }
1031
+ vaults = vaults.filter((v) => v.chainId === params.chainId);
1032
+ }
1033
+ if (params?.depositAssetAddress) {
1034
+ if (!isValidAddress(params.depositAssetAddress)) {
1035
+ throw new APIError(
1036
+ `Invalid depositAssetAddress: ${params.depositAssetAddress}.`,
1037
+ { endpoint: "getVaultsByConfig" }
1038
+ );
1039
+ }
1040
+ const normalized = params.depositAssetAddress.toLowerCase();
1041
+ vaults = vaults.filter(
1042
+ (v) => v.supportedAssets.some(
1043
+ (a) => a.address.toLowerCase() === normalized
1044
+ )
1045
+ );
1046
+ }
1047
+ if (params?.withdrawAssetAddress) {
1048
+ if (!isValidAddress(params.withdrawAssetAddress)) {
1049
+ throw new APIError(
1050
+ `Invalid withdrawAssetAddress: ${params.withdrawAssetAddress}.`,
1051
+ { endpoint: "getVaultsByConfig" }
1052
+ );
1053
+ }
1054
+ const normalized = params.withdrawAssetAddress.toLowerCase();
1055
+ vaults = vaults.filter(
1056
+ (v) => v.supportedAssets.some(
1057
+ (a) => a.withdrawable !== false && a.address.toLowerCase() === normalized
1058
+ )
1059
+ );
1060
+ }
1061
+ if (params?.settlementAssetAddress) {
1062
+ if (!isValidAddress(params.settlementAssetAddress)) {
1063
+ throw new APIError(
1064
+ `Invalid settlementAssetAddress: ${params.settlementAssetAddress}.`,
1065
+ { endpoint: "getVaultsByConfig" }
1066
+ );
1067
+ }
1068
+ const normalized = params.settlementAssetAddress.toLowerCase();
1069
+ vaults = vaults.filter(
1070
+ (v) => v.supportedAssets.some(
1071
+ (a) => a.address.toLowerCase() === normalized
1072
+ )
1073
+ );
1074
+ }
1075
+ return vaults;
1076
+ }
1095
1077
  async function getWithdrawSupportedAssets() {
1096
1078
  const cache = getCache();
1097
1079
  if (cache.isEmpty() || cache.isExpired()) {
@@ -1106,16 +1088,18 @@ async function getWithdrawSupportedAssets() {
1106
1088
  }
1107
1089
  const assetVaultMap = /* @__PURE__ */ new Map();
1108
1090
  for (const vault of vaults) {
1109
- const assetAddress = vault.vault.baseTokenAddress.toLowerCase();
1110
- if (!assetVaultMap.has(assetAddress)) {
1111
- assetVaultMap.set(assetAddress, []);
1091
+ for (const asset of vault.supportedAssets) {
1092
+ const assetAddress = asset.address.toLowerCase();
1093
+ if (!assetVaultMap.has(assetAddress)) {
1094
+ assetVaultMap.set(assetAddress, []);
1095
+ }
1096
+ assetVaultMap.get(assetAddress)?.push({
1097
+ id: vault.id,
1098
+ yieldType: vault.yieldType,
1099
+ chainId: vault.chainId,
1100
+ vaultId: vault.id
1101
+ });
1112
1102
  }
1113
- assetVaultMap.get(assetAddress)?.push({
1114
- id: vault.id,
1115
- yieldType: vault.yieldType,
1116
- chainId: vault.chainId,
1117
- vaultId: vault.id
1118
- });
1119
1103
  }
1120
1104
  for (const [assetAddress, vaultsData] of assetVaultMap.entries()) {
1121
1105
  const asset = assetMap.get(assetAddress);
@@ -1468,15 +1452,17 @@ exports.getClient = getClient;
1468
1452
  exports.getLogger = getLogger;
1469
1453
  exports.getRequestHeaders = getRequestHeaders;
1470
1454
  exports.getRestV2BaseURL = getRestV2BaseURL;
1455
+ exports.getVaultsByConfig = getVaultsByConfig;
1471
1456
  exports.getWithdrawSupportedAssets = getWithdrawSupportedAssets;
1472
1457
  exports.initAmplifySDK = initAmplifySDK;
1473
1458
  exports.initializeCache = initializeCache;
1474
1459
  exports.isCacheReady = isCacheReady;
1475
1460
  exports.isValidAddress = isValidAddress;
1461
+ exports.isValidChainId = isValidChainId;
1476
1462
  exports.refreshVaultCache = refreshVaultCache;
1477
1463
  exports.setLogLevel = setLogLevel;
1478
1464
  exports.setLogger = setLogger;
1479
1465
  exports.toChainId = toChainId;
1480
1466
  exports.waitForCacheReady = waitForCacheReady;
1481
- //# sourceMappingURL=chunk-BQG3XKTU.js.map
1482
- //# sourceMappingURL=chunk-BQG3XKTU.js.map
1467
+ //# sourceMappingURL=chunk-PKGFLHZA.js.map
1468
+ //# sourceMappingURL=chunk-PKGFLHZA.js.map