levr-sdk 0.0.2 → 0.1.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 (121) hide show
  1. package/README.md +256 -235
  2. package/dist/esm/abis/LevrFactory_v1.js +63 -0
  3. package/dist/esm/abis/LevrGovernor_v1.js +15 -24
  4. package/dist/esm/abis/LevrStaking_v1.js +7 -1
  5. package/dist/esm/balance.js +19 -1
  6. package/dist/esm/balance.js.map +1 -1
  7. package/dist/esm/client/hook/index.js +14 -3
  8. package/dist/esm/client/hook/index.js.map +1 -1
  9. package/dist/esm/client/hook/use-fee-receivers.js +11 -29
  10. package/dist/esm/client/hook/use-fee-receivers.js.map +1 -1
  11. package/dist/esm/client/hook/use-governance.js +19 -254
  12. package/dist/esm/client/hook/use-governance.js.map +1 -1
  13. package/dist/esm/client/hook/use-pool.js +26 -0
  14. package/dist/esm/client/hook/use-pool.js.map +1 -0
  15. package/dist/esm/client/hook/use-prepare.js +6 -3
  16. package/dist/esm/client/hook/use-prepare.js.map +1 -1
  17. package/dist/esm/client/hook/use-project.js +24 -9
  18. package/dist/esm/client/hook/use-project.js.map +1 -1
  19. package/dist/esm/client/hook/use-proposal.js +48 -0
  20. package/dist/esm/client/hook/use-proposal.js.map +1 -0
  21. package/dist/esm/client/hook/use-stake.js +29 -195
  22. package/dist/esm/client/hook/use-stake.js.map +1 -1
  23. package/dist/esm/client/hook/use-swap.js +9 -13
  24. package/dist/esm/client/hook/use-swap.js.map +1 -1
  25. package/dist/esm/client/hook/use-user.js +25 -0
  26. package/dist/esm/client/hook/use-user.js.map +1 -0
  27. package/dist/esm/client/levr-provider.js +65 -107
  28. package/dist/esm/client/levr-provider.js.map +1 -1
  29. package/dist/esm/client/query-keys.js +9 -21
  30. package/dist/esm/client/query-keys.js.map +1 -1
  31. package/dist/esm/constants.js +1 -1
  32. package/dist/esm/fee-receivers.js +25 -13
  33. package/dist/esm/fee-receivers.js.map +1 -1
  34. package/dist/esm/governance.js +35 -414
  35. package/dist/esm/governance.js.map +1 -1
  36. package/dist/esm/index.js +4 -2
  37. package/dist/esm/index.js.map +1 -1
  38. package/dist/esm/pool.js +70 -0
  39. package/dist/esm/pool.js.map +1 -0
  40. package/dist/esm/project.js +389 -135
  41. package/dist/esm/project.js.map +1 -1
  42. package/dist/esm/proposal.js +156 -0
  43. package/dist/esm/proposal.js.map +1 -0
  44. package/dist/esm/quote/index.js +2 -2
  45. package/dist/esm/quote/index.js.map +1 -1
  46. package/dist/esm/stake.js +34 -299
  47. package/dist/esm/stake.js.map +1 -1
  48. package/dist/esm/treasury.js +162 -0
  49. package/dist/esm/treasury.js.map +1 -0
  50. package/dist/esm/user.js +153 -0
  51. package/dist/esm/user.js.map +1 -0
  52. package/dist/types/abis/LevrFactory_v1.d.ts +48 -0
  53. package/dist/types/abis/LevrGovernor_v1.d.ts +12 -18
  54. package/dist/types/abis/LevrStaking_v1.d.ts +5 -1
  55. package/dist/types/balance.d.ts +15 -0
  56. package/dist/types/balance.d.ts.map +1 -1
  57. package/dist/types/client/hook/index.d.ts +11 -3
  58. package/dist/types/client/hook/index.d.ts.map +1 -1
  59. package/dist/types/client/hook/use-fee-receivers.d.ts +6 -16
  60. package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -1
  61. package/dist/types/client/hook/use-governance.d.ts +4 -98
  62. package/dist/types/client/hook/use-governance.d.ts.map +1 -1
  63. package/dist/types/client/hook/use-pool.d.ts +12 -0
  64. package/dist/types/client/hook/use-pool.d.ts.map +1 -0
  65. package/dist/types/client/hook/use-prepare.d.ts +1 -2
  66. package/dist/types/client/hook/use-prepare.d.ts.map +1 -1
  67. package/dist/types/client/hook/use-project.d.ts +5 -0
  68. package/dist/types/client/hook/use-project.d.ts.map +1 -1
  69. package/dist/types/client/hook/use-proposal.d.ts +18 -0
  70. package/dist/types/client/hook/use-proposal.d.ts.map +1 -0
  71. package/dist/types/client/hook/use-stake.d.ts +14 -73
  72. package/dist/types/client/hook/use-stake.d.ts.map +1 -1
  73. package/dist/types/client/hook/use-swap.d.ts +3 -8
  74. package/dist/types/client/hook/use-swap.d.ts.map +1 -1
  75. package/dist/types/client/hook/use-user.d.ts +13 -0
  76. package/dist/types/client/hook/use-user.d.ts.map +1 -0
  77. package/dist/types/client/levr-provider.d.ts +30 -50
  78. package/dist/types/client/levr-provider.d.ts.map +1 -1
  79. package/dist/types/client/query-keys.d.ts +13 -25
  80. package/dist/types/client/query-keys.d.ts.map +1 -1
  81. package/dist/types/fee-receivers.d.ts +28 -0
  82. package/dist/types/fee-receivers.d.ts.map +1 -1
  83. package/dist/types/governance.d.ts +5 -92
  84. package/dist/types/governance.d.ts.map +1 -1
  85. package/dist/types/index.d.ts +4 -2
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/pool.d.ts +590 -0
  88. package/dist/types/pool.d.ts.map +1 -0
  89. package/dist/types/project.d.ts +56 -1
  90. package/dist/types/project.d.ts.map +1 -1
  91. package/dist/types/proposal.d.ts +1161 -0
  92. package/dist/types/proposal.d.ts.map +1 -0
  93. package/dist/types/quote/index.d.ts +2 -2
  94. package/dist/types/quote/index.d.ts.map +1 -1
  95. package/dist/types/stake.d.ts +16 -41
  96. package/dist/types/stake.d.ts.map +1 -1
  97. package/dist/types/treasury.d.ts +16 -0
  98. package/dist/types/treasury.d.ts.map +1 -0
  99. package/dist/types/user.d.ts +188 -0
  100. package/dist/types/user.d.ts.map +1 -0
  101. package/package.json +5 -2
  102. package/dist/esm/client/hook/use-balance.js +0 -57
  103. package/dist/esm/client/hook/use-balance.js.map +0 -1
  104. package/dist/esm/client/hook/use-projects.js +0 -22
  105. package/dist/esm/client/hook/use-projects.js.map +0 -1
  106. package/dist/esm/client/hook/use-proposals.js +0 -29
  107. package/dist/esm/client/hook/use-proposals.js.map +0 -1
  108. package/dist/esm/projects.js +0 -184
  109. package/dist/esm/projects.js.map +0 -1
  110. package/dist/esm/proposals.js +0 -98
  111. package/dist/esm/proposals.js.map +0 -1
  112. package/dist/types/client/hook/use-balance.d.ts +0 -20
  113. package/dist/types/client/hook/use-balance.d.ts.map +0 -1
  114. package/dist/types/client/hook/use-projects.d.ts +0 -6
  115. package/dist/types/client/hook/use-projects.d.ts.map +0 -1
  116. package/dist/types/client/hook/use-proposals.d.ts +0 -16
  117. package/dist/types/client/hook/use-proposals.d.ts.map +0 -1
  118. package/dist/types/projects.d.ts +0 -20
  119. package/dist/types/projects.d.ts.map +0 -1
  120. package/dist/types/proposals.d.ts +0 -20
  121. package/dist/types/proposals.d.ts.map +0 -1
