@augustdigital/sdk 5.1.1 → 7.0.0

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 (72) hide show
  1. package/lib/adapters/evm/getters.d.ts +1 -1
  2. package/lib/adapters/evm/getters.js +14 -19
  3. package/lib/adapters/evm/index.d.ts +8 -1
  4. package/lib/adapters/evm/index.js +24 -0
  5. package/lib/adapters/solana/index.d.ts +4 -4
  6. package/lib/adapters/solana/utils.d.ts +5 -4
  7. package/lib/adapters/solana/utils.js +82 -45
  8. package/lib/adapters/solana/vault.actions.d.ts +2 -2
  9. package/lib/adapters/solana/vault.actions.js +112 -74
  10. package/lib/adapters/stellar/actions.js +3 -2
  11. package/lib/adapters/stellar/constants.d.ts +2 -0
  12. package/lib/adapters/stellar/constants.js +3 -1
  13. package/lib/adapters/stellar/getters.js +2 -2
  14. package/lib/adapters/stellar/soroban.js +19 -8
  15. package/lib/adapters/stellar/submit.js +16 -6
  16. package/lib/adapters/stellar/utils.d.ts +2 -1
  17. package/lib/adapters/stellar/utils.js +7 -15
  18. package/lib/adapters/sui/utils.d.ts +1 -1
  19. package/lib/adapters/sui/utils.js +3 -7
  20. package/lib/core/analytics/chain-name.d.ts +1 -0
  21. package/lib/core/analytics/chain-name.js +26 -0
  22. package/lib/core/analytics/env.d.ts +4 -0
  23. package/lib/core/analytics/env.js +33 -0
  24. package/lib/core/analytics/index.d.ts +6 -2
  25. package/lib/core/analytics/index.js +16 -1
  26. package/lib/core/analytics/instrumentation.js +56 -48
  27. package/lib/core/analytics/method-taxonomy.d.ts +3 -0
  28. package/lib/core/analytics/method-taxonomy.js +82 -0
  29. package/lib/core/analytics/metrics.js +18 -42
  30. package/lib/core/analytics/sanitize.d.ts +1 -0
  31. package/lib/core/analytics/sanitize.js +34 -0
  32. package/lib/core/analytics/sentry-runtime.d.ts +4 -0
  33. package/lib/core/analytics/sentry-runtime.js +78 -0
  34. package/lib/core/analytics/sentry.d.ts +7 -1
  35. package/lib/core/analytics/sentry.js +107 -51
  36. package/lib/core/analytics/types.d.ts +2 -0
  37. package/lib/core/analytics/version.d.ts +1 -0
  38. package/lib/core/analytics/version.js +5 -0
  39. package/lib/core/base.class.d.ts +2 -1
  40. package/lib/core/base.class.js +5 -1
  41. package/lib/core/cache.d.ts +4 -0
  42. package/lib/core/cache.js +25 -0
  43. package/lib/core/constants/web3.js +1 -1
  44. package/lib/core/fetcher.d.ts +4 -4
  45. package/lib/core/fetcher.js +49 -60
  46. package/lib/core/helpers/chain-address.d.ts +3 -0
  47. package/lib/core/helpers/chain-address.js +36 -0
  48. package/lib/core/helpers/explorer-link.d.ts +2 -0
  49. package/lib/core/helpers/explorer-link.js +11 -0
  50. package/lib/core/helpers/vault-version.d.ts +4 -0
  51. package/lib/core/helpers/vault-version.js +59 -0
  52. package/lib/core/helpers/vaults.d.ts +3 -4
  53. package/lib/core/helpers/vaults.js +12 -62
  54. package/lib/core/helpers/web3.d.ts +6 -6
  55. package/lib/core/helpers/web3.js +142 -79
  56. package/lib/core/logger/slack.js +2 -2
  57. package/lib/core/vault-metadata.d.ts +6 -0
  58. package/lib/core/vault-metadata.js +36 -0
  59. package/lib/evm/methods/crossChainVault.js +72 -16
  60. package/lib/evm/types/crossChain.d.ts +4 -0
  61. package/lib/evm/types/crossChain.js +6 -0
  62. package/lib/modules/vaults/fetcher.d.ts +1 -6
  63. package/lib/modules/vaults/fetcher.js +27 -36
  64. package/lib/modules/vaults/getters.d.ts +1 -1
  65. package/lib/modules/vaults/getters.js +3 -2
  66. package/lib/modules/vaults/read.actions.d.ts +27 -0
  67. package/lib/modules/vaults/read.actions.js +220 -0
  68. package/lib/modules/vaults/utils/date-utils.js +1 -2
  69. package/lib/modules/vaults/utils.js +57 -36
  70. package/lib/modules/vaults/write.actions.d.ts +35 -2
  71. package/lib/modules/vaults/write.actions.js +254 -94
  72. package/package.json +5 -2
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAddressChainType = getAddressChainType;
4
+ exports.getVaultVersion = getVaultVersion;
5
+ exports.getVaultVersionV2 = getVaultVersionV2;
6
+ const ethers_1 = require("ethers");
7
+ const vaults_1 = require("../constants/vaults");
8
+ const chain_address_1 = require("./chain-address");
9
+ function getAddressChainType(address) {
10
+ if ((0, chain_address_1.isStellarAddress)(address))
11
+ return 'stellar';
12
+ if ((0, chain_address_1.isSolanaAddress)(address))
13
+ return 'solana';
14
+ if ((0, chain_address_1.isSuiAddress)(address))
15
+ return 'sui';
16
+ return 'evm';
17
+ }
18
+ function getVaultVersion(vault) {
19
+ if (!vault)
20
+ return;
21
+ const chainType = getAddressChainType(vault);
22
+ if (chainType === 'stellar')
23
+ return 'stellar-0';
24
+ if (chainType === 'solana')
25
+ return 'sol-0';
26
+ if (!(0, ethers_1.isAddress)(vault))
27
+ return;
28
+ if (vaults_1.OLD_LENDING_POOLS.includes((0, ethers_1.getAddress)(vault))) {
29
+ return 'evm-0';
30
+ }
31
+ else if (vaults_1.MULTI_ASSET_VAULTS.includes((0, ethers_1.getAddress)(vault))) {
32
+ return 'evm-2';
33
+ }
34
+ else {
35
+ return 'evm-1';
36
+ }
37
+ }
38
+ function getVaultVersionV2(vault) {
39
+ if (!vault)
40
+ return;
41
+ const chainType = getAddressChainType(vault.address);
42
+ if (vault.chain_type === 'stellar' || chainType === 'stellar')
43
+ return 'stellar-0';
44
+ if (vault.chain_type === 'solana' || chainType === 'solana')
45
+ return 'sol-0';
46
+ if (!(0, ethers_1.isAddress)(vault.address))
47
+ return;
48
+ if (vaults_1.OLD_LENDING_POOLS.includes((0, ethers_1.getAddress)(vault.address))) {
49
+ return 'evm-0';
50
+ }
51
+ else if (vault.internal_type === 'multiAssetVault' ||
52
+ vaults_1.MULTI_ASSET_VAULTS.includes(vault.address)) {
53
+ return 'evm-2';
54
+ }
55
+ else {
56
+ return 'evm-1';
57
+ }
58
+ }
59
+ //# sourceMappingURL=vault-version.js.map
@@ -1,9 +1,8 @@
1
- import { ChainType, IAddress, IContractRunner, ITokenizedVault, IVaultVersion } from '../../types';
1
+ import { IAddress, IContractRunner } from '../../types';
2
2
  export declare const isBadTransaction: (hash: string, chainId: number) => boolean;
