@alphafi/alphafi-sdk 0.0.35 → 0.0.37

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 (208) hide show
  1. package/README.md +15 -0
  2. package/dist/cjs/common/coins.d.ts +1 -1
  3. package/dist/cjs/common/coins.d.ts.map +1 -1
  4. package/dist/cjs/common/coins.js +15 -11
  5. package/dist/cjs/common/coins.js.map +1 -1
  6. package/dist/cjs/common/constants.d.ts +436 -32
  7. package/dist/cjs/common/constants.d.ts.map +1 -1
  8. package/dist/cjs/common/constants.js +488 -56
  9. package/dist/cjs/common/constants.js.map +1 -1
  10. package/dist/cjs/common/maps.d.ts +46 -28
  11. package/dist/cjs/common/maps.d.ts.map +1 -1
  12. package/dist/cjs/common/maps.js +358 -227
  13. package/dist/cjs/common/maps.js.map +1 -1
  14. package/dist/cjs/common/types.d.ts +59 -47
  15. package/dist/cjs/common/types.d.ts.map +1 -1
  16. package/dist/cjs/common/types.js.map +1 -1
  17. package/dist/cjs/getAllVaults.d.ts.map +1 -1
  18. package/dist/cjs/getAllVaults.js +5 -2
  19. package/dist/cjs/getAllVaults.js.map +1 -1
  20. package/dist/cjs/getVaultBalances.d.ts +2 -1
  21. package/dist/cjs/getVaultBalances.d.ts.map +1 -1
  22. package/dist/cjs/getVaultBalances.js +15 -1
  23. package/dist/cjs/getVaultBalances.js.map +1 -1
  24. package/dist/cjs/graphql/getMultiReceipts.d.ts.map +1 -1
  25. package/dist/cjs/graphql/getMultiReceipts.js +4 -0
  26. package/dist/cjs/graphql/getMultiReceipts.js.map +1 -1
  27. package/dist/cjs/index.d.ts +7 -4
  28. package/dist/cjs/index.d.ts.map +1 -1
  29. package/dist/cjs/index.js +20 -5
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/sui-sdk/events/fetchAfterTransactionEvents.d.ts.map +1 -1
  32. package/dist/cjs/sui-sdk/events/fetchAfterTransactionEvents.js +2 -2
  33. package/dist/cjs/sui-sdk/events/fetchAfterTransactionEvents.js.map +1 -1
  34. package/dist/cjs/sui-sdk/events/fetchAutoCompoundingEvents.d.ts.map +1 -1
  35. package/dist/cjs/sui-sdk/events/fetchAutoCompoundingEvents.js +2 -2
  36. package/dist/cjs/sui-sdk/events/fetchAutoCompoundingEvents.js.map +1 -1
  37. package/dist/cjs/sui-sdk/events/fetchRebalanceEvents.d.ts.map +1 -1
  38. package/dist/cjs/sui-sdk/events/fetchRebalanceEvents.js +5 -7
  39. package/dist/cjs/sui-sdk/events/fetchRebalanceEvents.js.map +1 -1
  40. package/dist/cjs/sui-sdk/functions/fetchUserVaultBalances.d.ts +1 -1
  41. package/dist/cjs/sui-sdk/functions/fetchUserVaultBalances.d.ts.map +1 -1
  42. package/dist/cjs/sui-sdk/functions/fetchUserVaultBalances.js +11 -20
  43. package/dist/cjs/sui-sdk/functions/fetchUserVaultBalances.js.map +1 -1
  44. package/dist/cjs/sui-sdk/functions/fetchUserVaults.d.ts.map +1 -1
  45. package/dist/cjs/sui-sdk/functions/fetchUserVaults.js +12 -9
  46. package/dist/cjs/sui-sdk/functions/fetchUserVaults.js.map +1 -1
  47. package/dist/cjs/sui-sdk/functions/getPortfolioAmounts.d.ts +8 -23
  48. package/dist/cjs/sui-sdk/functions/getPortfolioAmounts.d.ts.map +1 -1
  49. package/dist/cjs/sui-sdk/functions/getPortfolioAmounts.js +157 -141
  50. package/dist/cjs/sui-sdk/functions/getPortfolioAmounts.js.map +1 -1
  51. package/dist/cjs/sui-sdk/functions/getReceipts.d.ts +15 -10
  52. package/dist/cjs/sui-sdk/functions/getReceipts.d.ts.map +1 -1
  53. package/dist/cjs/sui-sdk/functions/getReceipts.js +274 -190
  54. package/dist/cjs/sui-sdk/functions/getReceipts.js.map +1 -1
  55. package/dist/cjs/transactions/alpha.d.ts +4 -0
  56. package/dist/cjs/transactions/alpha.d.ts.map +1 -0
  57. package/dist/cjs/transactions/alpha.js +104 -0
  58. package/dist/cjs/transactions/alpha.js.map +1 -0
  59. package/dist/cjs/transactions/bluefin.d.ts +15 -0
  60. package/dist/cjs/transactions/bluefin.d.ts.map +1 -0
  61. package/dist/cjs/transactions/bluefin.js +457 -0
  62. package/dist/cjs/transactions/bluefin.js.map +1 -0
  63. package/dist/cjs/transactions/bucket.d.ts +8 -0
  64. package/dist/cjs/transactions/bucket.d.ts.map +1 -0
  65. package/dist/cjs/transactions/bucket.js +131 -0
  66. package/dist/cjs/transactions/bucket.js.map +1 -0
  67. package/dist/cjs/transactions/cetus.d.ts +24 -0
  68. package/dist/cjs/transactions/cetus.d.ts.map +1 -0
  69. package/dist/cjs/transactions/cetus.js +554 -0
  70. package/dist/cjs/transactions/cetus.js.map +1 -0
  71. package/dist/cjs/transactions/collect_rewards.d.ts +3 -0
  72. package/dist/cjs/transactions/collect_rewards.d.ts.map +1 -0
  73. package/dist/cjs/transactions/collect_rewards.js +332 -0
  74. package/dist/cjs/transactions/collect_rewards.js.map +1 -0
  75. package/dist/cjs/transactions/deposit.d.ts +5 -0
  76. package/dist/cjs/transactions/deposit.d.ts.map +1 -0
  77. package/dist/cjs/transactions/deposit.js +57 -0
  78. package/dist/cjs/transactions/deposit.js.map +1 -0
  79. package/dist/cjs/transactions/navi.d.ts +9 -0
  80. package/dist/cjs/transactions/navi.d.ts.map +1 -0
  81. package/dist/cjs/transactions/navi.js +618 -0
  82. package/dist/cjs/transactions/navi.js.map +1 -0
  83. package/dist/cjs/transactions/withdraw.d.ts +5 -0
  84. package/dist/cjs/transactions/withdraw.d.ts.map +1 -0
  85. package/dist/cjs/transactions/withdraw.js +52 -0
  86. package/dist/cjs/transactions/withdraw.js.map +1 -0
  87. package/dist/cjs/transactions/zapDeposit.d.ts +1 -0
  88. package/dist/cjs/transactions/zapDeposit.d.ts.map +1 -0
  89. package/dist/cjs/transactions/zapDeposit.js +730 -0
  90. package/dist/cjs/transactions/zapDeposit.js.map +1 -0
  91. package/dist/cjs/utils/clmm/prices.js +9 -9
  92. package/dist/cjs/utils/clmm/prices.js.map +1 -1
  93. package/dist/cjs/utils/getHoldersFromTransactionsUtils.d.ts.map +1 -1
  94. package/dist/cjs/utils/getHoldersFromTransactionsUtils.js +7 -7
  95. package/dist/cjs/utils/getHoldersFromTransactionsUtils.js.map +1 -1
  96. package/dist/cjs/utils/hop.js +3 -3
  97. package/dist/cjs/utils/hop.js.map +1 -1
  98. package/dist/cjs/utils/prices.d.ts +2 -0
  99. package/dist/cjs/utils/prices.d.ts.map +1 -1
  100. package/dist/cjs/utils/prices.js +39 -0
  101. package/dist/cjs/utils/prices.js.map +1 -1
  102. package/dist/cjs/utils/userHoldings.d.ts.map +1 -1
  103. package/dist/cjs/utils/userHoldings.js +18 -18
  104. package/dist/cjs/utils/userHoldings.js.map +1 -1
  105. package/dist/esm/common/coins.d.ts +1 -1
  106. package/dist/esm/common/coins.d.ts.map +1 -1
  107. package/dist/esm/common/coins.js +14 -10
  108. package/dist/esm/common/coins.js.map +1 -1
  109. package/dist/esm/common/constants.d.ts +436 -32
  110. package/dist/esm/common/constants.d.ts.map +1 -1
  111. package/dist/esm/common/constants.js +488 -56
  112. package/dist/esm/common/constants.js.map +1 -1
  113. package/dist/esm/common/maps.d.ts +46 -28
  114. package/dist/esm/common/maps.d.ts.map +1 -1
  115. package/dist/esm/common/maps.js +355 -226
  116. package/dist/esm/common/maps.js.map +1 -1
  117. package/dist/esm/common/types.d.ts +59 -47
  118. package/dist/esm/common/types.d.ts.map +1 -1
  119. package/dist/esm/common/types.js.map +1 -1
  120. package/dist/esm/getAllVaults.d.ts.map +1 -1
  121. package/dist/esm/getAllVaults.js +5 -2
  122. package/dist/esm/getAllVaults.js.map +1 -1
  123. package/dist/esm/getVaultBalances.d.ts +2 -1
  124. package/dist/esm/getVaultBalances.d.ts.map +1 -1
  125. package/dist/esm/getVaultBalances.js +14 -1
  126. package/dist/esm/getVaultBalances.js.map +1 -1
  127. package/dist/esm/graphql/getMultiReceipts.d.ts.map +1 -1
  128. package/dist/esm/graphql/getMultiReceipts.js +4 -0
  129. package/dist/esm/graphql/getMultiReceipts.js.map +1 -1
  130. package/dist/esm/index.d.ts +7 -4
  131. package/dist/esm/index.d.ts.map +1 -1
  132. package/dist/esm/index.js +7 -4
  133. package/dist/esm/index.js.map +1 -1
  134. package/dist/esm/sui-sdk/events/fetchAfterTransactionEvents.d.ts.map +1 -1
  135. package/dist/esm/sui-sdk/events/fetchAfterTransactionEvents.js +4 -4
  136. package/dist/esm/sui-sdk/events/fetchAfterTransactionEvents.js.map +1 -1
  137. package/dist/esm/sui-sdk/events/fetchAutoCompoundingEvents.d.ts.map +1 -1
  138. package/dist/esm/sui-sdk/events/fetchAutoCompoundingEvents.js +4 -4
  139. package/dist/esm/sui-sdk/events/fetchAutoCompoundingEvents.js.map +1 -1
  140. package/dist/esm/sui-sdk/events/fetchRebalanceEvents.d.ts.map +1 -1
  141. package/dist/esm/sui-sdk/events/fetchRebalanceEvents.js +7 -9
  142. package/dist/esm/sui-sdk/events/fetchRebalanceEvents.js.map +1 -1
  143. package/dist/esm/sui-sdk/functions/fetchUserVaultBalances.d.ts +1 -1
  144. package/dist/esm/sui-sdk/functions/fetchUserVaultBalances.d.ts.map +1 -1
  145. package/dist/esm/sui-sdk/functions/fetchUserVaultBalances.js +11 -20
  146. package/dist/esm/sui-sdk/functions/fetchUserVaultBalances.js.map +1 -1
  147. package/dist/esm/sui-sdk/functions/fetchUserVaults.d.ts.map +1 -1
  148. package/dist/esm/sui-sdk/functions/fetchUserVaults.js +13 -10
  149. package/dist/esm/sui-sdk/functions/fetchUserVaults.js.map +1 -1
  150. package/dist/esm/sui-sdk/functions/getPortfolioAmounts.d.ts +8 -23
  151. package/dist/esm/sui-sdk/functions/getPortfolioAmounts.d.ts.map +1 -1
  152. package/dist/esm/sui-sdk/functions/getPortfolioAmounts.js +158 -144
  153. package/dist/esm/sui-sdk/functions/getPortfolioAmounts.js.map +1 -1
  154. package/dist/esm/sui-sdk/functions/getReceipts.d.ts +15 -10
  155. package/dist/esm/sui-sdk/functions/getReceipts.d.ts.map +1 -1
  156. package/dist/esm/sui-sdk/functions/getReceipts.js +266 -186
  157. package/dist/esm/sui-sdk/functions/getReceipts.js.map +1 -1
  158. package/dist/esm/transactions/alpha.d.ts +4 -0
  159. package/dist/esm/transactions/alpha.d.ts.map +1 -0
  160. package/dist/esm/transactions/alpha.js +99 -0
  161. package/dist/esm/transactions/alpha.js.map +1 -0
  162. package/dist/esm/transactions/bluefin.d.ts +15 -0
  163. package/dist/esm/transactions/bluefin.d.ts.map +1 -0
  164. package/dist/esm/transactions/bluefin.js +450 -0
  165. package/dist/esm/transactions/bluefin.js.map +1 -0
  166. package/dist/esm/transactions/bucket.d.ts +8 -0
  167. package/dist/esm/transactions/bucket.d.ts.map +1 -0
  168. package/dist/esm/transactions/bucket.js +127 -0
  169. package/dist/esm/transactions/bucket.js.map +1 -0
  170. package/dist/esm/transactions/cetus.d.ts +24 -0
  171. package/dist/esm/transactions/cetus.d.ts.map +1 -0
  172. package/dist/esm/transactions/cetus.js +541 -0
  173. package/dist/esm/transactions/cetus.js.map +1 -0
  174. package/dist/esm/transactions/collect_rewards.d.ts +3 -0
  175. package/dist/esm/transactions/collect_rewards.d.ts.map +1 -0
  176. package/dist/esm/transactions/collect_rewards.js +329 -0
  177. package/dist/esm/transactions/collect_rewards.js.map +1 -0
  178. package/dist/esm/transactions/deposit.d.ts +5 -0
  179. package/dist/esm/transactions/deposit.d.ts.map +1 -0
  180. package/dist/esm/transactions/deposit.js +53 -0
  181. package/dist/esm/transactions/deposit.js.map +1 -0
  182. package/dist/esm/transactions/navi.d.ts +9 -0
  183. package/dist/esm/transactions/navi.d.ts.map +1 -0
  184. package/dist/esm/transactions/navi.js +614 -0
  185. package/dist/esm/transactions/navi.js.map +1 -0
  186. package/dist/esm/transactions/withdraw.d.ts +5 -0
  187. package/dist/esm/transactions/withdraw.d.ts.map +1 -0
  188. package/dist/esm/transactions/withdraw.js +49 -0
  189. package/dist/esm/transactions/withdraw.js.map +1 -0
  190. package/dist/esm/transactions/zapDeposit.d.ts +2 -0
  191. package/dist/esm/transactions/zapDeposit.d.ts.map +1 -0
  192. package/dist/esm/transactions/zapDeposit.js +730 -0
  193. package/dist/esm/transactions/zapDeposit.js.map +1 -0
  194. package/dist/esm/utils/clmm/prices.js +10 -10
  195. package/dist/esm/utils/clmm/prices.js.map +1 -1
  196. package/dist/esm/utils/getHoldersFromTransactionsUtils.d.ts.map +1 -1
  197. package/dist/esm/utils/getHoldersFromTransactionsUtils.js +9 -9
  198. package/dist/esm/utils/getHoldersFromTransactionsUtils.js.map +1 -1
  199. package/dist/esm/utils/hop.js +4 -4
  200. package/dist/esm/utils/hop.js.map +1 -1
  201. package/dist/esm/utils/prices.d.ts +2 -0
  202. package/dist/esm/utils/prices.d.ts.map +1 -1
  203. package/dist/esm/utils/prices.js +37 -0
  204. package/dist/esm/utils/prices.js.map +1 -1
  205. package/dist/esm/utils/userHoldings.d.ts.map +1 -1
  206. package/dist/esm/utils/userHoldings.js +20 -20
  207. package/dist/esm/utils/userHoldings.js.map +1 -1
  208. package/package.json +2 -2