@@ -1,81 +1,145 @@
1
- import { erc20Abi, formatUnits, zeroAddress } from "viem";
2
- import { IClankerLPLocker, IClankerToken, LevrFactory_v1 } from "./abis/index.js";
3
- import { GET_FACTORY_ADDRESS, GET_LP_LOCKER_ADDRESS } from "./constants.js";
1
+ import { erc20Abi, zeroAddress } from "viem";
2
+ import { IClankerToken, LevrFactory_v1, LevrGovernor_v1, LevrStaking_v1 } from "./abis/index.js";
3
+ import { formatBalanceWithUsd } from "./balance.js";
4
+ import { GET_FACTORY_ADDRESS, WETH } from "./constants.js";
5
+ import { getTokenRewards, parseFeeReceivers } from "./fee-receivers.js";
6
+ import { getTreasuryAirdropStatus } from "./treasury.js";
4
7
  import { getUsdPrice, getWethUsdPrice } from "./usd-price.js";
5
- /**
6
- * Get project data for a clanker token
7
- */
8
- export async function project({ publicClient, clankerToken, oraclePublicClient, }) {
9
- if (Object.values({ publicClient, clankerToken }).some((value) => !value)) {
10
- throw new Error("Invalid project params");
11
- }
12
- const chainId = publicClient.chain?.id;
13
- if (!chainId)
14
- throw new Error("Chain ID not found on public client");
15
- const factoryAddress = GET_FACTORY_ADDRESS(chainId);
16
- if (!factoryAddress)
17
- throw new Error("Factory address not found");
18
- const { treasury, governor, staking, stakedToken } = await publicClient.readContract({
19
- address: factoryAddress,
20
- abi: LevrFactory_v1,
21
- functionName: "getProjectContracts",
22
- args: [clankerToken],
23
- });
24
- if ([treasury, governor, staking, stakedToken].some((a) => a === zeroAddress))
25
- return null;
26
- // Fetch token metadata, forwarder, and treasury stats using multicall
27
- const [decimals, name, symbol, totalSupply, metadata, imageUrl, forwarder, treasuryBalance, stakingBalance,] = await publicClient.multicall({
28
- contracts: [
29
- {
30
- address: clankerToken,
31
- abi: erc20Abi,
32
- functionName: "decimals",
33
- },
34
- {
35
- address: clankerToken,
36
- abi: erc20Abi,
37
- functionName: "name",
38
- },
39
- {
40
- address: clankerToken,
41
- abi: erc20Abi,
42
- functionName: "symbol",
43
- },
44
- {
45
- address: clankerToken,
46
- abi: erc20Abi,
47
- functionName: "totalSupply",
48
- },
49
- {
50
- address: clankerToken,
51
- abi: IClankerToken,
52
- functionName: "metadata",
53
- },
54
- {
55
- address: clankerToken,
56
- abi: IClankerToken,
57
- functionName: "imageUrl",
58
- },
59
- {
60
- address: factoryAddress,
61
- abi: LevrFactory_v1,
62
- functionName: "trustedForwarder",
63
- },
64
- // Treasury stats
8
+ // ---
9
+ // Contract Getters
10
+ function getTokenContracts(clankerToken) {
11
+ return [
12
+ {
13
+ address: clankerToken,
14
+ abi: erc20Abi,
15
+ functionName: "decimals",
16
+ },
17
+ {
18
+ address: clankerToken,
19
+ abi: erc20Abi,
20
+ functionName: "name",
21
+ },
22
+ {
23
+ address: clankerToken,
24
+ abi: erc20Abi,
25
+ functionName: "symbol",
26
+ },
27
+ {
28
+ address: clankerToken,
29
+ abi: erc20Abi,
30
+ functionName: "totalSupply",
31
+ },
32
+ {
33
+ address: clankerToken,
34
+ abi: IClankerToken,
35
+ functionName: "metadata",
36
+ },
37
+ {
38
+ address: clankerToken,
39
+ abi: IClankerToken,
40
+ functionName: "imageUrl",
41
+ },
42
+ ];
43
+ }
44
+ function getFactoryContracts(factoryAddress, clankerToken) {
45
+ return [
46
+ {
47
+ address: factoryAddress,
48
+ abi: LevrFactory_v1,
49
+ functionName: "getProjectContracts",
50
+ args: [clankerToken],
51
+ },
52
+ {
53
+ address: factoryAddress,
54
+ abi: LevrFactory_v1,
55
+ functionName: "trustedForwarder",
56
+ },
57
+ ];
58
+ }
59
+ function getTreasuryContracts(clankerToken, treasury, staking) {
60
+ return [
61
+ {
62
+ address: clankerToken,
63
+ abi: erc20Abi,
64
+ functionName: "balanceOf",
65
+ args: [treasury],
66
+ },
67
+ {
68
+ address: clankerToken,
69
+ abi: erc20Abi,
70
+ functionName: "balanceOf",
71
+ args: [staking],
72
+ },
73
+ ];
74
+ }
75
+ function getGovernanceContracts(governor) {
76
+ return [
77
+ {
78
+ address: governor,
79
+ abi: LevrGovernor_v1,
80
+ functionName: "currentCycleId",
81
+ },
82
+ {
83
+ address: governor,
84
+ abi: LevrGovernor_v1,
85
+ functionName: "activeProposalCount",
86
+ args: [0], // boost type
87
+ },
88
+ {
89
+ address: governor,
90
+ abi: LevrGovernor_v1,
91
+ functionName: "activeProposalCount",
92
+ args: [1], // transfer type
93
+ },
94
+ ];
95
+ }
96
+ function getStakingContracts(staking, clankerToken, wethAddress) {
97
+ const baseContracts = [
98
+ {
99
+ address: staking,
100
+ abi: LevrStaking_v1,
101
+ functionName: "totalStaked",
102
+ },
103
+ {
104
+ address: staking,
105
+ abi: LevrStaking_v1,
106
+ functionName: "aprBps",
107
+ },
108
+ {
109
+ address: staking,
110
+ abi: LevrStaking_v1,
111
+ functionName: "outstandingRewards",
112
+ args: [clankerToken],
113
+ },
114
+ {
115
+ address: staking,
116
+ abi: LevrStaking_v1,
117
+ functionName: "rewardRatePerSecond",
118
+ args: [clankerToken],
119
+ },
120
+ ];
121
+ const wethContracts = wethAddress
122
+ ? [
65
123
  {
66
- address: clankerToken,
67
- abi: erc20Abi,
68
- functionName: "balanceOf",
69
- args: [treasury],
124
+ address: staking,
125
+ abi: LevrStaking_v1,
126
+ functionName: "outstandingRewards",
127
+ args: [wethAddress],
70
128
  },
71
129
  {
72
- address: clankerToken,
73
- abi: erc20Abi,
74
- functionName: "balanceOf",
75
- args: [staking],
130
+ address: staking,
131
+ abi: LevrStaking_v1,
132
+ functionName: "rewardRatePerSecond",
133
+ args: [wethAddress],
76
134
  },
77
- ],
78
- });
135
+ ]
136
+ : [];
137
+ return [...baseContracts, ...wethContracts];
138
+ }
139
+ // ---
140
+ // Parsers
141
+ function parseTokenData(results, clankerToken) {
142
+ const [decimals, name, symbol, totalSupply, metadata, imageUrl] = results;
79
143
  // Parse metadata JSON
80
144
  let parsedMetadata = null;
81
145
  if (metadata.result && typeof metadata.result === "string") {
@@ -86,40 +150,244 @@ export async function project({ publicClient, clankerToken, oraclePublicClient,
86
150
  // If parsing fails, leave as null
87
151
  }
88
152
  }
89
- // Extract pool information from LP locker
90
- let poolInfo;
91
- try {
92
- const lpLockerAddress = GET_LP_LOCKER_ADDRESS(chainId);
93
- if (lpLockerAddress) {
94
- // Get actual pool key from token rewards in LP locker
95
- const tokenRewards = await publicClient.readContract({
96
- address: lpLockerAddress,
97
- abi: IClankerLPLocker,
98
- functionName: "tokenRewards",
99
- args: [clankerToken],
100
- });
101
- const poolKey = tokenRewards.poolKey;
102
- poolInfo = {
103
- poolKey,
104
- feeDisplay: poolKey.fee === 8388608 ? "Dynamic" : `${(poolKey.fee / 10000).toFixed(2)}%`,
105
- numPositions: tokenRewards.numPositions,
153
+ return {
154
+ address: clankerToken,
155
+ decimals: decimals.result,
156
+ name: name.result,
157
+ symbol: symbol.result,
158
+ totalSupply: totalSupply.result,
159
+ metadata: parsedMetadata,
160
+ imageUrl: imageUrl.result,
161
+ };
162
+ }
163
+ function parseFactoryData(results) {
164
+ const [projectContracts, forwarder] = results;
165
+ const { treasury, governor, staking, stakedToken } = projectContracts.result;
166
+ return {
167
+ treasury,
168
+ governor,
169
+ staking,
170
+ stakedToken,
171
+ forwarder: forwarder.result,
172
+ };
173
+ }
174
+ function parseTreasuryStats(results, tokenDecimals, totalSupply, tokenUsdPrice) {
175
+ const [treasuryBalance, stakingBalance] = results;
176
+ const treasuryBalanceRaw = treasuryBalance.result;
177
+ const stakingBalanceRaw = stakingBalance.result;
178
+ // Total allocated = treasury + staking balances (protocol-controlled tokens)
179
+ const totalAllocatedRaw = treasuryBalanceRaw + stakingBalanceRaw;
180
+ // Utilization = (total allocated / total supply) * 100
181
+ const utilizationBps = totalSupply > 0n ? (totalAllocatedRaw * 10000n) / totalSupply : 0n;
182
+ const utilization = Number(utilizationBps) / 100;
183
+ return {
184
+ balance: formatBalanceWithUsd(treasuryBalanceRaw, tokenDecimals, tokenUsdPrice),
185
+ totalAllocated: formatBalanceWithUsd(totalAllocatedRaw, tokenDecimals, tokenUsdPrice),
186
+ utilization,
187
+ };
188
+ }
189
+ function parseGovernanceData(results) {
190
+ const [currentCycleId, boostCount, transferCount] = results;
191
+ return {
192
+ currentCycleId: currentCycleId.result,
193
+ activeProposalCount: {
194
+ boost: boostCount.result,
195
+ transfer: transferCount.result,
196
+ },
197
+ };
198
+ }
199
+ function parseStakingStats(results, tokenDecimals, tokenUsdPrice, wethUsdPrice, pricing) {
200
+ const totalStakedRaw = results[0].result;
201
+ const aprBpsRaw = results[1].result;
202
+ const outstandingRewardsTokenRaw = results[2].result;
203
+ const tokenRewardRateRaw = results[3].result;
204
+ // Check if WETH data is present
205
+ const hasWethData = results.length > 4;
206
+ const outstandingRewardsWethRaw = hasWethData && results[4] ? results[4].result : null;
207
+ const wethRewardRateRaw = hasWethData && results[5] ? results[5].result : null;
208
+ // Calculate WETH APR if available
209
+ let wethApr = null;
210
+ if (wethRewardRateRaw !== null &&
211
+ wethRewardRateRaw !== undefined &&
212
+ pricing &&
213
+ totalStakedRaw > 0n) {
214
+ const wethUsd = parseFloat(pricing.wethUsd);
215
+ const tokenUsd = parseFloat(pricing.tokenUsd);
216
+ if (tokenUsd > 0) {
217
+ const wethPriceInTokens = wethUsd / tokenUsd;
218
+ const secondsPerYear = BigInt(365 * 24 * 60 * 60);
219
+ const annualWethRewards = wethRewardRateRaw * secondsPerYear;
220
+ const priceScaleFactor = BigInt(1000000000000000000);
221
+ const wethPriceScaled = BigInt(Math.floor(wethPriceInTokens * Number(priceScaleFactor)));
222
+ const annualRewardsInUnderlying = (annualWethRewards * wethPriceScaled) / priceScaleFactor;
223
+ const aprBpsWeth = totalStakedRaw > 0n ? (annualRewardsInUnderlying * 10000n) / totalStakedRaw : 0n;
224
+ wethApr = {
225
+ raw: aprBpsWeth,
226
+ percentage: Number(aprBpsWeth) / 100,
106
227
  };
107
228
  }
108
229
  }
230
+ return {
231
+ totalStaked: formatBalanceWithUsd(totalStakedRaw, tokenDecimals, tokenUsdPrice),
232
+ apr: {
233
+ token: {
234
+ raw: aprBpsRaw,
235
+ percentage: Number(aprBpsRaw) / 100,
236
+ },
237
+ weth: wethApr,
238
+ },
239
+ outstandingRewards: {
240
+ staking: {
241
+ available: formatBalanceWithUsd(outstandingRewardsTokenRaw[0], tokenDecimals, tokenUsdPrice),
242
+ pending: formatBalanceWithUsd(outstandingRewardsTokenRaw[1], tokenDecimals, tokenUsdPrice),
243
+ },
244
+ weth: outstandingRewardsWethRaw
245
+ ? {
246
+ available: formatBalanceWithUsd(outstandingRewardsWethRaw[0], 18, wethUsdPrice),
247
+ pending: formatBalanceWithUsd(outstandingRewardsWethRaw[1], 18, wethUsdPrice),
248
+ }
249
+ : null,
250
+ },
251
+ rewardRates: {
252
+ token: formatBalanceWithUsd(tokenRewardRateRaw, tokenDecimals, tokenUsdPrice),
253
+ weth: wethRewardRateRaw !== null && wethRewardRateRaw !== undefined
254
+ ? formatBalanceWithUsd(wethRewardRateRaw, 18, wethUsdPrice)
255
+ : null,
256
+ },
257
+ };
258
+ }
259
+ /**
260
+ * Get multiple projects data using factory's paginated getProjects()
261
+ */
262
+ export async function getProjects({ publicClient, offset = 0, limit = 50, }) {
263
+ if (Object.values({ publicClient }).some((value) => !value)) {
264
+ throw new Error("Invalid projects params");
265
+ }
266
+ const chainId = publicClient.chain?.id;
267
+ if (!chainId)
268
+ throw new Error("Chain ID not found on public client");
269
+ const factoryAddress = GET_FACTORY_ADDRESS(chainId);
270
+ if (!factoryAddress)
271
+ throw new Error("Factory address not found");
272
+ // Get projects from factory using paginated view function
273
+ const [projectsData, total] = await publicClient.readContract({
274
+ address: factoryAddress,
275
+ abi: LevrFactory_v1,
276
+ functionName: "getProjects",
277
+ args: [BigInt(offset), BigInt(limit)],
278
+ });
279
+ if (projectsData.length === 0) {
280
+ return {
281
+ projects: [],
282
+ total: Number(total),
283
+ };
284
+ }
285
+ // Build contract calls for all projects (token data + treasury balances)
286
+ const contracts = projectsData.flatMap((projectInfo) => [
287
+ ...getTokenContracts(projectInfo.clankerToken),
288
+ ...getTreasuryContracts(projectInfo.clankerToken, projectInfo.project.treasury, projectInfo.project.staking),
289
+ ]);
290
+ const results = await publicClient.multicall({ contracts });
291
+ // Parse results into Project objects
292
+ const projects = [];
293
+ const callsPerProject = 8; // 6 token + 2 treasury (no governance for list view)
294
+ for (let i = 0; i < projectsData.length; i++) {
295
+ const projectInfo = projectsData[i];
296
+ const offset = i * callsPerProject;
297
+ // Extract results for this project
298
+ const tokenResults = results.slice(offset, offset + 6);
299
+ const treasuryResults = results.slice(offset + 6, offset + 8);
300
+ // Parse using our type-safe parsers
301
+ const tokenData = parseTokenData(tokenResults, projectInfo.clankerToken);
302
+ const treasuryStats = parseTreasuryStats(treasuryResults, tokenData.decimals, tokenData.totalSupply, null // No pricing for list view
303
+ );
304
+ projects.push({
305
+ chainId,
306
+ treasury: projectInfo.project.treasury,
307
+ governor: projectInfo.project.governor,
308
+ staking: projectInfo.project.staking,
309
+ stakedToken: projectInfo.project.stakedToken,
310
+ factory: factoryAddress,
311
+ token: tokenData,
312
+ treasuryStats,
313
+ });
314
+ }
315
+ return {
316
+ projects,
317
+ total: Number(total),
318
+ };
319
+ }
320
+ /**
321
+ * Get project data for a clanker token
322
+ */
323
+ export async function getProject({ publicClient, clankerToken, oraclePublicClient, userAddress, }) {
324
+ if (Object.values({ publicClient, clankerToken }).some((value) => !value)) {
325
+ throw new Error("Invalid project params");
326
+ }
327
+ const chainId = publicClient.chain?.id;
328
+ if (!chainId)
329
+ throw new Error("Chain ID not found on public client");
330
+ const factoryAddress = GET_FACTORY_ADDRESS(chainId);
331
+ if (!factoryAddress)
332
+ throw new Error("Factory address not found");
333
+ const wethAddress = WETH(chainId)?.address;
334
+ // Build contract calls using individual getters
335
+ const contracts = [
336
+ ...getTokenContracts(clankerToken),
337
+ ...getFactoryContracts(factoryAddress, clankerToken),
338
+ ];
339
+ const multicallResults = await publicClient.multicall({ contracts });
340
+ // Calculate slice indices for each data group
341
+ const tokenCount = 6;
342
+ const factoryCount = 2;
343
+ let idx = 0;
344
+ const tokenResults = multicallResults.slice(idx, idx + tokenCount);
345
+ idx += tokenCount;
346
+ const factoryResults = multicallResults.slice(idx, idx + factoryCount);
347
+ idx += factoryCount;
348
+ // Parse results using individual parsers
349
+ const tokenData = parseTokenData(tokenResults, clankerToken);
350
+ const factoryData = parseFactoryData(factoryResults);
351
+ // Check if project exists
352
+ const { treasury, governor, staking, stakedToken } = factoryData;
353
+ if ([treasury, governor, staking, stakedToken].some((a) => a === zeroAddress))
354
+ return null;
355
+ // Now fetch treasury, governance, and staking data
356
+ const additionalContracts = [
357
+ ...getTreasuryContracts(clankerToken, treasury, staking),
358
+ ...getGovernanceContracts(governor),
359
+ ...getStakingContracts(staking, clankerToken, wethAddress),
360
+ ];
361
+ const additionalResults = await publicClient.multicall({ contracts: additionalContracts });
362
+ // Calculate slice indices for additional data
363
+ const treasuryCount = 2;
364
+ const governanceCount = 3; // currentCycleId + 2 activeProposalCount calls
365
+ const stakingCount = wethAddress ? 6 : 4;
366
+ let idx2 = 0;
367
+ const treasuryResults = additionalResults.slice(idx2, idx2 + treasuryCount);
368
+ idx2 += treasuryCount;
369
+ const governanceResults = additionalResults.slice(idx2, idx2 + governanceCount);
370
+ idx2 += governanceCount;
371
+ const stakingResults = additionalResults.slice(idx2, idx2 + stakingCount);
372
+ // Extract pool information and fee receivers from LP locker
373
+ let poolInfo;
374
+ let feeReceivers;
375
+ try {
376
+ // Use shared utility to get tokenRewards (no duplication)
377
+ const tokenRewards = await getTokenRewards(publicClient, clankerToken);
378
+ const poolKey = tokenRewards.poolKey;
379
+ poolInfo = {
380
+ poolKey,
381
+ feeDisplay: poolKey.fee === 8388608 ? "Dynamic" : `${(poolKey.fee / 10000).toFixed(2)}%`,
382
+ numPositions: tokenRewards.numPositions,
383
+ };
384
+ // Parse fee receivers using shared utility (no logic duplication)
385
+ // Pass userAddress so areYouAnAdmin works out of the box
386
+ feeReceivers = parseFeeReceivers(tokenRewards, userAddress);
387
+ }
109
388
  catch {
110
389
  // If reading fails (e.g., token not deployed through Clanker), poolInfo remains undefined
111
390
  }
112
- // Calculate treasury stats
113
- const tokenDecimals = decimals.result;
114
- const treasuryBalanceRaw = treasuryBalance.result;
115
- const stakingBalanceRaw = stakingBalance.result;
116
- const totalSupplyRaw = totalSupply.result;
117
- // Total allocated = treasury + staking balances (protocol-controlled tokens)
118
- const totalAllocatedRaw = treasuryBalanceRaw + stakingBalanceRaw;
119
- // Utilization = (total allocated / total supply) * 100
120
- const utilization = totalSupplyRaw > 0n
121
- ? Number((totalAllocatedRaw * 10000n) / totalSupplyRaw) / 100 // Convert to percentage
122
- : 0;
123
391
  // Fetch pricing data if oracle client is provided and pool exists
124
392
  let pricing;
125
393
  if (oraclePublicClient && poolInfo) {
@@ -145,45 +413,31 @@ export async function project({ publicClient, clankerToken, oraclePublicClient,
145
413
  console.warn("Failed to fetch USD pricing:", error);
146
414
  }
147
415
  }
148
- // Calculate USD values for treasury stats if pricing is available
149
- const treasuryBalanceFormatted = formatUnits(treasuryBalanceRaw, tokenDecimals);
150
- const totalAllocatedFormatted = formatUnits(totalAllocatedRaw, tokenDecimals);
151
- const treasuryStats = {
152
- balance: {
153
- raw: treasuryBalanceRaw,
154
- formatted: treasuryBalanceFormatted,
155
- usd: pricing
156
- ? (parseFloat(treasuryBalanceFormatted) * parseFloat(pricing.tokenUsd)).toString()
157
- : undefined,
158
- },
159
- totalAllocated: {
160
- raw: totalAllocatedRaw,
161
- formatted: totalAllocatedFormatted,
162
- usd: pricing
163
- ? (parseFloat(totalAllocatedFormatted) * parseFloat(pricing.tokenUsd)).toString()
164
- : undefined,
165
- },
166
- utilization,
167
- };
416
+ // Calculate USD values for stats if pricing is available
417
+ const tokenUsdPrice = pricing ? parseFloat(pricing.tokenUsd) : null;
418
+ const wethUsdPrice = pricing ? parseFloat(pricing.wethUsd) : null;
419
+ // Parse treasury and staking stats using individual parsers
420
+ const treasuryStats = parseTreasuryStats(treasuryResults, tokenData.decimals, tokenData.totalSupply, tokenUsdPrice);
421
+ const stakingStats = parseStakingStats(stakingResults, tokenData.decimals, tokenUsdPrice, wethUsdPrice, pricing);
422
+ // Get airdrop status
423
+ const airdropStatus = await getTreasuryAirdropStatus(publicClient, clankerToken, treasury, tokenData.decimals, tokenUsdPrice);
424
+ const governanceStats = parseGovernanceData(governanceResults);
168
425
  return {
169
426
  chainId,
170
- treasury,
171
- governor,
172
- staking,
173
- stakedToken,
174
- forwarder: forwarder.result,
175
- token: {
176
- address: clankerToken,
177
- decimals: tokenDecimals,
178
- name: name.result,
179
- symbol: symbol.result,
180
- totalSupply: totalSupplyRaw,
181
- metadata: parsedMetadata,
182
- imageUrl: imageUrl.result,
183
- },
427
+ treasury: factoryData.treasury,
428
+ governor: factoryData.governor,
429
+ staking: factoryData.staking,
430
+ stakedToken: factoryData.stakedToken,
431
+ forwarder: factoryData.forwarder,
432
+ factory: factoryAddress,
433
+ token: tokenData,
184
434
  pool: poolInfo,
185
435
  treasuryStats,
436
+ stakingStats,
437
+ governanceStats,
438
+ feeReceivers,
186
439
  pricing,
440
+ airdrop: airdropStatus,
187
441
  };
188
442
  }
189
443
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/project.ts"],"names":[],"mappings":"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"}