3
3
  export declare const isBadVault: (address?: string) => boolean;
4
- export declare function getVaultVersion(vault: string): IVaultVersion | undefined;
5
- export declare function getVaultVersionV2(vault: ITokenizedVault): IVaultVersion | undefined;
6
- export declare function getAddressChainType(address: string): ChainType;
4
+ import { getAddressChainType, getVaultVersion, getVaultVersionV2 } from './vault-version';
5
+ export { getAddressChainType, getVaultVersion, getVaultVersionV2 };
7
6
  export declare const REWARD_DISTRIBUTOR_ADDRESS: (chainId: number) => string[];
8
7
  export declare const AVAX_PRICE_FEED_ADDRESS: (chainId: number) => "0xFF3EEb22B5E3dE6e705b44749C2559d704923FD7" | "0x";
9
8
  export declare function getVaultSymbol(vault: IAddress, provider: IContractRunner): Promise<string | undefined>;
@@ -1,18 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDefaultSubgraphUrl = exports.SUBGRAPH_POOL_URLS = exports.AVAX_PRICE_FEED_ADDRESS = exports.REWARD_DISTRIBUTOR_ADDRESS = exports.isBadVault = exports.isBadTransaction = void 0;
4
- exports.getVaultVersion = getVaultVersion;
5
- exports.getVaultVersionV2 = getVaultVersionV2;
6
- exports.getAddressChainType = getAddressChainType;
3
+ exports.getDefaultSubgraphUrl = exports.SUBGRAPH_POOL_URLS = exports.AVAX_PRICE_FEED_ADDRESS = exports.REWARD_DISTRIBUTOR_ADDRESS = exports.getVaultVersionV2 = exports.getVaultVersion = exports.getAddressChainType = exports.isBadVault = exports.isBadTransaction = void 0;
7
4
  exports.getVaultSymbol = getVaultSymbol;
8
5
  const ethers_1 = require("ethers");
9
6
  const vaults_1 = require("../constants/vaults");
10
7
  const web3_1 = require("./web3");
11
- const utils_1 = require("../../adapters/solana/utils");
12
- const utils_2 = require("../../adapters/sui/utils");
13
- const utils_3 = require("../../adapters/stellar/utils");
14
- const fetcher_1 = require("../../modules/vaults/fetcher");
8
+ const chain_address_1 = require("./chain-address");
9
+ const vault_metadata_1 = require("../vault-metadata");
15
10
  const logger_1 = require("../logger");
