@kasufinance/kasu-sdk 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.json +90 -0
  3. package/.github/workflows/ci.yml +0 -0
  4. package/.github/workflows/main.yml +43 -0
  5. package/.prettierignore +3 -0
  6. package/.prettierrc +28 -0
  7. package/abis/IClearingCoordinator.abi.json +410 -0
  8. package/abis/IERC20Metadata.abi.json +224 -0
  9. package/abis/IFeeManager.abi.json +66 -0
  10. package/abis/IKSULocking.abi.json +754 -0
  11. package/abis/IKasuAllowList.abi.json +455 -0
  12. package/abis/IKasuController.abi.json +423 -0
  13. package/abis/IKasuNFTs.abi.json +1523 -0
  14. package/abis/IKsuPrice.abi.json +15 -0
  15. package/abis/ILendingPool.abi.json +1431 -0
  16. package/abis/ILendingPoolFactory.abi.json +97 -0
  17. package/abis/ILendingPoolManager.abi.json +1347 -0
  18. package/abis/ILendingPoolTranche.abi.json +1317 -0
  19. package/abis/IPriceFeed.abi.json +1 -0
  20. package/abis/ISystemVariables.abi.json +431 -0
  21. package/abis/IUserLoyaltyRewards.abi.json +288 -0
  22. package/abis/IUserManager.abi.json +321 -0
  23. package/abis/KSULockBonus.abi.json +91 -0
  24. package/abis/KasuPoolExternalTVL.abi.json +812 -0
  25. package/abis/Swapper.abi.json +146 -0
  26. package/copy-abi.ps1 +15 -0
  27. package/dist/bundle.cjs.js +21646 -0
  28. package/dist/bundle.esm.js +21644 -0
  29. package/dist/contracts/IClearingCoordinatorAbi.d.ts +169 -0
  30. package/dist/contracts/IClearingCoordinatorAbi.js +1 -0
  31. package/dist/contracts/IERC20MetadataAbi.d.ts +162 -0
  32. package/dist/contracts/IERC20MetadataAbi.js +1 -0
  33. package/dist/contracts/IFeeManagerAbi.d.ts +96 -0
  34. package/dist/contracts/IFeeManagerAbi.js +1 -0
  35. package/dist/contracts/IKSULockingAbi.d.ts +466 -0
  36. package/dist/contracts/IKSULockingAbi.js +1 -0
  37. package/dist/contracts/IKasuAllowListAbi.d.ts +304 -0
  38. package/dist/contracts/IKasuAllowListAbi.js +1 -0
  39. package/dist/contracts/IKasuControllerAbi.d.ts +309 -0
  40. package/dist/contracts/IKasuControllerAbi.js +1 -0
  41. package/dist/contracts/IKasuNFTsAbi.d.ts +1121 -0
  42. package/dist/contracts/IKasuNFTsAbi.js +1 -0
  43. package/dist/contracts/IKsuPriceAbi.d.ts +42 -0
  44. package/dist/contracts/IKsuPriceAbi.js +1 -0
  45. package/dist/contracts/ILendingPoolAbi.d.ts +968 -0
  46. package/dist/contracts/ILendingPoolAbi.js +1 -0
  47. package/dist/contracts/ILendingPoolFactoryAbi.d.ts +103 -0
  48. package/dist/contracts/ILendingPoolFactoryAbi.js +1 -0
  49. package/dist/contracts/ILendingPoolManagerAbi.d.ts +779 -0
  50. package/dist/contracts/ILendingPoolManagerAbi.js +1 -0
  51. package/dist/contracts/ILendingPoolTrancheAbi.d.ts +752 -0
  52. package/dist/contracts/ILendingPoolTrancheAbi.js +1 -0
  53. package/dist/contracts/ISystemVariablesAbi.d.ts +378 -0
  54. package/dist/contracts/ISystemVariablesAbi.js +1 -0
  55. package/dist/contracts/IUserLoyaltyRewardsAbi.d.ts +248 -0
  56. package/dist/contracts/IUserLoyaltyRewardsAbi.js +1 -0
  57. package/dist/contracts/IUserManagerAbi.d.ts +270 -0
  58. package/dist/contracts/IUserManagerAbi.js +1 -0
  59. package/dist/contracts/KSULockBonusAbi.d.ts +61 -0
  60. package/dist/contracts/KSULockBonusAbi.js +1 -0
  61. package/dist/contracts/KasuPoolExternalTVLAbi.d.ts +411 -0
  62. package/dist/contracts/KasuPoolExternalTVLAbi.js +1 -0
  63. package/dist/contracts/SwapperAbi.d.ts +120 -0
  64. package/dist/contracts/SwapperAbi.js +1 -0
  65. package/dist/contracts/common.d.ts +21 -0
  66. package/dist/contracts/common.js +1 -0
  67. package/dist/contracts/factories/IClearingCoordinatorAbi__factory.d.ts +320 -0
  68. package/dist/contracts/factories/IClearingCoordinatorAbi__factory.js +423 -0
  69. package/dist/contracts/factories/IERC20MetadataAbi__factory.d.ts +178 -0
  70. package/dist/contracts/factories/IERC20MetadataAbi__factory.js +237 -0
  71. package/dist/contracts/factories/IFeeManagerAbi__factory.d.ts +59 -0
  72. package/dist/contracts/factories/IFeeManagerAbi__factory.js +79 -0
  73. package/dist/contracts/factories/IKSULockingAbi__factory.d.ts +588 -0
  74. package/dist/contracts/factories/IKSULockingAbi__factory.js +767 -0
  75. package/dist/contracts/factories/IKasuAllowListAbi__factory.d.ts +354 -0
  76. package/dist/contracts/factories/IKasuAllowListAbi__factory.js +468 -0
  77. package/dist/contracts/factories/IKasuControllerAbi__factory.d.ts +339 -0
  78. package/dist/contracts/factories/IKasuControllerAbi__factory.js +436 -0
  79. package/dist/contracts/factories/IKasuNFTsAbi__factory.d.ts +1629 -0
  80. package/dist/contracts/factories/IKasuNFTsAbi__factory.js +2108 -0
  81. package/dist/contracts/factories/IKsuPriceAbi__factory.d.ts +18 -0
  82. package/dist/contracts/factories/IKsuPriceAbi__factory.js +28 -0
  83. package/dist/contracts/factories/ILendingPoolAbi__factory.d.ts +1109 -0
  84. package/dist/contracts/factories/ILendingPoolAbi__factory.js +1444 -0
  85. package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.d.ts +81 -0
  86. package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.js +110 -0
  87. package/dist/contracts/factories/ILendingPoolManagerAbi__factory.d.ts +1045 -0
  88. package/dist/contracts/factories/ILendingPoolManagerAbi__factory.js +1360 -0
  89. package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.d.ts +1015 -0
  90. package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.js +1330 -0
  91. package/dist/contracts/factories/ISystemVariablesAbi__factory.d.ts +338 -0
  92. package/dist/contracts/factories/ISystemVariablesAbi__factory.js +444 -0
  93. package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.d.ts +230 -0
  94. package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.js +301 -0
  95. package/dist/contracts/factories/IUserManagerAbi__factory.d.ts +250 -0
  96. package/dist/contracts/factories/IUserManagerAbi__factory.js +334 -0
  97. package/dist/contracts/factories/KSULockBonusAbi__factory.d.ts +76 -0
  98. package/dist/contracts/factories/KSULockBonusAbi__factory.js +104 -0
  99. package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.d.ts +631 -0
  100. package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.js +825 -0
  101. package/dist/contracts/factories/SwapperAbi__factory.d.ts +120 -0
  102. package/dist/contracts/factories/SwapperAbi__factory.js +159 -0
  103. package/dist/contracts/factories/index.d.ts +18 -0
  104. package/dist/contracts/factories/index.js +21 -0
  105. package/dist/contracts/index.d.ts +37 -0
  106. package/dist/contracts/index.js +19 -0
  107. package/dist/index.d.ts +17 -0
  108. package/dist/index.js +16 -0
  109. package/dist/sdk-config.d.ts +22 -0
  110. package/dist/sdk-config.js +9 -0
  111. package/dist/services/DataService/data-service.d.ts +37 -0
  112. package/dist/services/DataService/data-service.js +586 -0
  113. package/dist/services/DataService/directus-types.d.ts +187 -0
  114. package/dist/services/DataService/directus-types.js +1 -0
  115. package/dist/services/DataService/queries.d.ts +7 -0
  116. package/dist/services/DataService/queries.js +158 -0
  117. package/dist/services/DataService/subgraph-types.d.ts +95 -0
  118. package/dist/services/DataService/subgraph-types.js +1 -0
  119. package/dist/services/DataService/types.d.ts +169 -0
  120. package/dist/services/DataService/types.js +1 -0
  121. package/dist/services/Locking/locking.d.ts +61 -0
  122. package/dist/services/Locking/locking.js +344 -0
  123. package/dist/services/Locking/queries.d.ts +10 -0
  124. package/dist/services/Locking/queries.js +108 -0
  125. package/dist/services/Locking/types.d.ts +117 -0
  126. package/dist/services/Locking/types.js +1 -0
  127. package/dist/services/Portfolio/portfolio.d.ts +22 -0
  128. package/dist/services/Portfolio/portfolio.js +325 -0
  129. package/dist/services/Portfolio/queries.d.ts +2 -0
  130. package/dist/services/Portfolio/queries.js +164 -0
  131. package/dist/services/Portfolio/types.d.ts +206 -0
  132. package/dist/services/Portfolio/types.js +1 -0
  133. package/dist/services/Swapper/swapper.d.ts +11 -0
  134. package/dist/services/Swapper/swapper.js +97 -0
  135. package/dist/services/Swapper/types.d.ts +51 -0
  136. package/dist/services/Swapper/types.js +1 -0
  137. package/dist/services/UserLending/helper.d.ts +2 -0
  138. package/dist/services/UserLending/helper.js +16 -0
  139. package/dist/services/UserLending/queries.d.ts +8 -0
  140. package/dist/services/UserLending/queries.js +188 -0
  141. package/dist/services/UserLending/subgraph-types.d.ts +147 -0
  142. package/dist/services/UserLending/subgraph-types.js +6 -0
  143. package/dist/services/UserLending/types.d.ts +102 -0
  144. package/dist/services/UserLending/types.js +13 -0
  145. package/dist/services/UserLending/user-lending.d.ts +55 -0
  146. package/dist/services/UserLending/user-lending.js +490 -0
  147. package/dist/services/shared.d.ts +1 -0
  148. package/dist/services/shared.js +11 -0
  149. package/dist/tests/sample.test.d.ts +1 -0
  150. package/dist/tests/sample.test.js +32 -0
  151. package/index.ts +2 -0
  152. package/jest-config.ts +9 -0
  153. package/jest.config.js +8 -0
  154. package/package.json +49 -0
  155. package/rollup.config.js +45 -0
  156. package/src/contracts/IClearingCoordinatorAbi.ts +406 -0
  157. package/src/contracts/IERC20MetadataAbi.ts +364 -0
  158. package/src/contracts/IFeeManagerAbi.ts +182 -0
  159. package/src/contracts/IKSULockingAbi.ts +965 -0
  160. package/src/contracts/IKasuAllowListAbi.ts +605 -0
  161. package/src/contracts/IKasuControllerAbi.ts +703 -0
  162. package/src/contracts/IKasuNFTsAbi.ts +2744 -0
  163. package/src/contracts/IKsuPriceAbi.ts +87 -0
  164. package/src/contracts/ILendingPoolAbi.ts +2081 -0
  165. package/src/contracts/ILendingPoolFactoryAbi.ts +161 -0
  166. package/src/contracts/ILendingPoolManagerAbi.ts +1917 -0
  167. package/src/contracts/ILendingPoolTrancheAbi.ts +1911 -0
  168. package/src/contracts/ISystemVariablesAbi.ts +908 -0
  169. package/src/contracts/IUserLoyaltyRewardsAbi.ts +544 -0
  170. package/src/contracts/IUserManagerAbi.ts +612 -0
  171. package/src/contracts/KSULockBonusAbi.ts +124 -0
  172. package/src/contracts/KasuPoolExternalTVLAbi.ts +1071 -0
  173. package/src/contracts/SwapperAbi.ts +266 -0
  174. package/src/contracts/common.ts +44 -0
  175. package/src/contracts/factories/IClearingCoordinatorAbi__factory.ts +438 -0
  176. package/src/contracts/factories/IERC20MetadataAbi__factory.ts +248 -0
  177. package/src/contracts/factories/IFeeManagerAbi__factory.ts +90 -0
  178. package/src/contracts/factories/IKSULockingAbi__factory.ts +778 -0
  179. package/src/contracts/factories/IKasuAllowListAbi__factory.ts +479 -0
  180. package/src/contracts/factories/IKasuControllerAbi__factory.ts +447 -0
  181. package/src/contracts/factories/IKasuNFTsAbi__factory.ts +2116 -0
  182. package/src/contracts/factories/IKsuPriceAbi__factory.ts +36 -0
  183. package/src/contracts/factories/ILendingPoolAbi__factory.ts +1455 -0
  184. package/src/contracts/factories/ILendingPoolFactoryAbi__factory.ts +125 -0
  185. package/src/contracts/factories/ILendingPoolManagerAbi__factory.ts +1375 -0
  186. package/src/contracts/factories/ILendingPoolTrancheAbi__factory.ts +1345 -0
  187. package/src/contracts/factories/ISystemVariablesAbi__factory.ts +455 -0
  188. package/src/contracts/factories/IUserLoyaltyRewardsAbi__factory.ts +316 -0
  189. package/src/contracts/factories/IUserManagerAbi__factory.ts +345 -0
  190. package/src/contracts/factories/KSULockBonusAbi__factory.ts +115 -0
  191. package/src/contracts/factories/KasuPoolExternalTVLAbi__factory.ts +840 -0
  192. package/src/contracts/factories/SwapperAbi__factory.ts +167 -0
  193. package/src/contracts/factories/index.ts +21 -0
  194. package/src/contracts/index.ts +40 -0
  195. package/src/index.ts +27 -0
  196. package/src/sdk-config.ts +35 -0
  197. package/src/services/DataService/data-service.ts +1017 -0
  198. package/src/services/DataService/directus-types.ts +199 -0
  199. package/src/services/DataService/queries.ts +165 -0
  200. package/src/services/DataService/subgraph-types.ts +104 -0
  201. package/src/services/DataService/types.ts +184 -0
  202. package/src/services/Locking/locking.ts +541 -0
  203. package/src/services/Locking/queries.ts +118 -0
  204. package/src/services/Locking/types.ts +141 -0
  205. package/src/services/Portfolio/portfolio.ts +593 -0
  206. package/src/services/Portfolio/queries.ts +166 -0
  207. package/src/services/Portfolio/types.ts +220 -0
  208. package/src/services/Swapper/swapper.ts +158 -0
  209. package/src/services/Swapper/types.ts +54 -0
  210. package/src/services/UserLending/helper.ts +28 -0
  211. package/src/services/UserLending/queries.ts +196 -0
  212. package/src/services/UserLending/subgraph-types.ts +173 -0
  213. package/src/services/UserLending/types.ts +123 -0
  214. package/src/services/UserLending/user-lending.ts +933 -0
  215. package/src/services/shared.ts +11 -0
  216. package/src/tests/sample.test.ts +44 -0
  217. package/tsconfig.json +27 -0
  218. package/tsconfig.tsbuildinfo +1 -0
  219. package/versioner.sh +6 -0
