levr-sdk 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +109 -13
  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/abis/StateView.js +149 -0
  6. package/dist/esm/abis/V3QuoterV2.js +26 -0
  7. package/dist/esm/abis/index.js +4 -0
  8. package/dist/esm/balance.js +48 -4
  9. package/dist/esm/balance.js.map +1 -1
  10. package/dist/esm/client/hook/index.js +14 -3
  11. package/dist/esm/client/hook/index.js.map +1 -1
  12. package/dist/esm/client/hook/use-fee-receivers.js +11 -30
  13. package/dist/esm/client/hook/use-fee-receivers.js.map +1 -1
  14. package/dist/esm/client/hook/use-governance.js +20 -274
  15. package/dist/esm/client/hook/use-governance.js.map +1 -1
  16. package/dist/esm/client/hook/use-pool.js +26 -0
  17. package/dist/esm/client/hook/use-pool.js.map +1 -0
  18. package/dist/esm/client/hook/use-prepare.js +6 -3
  19. package/dist/esm/client/hook/use-prepare.js.map +1 -1
  20. package/dist/esm/client/hook/use-project.js +28 -16
  21. package/dist/esm/client/hook/use-project.js.map +1 -1
  22. package/dist/esm/client/hook/use-proposal.js +48 -0
  23. package/dist/esm/client/hook/use-proposal.js.map +1 -0
  24. package/dist/esm/client/hook/use-stake.js +29 -215
  25. package/dist/esm/client/hook/use-stake.js.map +1 -1
  26. package/dist/esm/client/hook/use-swap.js +23 -19
  27. package/dist/esm/client/hook/use-swap.js.map +1 -1
  28. package/dist/esm/client/hook/use-user.js +25 -0
  29. package/dist/esm/client/hook/use-user.js.map +1 -0
  30. package/dist/esm/client/levr-provider.js +73 -108
  31. package/dist/esm/client/levr-provider.js.map +1 -1
  32. package/dist/esm/client/query-keys.js +10 -22
  33. package/dist/esm/client/query-keys.js.map +1 -1
  34. package/dist/esm/constants.js +42 -1
  35. package/dist/esm/constants.js.map +1 -1
  36. package/dist/esm/fee-receivers.js +28 -13
  37. package/dist/esm/fee-receivers.js.map +1 -1
  38. package/dist/esm/governance.js +35 -399
  39. package/dist/esm/governance.js.map +1 -1
  40. package/dist/esm/index.js +7 -3
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/pool-key.js +152 -0
  43. package/dist/esm/pool-key.js.map +1 -0
  44. package/dist/esm/pool.js +70 -0
  45. package/dist/esm/pool.js.map +1 -0
  46. package/dist/esm/project.js +415 -118
  47. package/dist/esm/project.js.map +1 -1
  48. package/dist/esm/proposal.js +156 -0
  49. package/dist/esm/proposal.js.map +1 -0
  50. package/dist/esm/quote/index.js +98 -0
  51. package/dist/esm/quote/index.js.map +1 -0
  52. package/dist/esm/quote/v3.js +62 -0
  53. package/dist/esm/quote/v3.js.map +1 -0
  54. package/dist/esm/quote/v4.js +228 -0
  55. package/dist/esm/quote/v4.js.map +1 -0
  56. package/dist/esm/stake.js +34 -237
  57. package/dist/esm/stake.js.map +1 -1
  58. package/dist/esm/treasury.js +162 -0
  59. package/dist/esm/treasury.js.map +1 -0
  60. package/dist/esm/usd-price.js +149 -0
  61. package/dist/esm/usd-price.js.map +1 -0
  62. package/dist/esm/user.js +153 -0
  63. package/dist/esm/user.js.map +1 -0
  64. package/dist/esm/util.js +45 -1
  65. package/dist/esm/util.js.map +1 -1
  66. package/dist/types/abis/LevrFactory_v1.d.ts +48 -0
  67. package/dist/types/abis/LevrGovernor_v1.d.ts +12 -18
  68. package/dist/types/abis/LevrStaking_v1.d.ts +5 -1
  69. package/dist/types/abis/StateView.d.ts +278 -0
  70. package/dist/types/abis/V3QuoterV2.d.ts +39 -0
  71. package/dist/types/abis/index.d.ts +2 -0
  72. package/dist/types/balance.d.ts +19 -6
  73. package/dist/types/balance.d.ts.map +1 -1
  74. package/dist/types/client/hook/index.d.ts +12 -4
  75. package/dist/types/client/hook/index.d.ts.map +1 -1
  76. package/dist/types/client/hook/use-fee-receivers.d.ts +6 -16
  77. package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -1
  78. package/dist/types/client/hook/use-governance.d.ts +4 -93
  79. package/dist/types/client/hook/use-governance.d.ts.map +1 -1
  80. package/dist/types/client/hook/use-pool.d.ts +12 -0
  81. package/dist/types/client/hook/use-pool.d.ts.map +1 -0
  82. package/dist/types/client/hook/use-prepare.d.ts +1 -2
  83. package/dist/types/client/hook/use-prepare.d.ts.map +1 -1
  84. package/dist/types/client/hook/use-project.d.ts +8 -1
  85. package/dist/types/client/hook/use-project.d.ts.map +1 -1
  86. package/dist/types/client/hook/use-proposal.d.ts +18 -0
  87. package/dist/types/client/hook/use-proposal.d.ts.map +1 -0
  88. package/dist/types/client/hook/use-stake.d.ts +14 -168
  89. package/dist/types/client/hook/use-stake.d.ts.map +1 -1
  90. package/dist/types/client/hook/use-swap.d.ts +5 -9
  91. package/dist/types/client/hook/use-swap.d.ts.map +1 -1
  92. package/dist/types/client/hook/use-user.d.ts +13 -0
  93. package/dist/types/client/hook/use-user.d.ts.map +1 -0
  94. package/dist/types/client/levr-provider.d.ts +41 -68
  95. package/dist/types/client/levr-provider.d.ts.map +1 -1
  96. package/dist/types/client/query-keys.d.ts +14 -26
  97. package/dist/types/client/query-keys.d.ts.map +1 -1
  98. package/dist/types/constants.d.ts +18 -0
  99. package/dist/types/constants.d.ts.map +1 -1
  100. package/dist/types/fee-receivers.d.ts +29 -2
  101. package/dist/types/fee-receivers.d.ts.map +1 -1
  102. package/dist/types/governance.d.ts +8 -108
  103. package/dist/types/governance.d.ts.map +1 -1
  104. package/dist/types/index.d.ts +7 -3
  105. package/dist/types/index.d.ts.map +1 -1
  106. package/dist/types/pool-key.d.ts +121 -0
  107. package/dist/types/pool-key.d.ts.map +1 -0
  108. package/dist/types/pool.d.ts +590 -0
  109. package/dist/types/pool.d.ts.map +1 -0
  110. package/dist/types/project.d.ts +61 -11
  111. package/dist/types/project.d.ts.map +1 -1
  112. package/dist/types/proposal.d.ts +1161 -0
  113. package/dist/types/proposal.d.ts.map +1 -0
  114. package/dist/types/quote/index.d.ts +97 -0
  115. package/dist/types/quote/index.d.ts.map +1 -0
  116. package/dist/types/quote/v3.d.ts +78 -0
  117. package/dist/types/quote/v3.d.ts.map +1 -0
  118. package/dist/types/quote/v4.d.ts +95 -0
  119. package/dist/types/quote/v4.d.ts.map +1 -0
  120. package/dist/types/stake.d.ts +41 -87
  121. package/dist/types/stake.d.ts.map +1 -1
  122. package/dist/types/treasury.d.ts +16 -0
  123. package/dist/types/treasury.d.ts.map +1 -0
  124. package/dist/types/types.d.ts +15 -0
  125. package/dist/types/types.d.ts.map +1 -1
  126. package/dist/types/usd-price.d.ts +141 -0
  127. package/dist/types/usd-price.d.ts.map +1 -0
  128. package/dist/types/user.d.ts +188 -0
  129. package/dist/types/user.d.ts.map +1 -0
  130. package/dist/types/util.d.ts +17 -0
  131. package/dist/types/util.d.ts.map +1 -1
  132. package/package.json +5 -2
  133. package/dist/esm/client/hook/use-balance.js +0 -56
  134. package/dist/esm/client/hook/use-balance.js.map +0 -1
  135. package/dist/esm/client/hook/use-projects.js +0 -22
  136. package/dist/esm/client/hook/use-projects.js.map +0 -1
  137. package/dist/esm/client/hook/use-proposals.js +0 -31
  138. package/dist/esm/client/hook/use-proposals.js.map +0 -1
  139. package/dist/esm/projects.js +0 -212
  140. package/dist/esm/projects.js.map +0 -1
  141. package/dist/esm/proposals.js +0 -98
  142. package/dist/esm/proposals.js.map +0 -1
  143. package/dist/esm/quote-v4.js +0 -169
  144. package/dist/esm/quote-v4.js.map +0 -1
  145. package/dist/types/client/hook/use-balance.d.ts +0 -18
  146. package/dist/types/client/hook/use-balance.d.ts.map +0 -1
  147. package/dist/types/client/hook/use-projects.d.ts +0 -6
  148. package/dist/types/client/hook/use-projects.d.ts.map +0 -1
  149. package/dist/types/client/hook/use-proposals.d.ts +0 -16
  150. package/dist/types/client/hook/use-proposals.d.ts.map +0 -1
  151. package/dist/types/projects.d.ts +0 -20
  152. package/dist/types/projects.d.ts.map +0 -1
  153. package/dist/types/proposals.d.ts +0 -20
  154. package/dist/types/proposals.d.ts.map +0 -1
  155. package/dist/types/quote-v4.d.ts +0 -54
  156. package/dist/types/quote-v4.d.ts.map +0 -1