11
+ const VAULT_SYMBOLS_LOWERCASE = Object.fromEntries(Object.entries(vaults_1.VAULT_SYMBOLS).map(([k, v]) => [k.toLowerCase(), v]));
16
12
  const isBadTransaction = (hash, chainId) => {
17
13
  const badTxs = {
18
14
  1: [
@@ -34,7 +30,7 @@ exports.isBadTransaction = isBadTransaction;
34
30
  const isBadVault = (address) => {
35
31
  if (!address)
36
32
  return false;
37
- if (getAddressChainType(address) !== 'evm')
33
+ if ((0, vault_version_1.getAddressChainType)(address) !== 'evm')
38
34
  return false;
39
35
  switch ((0, ethers_1.getAddress)(address)) {
40
36
  case (0, ethers_1.getAddress)('0x706162790b601A8514c18718d0c63C9D1268e89C'):
@@ -60,56 +56,10 @@ const isBadVault = (address) => {
60
56
  }
61
57
  };
62
58
  exports.isBadVault = isBadVault;
63
- function getVaultVersion(vault) {
64
- if (!vault)
65
- return;
66
- const chainType = getAddressChainType(vault);
67
- if (chainType === 'stellar')
68
- return 'stellar-0';
69
- if (chainType === 'solana')
70
- return 'sol-0';
71
- if (!(0, ethers_1.isAddress)(vault))
72
- return;
73
- if (vaults_1.OLD_LENDING_POOLS.includes((0, ethers_1.getAddress)(vault))) {
74
- return 'evm-0';
75
- }
76
- else if (vaults_1.MULTI_ASSET_VAULTS.includes((0, ethers_1.getAddress)(vault))) {
77
- return 'evm-2';
78
- }
79
- else {
80
- return 'evm-1';
81
- }
82
- }
83
- function getVaultVersionV2(vault) {
84
- if (!vault)
85
- return;
86
- const chainType = getAddressChainType(vault.address);
87
- if (vault.chain_type === 'stellar' || chainType === 'stellar')
88
- return 'stellar-0';
89
- if (vault.chain_type === 'solana' || chainType === 'solana')
90
- return 'sol-0';
91
- if (!(0, ethers_1.isAddress)(vault.address))
92
- return;
93
- if (vaults_1.OLD_LENDING_POOLS.includes((0, ethers_1.getAddress)(vault.address))) {
94
- return 'evm-0';
95
- }
96
- else if (vault.internal_type === 'multiAssetVault' ||
97
- vaults_1.MULTI_ASSET_VAULTS.includes(vault.address)) {
98
- return 'evm-2';
99
- }
100
- else {
101
- return 'evm-1';
102
- }
103
- }
104
- function getAddressChainType(address) {
105
- if ((0, utils_3.isStellarAddress)(address))
106
- return 'stellar';
107
- if (utils_1.SolanaUtils.isSolanaAddress(address))
108
- return 'solana';
109
- if ((0, utils_2.isSuiAddress)(address))
110
- return 'sui';
111
- return 'evm';
112
- }
59
+ const vault_version_1 = require("./vault-version");
60
+ Object.defineProperty(exports, "getAddressChainType", { enumerable: true, get: function () { return vault_version_1.getAddressChainType; } });
61
+ Object.defineProperty(exports, "getVaultVersion", { enumerable: true, get: function () { return vault_version_1.getVaultVersion; } });
62
+ Object.defineProperty(exports, "getVaultVersionV2", { enumerable: true, get: function () { return vault_version_1.getVaultVersionV2; } });
113
63
  const REWARD_DISTRIBUTOR_ADDRESS = (chainId) => {
114
64
  switch (chainId) {
115
65
  case 43114:
@@ -132,14 +82,14 @@ const AVAX_PRICE_FEED_ADDRESS = (chainId) => {
132
82
  };
133
83
  exports.AVAX_PRICE_FEED_ADDRESS = AVAX_PRICE_FEED_ADDRESS;
134
84
  async function getVaultSymbol(vault, provider) {
135
- if ((0, utils_3.isStellarAddress)(vault)) {
85
+ if ((0, chain_address_1.isStellarAddress)(vault)) {
136
86
  logger_1.Logger.log.warn('getVaultSymbol', `Vault symbol lookup is not yet supported for Stellar vaults: ${vault}`);
137
87
  return undefined;
138
88
  }
139
89
  const address = (0, ethers_1.getAddress)(vault);
140
90
  let vaultsMetadata = {};
141
91
  try {
142
- vaultsMetadata = await (0, fetcher_1.fetchVaultMetadata)();
92
+ vaultsMetadata = await (0, vault_metadata_1.fetchVaultMetadata)();
143
93
  }
144
94
  catch (e) {
145
95
  logger_1.Logger.log.error('getVaultSymbol:fetchMetadata', e, { vault });
@@ -151,7 +101,7 @@ async function getVaultSymbol(vault, provider) {
151
101
  }
152
102
  }
153
103
  const hardcodedSymbol = vaults_1.VAULT_SYMBOLS[address] ??
154
- Object.entries(vaults_1.VAULT_SYMBOLS).find(([k]) => k.toLowerCase() === address.toLowerCase())?.[1];
104
+ VAULT_SYMBOLS_LOWERCASE[address.toLowerCase()];
155
105
  if (hardcodedSymbol) {
156
106
  return hardcodedSymbol;
157
107
  }
@@ -1,7 +1,7 @@
1
1
  import { ethers, Interface, InterfaceAbi, JsonRpcProvider } from 'ethers';
2
2
  import type { Abi } from 'abitype';
3
3
  import type { TypedContract } from '../../types/typed-contract';
4
- import { IAddress, IChainId, IContractRunner, IExplorerType, IInfuraOptions } from '../../types';
4
+ import { IAddress, IContractRunner, IInfuraOptions } from '../../types';
5
5
  export declare const determineBlockCutoff: (chain: number) => 120000 | 3456000 | 150000;
6
6
  export declare const determineSecondsPerBlock: (chain: number) => number;
7
7
  export declare const determineBlockSkipInternal: (chain: number) => 1000 | 8000 | 50000;
@@ -13,10 +13,11 @@ export declare function createContract<const TAbi extends Abi>({ provider, addre
13
13
  }): TypedContract<TAbi> | undefined;
14
14
  export declare const createProvider: (rpcUrl: string, chainId?: number) => JsonRpcProvider;
15
15
  export declare const getInfuraProvider: (infura: IInfuraOptions) => JsonRpcProvider;
16
- export declare const explorerLink: (hex: IAddress, chain: IChainId, type: IExplorerType) => string;
17
- export declare const getDecimals: (provider: IContractRunner, address: IAddress, isVault?: boolean) => Promise<any>;
18
- export declare const getReceiptTokenAddress: (provider: IContractRunner, address: IAddress) => Promise<any>;
19
- export declare const getSymbol: (provider: IContractRunner, address: IAddress | undefined, isVault?: boolean) => Promise<any>;
16
+ export { explorerLink } from './explorer-link';
17
+ export declare const getDecimals: (provider: IContractRunner, address: IAddress, isVault?: boolean) => Promise<number>;
18
+ export declare const getWhitelistedAssets: (provider: IContractRunner, whitelistAddress: IAddress) => Promise<IAddress[]>;
19
+ export declare const getReceiptTokenAddress: (provider: IContractRunner, address: IAddress) => Promise<`0x${string}`>;
20
+ export declare const getSymbol: (provider: IContractRunner, address: IAddress | undefined, isVault?: boolean) => Promise<string>;
20
21
  export declare function getTokenMetadata(provider: IContractRunner, asset: IAddress, meta: ('symbol' | 'decimals' | 'name' | 'totalSupply')[]): Promise<any[]>;
21
22
  export declare const getManagementFeePercent: (provider: IContractRunner, address: IAddress) => Promise<number>;
22
23
  export declare function simulateTransaction(provider: IContractRunner, abi: string[] | any, functionName: string, options?: {
@@ -29,4 +30,3 @@ type ILoanOracleFeeCategories = 'LOAN.REPAY.INTERESTS';
29
30
  export declare function getLoanOracleFeeRate(provider: IContractRunner, category_id: ILoanOracleFeeCategories, address: IAddress, chainId?: number): Promise<number>;
30
31
  export declare function getHistoricalContractData(provider: IContractRunner, contractAddress: IAddress, abi: Interface | InterfaceAbi, methodName: string, args: (string | number | bigint | boolean)[], startBlock: number, endBlock: number, blockInterval?: number): Promise<any[]>;
31
32
  export declare function getHistoricalContractDataByDate(provider: IContractRunner, contractAddress: IAddress, abi: Interface | InterfaceAbi, methodName: string, args: (string | number | bigint | boolean)[], startDate: string | number, endDate: string | number, intervalHours?: number): Promise<any[]>;
32
- export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getManagementFeePercent = exports.getSymbol = exports.getReceiptTokenAddress = exports.getDecimals = exports.explorerLink = exports.getInfuraProvider = exports.createProvider = exports.getChainId = exports.determineBlockSkipInternal = exports.determineSecondsPerBlock = exports.determineBlockCutoff = void 0;
3
+ exports.getManagementFeePercent = exports.getSymbol = exports.getReceiptTokenAddress = exports.getWhitelistedAssets = exports.getDecimals = exports.explorerLink = exports.getInfuraProvider = exports.createProvider = exports.getChainId = exports.determineBlockSkipInternal = exports.determineSecondsPerBlock = exports.determineBlockCutoff = void 0;
4
4
  exports.createContract = createContract;
5
5
  exports.getTokenMetadata = getTokenMetadata;
6
6
  exports.simulateTransaction = simulateTransaction;
@@ -9,12 +9,17 @@ exports.getLoanOracleFeeRate = getLoanOracleFeeRate;
9
9
  exports.getHistoricalContractData = getHistoricalContractData;
10
10
  exports.getHistoricalContractDataByDate = getHistoricalContractDataByDate;
11
11
  const ethers_1 = require("ethers");
12
- const __1 = require("..");
13
- const utils_1 = require("../../adapters/solana/utils");
12
+ const errors_1 = require("../errors");
13
+ const cache_1 = require("../cache");
14
+ const logger_1 = require("../logger");
15
+ const web3_1 = require("../constants/web3");
16
+ const fetcher_1 = require("../fetcher");
17
+ const chain_address_1 = require("./chain-address");
14
18
  const constants_1 = require("../../adapters/solana/constants");
15
19
  const abis_1 = require("../../abis");
16
20
  const TokenizedVaultV2_1 = require("../../abis/TokenizedVaultV2");
17
- const vaults_1 = require("./vaults");
21
+ const TokenizedVaultV2WhitelistedAssets_1 = require("../../abis/TokenizedVaultV2WhitelistedAssets");
22
+ const vault_version_1 = require("./vault-version");
18
23
  const determineBlockCutoff = (chain) => {
19
24
  switch (chain) {
20
25
  case 56:
@@ -89,8 +94,8 @@ const createProvider = (rpcUrl, chainId) => {
89
94
  `or set the AUGUST_RPC_${chainId ?? '<chainId>'} environment variable.`);
90
95
  }
91
96
  const cacheKey = chainId ? `${rpcUrl}|${chainId}` : rpcUrl;
92
- if (__1.CACHE.has(cacheKey))
93
- return __1.CACHE.get(cacheKey);
97
+ if (cache_1.CACHE.has(cacheKey))
98
+ return cache_1.CACHE.get(cacheKey);
94
99
  const provider = chainId
95
100
  ? new ethers_1.JsonRpcProvider(rpcUrl, ethers_1.Network.from(chainId), {
96
101
  staticNetwork: ethers_1.Network.from(chainId),
@@ -99,7 +104,7 @@ const createProvider = (rpcUrl, chainId) => {
99
104
  : new ethers_1.JsonRpcProvider(rpcUrl, undefined, {
100
105
  batchMaxCount: 10,
101
106
  });
102
- __1.CACHE.set(cacheKey, provider);
107
+ cache_1.CACHE.set(cacheKey, provider);
103
108
  return provider;
104
109
  };
105
110
  exports.createProvider = createProvider;
@@ -131,12 +136,8 @@ const getInfuraProvider = (infura) => {
131
136
  return (0, exports.createProvider)(url, infura.chainId);
132
137
  };
133
138
  exports.getInfuraProvider = getInfuraProvider;
134
- const explorerLink = (hex, chain, type) => {
135
- if (!chain)
136
- return;
137
- return `${__1.NETWORKS[chain].explorer}/${type}/${hex}`;
138
- };
139
- exports.explorerLink = explorerLink;
139
+ var explorer_link_1 = require("./explorer-link");
140
+ Object.defineProperty(exports, "explorerLink", { enumerable: true, get: function () { return explorer_link_1.explorerLink; } });
140
141
  function providerScope(provider) {
141
142
  let chainId;
142
143
  try {
@@ -155,93 +156,155 @@ function providerScope(provider) {
155
156
  return `url:${conn.url}`;
156
157
  return 'unknown';
157
158
  }
159
+ const DECIMALS_REQUESTS = new Map();
158
160
  const getDecimals = async (provider, address, isVault = true) => {
159
161
  if (address === ethers_1.ZeroAddress) {
160
- __1.Logger.log.info('getDecimals', 'address is zero address');
162
+ logger_1.Logger.log.info('getDecimals', 'address is zero address');
161
163
  return 0;
162
164
  }
163
- if (utils_1.SolanaUtils.isSolanaAddress(address))
165
+ if ((0, chain_address_1.isSolanaAddress)(address))
164
166
  return constants_1.fallbackDecimals;
165
167
  if (!(address && provider))
166
168
  return;
167
169
  const key = `decimals-${providerScope(provider)}-${address}`;
168
- try {
169
- if (__1.CACHE.get(key))
170
- return __1.CACHE.get(key);
171
- if (isVault) {
172
- const tokenizedVault = (await (0, __1.fetchTokenizedVault)(address))?.[0];
173
- const version = (0, vaults_1.getVaultVersionV2)(tokenizedVault);
174
- let realAddress = address;
175
- if (version === 'evm-2') {
176
- realAddress = await (0, exports.getReceiptTokenAddress)(provider, address);
170
+ if (cache_1.CACHE.has(key))
171
+ return cache_1.CACHE.get(key);
172
+ const inflight = DECIMALS_REQUESTS.get(key);
173
+ if (inflight)
174
+ return inflight;
175
+ const fetchPromise = (async () => {
176
+ try {
177
+ if (isVault) {
178
+ const tokenizedVault = (await (0, fetcher_1.fetchTokenizedVault)(address))?.[0];
179
+ const version = (0, vault_version_1.getVaultVersionV2)(tokenizedVault);
180
+ let realAddress = address;
181
+ if (version === 'evm-2') {
182
+ realAddress = await (0, exports.getReceiptTokenAddress)(provider, address);
183
+ }
184
+ const contract = new ethers_1.Contract(realAddress, [web3_1.MIN_ABIS.decimals], provider);
185
+ const decimals = Number(await contract.decimals());
186
+ cache_1.CACHE.set(key, decimals);
187
+ return decimals;
188
+ }
189
+ else {
190
+ const contract = new ethers_1.Contract(address, [web3_1.MIN_ABIS.decimals], provider);
191
+ const decimals = Number(await contract.decimals());
192
+ cache_1.CACHE.set(key, decimals);
193
+ return decimals;
177
194
  }
178
- const contract = new ethers_1.Contract(realAddress, [__1.MIN_ABIS.decimals], provider);
179
- const decimals = Number(await contract.decimals());
180
- __1.CACHE.set(key, decimals);
181
- return decimals;
182
195
  }
183
- else {
184
- const contract = new ethers_1.Contract(address, [__1.MIN_ABIS.decimals], provider);
185
- const decimals = Number(await contract.decimals());
186
- __1.CACHE.set(key, decimals);
187
- return decimals;
196
+ catch (e) {
197
+ logger_1.Logger.log.error('getDecimals', `${address}::${e}`);
198
+ return undefined;
188
199
  }
189
- }
190
- catch (e) {
191
- __1.Logger.log.error('getDecimals', `${address}::${e}`);
192
- }
200
+ finally {
201
+ DECIMALS_REQUESTS.delete(key);
202
+ }
203
+ })();
204
+ DECIMALS_REQUESTS.set(key, fetchPromise);
205
+ return fetchPromise;
193
206
  };
194
207
  exports.getDecimals = getDecimals;
208
+ const WHITELISTED_ASSETS_REQUESTS = new Map();
209
+ const getWhitelistedAssets = async (provider, whitelistAddress) => {
210
+ if (!(whitelistAddress && provider)) {
211
+ throw new errors_1.AugustValidationError('INVALID_INPUT', 'getWhitelistedAssets: provider and whitelistAddress are required');
212
+ }
213
+ const key = `whitelisted-assets-${providerScope(provider)}-${whitelistAddress}`;
214
+ if (cache_1.CACHE.has(key))
215
+ return cache_1.CACHE.get(key);
216
+ const inflight = WHITELISTED_ASSETS_REQUESTS.get(key);
217
+ if (inflight)
218
+ return inflight;
219
+ const fetchPromise = (async () => {
220
+ try {
221
+ const contract = new ethers_1.Contract(whitelistAddress, TokenizedVaultV2WhitelistedAssets_1.ABI_TOKENIZED_VAULT_V2_WHITELISTED_ASSETS, provider);
222
+ const list = (await contract.getWhitelistedAssets());
223
+ cache_1.CACHE.set(key, list, { ttl: 5 * 60 * 1000 });
224
+ return list;
225
+ }
226
+ finally {
227
+ WHITELISTED_ASSETS_REQUESTS.delete(key);
228
+ }
229
+ })();
230
+ WHITELISTED_ASSETS_REQUESTS.set(key, fetchPromise);
231
+ return fetchPromise;
232
+ };
233
+ exports.getWhitelistedAssets = getWhitelistedAssets;
234
+ const RECEIPT_TOKEN_REQUESTS = new Map();
195
235
  const getReceiptTokenAddress = async (provider, address) => {
196
236
  if (!(address && provider))
197
237
  return;
198
238
  const key = `receipt-token-${providerScope(provider)}-${address}`;
199
- try {
200
- if (__1.CACHE.get(key))
201
- return __1.CACHE.get(key);
202
- const vaultContract = new ethers_1.Contract(address, TokenizedVaultV2_1.ABI_TOKENIZED_VAULT_V2, provider);
203
- const receiptToken = (await vaultContract.lpTokenAddress());
204
- __1.CACHE.set(key, receiptToken);
205
- return receiptToken;
206
- }
207
- catch (e) {
208
- __1.Logger.log.error('getReceiptTokenAddress', e);
209
- }
239
+ if (cache_1.CACHE.has(key))
240
+ return cache_1.CACHE.get(key);
241
+ const inflight = RECEIPT_TOKEN_REQUESTS.get(key);
242
+ if (inflight)
243
+ return inflight;
244
+ const fetchPromise = (async () => {
245
+ try {
246
+ const vaultContract = new ethers_1.Contract(address, TokenizedVaultV2_1.ABI_TOKENIZED_VAULT_V2, provider);
247
+ const receiptToken = (await vaultContract.lpTokenAddress());
248
+ cache_1.CACHE.set(key, receiptToken);
249
+ return receiptToken;
250
+ }
251
+ catch (e) {
252
+ logger_1.Logger.log.error('getReceiptTokenAddress', e);
253
+ return undefined;
254
+ }
255
+ finally {
256
+ RECEIPT_TOKEN_REQUESTS.delete(key);
257
+ }
258
+ })();
259
+ RECEIPT_TOKEN_REQUESTS.set(key, fetchPromise);
260
+ return fetchPromise;
210
261
  };
211
262
  exports.getReceiptTokenAddress = getReceiptTokenAddress;
263
+ const SYMBOL_REQUESTS = new Map();
212
264
  const getSymbol = async (provider, address, isVault = true) => {
213
265
  if (address === ethers_1.ZeroAddress) {
214
- __1.Logger.log.info('getSymbol', 'address is zero address');
266
+ logger_1.Logger.log.info('getSymbol', 'address is zero address');
215
267
  return 'N/A';
216
268
  }
217
269
  if (!(address && provider))
218
270
  return;
219
271
  const key = `symbol-${providerScope(provider)}-${address}`;
220
- try {
221
- if (__1.CACHE.get(key))
222
- return __1.CACHE.get(key);
223
- if (isVault) {
224
- const tokenizedVault = (await (0, __1.fetchTokenizedVault)(address))?.[0];
225
- const version = (0, vaults_1.getVaultVersionV2)(tokenizedVault);
226
- let realAddress = address;
227
- if (version === 'evm-2') {
228
- realAddress = await (0, exports.getReceiptTokenAddress)(provider, address);
272
+ if (cache_1.CACHE.has(key))
273
+ return cache_1.CACHE.get(key);
274
+ const inflight = SYMBOL_REQUESTS.get(key);
275
+ if (inflight)
276
+ return inflight;
277
+ const fetchPromise = (async () => {
278
+ try {
279
+ if (isVault) {
280
+ const tokenizedVault = (await (0, fetcher_1.fetchTokenizedVault)(address))?.[0];
281
+ const version = (0, vault_version_1.getVaultVersionV2)(tokenizedVault);
282
+ let realAddress = address;
283
+ if (version === 'evm-2') {
284
+ realAddress = await (0, exports.getReceiptTokenAddress)(provider, address);
285
+ }
286
+ const contract = new ethers_1.Contract(realAddress, [web3_1.MIN_ABIS.symbol], provider);
287
+ const symbol = (await contract.symbol());
288
+ cache_1.CACHE.set(key, symbol);
289
+ return symbol;
290
+ }
291
+ else {
292
+ const contract = new ethers_1.Contract(address, [web3_1.MIN_ABIS.symbol], provider);
293
+ const symbol = (await contract.symbol());
294
+ cache_1.CACHE.set(key, symbol);
295
+ return symbol;
229
296
  }
230
- const contract = new ethers_1.Contract(realAddress, [__1.MIN_ABIS.symbol], provider);
231
- const symbol = (await contract.symbol());
232
- __1.CACHE.set(key, symbol);
233
- return symbol;
234
297
  }
235
- else {
236
- const contract = new ethers_1.Contract(address, [__1.MIN_ABIS.symbol], provider);
237
- const symbol = (await contract.symbol());
238
- __1.CACHE.set(key, symbol);
239
- return symbol;
298
+ catch (e) {
299
+ logger_1.Logger.log.error('getSymbol', `${address}::${e}`);
300
+ return undefined;
240
301
  }
241
- }
242
- catch (e) {
243
- __1.Logger.log.error('getSymbol', `${address}::${e}`);
244
- }
302
+ finally {
303
+ SYMBOL_REQUESTS.delete(key);
304
+ }
305
+ })();
306
+ SYMBOL_REQUESTS.set(key, fetchPromise);
307
+ return fetchPromise;
245
308
  };
246
309
  exports.getSymbol = getSymbol;
247
310
  async function getTokenMetadata(provider, asset, meta) {
@@ -250,13 +313,13 @@ async function getTokenMetadata(provider, asset, meta) {
250
313
  function buildAbi() {
251
314
  const abiArr = [];
252
315
  if (meta?.includes('name'))
253
- abiArr.push(__1.MIN_ABIS.name);
316
+ abiArr.push(web3_1.MIN_ABIS.name);
254
317
  if (meta?.includes('symbol'))
255
- abiArr.push(__1.MIN_ABIS.symbol);
318
+ abiArr.push(web3_1.MIN_ABIS.symbol);
256
319
  if (meta?.includes('decimals'))
257
- abiArr.push(__1.MIN_ABIS.decimals);
320
+ abiArr.push(web3_1.MIN_ABIS.decimals);
258
321
  if (meta?.includes('totalSupply'))
259
- abiArr.push(__1.MIN_ABIS.totalSupply);
322
+ abiArr.push(web3_1.MIN_ABIS.totalSupply);
260
323
  return abiArr;
261
324
  }
262
325
  try {
@@ -281,7 +344,7 @@ const getManagementFeePercent = async (provider, address) => {
281
344
  if (!(address && provider))
282
345
  return;
283
346
  try {
284
- const contract = new ethers_1.Contract(address, [__1.MIN_ABIS.managementFeePercent], provider);
347
+ const contract = new ethers_1.Contract(address, [web3_1.MIN_ABIS.managementFeePercent], provider);
285
348
  await contract.managementFeePercent.staticCall();
286
349
  }
287
350
  catch (e) {
@@ -289,7 +352,7 @@ const getManagementFeePercent = async (provider, address) => {
289
352
  return undefined;
290
353
  }
291
354
  try {
292
- const contract = new ethers_1.Contract(address, [__1.MIN_ABIS.managementFeePercent], provider);
355
+ const contract = new ethers_1.Contract(address, [web3_1.MIN_ABIS.managementFeePercent], provider);
293
356
  const fee = (await contract.managementFeePercent());
294
357
  return Number(fee) / 100;
295
358
  }
@@ -345,13 +408,13 @@ async function getLoanOracleFeeRate(provider, category_id, address, chainId) {
345
408
  const chainIdRes = await (0, exports.getChainId)(provider);
346
409
  _chainId = Number(chainIdRes);
347
410
  }
348
- if (!__1.ORACLE_CONTRACTS?.[_chainId]) {
411
+ if (!web3_1.ORACLE_CONTRACTS?.[_chainId]) {
349
412
  console.warn('#getLoanOracleFeeRate: no oracle address for', _chainId);
350
413
  return Number(0);
351
414
  }
352
415
  const oracleContract = createContract({
353
416
  provider,
354
- address: __1.ORACLE_CONTRACTS[_chainId],
417
+ address: web3_1.ORACLE_CONTRACTS[_chainId],
355
418
  abi: abis_1.ABI_FEE_ORACLE,
356
419
  });
357
420
  const hashedCategory = (0, ethers_1.keccak256)((0, ethers_1.toUtf8Bytes)(category_id));
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SLACK = exports.DEFAULT_SLACK_WEBHOOK_URL = void 0;
4
4
  const core_1 = require("../helpers/core");
5
- const web3_1 = require("../helpers/web3");
5
+ const explorer_link_1 = require("../helpers/explorer-link");
6
6
  const sanitize_1 = require("../analytics/sanitize");
7
7
  exports.DEFAULT_SLACK_WEBHOOK_URL = 'T04CM84GAV6/B0A2DS3ST8C/FLtOA3Jna3FN7UO4DoGxHfhG';
8
8
  function error(options) {
@@ -35,7 +35,7 @@ function error(options) {
35
35
  const safeError = (0, sanitize_1.sanitizeString)(String(error));
36
36
  const safeTitle = (0, sanitize_1.sanitizeString)(String(title));
37
37
  const data = {
38
- text: `*Error: ${safeTitle}*\n${new Date().toUTCString()}\n\nPool: [${(0, core_1.truncate)(poolAddress)}](${(0, web3_1.explorerLink)(poolAddress, chainId, 'address')})\n\n\nError: ${safeError}`,
38
+ text: `*Error: ${safeTitle}*\n${new Date().toUTCString()}\n\nPool: [${(0, core_1.truncate)(poolAddress)}](${(0, explorer_link_1.explorerLink)(poolAddress, chainId, 'address')})\n\n\nError: ${safeError}`,
39
39
  };
40
40
  const res = await fetch(webhookUrl, {
41
41
  method: 'POST',
@@ -0,0 +1,6 @@
1
+ import { IVaultMetadata } from '../types';
2
+ export declare function fetchVaultMetadata(opts?: {
3
+ options?: {
4
+ headers?: Record<string, string>;
5
+ };
6
+ }): Promise<IVaultMetadata>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchVaultMetadata = fetchVaultMetadata;
4
+ const cache_1 = require("./cache");
5
+ const core_1 = require("./constants/core");
6
+ const logger_1 = require("./logger");
7
+ async function fetchVaultMetadata(opts) {
8
+ const { options } = opts || {};
9
+ try {
10
+ const cacheKey = 'vaults_metadata';
11
+ if (cache_1.CACHE.has(cacheKey)) {
12
+ return cache_1.CACHE.get(cacheKey);
13
+ }
14
+ const response = await fetch(`${core_1.WEBSERVER_URL['upshift']}${core_1.WEBSERVER_ENDPOINTS.upshift.vaults.metadata}`, {
15
+ method: 'GET',
16
+ headers: {
17
+ 'content-type': 'application/json',
18
+ accept: 'application/json',
19
+ 'x-request-client': 'august-sdk',
20
+ ...options?.headers,
21
+ },
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`Failed to fetch vault metadata: ${response.statusText}`);
25
+ }
26
+ const metadata = await response.json();
27
+ cache_1.CACHE.set(cacheKey, metadata, { ttl: 10 * 60 * 1000 });
28
+ return metadata;
29
+ }
30
+ catch (e) {
31
+ logger_1.Logger.log.error('getVaultMetadata', e);
32
+ const errorMessage = e instanceof Error ? e.message : String(e);
33
+ throw new Error(`#getVaultMetadata::${errorMessage}`);
34
+ }
35
+ }
36
+ //# sourceMappingURL=vault-metadata.js.map