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