@@ -1,74 +1,145 @@
1
- import { erc20Abi, formatUnits, zeroAddress } from "viem";
2
- import { IClankerLPLocker, IClankerToken, LevrFactory_v1 } from "./abis/index.js";
3
- import { GET_LP_LOCKER_ADDRESS } from "./constants.js";
4
- /**
5
- * Get project data for a clanker token
6
- */
7
- export async function project({ publicClient, factoryAddress, chainId, clankerToken, }) {
8
- if (Object.values({ publicClient, factoryAddress, chainId, clankerToken }).some((value) => !value)) {
9
- throw new Error("Invalid project params");
10
- }
11
- const { treasury, governor, staking, stakedToken } = await publicClient.readContract({
12
- address: factoryAddress,
13
- abi: LevrFactory_v1,
14
- functionName: "getProjectContracts",
15
- args: [clankerToken],
16
- });
17
- if ([treasury, governor, staking, stakedToken].some((a) => a === zeroAddress))
18
- return null;
19
- // Fetch token metadata, forwarder, and treasury stats using multicall
20
- const [decimals, name, symbol, totalSupply, metadata, imageUrl, forwarder, treasuryBalance, stakingBalance,] = await publicClient.multicall({
21
- contracts: [
22
- {
23
- address: clankerToken,
24
- abi: erc20Abi,
25
- functionName: "decimals",
26
- },
27
- {
28
- address: clankerToken,
29
- abi: erc20Abi,
30
- functionName: "name",
31
- },
32
- {
33
- address: clankerToken,
34
- abi: erc20Abi,
35
- functionName: "symbol",
36
- },
37
- {
38
- address: clankerToken,
39
- abi: erc20Abi,
40
- functionName: "totalSupply",
41
- },
42
- {
43
- address: clankerToken,
44
- abi: IClankerToken,
45
- functionName: "metadata",
46
- },
47
- {
48
- address: clankerToken,
49
- abi: IClankerToken,
50
- functionName: "imageUrl",
51
- },
52
- {
53
- address: factoryAddress,
54
- abi: LevrFactory_v1,
55
- functionName: "trustedForwarder",
56
- },
57
- // Treasury stats
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";
7
+ import { getUsdPrice, getWethUsdPrice } from "./usd-price.js";
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
+ ? [
58
123
  {
59
- address: clankerToken,
60
- abi: erc20Abi,
61
- functionName: "balanceOf",
62
- args: [treasury],
124
+ address: staking,
125
+ abi: LevrStaking_v1,
126
+ functionName: "outstandingRewards",
127
+ args: [wethAddress],
63
128
  },
64
129
  {
65
- address: clankerToken,
66
- abi: erc20Abi,
67
- functionName: "balanceOf",
68
- args: [staking],
130
+ address: staking,
131
+ abi: LevrStaking_v1,
132
+ functionName: "rewardRatePerSecond",
133
+ args: [wethAddress],
69
134
  },
70
- ],
71
- });
135
+ ]
136
+ : [];
137
+ return [...baseContracts, ...wethContracts];
138
+ }
139
+ // ---
140
+ // Parsers
141
+ function parseTokenData(results, clankerToken) {
142
+ const [decimals, name, symbol, totalSupply, metadata, imageUrl] = results;
72
143
  // Parse metadata JSON
73
144
  let parsedMetadata = null;
74
145
  if (metadata.result && typeof metadata.result === "string") {
@@ -79,68 +150,294 @@ export async function project({ publicClient, factoryAddress, chainId, clankerTo
79
150
  // If parsing fails, leave as null
80
151
  }
81
152
  }
82
- // Extract pool information from LP locker
83
- let poolInfo;
84
- try {
85
- const lpLockerAddress = GET_LP_LOCKER_ADDRESS(chainId);
86
- if (lpLockerAddress) {
87
- // Get actual pool key from token rewards in LP locker
88
- const tokenRewards = await publicClient.readContract({
89
- address: lpLockerAddress,
90
- abi: IClankerLPLocker,
91
- functionName: "tokenRewards",
92
- args: [clankerToken],
93
- });
94
- const poolKey = tokenRewards.poolKey;
95
- poolInfo = {
96
- poolKey,
97
- feeDisplay: poolKey.fee === 8388608 ? "Dynamic" : `${(poolKey.fee / 10000).toFixed(2)}%`,
98
- numPositions: tokenRewards.numPositions,
99
- };
100
- }
101
- }
102
- catch {
103
- // If reading fails (e.g., token not deployed through Clanker), poolInfo remains undefined
104
- }
105
- // Calculate treasury stats
106
- const tokenDecimals = decimals.result;
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;
107
176
  const treasuryBalanceRaw = treasuryBalance.result;
108
177
  const stakingBalanceRaw = stakingBalance.result;
109
- const totalSupplyRaw = totalSupply.result;
110
178
  // Total allocated = treasury + staking balances (protocol-controlled tokens)
111
179
  const totalAllocatedRaw = treasuryBalanceRaw + stakingBalanceRaw;
112
180
  // Utilization = (total allocated / total supply) * 100
113
- const utilization = totalSupplyRaw > 0n
114
- ? Number((totalAllocatedRaw * 10000n) / totalSupplyRaw) / 100 // Convert to percentage
115
- : 0;
116
- const treasuryStats = {
117
- balance: {
118
- raw: treasuryBalanceRaw,
119
- formatted: formatUnits(treasuryBalanceRaw, tokenDecimals),
120
- },
121
- totalAllocated: {
122
- raw: totalAllocatedRaw,
123
- formatted: formatUnits(totalAllocatedRaw, tokenDecimals),
124
- },
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),
125
186
  utilization,
126
187
  };
188
+ }
189
+ function parseGovernanceData(results) {
190
+ const [currentCycleId, boostCount, transferCount] = results;
127
191
  return {
128
- treasury,
129
- governor,
130
- staking,
131
- stakedToken,
132
- forwarder: forwarder.result,
133
- token: {
134
- address: clankerToken,
135
- decimals: tokenDecimals,
136
- name: name.result,
137
- symbol: symbol.result,
138
- totalSupply: totalSupplyRaw,
139
- metadata: parsedMetadata,
140
- imageUrl: imageUrl.result,
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,
227
+ };
228
+ }
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,
141
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
+ }
388
+ catch {
389
+ // If reading fails (e.g., token not deployed through Clanker), poolInfo remains undefined
390
+ }
391
+ // Fetch pricing data if oracle client is provided and pool exists
392
+ let pricing;
393
+ if (oraclePublicClient && poolInfo) {
394
+ try {
395
+ const [wethUsdData, tokenUsdData] = await Promise.all([
396
+ getWethUsdPrice({ publicClient: oraclePublicClient }),
397
+ getUsdPrice({
398
+ oraclePublicClient,
399
+ quotePublicClient: publicClient,
400
+ tokenAddress: clankerToken,
401
+ quoteFee: poolInfo.poolKey.fee,
402
+ quoteTickSpacing: poolInfo.poolKey.tickSpacing,
403
+ quoteHooks: poolInfo.poolKey.hooks,
404
+ }),
405
+ ]);
406
+ pricing = {
407
+ wethUsd: wethUsdData.priceUsd,
408
+ tokenUsd: tokenUsdData.priceUsd,
409
+ };
410
+ }
411
+ catch (error) {
412
+ // If pricing fails, continue without it (graceful degradation)
413
+ console.warn("Failed to fetch USD pricing:", error);
414
+ }
415
+ }
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);
425
+ return {
426
+ chainId,
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,
142
434
  pool: poolInfo,
143
435
  treasuryStats,
436
+ stakingStats,
437
+ governanceStats,
438
+ feeReceivers,
439
+ pricing,
440
+ airdrop: airdropStatus,
144
441
  };