@@ -0,0 +1,325 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { BigNumber } from 'ethers';
11
+ import { formatEther, parseEther, parseUnits } from 'ethers/lib/utils';
12
+ import { GraphQLClient } from 'graphql-request';
13
+ import { IKasuNFTsAbi__factory, ISystemVariablesAbi__factory, } from '../../contracts';
14
+ import { DataService } from '../DataService/data-service';
15
+ import { KSULocking } from '../Locking/locking';
16
+ import { UserLending } from '../UserLending/user-lending';
17
+ import { lendingPortfolioQuery } from './queries';
18
+ export class Portfolio {
19
+ constructor(_kasuConfig, signerOrProvider) {
20
+ this._kasuConfig = _kasuConfig;
21
+ this._signerOrProvider = signerOrProvider;
22
+ this._lockingService = new KSULocking(_kasuConfig, signerOrProvider);
23
+ this._dataService = new DataService(_kasuConfig, signerOrProvider);
24
+ this._systemVariablesAbi = ISystemVariablesAbi__factory.connect(_kasuConfig.contracts.SystemVariables, signerOrProvider);
25
+ this._userLendingService = new UserLending(_kasuConfig, signerOrProvider);
26
+ this._kasuNftContract = IKasuNFTsAbi__factory.connect(_kasuConfig.contracts.KasuNFTs, signerOrProvider);
27
+ this._graph = new GraphQLClient(_kasuConfig.subgraphUrl);
28
+ }
29
+ getPortfolioRewards(userAddress) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ const userLockingData = yield this._lockingService.getUserBonusData(userAddress);
32
+ const lockingRewards = yield this._lockingService.getLockingRewards(userAddress);
33
+ const ksuLaunchBonus = yield this._lockingService.getUserTotalBonusAmount(userAddress);
34
+ return {
35
+ bonusYieldEarnings: {
36
+ claimableBalance: {
37
+ ksuAmount: userLockingData.ksuBonusAndRewards,
38
+ },
39
+ lifeTime: {
40
+ ksuAmount: userLockingData.ksuBonusAndRewardsLifetime,
41
+ },
42
+ },
43
+ protocolFees: {
44
+ claimableBalance: {
45
+ usdcAmount: lockingRewards.claimableRewards,
46
+ },
47
+ lifeTime: { usdcAmount: lockingRewards.lifeTimeRewards },
48
+ },
49
+ ksuLaunchBonus: { lifeTime: { ksuAmount: ksuLaunchBonus } },
50
+ };
51
+ });
52
+ }
53
+ getUserNfts(userAddress) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const usernfts = yield this._kasuNftContract.tokensOfOwner(userAddress);
56
+ return usernfts.map((nft) => nft.toNumber());
57
+ });
58
+ }
59
+ getPortfolioSummary(userAddress, portfolioLendingPools) {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ const userLockingData = yield this._lockingService.getUserBonusData(userAddress);
62
+ let totalInvestments = 0;
63
+ let weightedApy = 0;
64
+ let totalYieldEarned = 0;
65
+ let weeklyYieldEarnings = 0;
66
+ for (const pool of portfolioLendingPools) {
67
+ for (const tranche of pool.tranches) {
68
+ const investedAmount = parseFloat(tranche.investedAmount);
69
+ totalInvestments += investedAmount;
70
+ totalYieldEarned += parseFloat(tranche.yieldEarnings.lifetime);
71
+ weightedApy += parseFloat(tranche.apy) * investedAmount;
72
+ weeklyYieldEarnings +=
73
+ investedAmount * parseFloat(tranche.interestRate);
74
+ for (const fixedDeposits of tranche.fixedLoans) {
75
+ const ftdConfig = tranche.fixedTermConfig.find((ftd) => ftd.configId === fixedDeposits.configId);
76
+ if (!ftdConfig)
77
+ continue;
78
+ const ftdInvestedAmount = parseFloat(fixedDeposits.amount);
79
+ totalInvestments += ftdInvestedAmount;
80
+ totalYieldEarned += parseFloat(fixedDeposits.yieldEarnings.lifetime);
81
+ weeklyYieldEarnings +=
82
+ ftdInvestedAmount *
83
+ parseFloat(ftdConfig.epochInterestRate);
84
+ weightedApy +=
85
+ parseFloat(ftdConfig.apy) * ftdInvestedAmount;
86
+ }
87
+ }
88
+ }
89
+ return {
90
+ current: {
91
+ totalKsuLocked: userLockingData.totalLockedAmount,
92
+ totalLendingPoolInvestments: totalInvestments.toString(),
93
+ weightedAverageApy: totalInvestments === 0
94
+ ? '0'
95
+ : (weightedApy / totalInvestments).toString(),
96
+ },
97
+ daily: {
98
+ yieldEarnings: (weeklyYieldEarnings / 7).toString(),
99
+ },
100
+ weekly: {
101
+ yieldEarnings: weeklyYieldEarnings.toString(),
102
+ protocolFeesEarned: '0',
103
+ ksuBonusRewards: '0',
104
+ },
105
+ lifetime: {
106
+ yieldEarnings: totalYieldEarned.toString(),
107
+ ksuBonusRewards: userLockingData.ksuBonusAndRewards,
108
+ protocolFeesEarned: userLockingData.protocolFeesEarned,
109
+ },
110
+ };
111
+ });
112
+ }
113
+ getPortfolioLendingData(userAddress, poolOverviews, currentEpoch, provider) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
116
+ const SECONDS_PER_EPOCH = 604800; // seconds in a week
117
+ const portfolioLendingPoolsPromise = [];
118
+ const previousEpoch = BigNumber.from(currentEpoch).sub(BigNumber.from(1));
119
+ const [lastEpochData, portfolioUserTrancheBalances, userPoolBalances] = yield Promise.all([
120
+ this._graph.request(lendingPortfolioQuery, {
121
+ userAddress: userAddress.toLowerCase(),
122
+ epochId: parseFloat(currentEpoch),
123
+ lastEpochId: previousEpoch.toNumber(),
124
+ unusedPools: this._kasuConfig.UNUSED_LENDING_POOL_IDS,
125
+ }),
126
+ this._userLendingService.getPortfolioUserTrancheBalances(userAddress),
127
+ this._userLendingService.getUserPoolBalance(userAddress, poolOverviews.map(({ id }) => id), provider),
128
+ ]);
129
+ if (!lastEpochData.user)
130
+ return [];
131
+ const userRequestsMap = new Map();
132
+ for (const userRequest of lastEpochData.userRequests) {
133
+ const trancheId = userRequest.tranche.id;
134
+ const ftdId = userRequest.fixedTermConfigId;
135
+ let remainingAcceptedAmount = parseFloat(userRequest.amountAccepted);
136
+ for (const userRequestEvent of userRequest.userRequestEvents) {
137
+ const mappedUserRequest = userRequestsMap.get(trancheId);
138
+ const assetAmount = parseFloat(userRequestEvent.assetAmount);
139
+ const acceptedAmount = remainingAcceptedAmount > assetAmount
140
+ ? assetAmount
141
+ : remainingAcceptedAmount;
142
+ remainingAcceptedAmount -= acceptedAmount;
143
+ const userRequestFtdItem = {
144
+ id: userRequestEvent.id,
145
+ depositAmount: userRequestEvent.assetAmount,
146
+ acceptedAmount: acceptedAmount.toString(),
147
+ timestamp: parseInt(userRequest.createdOn),
148
+ };
149
+ if (!mappedUserRequest) {
150
+ userRequestsMap.set(trancheId, {
151
+ [ftdId]: [userRequestFtdItem],
152
+ });
153
+ continue;
154
+ }
155
+ userRequestsMap.set(trancheId, Object.assign(Object.assign({}, mappedUserRequest), { [ftdId]: [
156
+ ...((_a = mappedUserRequest[ftdId]) !== null && _a !== void 0 ? _a : []),
157
+ userRequestFtdItem,
158
+ ] }));
159
+ }
160
+ }
161
+ let totalInvestments = BigNumber.from(0);
162
+ let totalYieldEarnedLastEpoch = 0;
163
+ for (const poolOverview of poolOverviews) {
164
+ const userPoolBalance = userPoolBalances.find(({ poolId }) => poolId === poolOverview.id);
165
+ if (!userPoolBalance) {
166
+ console.warn(`Could not find user pool balance for ${poolOverview.id}`);
167
+ continue;
168
+ }
169
+ totalInvestments = userPoolBalance.balance.add(totalInvestments);
170
+ const tranches = [];
171
+ const lendingPoolUserDetails = lastEpochData.user.lendingPoolUserDetails.find(({ lendingPool }) => lendingPool.id === poolOverview.id);
172
+ if (!lendingPoolUserDetails)
173
+ continue;
174
+ const portfolioUserTrancheBalance = portfolioUserTrancheBalances.get(poolOverview.id);
175
+ for (const tranche of poolOverview.tranches) {
176
+ const lastEpochUserTrancheDetails = lendingPoolUserDetails.lendingPoolTrancheUserDetails.find((lendingPool) => lendingPool.tranche.id === tranche.id);
177
+ const userRequest = userRequestsMap.get(tranche.id);
178
+ const depositDetails = (_b = userRequest === null || userRequest === void 0 ? void 0 : userRequest['0']) !== null && _b !== void 0 ? _b : [];
179
+ if (!lastEpochUserTrancheDetails) {
180
+ tranches.push(Object.assign(Object.assign({}, tranche), { investedAmount: {
181
+ balance: '0',
182
+ yieldEarned: 0,
183
+ }, yieldEarnings: {
184
+ lastEpoch: '0',
185
+ lifetime: '0',
186
+ }, depositDetails, fixedLoans: [] }));
187
+ continue;
188
+ }
189
+ const lastEpochTotalYield = parseFloat((_e = (_d = (_c = lastEpochUserTrancheDetails.tranche
190
+ .lendingPoolTrancheEpochInterest) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.epochInterestAmount) !== null && _e !== void 0 ? _e : '0');
191
+ const lastEpochUserShares = parseFloat((_h = (_g = (_f = lastEpochUserTrancheDetails
192
+ .lendingPoolTrancheUserEpochSharesUpdates) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.shares) !== null && _h !== void 0 ? _h : '0');
193
+ const lastEpochTotalShares = parseFloat((_l = (_k = (_j = lastEpochUserTrancheDetails.tranche
194
+ .lendingPoolTrancheShareUpdates) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.shares) !== null && _l !== void 0 ? _l : '0');
195
+ const currentTotalAmount = parseFloat(lastEpochUserTrancheDetails.tranche.balance);
196
+ const currentTotalShares = parseFloat(lastEpochUserTrancheDetails.tranche.shares);
197
+ const lastEpochTotalBaseYield = lastEpochTotalShares === 0
198
+ ? 0
199
+ : (lastEpochTotalYield * lastEpochUserShares) /
200
+ lastEpochTotalShares;
201
+ const userTrancheBalance = {
202
+ balance: '0',
203
+ yieldEarned: 0,
204
+ };
205
+ if (portfolioUserTrancheBalance) {
206
+ const portfolioUserTranche = portfolioUserTrancheBalance.find(({ trancheId }) => trancheId === tranche.id);
207
+ if (portfolioUserTranche) {
208
+ userTrancheBalance.balance =
209
+ portfolioUserTranche.userBalance;
210
+ userTrancheBalance.yieldEarned =
211
+ portfolioUserTranche.yieldEarned;
212
+ }
213
+ }
214
+ let totalLifetimeFtdYield = 0;
215
+ let lastEpochVariableBaseYield = lastEpochTotalBaseYield;
216
+ const fixedLoans = lastEpochUserTrancheDetails.userLendingPoolTrancheFixedTermDepositLocks.map((fixedTermDeposit) => {
217
+ var _a, _b, _c, _d, _e;
218
+ const fixedLoanDepositDetails = (_a = userRequest === null || userRequest === void 0 ? void 0 : userRequest[fixedTermDeposit
219
+ .lendingPoolTrancheFixedTermConfig
220
+ .configId]) !== null && _a !== void 0 ? _a : [];
221
+ let lastEpochYieldEarned = 0;
222
+ let lifetimeYieldEarned = 0;
223
+ if (parseFloat(fixedTermDeposit.epochLockStart) <
224
+ previousEpoch.toNumber() &&
225
+ parseFloat(fixedTermDeposit.epochLockEnd) >=
226
+ previousEpoch.toNumber() &&
227
+ Boolean((_b = lastEpochUserTrancheDetails
228
+ .lendingPoolTrancheUserEpochSharesUpdates) === null || _b === void 0 ? void 0 : _b.length)) {
229
+ const currentEpochFtdShares = parseFloat(fixedTermDeposit.trancheShares);
230
+ const lastEpochFtdShares = parseFloat((_e = (_d = (_c = fixedTermDeposit
231
+ .userLendingPoolTrancheFixedTermDepositLockShareUpdate) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.shares) !== null && _e !== void 0 ? _e : '0');
232
+ const additionalFtdYield = ((currentEpochFtdShares -
233
+ lastEpochFtdShares) *
234
+ currentTotalAmount) /
235
+ currentTotalShares;
236
+ const lastEpochFtdBaseYield = (lastEpochTotalBaseYield *
237
+ lastEpochFtdShares) /
238
+ lastEpochUserShares;
239
+ lastEpochVariableBaseYield -=
240
+ lastEpochFtdBaseYield;
241
+ lastEpochYieldEarned =
242
+ lastEpochFtdBaseYield + additionalFtdYield;
243
+ }
244
+ lifetimeYieldEarned =
245
+ this.calculateFixedTermDepositEarnings(fixedTermDeposit, lastEpochUserTrancheDetails.tranche.balance, lastEpochUserTrancheDetails.tranche.shares);
246
+ totalLifetimeFtdYield += lifetimeYieldEarned;
247
+ totalYieldEarnedLastEpoch += lastEpochYieldEarned;
248
+ const lockDuration = parseFloat(fixedTermDeposit
249
+ .lendingPoolTrancheFixedTermConfig
250
+ .epochLockDuration) * SECONDS_PER_EPOCH;
251
+ return {
252
+ lockId: fixedTermDeposit.lockId,
253
+ configId: fixedTermDeposit
254
+ .lendingPoolTrancheFixedTermConfig
255
+ .configId,
256
+ epochLockDuration: fixedTermDeposit
257
+ .lendingPoolTrancheFixedTermConfig
258
+ .epochLockDuration,
259
+ epochLockEnd: fixedTermDeposit.epochLockEnd,
260
+ epochInterestRate: fixedTermDeposit
261
+ .lendingPoolTrancheFixedTermConfig
262
+ .epochInterestRate,
263
+ epochLockStart: fixedTermDeposit.epochLockStart,
264
+ amount: this._userLendingService
265
+ .convertSharesToAssets(fixedTermDeposit.trancheShares, lastEpochUserTrancheDetails.tranche
266
+ .balance, lastEpochUserTrancheDetails.tranche
267
+ .shares)
268
+ .toString(),
269
+ endTime: parseInt(fixedTermDeposit.createdOn) +
270
+ lockDuration,
271
+ isLocked: fixedTermDeposit.isLocked,
272
+ isWithdrawalRequested: fixedTermDeposit.isWithdrawalRequested,
273
+ startTime: parseInt(fixedTermDeposit.createdOn),
274
+ yieldEarnings: {
275
+ lastEpoch: lastEpochYieldEarned.toString(),
276
+ lifetime: this.precisionToString(lifetimeYieldEarned),
277
+ },
278
+ depositDetails: fixedLoanDepositDetails,
279
+ };
280
+ });
281
+ totalYieldEarnedLastEpoch += lastEpochTotalBaseYield;
282
+ tranches.push(Object.assign(Object.assign({}, tranche), { investedAmount: userTrancheBalance, yieldEarnings: {
283
+ lastEpoch: lastEpochVariableBaseYield.toString(),
284
+ lifetime: this.precisionToString(totalLifetimeFtdYield), // passing in total FTD yield to be subtracted by total trache lifetime later down
285
+ }, fixedLoans,
286
+ depositDetails }));
287
+ }
288
+ portfolioLendingPoolsPromise.push(Object.assign(Object.assign({}, poolOverview), { totalYieldEarningsLastEpoch: totalYieldEarnedLastEpoch.toString(), totalInvestedAmount: userPoolBalance.balance.toString(), totalYieldEarningsLifetime: userPoolBalance.yieldEarned.toString(), tranches }));
289
+ }
290
+ const portfolioLendingPools = portfolioLendingPoolsPromise.map((pool) => (Object.assign(Object.assign({}, pool), { tranches: pool.tranches.map((tranche) => {
291
+ const trancheBalance = tranche.investedAmount;
292
+ const lockedAmount = tranche.fixedLoans.reduce((total, cur) => {
293
+ if (!cur.isLocked)
294
+ return total;
295
+ return total.add(parseEther(cur.amount));
296
+ }, BigNumber.from(0));
297
+ const totalTrancheYieldEarned = trancheBalance.yieldEarned.toFixed(6);
298
+ const totalTrancheFtdYieldEarned = parseFloat(tranche.yieldEarnings.lifetime).toFixed(6);
299
+ return Object.assign(Object.assign({}, tranche), { investedAmount: formatEther(parseEther(trancheBalance.balance).sub(lockedAmount)), yieldEarnings: Object.assign(Object.assign({}, tranche.yieldEarnings), { lifetime: this.precisionToString(parseFloat(totalTrancheYieldEarned) -
300
+ parseFloat(totalTrancheFtdYieldEarned)) }) });
301
+ }) })));
302
+ return portfolioLendingPools.filter((pool) => !parseUnits(pool.totalInvestedAmount).isZero() ||
303
+ !parseUnits(pool.totalYieldEarningsLifetime).isZero());
304
+ });
305
+ }
306
+ precisionToString(val) {
307
+ if (val < 0 && val > -0.0001) {
308
+ return '0';
309
+ }
310
+ return val.toString();
311
+ }
312
+ calculateFixedTermDepositEarnings(fixedTermDepositLock, totalTrancheBalance, totalTrancheShares) {
313
+ const { isLocked, unlockAmount, initialAmount, trancheShares } = fixedTermDepositLock;
314
+ let yieldEarned = 0;
315
+ if (!isLocked && unlockAmount) {
316
+ yieldEarned = parseFloat(unlockAmount) - parseFloat(initialAmount);
317
+ }
318
+ else {
319
+ const currentUsdAmount = this._userLendingService.convertSharesToAssets(trancheShares, totalTrancheBalance, totalTrancheShares);
320
+ yieldEarned =
321
+ parseFloat(currentUsdAmount) - parseFloat(initialAmount);
322
+ }
323
+ return yieldEarned;
324
+ }
325
+ }
@@ -0,0 +1,2 @@
1
+ export declare const lastEpochQuery: string;
2
+ export declare const lendingPortfolioQuery: string;
@@ -0,0 +1,164 @@
1
+ import { gql } from 'graphql-request';
2
+ export const lastEpochQuery = gql `
3
+ query LastEpochQuery(
4
+ $userAddress: String!
5
+ $epochId: String!
6
+ $unusedPools: [String]!
7
+ ) {
8
+ user(id: $userAddress) {
9
+ lendingPoolUserDetails(
10
+ where: { lendingPool_not_in: $unusedPools }
11
+ ) {
12
+ id
13
+ lendingPool {
14
+ id
15
+ name
16
+ balance
17
+ tranches {
18
+ shares
19
+ }
20
+ }
21
+ lendingPoolTrancheUserDetails {
22
+ lendingPoolTrancheUserEpochSharesUpdates(
23
+ orderDirection: desc
24
+ orderBy: shareUpdatesIndex
25
+ where: { epochId_lte: $epochId }
26
+ first: 1
27
+ ) {
28
+ shares
29
+ }
30
+ userLendingPoolTrancheFixedTermDepositLocks {
31
+ lockId
32
+ initialTrancheShares
33
+ isWithdrawalRequested
34
+ createdOn
35
+ epochLockStart
36
+ epochLockEnd
37
+ lendingPoolTrancheFixedTermConfig {
38
+ epochLockDuration
39
+ }
40
+ }
41
+ tranche {
42
+ id
43
+ lendingPoolTrancheShareUpdates(
44
+ orderBy: shareUpdatesIndex
45
+ orderDirection: desc
46
+ where: { epochId_lte: $epochId }
47
+ first: 1
48
+ ) {
49
+ shares
50
+ }
51
+ lendingPoolTrancheEpochInterest(
52
+ where: { epochId: $epochId }
53
+ ) {
54
+ epochInterestAmount
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ `;
62
+ export const lendingPortfolioQuery = gql `
63
+ query LastEpochQuery(
64
+ $userAddress: ID!
65
+ $epochId: BigInt!
66
+ $lastEpochId: BigInt!
67
+ $unusedPools: [String!]!
68
+ ) {
69
+ user(id: $userAddress) {
70
+ lendingPoolUserDetails(
71
+ where: { lendingPool_not_in: $unusedPools }
72
+ ) {
73
+ id
74
+ lendingPool {
75
+ id
76
+ name
77
+ balance
78
+ tranches {
79
+ shares
80
+ }
81
+ }
82
+ lendingPoolTrancheUserDetails {
83
+ shares
84
+ lendingPoolTrancheUserEpochSharesUpdates(
85
+ orderDirection: desc
86
+ orderBy: shareUpdatesIndex
87
+ where: { epochId_lt: $epochId }
88
+ first: 1
89
+ ) {
90
+ shares
91
+ }
92
+ userLendingPoolTrancheFixedTermDepositLocks {
93
+ isLocked
94
+ unlockAmount
95
+ initialAmount
96
+ lockId
97
+ initialTrancheShares
98
+ isWithdrawalRequested
99
+ createdOn
100
+ epochLockStart
101
+ epochLockEnd
102
+ trancheShares
103
+ lendingPoolTrancheFixedTermConfig {
104
+ epochLockDuration
105
+ configId
106
+ epochInterestRate
107
+ }
108
+ userLendingPoolTrancheFixedTermDepositLockShareUpdate(
109
+ orderBy: shareUpdatesIndex
110
+ orderDirection: desc
111
+ first: 1
112
+ where: { epochId_lt: $lastEpochId }
113
+ ) {
114
+ shares
115
+ }
116
+ }
117
+ tranche {
118
+ id
119
+ shares
120
+ balance
121
+ lendingPoolTrancheShareUpdates(
122
+ first: 1
123
+ orderBy: shareUpdatesIndex
124
+ orderDirection: desc
125
+ where: { epochId_lt: $epochId }
126
+ ) {
127
+ shares
128
+ }
129
+ lendingPoolTrancheEpochInterest(
130
+ first: 1
131
+ orderBy: epochId
132
+ orderDirection: desc
133
+ where: { epochId_lt: $epochId }
134
+ ) {
135
+ epochInterestAmount
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ userRequests(
142
+ where: {
143
+ user: $userAddress
144
+ userRequestEvents_: {
145
+ type_in: [DepositInitiated, DepositIncreased]
146
+ additionalData_not: null
147
+ }
148
+ }
149
+ ) {
150
+ createdOn
151
+ amountAccepted
152
+ tranche {
153
+ id
154
+ }
155
+ fixedTermConfigId
156
+ userRequestEvents(
157
+ where: { type_in: [DepositInitiated, DepositIncreased] }
158
+ ) {
159
+ id
160
+ assetAmount
161
+ }
162
+ }
163
+ }
164
+ `;