@@ -1,17 +1,19 @@
1
1
  import { Decimal } from "decimal.js";
2
- import { getCoinAmountsFromLiquidity, getPool, getPoolExchangeRate, getReceipts, getNaviInvestor, fetchVoloExchangeRate, } from "./getReceipts.js";
3
- import { SimpleCache } from "../../utils/simpleCache.js";
4
- import { coins } from "../../common/coins.js";
5
- import { poolCoinMap, poolCoinPairMap } from "../../common/maps.js";
2
+ import { poolInfo, loopingPoolCoinMap, getSuiClient, cetusPoolMap, getParentPool, } from "../../index.js";
3
+ import { getCoinAmountsFromLiquidity, getPool, getPoolExchangeRate, getReceipts, fetchVoloExchangeRate, getInvestor, } from "./getReceipts.js";
4
+ import { coinsList } from "../../common/coins.js";
5
+ import { singleAssetPoolCoinMap, doubleAssetPoolCoinMap, } from "../../common/maps.js";
6
6
  import { getAlphaPrice } from "../../utils/clmm/prices.js";
7
7
  import { getLatestPrices } from "../../utils/prices.js";
8
- export async function getAlphaPortfolioAmount(poolName, options) {
9
- const receipts = await getReceipts(poolName, options.address);
10
- const pool = await getPool(poolName);
8
+ import { TickMath } from "@cetusprotocol/cetus-sui-clmm-sdk";
9
+ import BN from "bn.js";
10
+ export async function getAlphaPortfolioAmount(poolName, options, ignoreCache) {
11
+ const receipts = await getReceipts(poolName, options.address, ignoreCache);
12
+ const pool = await getPool(poolName, ignoreCache);
11
13
  if (!pool) {
12
14
  throw new Error("Pool not found");
13
15
  }
14
- const exchangeRate = await getPoolExchangeRate(poolName);
16
+ const exchangeRate = await getPoolExchangeRate(poolName, ignoreCache);
15
17
  let totalXTokens = new Decimal(0);
16
18
  if (!exchangeRate) {
17
19
  return "0"; // if pool has 0 xtokens
@@ -38,7 +40,7 @@ export async function getAlphaPortfolioAmount(poolName, options) {
38
40
  });
39
41
  }
40
42
  if (totalXTokens.gt(0)) {
41
- const poolExchangeRate = await getPoolExchangeRate(poolName);
43
+ const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);
42
44
  if (poolExchangeRate) {
43
45
  const tokens = totalXTokens.div(1e9).mul(poolExchangeRate);
44
46
  return `${tokens}`;
@@ -51,8 +53,8 @@ export async function getAlphaPortfolioAmount(poolName, options) {
51
53
  return "0";
52
54
  }
53
55
  }
54
- export async function getAlphaPortfolioAmountInUSD(poolName, options) {
55
- const tokens = await getAlphaPortfolioAmount(poolName, options);
56
+ export async function getAlphaPortfolioAmountInUSD(poolName, options, ignoreCache) {
57
+ const tokens = await getAlphaPortfolioAmount(poolName, options, ignoreCache);
56
58
  const priceOfAlpha = await getAlphaPrice();
57
59
  if (priceOfAlpha && tokens) {
58
60
  let amount = new Decimal(tokens);
@@ -60,71 +62,43 @@ export async function getAlphaPortfolioAmountInUSD(poolName, options) {
60
62
  return amount.toString();
61
63
  }
62
64
  }
63
- const portfolioAmountCache = new SimpleCache();
64
- const portfolioAmountPromiseCache = new SimpleCache();
65
- export async function getPortfolioAmount(poolName, options, ignoreCache = false) {
66
- let portfolioAmount = [0, 0];
67
- const portfolioAmountCacheKey = `getPortfolioAmount:${poolName}-${options.address}}`;
68
- if (ignoreCache) {
69
- portfolioAmountCache.delete(portfolioAmountCacheKey);
70
- portfolioAmountPromiseCache.delete(portfolioAmountCacheKey);
71
- }
72
- const cachedResponse = portfolioAmountCache.get(portfolioAmountCacheKey);
73
- if (cachedResponse) {
74
- return cachedResponse;
75
- }
76
- let cachedPromise = portfolioAmountPromiseCache.get(portfolioAmountCacheKey);
77
- if (!cachedPromise) {
78
- cachedPromise = (async () => {
79
- const receipts = await getReceipts(poolName, options.address);
80
- let totalXTokens = new Decimal(0);
81
- if (receipts) {
82
- receipts.forEach((receipt) => {
83
- const xTokens = receipt.content.fields.xTokenBalance;
84
- totalXTokens = totalXTokens.add(xTokens);
85
- });
86
- }
87
- if (totalXTokens.gt(0)) {
88
- const poolExchangeRate = await getPoolExchangeRate(poolName);
89
- if (poolExchangeRate) {
90
- const tokens = totalXTokens.mul(poolExchangeRate);
91
- const poolTokenAmounts = await getCoinAmountsFromLiquidity(poolName, tokens.toNumber());
92
- portfolioAmount = poolTokenAmounts;
93
- }
94
- else {
95
- console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);
96
- }
97
- }
98
- else {
99
- portfolioAmount = [0, 0];
100
- }
101
- portfolioAmountCache.set(portfolioAmountCacheKey, portfolioAmount);
102
- portfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache
103
- return portfolioAmount;
104
- })().catch((error) => {
105
- portfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache
106
- throw error;
65
+ export async function getPortfolioAmount(poolName, address, ignoreCache) {
66
+ let portfolioAmount = ["0", "0"];
67
+ const receipts = await getReceipts(poolName, address, ignoreCache);
68
+ let totalXTokens = new Decimal(0);
69
+ if (receipts) {
70
+ receipts.forEach((receipt) => {
71
+ const xTokens = receipt.content.fields.xTokenBalance;
72
+ totalXTokens = totalXTokens.add(xTokens);
107
73
  });
108
- portfolioAmountPromiseCache.set(portfolioAmountCacheKey, cachedPromise);
109
74
  }
110
- return cachedPromise;
75
+ if (totalXTokens.gt(0)) {
76
+ const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);
77
+ if (poolExchangeRate) {
78
+ const tokens = totalXTokens.mul(poolExchangeRate);
79
+ const poolTokenAmounts = await getCoinAmountsFromLiquidity(poolName, tokens.toString(), ignoreCache);
80
+ portfolioAmount = poolTokenAmounts;
81
+ }
82
+ else {
83
+ console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);
84
+ }
85
+ }
86
+ return portfolioAmount;
111
87
  }
112
- export async function getDoubleAssetPortfolioAmountInUSD(poolName, options, ignoreCache = false) {
88
+ export async function getDoubleAssetPortfolioAmountInUSD(poolName, address, ignoreCache) {
113
89
  if (poolName !== undefined) {
114
- const amounts = await getPortfolioAmount(poolName, options, ignoreCache);
90
+ const amounts = await getPortfolioAmount(poolName, address, ignoreCache);
115
91
  if (amounts !== undefined) {
116
92
  const ten = new Decimal(10);
117
- const pool1 = poolCoinPairMap[poolName]
118
- .coinA;
119
- const pool2 = poolCoinPairMap[poolName]
120
- .coinB;
121
- const amount0 = new Decimal(amounts[0]).div(ten.pow(coins[pool1].expo));
122
- const amount1 = new Decimal(amounts[1]).div(ten.pow(coins[pool2].expo));
93
+ const pool1 = doubleAssetPoolCoinMap[poolName].coin1;
94
+ const pool2 = doubleAssetPoolCoinMap[poolName].coin2;
95
+ const amount0 = new Decimal(amounts[0]).div(ten.pow(coinsList[pool1].expo));
96
+ const amount1 = new Decimal(amounts[1]).div(ten.pow(coinsList[pool2].expo));
123
97
  const tokens = poolName.split("-");
124
98
  const [priceOfCoin0, priceOfCoin1] = await getLatestPrices([
125
99
  `${tokens[0]}/USD`,
126
100
  `${tokens[1]}/USD`,
127
- ], false);
101
+ ], ignoreCache);
128
102
  if (priceOfCoin0 && priceOfCoin1) {
129
103
  const amount = amount0.mul(priceOfCoin0).add(amount1.mul(priceOfCoin1));
130
104
  return amount.toString();
@@ -136,106 +110,146 @@ export async function getDoubleAssetPortfolioAmountInUSD(poolName, options, igno
136
110
  return "0";
137
111
  }
138
112
  }
139
- const singleAssetPortfolioAmountCache = new SimpleCache();
140
- const singleAssetPortfolioAmountPromiseCache = new SimpleCache();
141
- export async function getSingleAssetPortfolioAmount(poolName, options, ignoreCache = false) {
113
+ export async function getNaviLoopingPoolDebt(poolName) {
114
+ const debt = (await getSuiClient().getDynamicFieldObject({
115
+ parentId: poolInfo[poolName].investorId,
116
+ name: {
117
+ type: "vector<u8>",
118
+ value: "debt".split("").map((char) => char.charCodeAt(0)),
119
+ },
120
+ })).data.content.fields.value.toString();
121
+ return debt;
122
+ }
123
+ export async function getSingleAssetPortfolioAmount(poolName, address, ignoreCache) {
142
124
  let portfolioAmount = 0;
143
- const portfolioAmountCacheKey = `getPortfolioAmount:${poolName}-${options.address}}`;
144
- if (ignoreCache) {
145
- singleAssetPortfolioAmountCache.delete(portfolioAmountCacheKey);
146
- singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey);
147
- }
148
- const cachedResponse = singleAssetPortfolioAmountCache.get(portfolioAmountCacheKey);
149
- if (cachedResponse) {
150
- return cachedResponse;
125
+ const receipts = await getReceipts(poolName, address, ignoreCache);
126
+ let totalXTokens = new Decimal(0);
127
+ if (receipts) {
128
+ receipts.forEach((receipt) => {
129
+ const xTokens = receipt.content.fields.xTokenBalance;
130
+ totalXTokens = totalXTokens.add(xTokens);
131
+ });
151
132
  }
152
- let cachedPromise = singleAssetPortfolioAmountPromiseCache.get(portfolioAmountCacheKey);
153
- if (!cachedPromise) {
154
- cachedPromise = (async () => {
155
- const receipts = await getReceipts(poolName, options.address, ignoreCache);
156
- let totalXTokens = new Decimal(0);
157
- if (receipts) {
158
- receipts.forEach((receipt) => {
159
- const xTokens = receipt.content.fields.xTokenBalance;
160
- totalXTokens = totalXTokens.add(xTokens);
161
- });
162
- }
163
- if (totalXTokens.gt(0)) {
164
- if (poolName == "NAVI-LOOP-SUI-VSUI" ||
165
- poolName == "NAVI-LOOP-USDC-USDT") {
166
- const pool = await getPool(poolName, ignoreCache);
167
- const investor = (await getNaviInvestor(poolName, ignoreCache));
168
- if (pool && investor) {
169
- const liquidity = new Decimal(investor.content.fields.tokensDeposited);
170
- const debtToSupplyRatio = new Decimal(investor.content.fields.current_debt_to_supply_ratio);
171
- const tokensInvested = liquidity.mul(new Decimal(1).minus(new Decimal(debtToSupplyRatio).div(1e20)));
172
- const xTokenSupplyInPool = new Decimal(pool.content.fields.xTokenSupply);
173
- const userTokens = totalXTokens
174
- .mul(tokensInvested)
175
- .div(xTokenSupplyInPool);
176
- const tokens = userTokens.div(Math.pow(10, 9 - coins[poolCoinMap[poolName]].expo));
177
- if (poolName == "NAVI-LOOP-SUI-VSUI") {
178
- // const { SevenKGateway } = await import("../");
179
- // const sevenKInstance = new SevenKGateway();
180
- // const numberOfTokensInSui = (await sevenKInstance.getQuote({
181
- // slippage: 1,
182
- // senderAddress: options.address,
183
- // pair: { coinA: coins["VSUI"], coinB: coins["SUI"] },
184
- // inAmount: new BN(tokens.toNumber()),
185
- // })) as QuoteResponse;
186
- const voloExchRate = await fetchVoloExchangeRate();
187
- portfolioAmount = Number(tokens.mul(parseFloat(voloExchRate.data.exchangeRate)));
188
- }
189
- // TODO: Whenever NAVI-LOOP-USDT-WUSDC is released, change this else implementation
190
- else {
191
- portfolioAmount = Number(tokens);
192
- }
133
+ if (totalXTokens.gt(0)) {
134
+ let pool;
135
+ let investor;
136
+ if (poolInfo[poolName].parentProtocolName == "NAVI") {
137
+ pool = await getPool(poolName, ignoreCache);
138
+ investor = (await getInvestor(poolName, ignoreCache));
139
+ }
140
+ if (poolName == "NAVI-LOOP-USDC-USDT" ||
141
+ poolName == "NAVI-LOOP-USDT-USDC") {
142
+ const supplyCoin = loopingPoolCoinMap[poolName].supplyCoin;
143
+ const borrowCoin = loopingPoolCoinMap[poolName].borrowCoin;
144
+ if (pool && investor) {
145
+ let tokensInvested = new Decimal(0);
146
+ const currentDebt = await getNaviLoopingPoolDebt(poolName);
147
+ const currentSupply = investor.content.fields.tokensDeposited.toString();
148
+ if (cetusPoolMap[supplyCoin + "-" + borrowCoin] &&
149
+ currentDebt &&
150
+ currentSupply) {
151
+ const cetusPool = await getParentPool(supplyCoin + "-" + borrowCoin, ignoreCache);
152
+ if (cetusPool) {
153
+ const sqrtPrice = cetusPool?.content.fields.current_sqrt_price;
154
+ const price = TickMath.sqrtPriceX64ToPrice(new BN(sqrtPrice), coinsList[supplyCoin].expo, coinsList[borrowCoin].expo);
155
+ const currentDebtInSupplyCoin = new Decimal(currentDebt).div(price);
156
+ tokensInvested = new Decimal(currentSupply).minus(currentDebtInSupplyCoin);
193
157
  }
194
158
  else {
195
- console.error(`Could not get object for poolName: ${poolName}`);
159
+ console.error(`couldnt fetch cetus pool`);
196
160
  }
197
161
  }
198
- else {
199
- const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);
200
- if (poolExchangeRate) {
201
- let tokens = totalXTokens.mul(poolExchangeRate);
202
- tokens = tokens.div(Math.pow(10, 9 -
203
- coins[poolCoinMap[poolName]].expo));
204
- portfolioAmount = tokens.toNumber();
162
+ else if (cetusPoolMap[borrowCoin + "-" + supplyCoin] &&
163
+ currentDebt !== undefined &&
164
+ currentSupply !== undefined) {
165
+ const cetusPool = await getParentPool(borrowCoin + "-" + supplyCoin, ignoreCache);
166
+ if (cetusPool) {
167
+ const sqrtPrice = cetusPool?.content.fields.current_sqrt_price;
168
+ const price = TickMath.sqrtPriceX64ToPrice(new BN(sqrtPrice), coinsList[borrowCoin].expo, coinsList[supplyCoin].expo);
169
+ const currentDebtInSupplyCoin = new Decimal(currentDebt).mul(price);
170
+ tokensInvested = new Decimal(currentSupply).minus(currentDebtInSupplyCoin);
205
171
  }
206
172
  else {
207
- console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);
173
+ console.error(`couldnt fetch cetus pool`);
208
174
  }
209
175
  }
176
+ else {
177
+ console.error(`one or more of these are possibly undefined: currentDebt:${currentDebt}, currentSupply: ${currentSupply}, cetusPoolMap[supplyCoin+'-'+borrowCoin]:${cetusPoolMap[supplyCoin + "-" + borrowCoin]}, cetusPoolMap[borrowCoin+'-'+supplyCoin]: ${cetusPoolMap[borrowCoin + "-" + supplyCoin]}`);
178
+ }
179
+ const xTokenSupplyInPool = new Decimal(pool.content.fields.xTokenSupply);
180
+ const userTokens = totalXTokens
181
+ .mul(tokensInvested)
182
+ .div(xTokenSupplyInPool);
183
+ const tokens = userTokens.div(Math.pow(10, 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo));
184
+ portfolioAmount = Number(tokens);
210
185
  }
211
186
  else {
212
- portfolioAmount = 0;
187
+ console.error(`Could not get object for poolName: ${poolName}`);
213
188
  }
214
- singleAssetPortfolioAmountCache.set(portfolioAmountCacheKey, portfolioAmount);
215
- singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache
216
- return portfolioAmount;
217
- })().catch((error) => {
218
- singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache
219
- throw error;
220
- });
221
- singleAssetPortfolioAmountPromiseCache.set(portfolioAmountCacheKey, cachedPromise);
189
+ }
190
+ else if (poolName == "NAVI-LOOP-HASUI-SUI" ||
191
+ poolName == "NAVI-LOOP-SUI-VSUI") {
192
+ if (pool && investor) {
193
+ const liquidity = new Decimal(investor.content.fields.tokensDeposited);
194
+ const debtToSupplyRatio = new Decimal(investor.content.fields.current_debt_to_supply_ratio);
195
+ const tokensInvested = liquidity.mul(new Decimal(1).minus(new Decimal(debtToSupplyRatio).div(1e20)));
196
+ const xTokenSupplyInPool = new Decimal(pool.content.fields.xTokenSupply);
197
+ const userTokens = totalXTokens
198
+ .mul(tokensInvested)
199
+ .div(xTokenSupplyInPool);
200
+ const tokens = userTokens.div(Math.pow(10, 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo));
201
+ if (poolName == "NAVI-LOOP-SUI-VSUI") {
202
+ // const { SevenKGateway } = await import("../");
203
+ // const sevenKInstance = new SevenKGateway();
204
+ // const numberOfTokensInSui = (await sevenKInstance.getQuote({
205
+ // slippage: 1,
206
+ // senderAddress: options.address,
207
+ // pair: { coinA: coins["VSUI"], coinB: coins["SUI"] },
208
+ // inAmount: new BN(tokens.toNumber()),
209
+ // })) as QuoteResponse;
210
+ const voloExchRate = await fetchVoloExchangeRate();
211
+ portfolioAmount = Number(tokens.mul(parseFloat(voloExchRate.data.exchangeRate)));
212
+ }
213
+ else {
214
+ portfolioAmount = Number(tokens);
215
+ }
216
+ }
217
+ else {
218
+ console.error(`Could not get object for poolName: ${poolName}`);
219
+ }
220
+ }
221
+ else {
222
+ const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);
223
+ if (poolExchangeRate) {
224
+ let tokens = totalXTokens.mul(poolExchangeRate);
225
+ if (poolInfo[poolName].parentProtocolName == "NAVI") {
226
+ tokens = tokens.div(Math.pow(10, 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo));
227
+ }
228
+ portfolioAmount = tokens.toNumber();
229
+ }
230
+ else {
231
+ console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);
232
+ }
233
+ }
222
234
  }
223
- return cachedPromise;
235
+ return portfolioAmount;
224
236
  }
225
- export async function getSingleAssetPortfolioAmountInUSD(poolName, options, ignoreCache = false) {
226
- const amounts = await getSingleAssetPortfolioAmount(poolName, options, ignoreCache);
237
+ export async function getSingleAssetPortfolioAmountInUSD(poolName, address, ignoreCache) {
238
+ const amounts = await getSingleAssetPortfolioAmount(poolName, address, ignoreCache);
227
239
  if (amounts !== undefined) {
228
- const amount = new Decimal(amounts).div(new Decimal(Math.pow(10, coins[poolCoinMap[poolName]].expo)));
229
- const [priceOfCoin] = await getLatestPrices([
230
- `${poolCoinMap[poolName]}/USD`,
231
- ], false);
240
+ let coinName = singleAssetPoolCoinMap[poolName].coin;
241
+ if (poolName == "NAVI-LOOP-SUI-VSUI") {
242
+ coinName = "SUI";
243
+ }
244
+ const amount = new Decimal(amounts).div(new Decimal(Math.pow(10, coinsList[coinName].expo)));
245
+ const [priceOfCoin] = await getLatestPrices([`${coinName}/USD`], ignoreCache);
232
246
  if (priceOfCoin) {
233
247
  const amountInUSD = amount.mul(priceOfCoin);
234
248
  return amountInUSD.toString();
235
249
  }
236
250
  }
237
251
  else {
238
- console.error(`getPortfolioAmountInUSD is not implemented for poolName: ${poolName}`);
252
+ console.error(`getSingleAssetPortfolioAmountInUSD is not implemented for poolName: ${poolName}`);
239
253
  }
240
254
  return "0";
241
255
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getPortfolioAmounts.js","sourceRoot":"","sources":["../../../../src/sui-sdk/functions/getPortfolioAmounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SuiClient } from \"@mysten/sui/client\";\nimport { Decimal } from \"decimal.js\";\nimport {\n CoinName,\n PoolName,\n DoubleAssetPoolNames,\n NaviInvestor,\n CommonInvestorFields,\n SingleAssetPoolNames,\n} from \"../../index.js\";\nimport {\n getCoinAmountsFromLiquidity,\n getPool,\n getPoolExchangeRate,\n getReceipts,\n getNaviInvestor,\n fetchVoloExchangeRate,\n} from \"./getReceipts.js\";\nimport { SimpleCache } from \"../../utils/simpleCache.js\";\nimport { coins } from \"../../common/coins.js\";\nimport { poolCoinMap, poolCoinPairMap } from \"../../common/maps.js\";\nimport { PythPriceIdPair } from \"../../common/pyth.js\";\nimport { getAlphaPrice } from \"../../utils/clmm/prices.js\";\nimport { getLatestPrices } from \"../../utils/prices.js\";\n\nexport async function getAlphaPortfolioAmount(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n) {\n const receipts = await getReceipts(poolName, options.address);\n const pool = await getPool(poolName);\n if (!pool) {\n throw new Error(\"Pool not found\");\n }\n\n const exchangeRate = await getPoolExchangeRate(poolName);\n let totalXTokens = new Decimal(0);\n if (!exchangeRate) {\n return \"0\"; // if pool has 0 xtokens\n }\n if (options.isLocked === true) {\n receipts.forEach(async (receipt) => {\n const xTokens = new Decimal(receipt.content.fields.xTokenBalance);\n const bal = new Decimal(\n Number(receipt.content.fields.unlocked_xtokens) *\n exchangeRate.toNumber(),\n );\n totalXTokens = totalXTokens.add(xTokens.sub(bal));\n });\n } else if (options.isLocked === false) {\n receipts.forEach((receipt) => {\n const bal = new Decimal(\n Number(receipt.content.fields.unlocked_xtokens) *\n exchangeRate.toNumber(),\n );\n totalXTokens = totalXTokens.add(bal);\n });\n } else {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n if (totalXTokens.gt(0)) {\n const poolExchangeRate = await getPoolExchangeRate(poolName);\n if (poolExchangeRate) {\n const tokens = totalXTokens.div(1e9).mul(poolExchangeRate);\n return `${tokens}`;\n } else {\n console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);\n }\n } else {\n return \"0\";\n }\n}\n\nexport async function getAlphaPortfolioAmountInUSD(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n) {\n const tokens = await getAlphaPortfolioAmount(poolName, options);\n const priceOfAlpha = await getAlphaPrice();\n if (priceOfAlpha && tokens) {\n let amount = new Decimal(tokens);\n amount = amount.mul(priceOfAlpha);\n return amount.toString();\n }\n}\n\nconst portfolioAmountCache = new SimpleCache<[number, number]>();\nconst portfolioAmountPromiseCache = new SimpleCache<\n Promise<[number, number]>\n>();\nexport async function getPortfolioAmount(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean = false,\n): Promise<[number, number] | undefined> {\n let portfolioAmount: [number, number] = [0, 0];\n const portfolioAmountCacheKey = `getPortfolioAmount:${poolName}-${options.address}}`;\n if (ignoreCache) {\n portfolioAmountCache.delete(portfolioAmountCacheKey);\n portfolioAmountPromiseCache.delete(portfolioAmountCacheKey);\n }\n const cachedResponse = portfolioAmountCache.get(portfolioAmountCacheKey);\n\n if (cachedResponse) {\n return cachedResponse;\n }\n\n let cachedPromise = portfolioAmountPromiseCache.get(portfolioAmountCacheKey);\n\n if (!cachedPromise) {\n cachedPromise = (async () => {\n const receipts = await getReceipts(poolName, options.address);\n let totalXTokens = new Decimal(0);\n if (receipts) {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n\n if (totalXTokens.gt(0)) {\n const poolExchangeRate = await getPoolExchangeRate(poolName);\n if (poolExchangeRate) {\n const tokens = totalXTokens.mul(poolExchangeRate);\n const poolTokenAmounts = await getCoinAmountsFromLiquidity(\n poolName,\n tokens.toNumber(),\n );\n portfolioAmount = poolTokenAmounts;\n } else {\n console.error(\n `Could not get poolExchangeRate for poolName: ${poolName}`,\n );\n }\n } else {\n portfolioAmount = [0, 0];\n }\n\n portfolioAmountCache.set(portfolioAmountCacheKey, portfolioAmount);\n portfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache\n return portfolioAmount;\n })().catch((error) => {\n portfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache\n throw error;\n });\n\n portfolioAmountPromiseCache.set(portfolioAmountCacheKey, cachedPromise);\n }\n\n return cachedPromise;\n}\n\nexport async function getDoubleAssetPortfolioAmountInUSD(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean = false,\n): Promise<string | undefined> {\n if ((poolName as DoubleAssetPoolNames) !== undefined) {\n const amounts = await getPortfolioAmount(poolName, options, ignoreCache);\n if (amounts !== undefined) {\n const ten = new Decimal(10);\n const pool1 = poolCoinPairMap[poolName as DoubleAssetPoolNames]\n .coinA as CoinName;\n const pool2 = poolCoinPairMap[poolName as DoubleAssetPoolNames]\n .coinB as CoinName;\n const amount0 = new Decimal(amounts[0]).div(\n ten.pow(coins[pool1 as CoinName].expo),\n );\n const amount1 = new Decimal(amounts[1]).div(\n ten.pow(coins[pool2 as CoinName].expo),\n );\n const tokens = poolName.split(\"-\");\n const [priceOfCoin0, priceOfCoin1] = await getLatestPrices(\n [\n `${tokens[0]}/USD` as PythPriceIdPair,\n `${tokens[1]}/USD` as PythPriceIdPair,\n ],\n false,\n );\n if (priceOfCoin0 && priceOfCoin1) {\n const amount = amount0.mul(priceOfCoin0).add(amount1.mul(priceOfCoin1));\n return amount.toString();\n }\n } else {\n console.error(\n `getPortfolioAmountInUSD is not implemented for poolName: ${poolName}`,\n );\n }\n return \"0\";\n }\n}\n\nconst singleAssetPortfolioAmountCache = new SimpleCache<number>();\nconst singleAssetPortfolioAmountPromiseCache = new SimpleCache<\n Promise<number>\n>();\nexport async function getSingleAssetPortfolioAmount(\n poolName: SingleAssetPoolNames,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean = false,\n) {\n let portfolioAmount: number = 0;\n const portfolioAmountCacheKey = `getPortfolioAmount:${poolName}-${options.address}}`;\n if (ignoreCache) {\n singleAssetPortfolioAmountCache.delete(portfolioAmountCacheKey);\n singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey);\n }\n const cachedResponse = singleAssetPortfolioAmountCache.get(\n portfolioAmountCacheKey,\n );\n\n if (cachedResponse) {\n return cachedResponse;\n }\n\n let cachedPromise = singleAssetPortfolioAmountPromiseCache.get(\n portfolioAmountCacheKey,\n );\n\n if (!cachedPromise) {\n cachedPromise = (async () => {\n const receipts = await getReceipts(\n poolName,\n options.address,\n ignoreCache,\n );\n let totalXTokens = new Decimal(0);\n if (receipts) {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n if (totalXTokens.gt(0)) {\n if (\n poolName == \"NAVI-LOOP-SUI-VSUI\" ||\n poolName == \"NAVI-LOOP-USDC-USDT\"\n ) {\n const pool = await getPool(poolName, ignoreCache);\n const investor = (await getNaviInvestor(\n poolName,\n ignoreCache,\n )) as NaviInvestor & CommonInvestorFields;\n if (pool && investor) {\n const liquidity = new Decimal(\n investor.content.fields.tokensDeposited,\n );\n const debtToSupplyRatio = new Decimal(\n investor.content.fields.current_debt_to_supply_ratio,\n );\n const tokensInvested = liquidity.mul(\n new Decimal(1).minus(new Decimal(debtToSupplyRatio).div(1e20)),\n );\n const xTokenSupplyInPool = new Decimal(\n pool.content.fields.xTokenSupply,\n );\n const userTokens = totalXTokens\n .mul(tokensInvested)\n .div(xTokenSupplyInPool);\n const tokens = userTokens.div(\n Math.pow(10, 9 - coins[poolCoinMap[poolName]].expo),\n );\n if (poolName == \"NAVI-LOOP-SUI-VSUI\") {\n // const { SevenKGateway } = await import(\"../\");\n // const sevenKInstance = new SevenKGateway();\n // const numberOfTokensInSui = (await sevenKInstance.getQuote({\n // slippage: 1,\n // senderAddress: options.address,\n // pair: { coinA: coins[\"VSUI\"], coinB: coins[\"SUI\"] },\n // inAmount: new BN(tokens.toNumber()),\n // })) as QuoteResponse;\n const voloExchRate = await fetchVoloExchangeRate();\n portfolioAmount = Number(\n tokens.mul(parseFloat(voloExchRate.data.exchangeRate)),\n );\n }\n // TODO: Whenever NAVI-LOOP-USDT-WUSDC is released, change this else implementation\n else {\n portfolioAmount = Number(tokens);\n }\n } else {\n console.error(`Could not get object for poolName: ${poolName}`);\n }\n } else {\n const poolExchangeRate = await getPoolExchangeRate(\n poolName,\n ignoreCache,\n );\n if (poolExchangeRate) {\n let tokens = totalXTokens.mul(poolExchangeRate);\n tokens = tokens.div(\n Math.pow(\n 10,\n 9 -\n coins[poolCoinMap[poolName as keyof typeof poolCoinMap]].expo,\n ),\n );\n portfolioAmount = tokens.toNumber();\n } else {\n console.error(\n `Could not get poolExchangeRate for poolName: ${poolName}`,\n );\n }\n }\n } else {\n portfolioAmount = 0;\n }\n\n singleAssetPortfolioAmountCache.set(\n portfolioAmountCacheKey,\n portfolioAmount,\n );\n singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache\n return portfolioAmount;\n })().catch((error) => {\n singleAssetPortfolioAmountPromiseCache.delete(portfolioAmountCacheKey); // Remove the promise from cache\n throw error;\n });\n\n singleAssetPortfolioAmountPromiseCache.set(\n portfolioAmountCacheKey,\n cachedPromise,\n );\n }\n\n return cachedPromise;\n}\n\nexport async function getSingleAssetPortfolioAmountInUSD(\n poolName: SingleAssetPoolNames,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean = false,\n): Promise<string | undefined> {\n const amounts = await getSingleAssetPortfolioAmount(\n poolName,\n options,\n ignoreCache,\n );\n if (amounts !== undefined) {\n const amount = new Decimal(amounts).div(\n new Decimal(\n Math.pow(\n 10,\n coins[poolCoinMap[poolName as keyof typeof poolCoinMap]].expo,\n ),\n ),\n );\n const [priceOfCoin] = await getLatestPrices(\n [\n `${poolCoinMap[poolName as keyof typeof poolCoinMap]}/USD` as PythPriceIdPair,\n ],\n false,\n );\n if (priceOfCoin) {\n const amountInUSD = amount.mul(priceOfCoin);\n return amountInUSD.toString();\n }\n } else {\n console.error(\n `getPortfolioAmountInUSD is not implemented for poolName: ${poolName}`,\n );\n }\n return \"0\";\n}\n"]}
1
+ {"version":3,"file":"getPortfolioAmounts.js","sourceRoot":"","sources":["../../../../src/sui-sdk/functions/getPortfolioAmounts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SuiClient } from \"@mysten/sui/client\";\nimport { Decimal } from \"decimal.js\";\nimport {\n PoolName,\n DoubleAssetPoolNames,\n NaviInvestor,\n CommonInvestorFields,\n poolInfo,\n loopingPoolCoinMap,\n getSuiClient,\n LoopingDebt,\n cetusPoolMap,\n getParentPool,\n} from \"../../index.js\";\nimport {\n getCoinAmountsFromLiquidity,\n getPool,\n getPoolExchangeRate,\n getReceipts,\n fetchVoloExchangeRate,\n getInvestor,\n} from \"./getReceipts.js\";\nimport { coinsList } from \"../../common/coins.js\";\nimport {\n singleAssetPoolCoinMap,\n doubleAssetPoolCoinMap,\n} from \"../../common/maps.js\";\nimport { PythPriceIdPair } from \"../../common/pyth.js\";\nimport { getAlphaPrice } from \"../../utils/clmm/prices.js\";\nimport { getLatestPrices } from \"../../utils/prices.js\";\nimport { TickMath } from \"@cetusprotocol/cetus-sui-clmm-sdk\";\nimport BN from \"bn.js\";\n\nexport async function getAlphaPortfolioAmount(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean,\n) {\n const receipts = await getReceipts(poolName, options.address, ignoreCache);\n const pool = await getPool(poolName, ignoreCache);\n if (!pool) {\n throw new Error(\"Pool not found\");\n }\n\n const exchangeRate = await getPoolExchangeRate(poolName, ignoreCache);\n let totalXTokens = new Decimal(0);\n if (!exchangeRate) {\n return \"0\"; // if pool has 0 xtokens\n }\n if (options.isLocked === true) {\n receipts.forEach(async (receipt) => {\n const xTokens = new Decimal(receipt.content.fields.xTokenBalance);\n const bal = new Decimal(\n Number(receipt.content.fields.unlocked_xtokens) *\n exchangeRate.toNumber(),\n );\n totalXTokens = totalXTokens.add(xTokens.sub(bal));\n });\n } else if (options.isLocked === false) {\n receipts.forEach((receipt) => {\n const bal = new Decimal(\n Number(receipt.content.fields.unlocked_xtokens) *\n exchangeRate.toNumber(),\n );\n totalXTokens = totalXTokens.add(bal);\n });\n } else {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n if (totalXTokens.gt(0)) {\n const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);\n if (poolExchangeRate) {\n const tokens = totalXTokens.div(1e9).mul(poolExchangeRate);\n return `${tokens}`;\n } else {\n console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);\n }\n } else {\n return \"0\";\n }\n}\n\nexport async function getAlphaPortfolioAmountInUSD(\n poolName: PoolName,\n options: { suiClient: SuiClient; address: string; isLocked?: boolean },\n ignoreCache: boolean,\n) {\n const tokens = await getAlphaPortfolioAmount(poolName, options, ignoreCache);\n const priceOfAlpha = await getAlphaPrice();\n if (priceOfAlpha && tokens) {\n let amount = new Decimal(tokens);\n amount = amount.mul(priceOfAlpha);\n return amount.toString();\n }\n}\n\nexport async function getPortfolioAmount(\n poolName: PoolName,\n address: string,\n ignoreCache: boolean,\n): Promise<[string, string] | undefined> {\n let portfolioAmount: [string, string] = [\"0\", \"0\"];\n const receipts = await getReceipts(poolName, address, ignoreCache);\n let totalXTokens = new Decimal(0);\n if (receipts) {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n\n if (totalXTokens.gt(0)) {\n const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);\n if (poolExchangeRate) {\n const tokens = totalXTokens.mul(poolExchangeRate);\n const poolTokenAmounts = await getCoinAmountsFromLiquidity(\n poolName,\n tokens.toString(),\n ignoreCache,\n );\n portfolioAmount = poolTokenAmounts;\n } else {\n console.error(`Could not get poolExchangeRate for poolName: ${poolName}`);\n }\n }\n return portfolioAmount;\n}\n\nexport async function getDoubleAssetPortfolioAmountInUSD(\n poolName: PoolName,\n address: string,\n ignoreCache: boolean,\n): Promise<string | undefined> {\n if ((poolName as DoubleAssetPoolNames) !== undefined) {\n const amounts = await getPortfolioAmount(poolName, address, ignoreCache);\n if (amounts !== undefined) {\n const ten = new Decimal(10);\n const pool1 = doubleAssetPoolCoinMap[poolName].coin1;\n const pool2 = doubleAssetPoolCoinMap[poolName].coin2;\n\n const amount0 = new Decimal(amounts[0]).div(\n ten.pow(coinsList[pool1].expo),\n );\n const amount1 = new Decimal(amounts[1]).div(\n ten.pow(coinsList[pool2].expo),\n );\n const tokens = poolName.split(\"-\");\n const [priceOfCoin0, priceOfCoin1] = await getLatestPrices(\n [\n `${tokens[0]}/USD` as PythPriceIdPair,\n `${tokens[1]}/USD` as PythPriceIdPair,\n ],\n ignoreCache,\n );\n if (priceOfCoin0 && priceOfCoin1) {\n const amount = amount0.mul(priceOfCoin0).add(amount1.mul(priceOfCoin1));\n return amount.toString();\n }\n } else {\n console.error(\n `getPortfolioAmountInUSD is not implemented for poolName: ${poolName}`,\n );\n }\n return \"0\";\n }\n}\n\nexport async function getNaviLoopingPoolDebt(\n poolName: PoolName,\n): Promise<string | undefined> {\n const debt = (\n (\n await getSuiClient().getDynamicFieldObject({\n parentId: poolInfo[poolName].investorId,\n name: {\n type: \"vector<u8>\",\n value: \"debt\".split(\"\").map((char) => char.charCodeAt(0)),\n },\n })\n ).data as LoopingDebt\n ).content.fields.value.toString();\n return debt;\n}\n\nexport async function getSingleAssetPortfolioAmount(\n poolName: PoolName,\n address: string,\n ignoreCache: boolean,\n) {\n let portfolioAmount: number = 0;\n const receipts = await getReceipts(poolName, address, ignoreCache);\n let totalXTokens = new Decimal(0);\n if (receipts) {\n receipts.forEach((receipt) => {\n const xTokens = receipt.content.fields.xTokenBalance;\n totalXTokens = totalXTokens.add(xTokens);\n });\n }\n if (totalXTokens.gt(0)) {\n let pool;\n let investor;\n if (poolInfo[poolName].parentProtocolName == \"NAVI\") {\n pool = await getPool(poolName, ignoreCache);\n investor = (await getInvestor(poolName, ignoreCache)) as NaviInvestor &\n CommonInvestorFields;\n }\n if (\n poolName == \"NAVI-LOOP-USDC-USDT\" ||\n poolName == \"NAVI-LOOP-USDT-USDC\"\n ) {\n const supplyCoin = loopingPoolCoinMap[poolName].supplyCoin;\n const borrowCoin = loopingPoolCoinMap[poolName].borrowCoin;\n if (pool && investor) {\n let tokensInvested = new Decimal(0);\n const currentDebt = await getNaviLoopingPoolDebt(poolName);\n\n const currentSupply =\n investor.content.fields.tokensDeposited.toString();\n if (\n cetusPoolMap[supplyCoin + \"-\" + borrowCoin] &&\n currentDebt &&\n currentSupply\n ) {\n const cetusPool = await getParentPool(\n supplyCoin + \"-\" + borrowCoin,\n ignoreCache,\n );\n if (cetusPool) {\n const sqrtPrice = cetusPool?.content.fields.current_sqrt_price;\n const price = TickMath.sqrtPriceX64ToPrice(\n new BN(sqrtPrice!),\n coinsList[supplyCoin].expo,\n coinsList[borrowCoin].expo,\n );\n const currentDebtInSupplyCoin = new Decimal(currentDebt).div(price);\n tokensInvested = new Decimal(currentSupply).minus(\n currentDebtInSupplyCoin,\n );\n } else {\n console.error(`couldnt fetch cetus pool`);\n }\n } else if (\n cetusPoolMap[borrowCoin + \"-\" + supplyCoin] &&\n currentDebt !== undefined &&\n currentSupply !== undefined\n ) {\n const cetusPool = await getParentPool(\n borrowCoin + \"-\" + supplyCoin,\n ignoreCache,\n );\n if (cetusPool) {\n const sqrtPrice = cetusPool?.content.fields.current_sqrt_price;\n const price = TickMath.sqrtPriceX64ToPrice(\n new BN(sqrtPrice!),\n coinsList[borrowCoin].expo,\n coinsList[supplyCoin].expo,\n );\n const currentDebtInSupplyCoin = new Decimal(currentDebt).mul(price);\n tokensInvested = new Decimal(currentSupply).minus(\n currentDebtInSupplyCoin,\n );\n } else {\n console.error(`couldnt fetch cetus pool`);\n }\n } else {\n console.error(\n `one or more of these are possibly undefined: currentDebt:${currentDebt}, currentSupply: ${currentSupply}, cetusPoolMap[supplyCoin+'-'+borrowCoin]:${cetusPoolMap[supplyCoin + \"-\" + borrowCoin]}, cetusPoolMap[borrowCoin+'-'+supplyCoin]: ${cetusPoolMap[borrowCoin + \"-\" + supplyCoin]}`,\n );\n }\n\n const xTokenSupplyInPool = new Decimal(\n pool.content.fields.xTokenSupply,\n );\n const userTokens = totalXTokens\n .mul(tokensInvested)\n .div(xTokenSupplyInPool);\n const tokens = userTokens.div(\n Math.pow(\n 10,\n 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo,\n ),\n );\n portfolioAmount = Number(tokens);\n } else {\n console.error(`Could not get object for poolName: ${poolName}`);\n }\n } else if (\n poolName == \"NAVI-LOOP-HASUI-SUI\" ||\n poolName == \"NAVI-LOOP-SUI-VSUI\"\n ) {\n if (pool && investor) {\n const liquidity = new Decimal(investor.content.fields.tokensDeposited);\n const debtToSupplyRatio = new Decimal(\n investor.content.fields.current_debt_to_supply_ratio,\n );\n const tokensInvested = liquidity.mul(\n new Decimal(1).minus(new Decimal(debtToSupplyRatio).div(1e20)),\n );\n const xTokenSupplyInPool = new Decimal(\n pool.content.fields.xTokenSupply,\n );\n const userTokens = totalXTokens\n .mul(tokensInvested)\n .div(xTokenSupplyInPool);\n const tokens = userTokens.div(\n Math.pow(\n 10,\n 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo,\n ),\n );\n if (poolName == \"NAVI-LOOP-SUI-VSUI\") {\n // const { SevenKGateway } = await import(\"../\");\n // const sevenKInstance = new SevenKGateway();\n // const numberOfTokensInSui = (await sevenKInstance.getQuote({\n // slippage: 1,\n // senderAddress: options.address,\n // pair: { coinA: coins[\"VSUI\"], coinB: coins[\"SUI\"] },\n // inAmount: new BN(tokens.toNumber()),\n // })) as QuoteResponse;\n const voloExchRate = await fetchVoloExchangeRate();\n portfolioAmount = Number(\n tokens.mul(parseFloat(voloExchRate.data.exchangeRate)),\n );\n } else {\n portfolioAmount = Number(tokens);\n }\n } else {\n console.error(`Could not get object for poolName: ${poolName}`);\n }\n } else {\n const poolExchangeRate = await getPoolExchangeRate(poolName, ignoreCache);\n if (poolExchangeRate) {\n let tokens = totalXTokens.mul(poolExchangeRate);\n if (poolInfo[poolName].parentProtocolName == \"NAVI\") {\n tokens = tokens.div(\n Math.pow(\n 10,\n 9 - coinsList[singleAssetPoolCoinMap[poolName].coin].expo,\n ),\n );\n }\n portfolioAmount = tokens.toNumber();\n } else {\n console.error(\n `Could not get poolExchangeRate for poolName: ${poolName}`,\n );\n }\n }\n }\n return portfolioAmount;\n}\n\nexport async function getSingleAssetPortfolioAmountInUSD(\n poolName: PoolName,\n address: string,\n ignoreCache: boolean,\n): Promise<string | undefined> {\n const amounts = await getSingleAssetPortfolioAmount(\n poolName,\n address,\n ignoreCache,\n );\n\n if (amounts !== undefined) {\n let coinName = singleAssetPoolCoinMap[poolName].coin;\n if (poolName == \"NAVI-LOOP-SUI-VSUI\") {\n coinName = \"SUI\";\n }\n const amount = new Decimal(amounts).div(\n new Decimal(Math.pow(10, coinsList[coinName].expo)),\n );\n const [priceOfCoin] = await getLatestPrices(\n [`${coinName}/USD` as PythPriceIdPair],\n ignoreCache,\n );\n if (priceOfCoin) {\n const amountInUSD = amount.mul(priceOfCoin);\n return amountInUSD.toString();\n }\n } else {\n console.error(\n `getSingleAssetPortfolioAmountInUSD is not implemented for poolName: ${poolName}`,\n );\n }\n return \"0\";\n}\n"]}
@@ -1,14 +1,18 @@
1
- import { AlphaPoolType, CetusInvestor, NaviInvestor, CommonInvestorFields, CetusPoolType, PoolName, PoolType, Receipt, SingleAssetPoolNames, NaviVoloData } from "../../index.js";
1
+ import { AlphaPoolType, NaviInvestor, CommonInvestorFields, CetusPoolType, PoolName, PoolType, Receipt, NaviVoloData, Investor, SingleAssetPoolNames, ReceiptGQL } from "../../index.js";
2
2
  import { Decimal } from "decimal.js";
3
- export declare function getReceipts(poolName: string, address: string, ignoreCache?: boolean): Promise<Receipt[]>;
4
- export declare function getPoolExchangeRate(poolName: PoolName, ignoreCache?: boolean): Promise<Decimal | undefined>;
5
- export declare function getCoinAmountsFromLiquidity(poolName: PoolName, liquidity: number): Promise<[number, number]>;
6
- export declare function getPool(poolName: string, ignoreCache?: boolean): Promise<PoolType | AlphaPoolType | undefined>;
7
- export declare function getCetusPool(poolName: string, ignoreCache?: boolean): Promise<CetusPoolType | undefined>;
8
- export declare function getCetusInvestor(poolName: PoolName, ignoreCache?: boolean): Promise<CetusInvestor | undefined>;
9
- export declare function getNaviInvestor(poolName: SingleAssetPoolNames, ignoreCache?: boolean): Promise<(NaviInvestor & CommonInvestorFields) | undefined>;
10
- export declare function fetchVoloExchangeRate(ignoreCache?: boolean): Promise<NaviVoloData>;
11
- export declare function multiGetNaviInvestor(poolNames: SingleAssetPoolNames[], ignoreCache?: boolean): Promise<{
3
+ export declare function convertReceiptGQLToReceipt(receipts: ReceiptGQL[]): Receipt[];
4
+ export declare function getMultiReceipts(address: string): Promise<void>;
5
+ export declare function getReceipts(poolName: string, address: string, ignoreCache: boolean): Promise<Receipt[]>;
6
+ export declare function getPoolExchangeRate(poolName: PoolName, ignoreCache: boolean): Promise<Decimal | undefined>;
7
+ export declare function getMultiPool(): Promise<void>;
8
+ export declare function getPool(poolName: string, ignoreCache: boolean): Promise<PoolType | AlphaPoolType | undefined>;
9
+ export declare function getMultiParentPool(): Promise<void>;
10
+ export declare function getParentPool(poolName: string, ignoreCache: boolean): Promise<CetusPoolType | undefined>;
11
+ export declare function getMultiInvestor(): Promise<void>;
12
+ export declare function getInvestor(poolName: PoolName, ignoreCache: boolean): Promise<Investor | undefined>;
13
+ export declare function fetchVoloExchangeRate(): Promise<NaviVoloData>;
14
+ export declare function getCoinAmountsFromLiquidity(poolName: PoolName, liquidity: string, ignoreCache: boolean): Promise<[string, string]>;
15
+ export declare function multiGetNaviInvestor(poolNames: SingleAssetPoolNames[]): Promise<{
12
16
  ALPHA?: (NaviInvestor & CommonInvestorFields) | undefined;
13
17
  "NAVI-SUI"?: (NaviInvestor & CommonInvestorFields) | undefined;
14
18
  "NAVI-VSUI"?: (NaviInvestor & CommonInvestorFields) | undefined;
@@ -25,5 +29,6 @@ export declare function multiGetNaviInvestor(poolNames: SingleAssetPoolNames[],
25
29
  "NAVI-ETH"?: (NaviInvestor & CommonInvestorFields) | undefined;
26
30
  "NAVI-LOOP-HASUI-SUI"?: (NaviInvestor & CommonInvestorFields) | undefined;
27
31
  "NAVI-LOOP-USDT-USDC"?: (NaviInvestor & CommonInvestorFields) | undefined;
32
+ "NAVI-NS"?: (NaviInvestor & CommonInvestorFields) | undefined;
28
33
  }>;
29
34
  //# sourceMappingURL=getReceipts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getReceipts.d.ts","sourceRoot":"","sources":["../../../../src/sui-sdk/functions/getReceipts.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,aAAa,EAEb,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,oBAAoB,EACpB,YAAY,EACb,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAKrC,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CAsEpB;AAID,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAiD9B;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B3B;AAOD,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC,CAkD/C;AAOD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAgDpC;AAOD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA8CpC;AASD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,CAAC,YAAY,GAAG,oBAAoB,CAAC,GAAG,SAAS,CAAC,CA8C5D;AAOD,wBAAsB,qBAAqB,CACzC,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,oBAAoB,EAAE,EACjC,WAAW,GAAE,OAAe;;;;;;;;;;;;;;;;;GAuD7B"}
1
+ {"version":3,"file":"getReceipts.d.ts","sourceRoot":"","sources":["../../../../src/sui-sdk/functions/getReceipts.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAEb,YAAY,EACZ,oBAAoB,EACpB,aAAa,EAEb,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,QAAQ,EAGR,oBAAoB,EAEpB,UAAU,EAGX,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAyE5E;AAKD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,iBA0BrD;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CAgEpB;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAoC9B;AAOD,wBAAsB,YAAY,kBAuBjC;AAED,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC,CAgD/C;AAOD,wBAAsB,kBAAkB,kBAuBvC;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAkDpC;AAKD,wBAAsB,gBAAgB,kBAuBrC;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAqD/B;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,YAAY,CAAC,CAenE;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA4B3B;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,oBAAoB,EAAE;;;;;;;;;;;;;;;;;;GA8B3E"}