145
442
  }
146
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA6J1D,MAAM;AACN,mBAAmB;AAEnB,SAAS,iBAAiB,CAAC,YAA2B;IACpD,OAAO;QACL;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,UAAmB;SAClC;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,MAAe;SAC9B;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,QAAiB;SAChC;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,aAAsB;SACrC;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,aAAa;YAClB,YAAY,EAAE,UAAmB;SAClC;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,aAAa;YAClB,YAAY,EAAE,UAAmB;SAClC;KACF,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,cAA6B,EAAE,YAA2B;IACrF,OAAO;QACL;YACE,OAAO,EAAE,cAAc;YACvB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,qBAA8B;YAC5C,IAAI,EAAE,CAAC,YAAY,CAAC;SACrB;QACD;YACE,OAAO,EAAE,cAAc;YACvB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,kBAA2B;SAC1C;KACF,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,YAA2B,EAC3B,QAAuB,EACvB,OAAsB;IAEtB,OAAO;QACL;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,WAAoB;YAClC,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB;QACD;YACE,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,WAAoB;YAClC,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB;KACF,CAAA;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAuB;IACrD,OAAO;QACL;YACE,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,eAAe;YACpB,YAAY,EAAE,gBAAyB;SACxC;QACD;YACE,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,eAAe;YACpB,YAAY,EAAE,qBAA8B;YAC5C,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa;SACzB;QACD;YACE,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,eAAe;YACpB,YAAY,EAAE,qBAA8B;YAC5C,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB;SAC5B;KACF,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAsB,EACtB,YAA2B,EAC3B,WAA2B;IAE3B,MAAM,aAAa,GAAG;QACpB;YACE,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,aAAsB;SACrC;QACD;YACE,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,QAAiB;SAChC;QACD;YACE,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,oBAA6B;YAC3C,IAAI,EAAE,CAAC,YAAY,CAAC;SACrB;QACD;YACE,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,cAAc;YACnB,YAAY,EAAE,qBAA8B;YAC5C,IAAI,EAAE,CAAC,YAAY,CAAC;SACrB;KACF,CAAA;IAED,MAAM,aAAa,GAAG,WAAW;QAC/B,CAAC,CAAC;YACE;gBACE,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE,cAAc;gBACnB,YAAY,EAAE,oBAA6B;gBAC3C,IAAI,EAAE,CAAC,WAAW,CAAC;aACpB;YACD;gBACE,OAAO,EAAE,OAAO;gBAChB,GAAG,EAAE,cAAc;gBACnB,YAAY,EAAE,qBAA8B;gBAC5C,IAAI,EAAE,CAAC,WAAW,CAAC;aACpB;SACF;QACH,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM;AACN,UAAU;AAEV,SAAS,cAAc,CAAC,OAA6B,EAAE,YAA2B;IAChF,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAA;IAEzE,sBAAsB;IACtB,IAAI,cAAc,GAA2B,IAAI,CAAA;IACjD,IAAI,QAAQ,CAAC,MAAM,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,IAAI,EAAE,IAAI,CAAC,MAAM;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA+B;IACvD,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,OAAO,CAAA;IAC7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAA;IAE5E,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,WAAW;QACX,SAAS,EAAE,SAAS,CAAC,MAAM;KAC5B,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAgC,EAChC,aAAqB,EACrB,WAAmB,EACnB,aAA4B;IAE5B,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,GAAG,OAAO,CAAA;IAEjD,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAA;IACjD,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAA;IAE/C,6EAA6E;IAC7E,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,CAAA;IAEhE,uDAAuD;IACvD,MAAM,cAAc,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,GAAG,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACzF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,GAAG,CAAA;IAEhD,OAAO;QACL,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,aAAa,CAAC;QAC/E,cAAc,EAAE,oBAAoB,CAAC,iBAAiB,EAAE,aAAa,EAAE,aAAa,CAAC;QACrF,WAAW;KACZ,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAkC;IAC7D,MAAM,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,OAAO,CAAA;IAC3D,OAAO;QACL,cAAc,EAAE,cAAc,CAAC,MAAM;QACrC,mBAAmB,EAAE;YACnB,KAAK,EAAE,UAAU,CAAC,MAAM;YACxB,QAAQ,EAAE,aAAa,CAAC,MAAM;SAC/B;KACF,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,OAA+B,EAC/B,aAAqB,EACrB,aAA4B,EAC5B,YAA2B,EAC3B,OAAuB;IAEvB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACnC,MAAM,0BAA0B,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACpD,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAE5C,gCAAgC;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,MAAM,yBAAyB,GAAG,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACtF,MAAM,iBAAiB,GAAG,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IAE9E,kCAAkC;IAClC,IAAI,OAAO,GAA+C,IAAI,CAAA;IAE9D,IACE,iBAAiB,KAAK,IAAI;QAC1B,iBAAiB,KAAK,SAAS;QAC/B,OAAO;QACP,cAAc,GAAG,EAAE,EACnB,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAE7C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAA;YAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;YACjD,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,cAAc,CAAA;YAE5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;YACrC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;YACxF,MAAM,yBAAyB,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,GAAG,gBAAgB,CAAA;YAE1F,MAAM,UAAU,GACd,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB,GAAG,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;YAClF,OAAO,GAAG;gBACR,GAAG,EAAE,UAAU;gBACf,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG;aACrC,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,cAAc,EAAE,aAAa,EAAE,aAAa,CAAC;QAC/E,GAAG,EAAE;YACH,KAAK,EAAE;gBACL,GAAG,EAAE,SAAS;gBACd,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG;aACpC;YACD,IAAI,EAAE,OAAO;SACd;QACD,kBAAkB,EAAE;YAClB,OAAO,EAAE;gBACP,SAAS,EAAE,oBAAoB,CAC7B,0BAA0B,CAAC,CAAC,CAAC,EAC7B,aAAa,EACb,aAAa,CACd;gBACD,OAAO,EAAE,oBAAoB,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC;aAC3F;YACD,IAAI,EAAE,yBAAyB;gBAC7B,CAAC,CAAC;oBACE,SAAS,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC;oBAC/E,OAAO,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC;iBAC9E;gBACH,CAAC,CAAC,IAAI;SACT;QACD,WAAW,EAAE;YACX,KAAK,EAAE,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,aAAa,CAAC;YAC7E,IAAI,EACF,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,KAAK,SAAS;gBAC3D,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,EAAE,EAAE,YAAY,CAAC;gBAC3D,CAAC,CAAC,IAAI;SACX;KACF,CAAA;AACH,CAAC;AAwBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,YAAY,EACZ,MAAM,GAAG,CAAC,EACV,KAAK,GAAG,EAAE,GACK;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAA;IACtC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEpE,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEjE,0DAA0D;IAC1D,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;QAC5D,OAAO,EAAE,cAAc;QACvB,GAAG,EAAE,cAAc;QACnB,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;KACtC,CAAC,CAAA;IAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACrB,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtD,GAAG,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC;QAC9C,GAAG,oBAAoB,CACrB,WAAW,CAAC,YAAY,EACxB,WAAW,CAAC,OAAO,CAAC,QAAQ,EAC5B,WAAW,CAAC,OAAO,CAAC,OAAO,CAC5B;KACF,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAE3D,qCAAqC;IACrC,MAAM,QAAQ,GASR,EAAE,CAAA;IACR,MAAM,eAAe,GAAG,CAAC,CAAA,CAAC,qDAAqD;IAE/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,CAAA;QAElC,mCAAmC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAyB,CAAA;QAC9E,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAA4B,CAAA;QAExF,oCAAoC;QACpC,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,kBAAkB,CACtC,eAAe,EACf,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,WAAW,EACrB,IAAI,CAAC,2BAA2B;SACjC,CAAA;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO;YACP,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ;YACtC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ;YACtC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO;YACpC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,WAAW;YAC5C,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,SAAS;YAChB,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;KACrB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACG;IACd,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAA;IACtC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEpE,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAEjE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAE1C,gDAAgD;IAChD,MAAM,SAAS,GAAG;QAChB,GAAG,iBAAiB,CAAC,YAAY,CAAC;QAClC,GAAG,mBAAmB,CAAC,cAAc,EAAE,YAAY,CAAC;KACrD,CAAA;IAED,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAEpE,8CAA8C;IAC9C,MAAM,UAAU,GAAG,CAAC,CAAA;IACpB,MAAM,YAAY,GAAG,CAAC,CAAA;IAEtB,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAAyB,CAAA;IAC1F,GAAG,IAAI,UAAU,CAAA;IAEjB,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,CAA2B,CAAA;IAChG,GAAG,IAAI,YAAY,CAAA;IAEnB,yCAAyC;IACzC,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAEpD,0BAA0B;IAC1B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,CAAA;IAChE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC;QAAE,OAAO,IAAI,CAAA;IAE1F,mDAAmD;IACnD,MAAM,mBAAmB,GAAG;QAC1B,GAAG,oBAAoB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC;QACxD,GAAG,sBAAsB,CAAC,QAAQ,CAAC;QACnC,GAAG,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC;KAC3D,CAAA;IAED,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAE1F,8CAA8C;IAC9C,MAAM,aAAa,GAAG,CAAC,CAAA;IACvB,MAAM,eAAe,GAAG,CAAC,CAAA,CAAC,+CAA+C;IACzE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAExC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAC7C,IAAI,EACJ,IAAI,GAAG,aAAa,CACM,CAAA;IAC5B,IAAI,IAAI,aAAa,CAAA;IAErB,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAC/C,IAAI,EACJ,IAAI,GAAG,eAAe,CACM,CAAA;IAC9B,IAAI,IAAI,eAAe,CAAA;IAEvB,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAC5C,IAAI,EACJ,IAAI,GAAG,YAAY,CACM,CAAA;IAE3B,4DAA4D;IAC5D,IAAI,QAA8B,CAAA;IAClC,IAAI,YAA4C,CAAA;IAChD,IAAI,CAAC;QACH,0DAA0D;QAC1D,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;QAEtE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAA;QACpC,QAAQ,GAAG;YACT,OAAO;YACP,UAAU,EAAE,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YACzF,YAAY,EAAE,YAAY,CAAC,YAAY;SACxC,CAAA;QAED,kEAAkE;QAClE,yDAAyD;QACzD,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,0FAA0F;IAC5F,CAAC;IAED,kEAAkE;IAClE,IAAI,OAAkC,CAAA;IAEtC,IAAI,kBAAkB,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACpD,eAAe,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;gBACrD,WAAW,CAAC;oBACV,kBAAkB;oBAClB,iBAAiB,EAAE,YAAY;oBAC/B,YAAY,EAAE,YAAY;oBAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG;oBAC9B,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW;oBAC9C,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;iBACnC,CAAC;aACH,CAAC,CAAA;YAEF,OAAO,GAAG;gBACR,OAAO,EAAE,WAAW,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;aAChC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+DAA+D;YAC/D,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnE,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEjE,4DAA4D;IAC5D,MAAM,aAAa,GAAG,kBAAkB,CACtC,eAAe,EACf,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,WAAW,EACrB,aAAa,CACd,CAAA;IAED,MAAM,YAAY,GAAG,iBAAiB,CACpC,cAAc,EACd,SAAS,CAAC,QAAQ,EAClB,aAAa,EACb,YAAY,EACZ,OAAO,CACR,CAAA;IAED,qBAAqB;IACrB,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,SAAS,CAAC,QAAQ,EAClB,aAAa,CACd,CAAA;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;IAE9D,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,QAAQ;QACd,aAAa;QACb,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,OAAO;QACP,OAAO,EAAE,aAAa;KACvB,CAAA;AACH,CAAC"}