levr-sdk 0.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 (179) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +711 -0
  3. package/dist/esm/abis/IClankerAirdrop.js +443 -0
  4. package/dist/esm/abis/IClankerHookDynamicFee.js +198 -0
  5. package/dist/esm/abis/IClankerHookStaticFee.js +75 -0
  6. package/dist/esm/abis/IClankerLPLocker.js +402 -0
  7. package/dist/esm/abis/IClankerLpLockerMultiple.js +609 -0
  8. package/dist/esm/abis/IClankerToken.js +421 -0
  9. package/dist/esm/abis/LevrFactory_v1.js +608 -0
  10. package/dist/esm/abis/LevrForwarder_v1.js +622 -0
  11. package/dist/esm/abis/LevrGovernor_v1.js +726 -0
  12. package/dist/esm/abis/LevrStakedToken_v1.js +441 -0
  13. package/dist/esm/abis/LevrStaking_v1.js +607 -0
  14. package/dist/esm/abis/LevrTreasury_v1.js +219 -0
  15. package/dist/esm/abis/Permit2.js +29 -0
  16. package/dist/esm/abis/V4Quoter.js +466 -0
  17. package/dist/esm/abis/WETH9.js +153 -0
  18. package/dist/esm/abis/index.js +23 -0
  19. package/dist/esm/balance.js +72 -0
  20. package/dist/esm/balance.js.map +1 -0
  21. package/dist/esm/build-calldatas-v4.js +98 -0
  22. package/dist/esm/build-calldatas-v4.js.map +1 -0
  23. package/dist/esm/build-clanker-v4.js +128 -0
  24. package/dist/esm/build-clanker-v4.js.map +1 -0
  25. package/dist/esm/client/hook/index.js +36 -0
  26. package/dist/esm/client/hook/index.js.map +1 -0
  27. package/dist/esm/client/hook/use-balance.js +56 -0
  28. package/dist/esm/client/hook/use-balance.js.map +1 -0
  29. package/dist/esm/client/hook/use-clanker.js +57 -0
  30. package/dist/esm/client/hook/use-clanker.js.map +1 -0
  31. package/dist/esm/client/hook/use-deploy.js +16 -0
  32. package/dist/esm/client/hook/use-deploy.js.map +1 -0
  33. package/dist/esm/client/hook/use-fee-receivers.js +54 -0
  34. package/dist/esm/client/hook/use-fee-receivers.js.map +1 -0
  35. package/dist/esm/client/hook/use-governance.js +389 -0
  36. package/dist/esm/client/hook/use-governance.js.map +1 -0
  37. package/dist/esm/client/hook/use-prepare.js +47 -0
  38. package/dist/esm/client/hook/use-prepare.js.map +1 -0
  39. package/dist/esm/client/hook/use-project.js +29 -0
  40. package/dist/esm/client/hook/use-project.js.map +1 -0
  41. package/dist/esm/client/hook/use-projects.js +22 -0
  42. package/dist/esm/client/hook/use-projects.js.map +1 -0
  43. package/dist/esm/client/hook/use-proposals.js +31 -0
  44. package/dist/esm/client/hook/use-proposals.js.map +1 -0
  45. package/dist/esm/client/hook/use-register.js +101 -0
  46. package/dist/esm/client/hook/use-register.js.map +1 -0
  47. package/dist/esm/client/hook/use-stake.js +327 -0
  48. package/dist/esm/client/hook/use-stake.js.map +1 -0
  49. package/dist/esm/client/hook/use-swap.js +110 -0
  50. package/dist/esm/client/hook/use-swap.js.map +1 -0
  51. package/dist/esm/client/index.js +4 -0
  52. package/dist/esm/client/index.js.map +1 -0
  53. package/dist/esm/client/levr-provider.js +201 -0
  54. package/dist/esm/client/levr-provider.js.map +1 -0
  55. package/dist/esm/client/query-keys.js +61 -0
  56. package/dist/esm/client/query-keys.js.map +1 -0
  57. package/dist/esm/constants.js +182 -0
  58. package/dist/esm/constants.js.map +1 -0
  59. package/dist/esm/deploy-v4.js +46 -0
  60. package/dist/esm/deploy-v4.js.map +1 -0
  61. package/dist/esm/fee-receivers.js +52 -0
  62. package/dist/esm/fee-receivers.js.map +1 -0
  63. package/dist/esm/governance.js +555 -0
  64. package/dist/esm/governance.js.map +1 -0
  65. package/dist/esm/index.js +18 -0
  66. package/dist/esm/index.js.map +1 -0
  67. package/dist/esm/project.js +146 -0
  68. package/dist/esm/project.js.map +1 -0
  69. package/dist/esm/projects.js +212 -0
  70. package/dist/esm/projects.js.map +1 -0
  71. package/dist/esm/proposals.js +98 -0
  72. package/dist/esm/proposals.js.map +1 -0
  73. package/dist/esm/quote-v4.js +169 -0
  74. package/dist/esm/quote-v4.js.map +1 -0
  75. package/dist/esm/schema/base.schema.js +11 -0
  76. package/dist/esm/schema/base.schema.js.map +1 -0
  77. package/dist/esm/schema/clanker.schema.js +191 -0
  78. package/dist/esm/schema/clanker.schema.js.map +1 -0
  79. package/dist/esm/schema/index.js +4 -0
  80. package/dist/esm/schema/index.js.map +1 -0
  81. package/dist/esm/schema/levr.schema.js +114 -0
  82. package/dist/esm/schema/levr.schema.js.map +1 -0
  83. package/dist/esm/stake.js +384 -0
  84. package/dist/esm/stake.js.map +1 -0
  85. package/dist/esm/swap-v4.js +281 -0
  86. package/dist/esm/swap-v4.js.map +1 -0
  87. package/dist/esm/types.js +2 -0
  88. package/dist/esm/types.js.map +1 -0
  89. package/dist/esm/util.js +19 -0
  90. package/dist/esm/util.js.map +1 -0
  91. package/dist/types/abis/IClankerAirdrop.d.ts +348 -0
  92. package/dist/types/abis/IClankerHookDynamicFee.d.ts +156 -0
  93. package/dist/types/abis/IClankerHookStaticFee.d.ts +58 -0
  94. package/dist/types/abis/IClankerLPLocker.d.ts +316 -0
  95. package/dist/types/abis/IClankerLpLockerMultiple.d.ts +481 -0
  96. package/dist/types/abis/IClankerToken.d.ts +326 -0
  97. package/dist/types/abis/LevrFactory_v1.d.ts +471 -0
  98. package/dist/types/abis/LevrForwarder_v1.d.ts +478 -0
  99. package/dist/types/abis/LevrGovernor_v1.d.ts +562 -0
  100. package/dist/types/abis/LevrStakedToken_v1.d.ts +338 -0
  101. package/dist/types/abis/LevrStaking_v1.d.ts +468 -0
  102. package/dist/types/abis/LevrTreasury_v1.d.ts +169 -0
  103. package/dist/types/abis/Permit2.d.ts +54 -0
  104. package/dist/types/abis/V4Quoter.d.ts +496 -0
  105. package/dist/types/abis/WETH9.d.ts +244 -0
  106. package/dist/types/abis/index.d.ts +15 -0
  107. package/dist/types/balance.d.ts +24 -0
  108. package/dist/types/balance.d.ts.map +1 -0
  109. package/dist/types/build-calldatas-v4.d.ts +20 -0
  110. package/dist/types/build-calldatas-v4.d.ts.map +1 -0
  111. package/dist/types/build-clanker-v4.d.ts +12 -0
  112. package/dist/types/build-clanker-v4.d.ts.map +1 -0
  113. package/dist/types/client/hook/index.d.ts +32 -0
  114. package/dist/types/client/hook/index.d.ts.map +1 -0
  115. package/dist/types/client/hook/use-balance.d.ts +18 -0
  116. package/dist/types/client/hook/use-balance.d.ts.map +1 -0
  117. package/dist/types/client/hook/use-clanker.d.ts +23 -0
  118. package/dist/types/client/hook/use-clanker.d.ts.map +1 -0
  119. package/dist/types/client/hook/use-deploy.d.ts +45 -0
  120. package/dist/types/client/hook/use-deploy.d.ts.map +1 -0
  121. package/dist/types/client/hook/use-fee-receivers.d.ts +26 -0
  122. package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -0
  123. package/dist/types/client/hook/use-governance.d.ts +145 -0
  124. package/dist/types/client/hook/use-governance.d.ts.map +1 -0
  125. package/dist/types/client/hook/use-prepare.d.ts +21 -0
  126. package/dist/types/client/hook/use-prepare.d.ts.map +1 -0
  127. package/dist/types/client/hook/use-project.d.ts +11 -0
  128. package/dist/types/client/hook/use-project.d.ts.map +1 -0
  129. package/dist/types/client/hook/use-projects.d.ts +6 -0
  130. package/dist/types/client/hook/use-projects.d.ts.map +1 -0
  131. package/dist/types/client/hook/use-proposals.d.ts +16 -0
  132. package/dist/types/client/hook/use-proposals.d.ts.map +1 -0
  133. package/dist/types/client/hook/use-register.d.ts +31 -0
  134. package/dist/types/client/hook/use-register.d.ts.map +1 -0
  135. package/dist/types/client/hook/use-stake.d.ts +195 -0
  136. package/dist/types/client/hook/use-stake.d.ts.map +1 -0
  137. package/dist/types/client/hook/use-swap.d.ts +59 -0
  138. package/dist/types/client/hook/use-swap.d.ts.map +1 -0
  139. package/dist/types/client/index.d.ts +4 -0
  140. package/dist/types/client/index.d.ts.map +1 -0
  141. package/dist/types/client/levr-provider.d.ts +127 -0
  142. package/dist/types/client/levr-provider.d.ts.map +1 -0
  143. package/dist/types/client/query-keys.d.ts +61 -0
  144. package/dist/types/client/query-keys.d.ts.map +1 -0
  145. package/dist/types/constants.d.ts +101 -0
  146. package/dist/types/constants.d.ts.map +1 -0
  147. package/dist/types/deploy-v4.d.ts +13 -0
  148. package/dist/types/deploy-v4.d.ts.map +1 -0
  149. package/dist/types/fee-receivers.d.ts +29 -0
  150. package/dist/types/fee-receivers.d.ts.map +1 -0
  151. package/dist/types/governance.d.ts +205 -0
  152. package/dist/types/governance.d.ts.map +1 -0
  153. package/dist/types/index.d.ts +18 -0
  154. package/dist/types/index.d.ts.map +1 -0
  155. package/dist/types/project.d.ts +51 -0
  156. package/dist/types/project.d.ts.map +1 -0
  157. package/dist/types/projects.d.ts +20 -0
  158. package/dist/types/projects.d.ts.map +1 -0
  159. package/dist/types/proposals.d.ts +20 -0
  160. package/dist/types/proposals.d.ts.map +1 -0
  161. package/dist/types/quote-v4.d.ts +54 -0
  162. package/dist/types/quote-v4.d.ts.map +1 -0
  163. package/dist/types/schema/base.schema.d.ts +5 -0
  164. package/dist/types/schema/base.schema.d.ts.map +1 -0
  165. package/dist/types/schema/clanker.schema.d.ts +104 -0
  166. package/dist/types/schema/clanker.schema.d.ts.map +1 -0
  167. package/dist/types/schema/index.d.ts +4 -0
  168. package/dist/types/schema/index.d.ts.map +1 -0
  169. package/dist/types/schema/levr.schema.d.ts +34 -0
  170. package/dist/types/schema/levr.schema.d.ts.map +1 -0
  171. package/dist/types/stake.d.ts +137 -0
  172. package/dist/types/stake.d.ts.map +1 -0
  173. package/dist/types/swap-v4.d.ts +97 -0
  174. package/dist/types/swap-v4.d.ts.map +1 -0
  175. package/dist/types/types.d.ts +20 -0
  176. package/dist/types/types.d.ts.map +1 -0
  177. package/dist/types/util.d.ts +5 -0
  178. package/dist/types/util.d.ts.map +1 -0
  179. package/package.json +100 -0
@@ -0,0 +1,389 @@
1
+ "use client";
2
+ import { useMutation, useQuery } from "@tanstack/react-query";
3
+ import { useMemo } from "react";
4
+ import { parseUnits } from "viem";
5
+ import { usePublicClient, useWalletClient } from "wagmi";
6
+ import { Governance } from "../../governance.js";
7
+ import { useLevrContext } from "../levr-provider.js";
8
+ import { queryKeys } from "../query-keys.js";
9
+ /**
10
+ * Internal: Creates global governance queries with all logic
11
+ * Used by LevrProvider
12
+ */
13
+ export function useGovernanceQueries({ clankerToken, projectData, enabled: e = true, }) {
14
+ const wallet = useWalletClient();
15
+ const publicClient = usePublicClient();
16
+ // Create Governance instance
17
+ const governance = useMemo(() => {
18
+ if (!wallet.data || !publicClient || !projectData || !clankerToken) {
19
+ return null;
20
+ }
21
+ return new Governance({
22
+ wallet: wallet.data,
23
+ publicClient,
24
+ governorAddress: projectData.governor,
25
+ tokenDecimals: projectData.token.decimals,
26
+ clankerToken,
27
+ });
28
+ }, [wallet.data, publicClient, projectData, clankerToken]);
29
+ const currentCycleId = useQuery({
30
+ queryKey: queryKeys.governance.currentCycleId(projectData?.governor),
31
+ queryFn: async () => {
32
+ if (!governance)
33
+ throw new Error("Governance not initialized");
34
+ return await governance.getCurrentCycleId();
35
+ },
36
+ enabled: e && !!governance && !!projectData,
37
+ retry: 1,
38
+ });
39
+ const addresses = useQuery({
40
+ queryKey: queryKeys.governance.addresses(projectData?.governor),
41
+ queryFn: async () => {
42
+ if (!governance)
43
+ throw new Error("Governance not initialized");
44
+ const [treasury, factory, stakedToken] = await Promise.all([
45
+ governance.getTreasury(),
46
+ governance.getFactory(),
47
+ governance.getStakedToken(),
48
+ ]);
49
+ return { treasury, factory, stakedToken };
50
+ },
51
+ enabled: e && !!governance && !!projectData,
52
+ retry: 1,
53
+ });
54
+ const airdropStatus = useQuery({
55
+ queryKey: queryKeys.governance.airdropStatus(projectData?.governor, clankerToken),
56
+ queryFn: async () => {
57
+ if (!governance)
58
+ throw new Error("Governance not initialized");
59
+ return await governance.getAirdropStatus();
60
+ },
61
+ enabled: e && !!governance && !!projectData && !!clankerToken,
62
+ retry: 1,
63
+ refetchInterval: 30000,
64
+ });
65
+ return {
66
+ currentCycleId,
67
+ addresses,
68
+ airdropStatus,
69
+ };
70
+ }
71
+ /**
72
+ * Hook for managing governance operations
73
+ * Global queries from LevrProvider, dynamic queries created per-component
74
+ */
75
+ export function useGovernance({ governorAddress, clankerToken: _clankerToken, tokenDecimals = 18, enabled = true, proposalId, cycleId, userAddress, onProposeTransferSuccess, onProposeTransferError, onProposeBoostSuccess, onProposeBoostError, onVoteSuccess, onVoteError, onExecuteProposalSuccess, onExecuteProposalError, onClaimAirdropSuccess, onClaimAirdropError, }) {
76
+ const { governance: governanceQueries, refetch, clankerToken } = useLevrContext();
77
+ const wallet = useWalletClient();
78
+ const publicClient = usePublicClient();
79
+ // Create governance instance for mutations
80
+ const governance = wallet.data && publicClient && clankerToken
81
+ ? new Governance({
82
+ wallet: wallet.data,
83
+ publicClient,
84
+ governorAddress,
85
+ tokenDecimals,
86
+ clankerToken,
87
+ })
88
+ : null;
89
+ // Global queries from context
90
+ const currentCycleId = governanceQueries.currentCycleId;
91
+ const addresses = governanceQueries.addresses;
92
+ const airdropStatus = governanceQueries.airdropStatus;
93
+ // Dynamic queries (component-specific)
94
+ const proposal = useQuery({
95
+ queryKey: queryKeys.governance.proposal(governorAddress, proposalId?.toString()),
96
+ queryFn: async () => {
97
+ if (!governance || !proposalId)
98
+ throw new Error("Governance not initialized or no proposal ID");
99
+ return await governance.getProposal(proposalId);
100
+ },
101
+ enabled: enabled && !!governance && proposalId !== undefined,
102
+ retry: 1,
103
+ });
104
+ const proposalsForCycle = useQuery({
105
+ queryKey: queryKeys.governance.proposalsForCycle(governorAddress, cycleId?.toString()),
106
+ queryFn: async () => {
107
+ if (!governance || cycleId === undefined)
108
+ throw new Error("Governance not initialized or no cycle ID");
109
+ return await governance.getProposalsForCycle(cycleId);
110
+ },
111
+ enabled: enabled && !!governance && cycleId !== undefined,
112
+ retry: 1,
113
+ });
114
+ const winner = useQuery({
115
+ queryKey: queryKeys.governance.winner(governorAddress, cycleId?.toString()),
116
+ queryFn: async () => {
117
+ if (!governance || cycleId === undefined)
118
+ throw new Error("Governance not initialized or no cycle ID");
119
+ return await governance.getWinner(cycleId);
120
+ },
121
+ enabled: enabled && !!governance && cycleId !== undefined,
122
+ retry: 1,
123
+ });
124
+ const voteReceipt = useQuery({
125
+ queryKey: [
126
+ "governance",
127
+ "voteReceipt",
128
+ governorAddress,
129
+ proposalId?.toString(),
130
+ userAddress || wallet.data?.account.address,
131
+ ],
132
+ queryFn: async () => {
133
+ if (!governance || !proposalId)
134
+ throw new Error("Governance not initialized or no proposal ID");
135
+ return await governance.getVoteReceipt(proposalId, userAddress);
136
+ },
137
+ enabled: enabled && !!governance && proposalId !== undefined,
138
+ retry: 1,
139
+ });
140
+ const votingPowerSnapshot = useQuery({
141
+ queryKey: [
142
+ "governance",
143
+ "votingPowerSnapshot",
144
+ governorAddress,
145
+ proposalId?.toString(),
146
+ userAddress || wallet.data?.account.address,
147
+ ],
148
+ queryFn: async () => {
149
+ if (!governance || !proposalId)
150
+ throw new Error("Governance not initialized or no proposal ID");
151
+ return await governance.getVotingPowerSnapshot(proposalId, userAddress);
152
+ },
153
+ enabled: enabled && !!governance && proposalId !== undefined,
154
+ retry: 1,
155
+ });
156
+ const meetsQuorum = useQuery({
157
+ queryKey: ["governance", "meetsQuorum", governorAddress, proposalId?.toString()],
158
+ queryFn: async () => {
159
+ if (!governance || !proposalId)
160
+ throw new Error("Governance not initialized or no proposal ID");
161
+ return await governance.meetsQuorum(proposalId);
162
+ },
163
+ enabled: enabled && !!governance && proposalId !== undefined,
164
+ retry: 1,
165
+ });
166
+ const meetsApproval = useQuery({
167
+ queryKey: ["governance", "meetsApproval", governorAddress, proposalId?.toString()],
168
+ queryFn: async () => {
169
+ if (!governance || !proposalId)
170
+ throw new Error("Governance not initialized or no proposal ID");
171
+ return await governance.meetsApproval(proposalId);
172
+ },
173
+ enabled: enabled && !!governance && proposalId !== undefined,
174
+ retry: 1,
175
+ });
176
+ const proposalState = useQuery({
177
+ queryKey: ["governance", "proposalState", governorAddress, proposalId?.toString()],
178
+ queryFn: async () => {
179
+ if (!governance || !proposalId)
180
+ throw new Error("Governance not initialized or no proposal ID");
181
+ return await governance.getProposalState(proposalId);
182
+ },
183
+ enabled: enabled && !!governance && proposalId !== undefined,
184
+ retry: 1,
185
+ });
186
+ const activeProposalCount = useQuery({
187
+ queryKey: ["governance", "activeProposalCount", governorAddress],
188
+ queryFn: async () => {
189
+ if (!governance)
190
+ throw new Error("Governance not initialized");
191
+ const [boostCount, transferCount] = await Promise.all([
192
+ governance.getActiveProposalCount(0),
193
+ governance.getActiveProposalCount(1),
194
+ ]);
195
+ return { boost: boostCount, transfer: transferCount };
196
+ },
197
+ enabled: enabled && !!governance,
198
+ retry: 1,
199
+ });
200
+ // Mutations
201
+ const vote = useMutation({
202
+ mutationFn: async ({ proposalId, support, }) => {
203
+ if (!governance)
204
+ throw new Error("Governance not initialized");
205
+ if (!wallet.data)
206
+ throw new Error("Wallet is not connected");
207
+ return await governance.vote(proposalId, support);
208
+ },
209
+ onSuccess: async (receipt) => {
210
+ await refetch.afterGovernance();
211
+ onVoteSuccess?.(receipt);
212
+ },
213
+ onError: onVoteError,
214
+ });
215
+ const proposeTransfer = useMutation({
216
+ mutationFn: async (config) => {
217
+ if (!governance)
218
+ throw new Error("Governance not initialized");
219
+ if (!wallet.data)
220
+ throw new Error("Wallet is not connected");
221
+ const amountBigInt = parseUnits(config.amount, config.amountDecimals);
222
+ const result = await governance.proposeTransfer(config.recipient, amountBigInt, config.description);
223
+ return result;
224
+ },
225
+ onSuccess: async (result) => {
226
+ await refetch.afterGovernance();
227
+ onProposeTransferSuccess?.(result.receipt, result.proposalId);
228
+ },
229
+ onError: onProposeTransferError,
230
+ });
231
+ const proposeBoost = useMutation({
232
+ mutationFn: async (config) => {
233
+ if (!governance)
234
+ throw new Error("Governance not initialized");
235
+ if (!wallet.data)
236
+ throw new Error("Wallet is not connected");
237
+ const amountBigInt = parseUnits(config.amount, config.amountDecimals);
238
+ const result = await governance.proposeBoost(amountBigInt);
239
+ return result;
240
+ },
241
+ onSuccess: async (result) => {
242
+ await refetch.afterGovernance();
243
+ onProposeBoostSuccess?.(result.receipt, result.proposalId);
244
+ },
245
+ onError: onProposeBoostError,
246
+ });
247
+ const executeProposal = useMutation({
248
+ mutationFn: async (config) => {
249
+ if (!governance)
250
+ throw new Error("Governance not initialized");
251
+ if (!wallet.data)
252
+ throw new Error("Wallet is not connected");
253
+ const receipt = await governance.executeProposal(config.proposalId);
254
+ return receipt;
255
+ },
256
+ onSuccess: async (receipt) => {
257
+ await refetch.afterGovernance();
258
+ onExecuteProposalSuccess?.(receipt);
259
+ },
260
+ onError: onExecuteProposalError,
261
+ });
262
+ const claimAirdrop = useMutation({
263
+ mutationFn: async () => {
264
+ if (!governance)
265
+ throw new Error("Governance not initialized");
266
+ if (!wallet.data)
267
+ throw new Error("Wallet is not connected");
268
+ return await governance.claimAirdrop();
269
+ },
270
+ onSuccess: async (receipt) => {
271
+ await refetch.afterGovernance();
272
+ onClaimAirdropSuccess?.(receipt);
273
+ },
274
+ onError: onClaimAirdropError,
275
+ });
276
+ const proposeAndExecuteTransfer = useMutation({
277
+ mutationFn: async (config) => {
278
+ if (!governance)
279
+ throw new Error("Governance not initialized");
280
+ const amountBigInt = parseUnits(config.amount, config.amountDecimals);
281
+ const result = await governance.proposeAndExecuteTransfer(config.recipient, amountBigInt, config.description);
282
+ return result;
283
+ },
284
+ onSuccess: async () => {
285
+ await refetch.afterGovernance();
286
+ },
287
+ });
288
+ const proposeAndExecuteBoost = useMutation({
289
+ mutationFn: async (config) => {
290
+ if (!governance)
291
+ throw new Error("Governance not initialized");
292
+ const amountBigInt = parseUnits(config.amount, config.amountDecimals);
293
+ const result = await governance.proposeAndExecuteBoost(amountBigInt);
294
+ return result;
295
+ },
296
+ onSuccess: async () => {
297
+ await refetch.afterGovernance();
298
+ },
299
+ });
300
+ // Helpers
301
+ const buildProposeTransferConfig = ({ recipient, amount, amountDecimals = tokenDecimals, description, }) => ({
302
+ recipient,
303
+ amount: amount.toString(),
304
+ amountDecimals,
305
+ description,
306
+ });
307
+ const buildProposeBoostConfig = ({ amount, amountDecimals = tokenDecimals, }) => ({
308
+ amount: amount.toString(),
309
+ amountDecimals,
310
+ });
311
+ const buildExecuteProposalConfig = ({ proposalId, }) => ({
312
+ proposalId,
313
+ });
314
+ return {
315
+ // Core mutations
316
+ proposeTransfer,
317
+ proposeBoost,
318
+ vote,
319
+ executeProposal,
320
+ claimAirdrop,
321
+ // Convenience mutations
322
+ proposeAndExecuteTransfer,
323
+ proposeAndExecuteBoost,
324
+ // Queries
325
+ proposal,
326
+ currentCycleId,
327
+ addresses,
328
+ airdropStatus,
329
+ proposalsForCycle,
330
+ winner,
331
+ voteReceipt,
332
+ votingPowerSnapshot,
333
+ meetsQuorum,
334
+ meetsApproval,
335
+ proposalState,
336
+ activeProposalCount,
337
+ // Convenience accessors - proposal data
338
+ proposalData: proposal.data,
339
+ proposalDescription: proposal.data?.description,
340
+ // Convenience accessors - cycle data
341
+ currentCycleIdValue: currentCycleId.data,
342
+ cycleProposals: proposalsForCycle.data,
343
+ winnerProposalId: winner.data,
344
+ // Convenience accessors - vote data
345
+ hasVoted: voteReceipt.data?.hasVoted ?? false,
346
+ voteSupport: voteReceipt.data?.support,
347
+ votesUsed: voteReceipt.data?.votes,
348
+ userVotingPower: votingPowerSnapshot.data,
349
+ // Convenience accessors - proposal status
350
+ proposalMeetsQuorum: meetsQuorum.data ?? false,
351
+ proposalMeetsApproval: meetsApproval.data ?? false,
352
+ proposalStateValue: proposalState.data,
353
+ // Convenience accessors - active counts
354
+ activeBoostProposals: activeProposalCount.data?.boost,
355
+ activeTransferProposals: activeProposalCount.data?.transfer,
356
+ // Convenience accessors - addresses
357
+ treasuryAddress: addresses.data?.treasury,
358
+ factoryAddress: addresses.data?.factory,
359
+ stakedTokenAddress: addresses.data?.stakedToken,
360
+ // Convenience accessors - airdrop
361
+ airdropStatusData: airdropStatus.data,
362
+ availableAirdropAmount: airdropStatus.data?.availableAmount,
363
+ airdropAllocatedAmount: airdropStatus.data?.allocatedAmount,
364
+ isAirdropAvailable: airdropStatus.data?.isAvailable ?? false,
365
+ airdropError: airdropStatus.data?.error,
366
+ // Helpers
367
+ buildProposeTransferConfig,
368
+ buildProposeBoostConfig,
369
+ buildExecuteProposalConfig,
370
+ // Status flags
371
+ isReady: !!governance && !!wallet.data,
372
+ isLoading: proposal.isLoading ||
373
+ currentCycleId.isLoading ||
374
+ addresses.isLoading ||
375
+ airdropStatus.isLoading ||
376
+ proposalsForCycle.isLoading ||
377
+ winner.isLoading ||
378
+ voteReceipt.isLoading ||
379
+ votingPowerSnapshot.isLoading ||
380
+ meetsQuorum.isLoading ||
381
+ meetsApproval.isLoading ||
382
+ proposalState.isLoading ||
383
+ activeProposalCount.isLoading,
384
+ isProposing: proposeTransfer.isPending || proposeBoost.isPending,
385
+ isVoting: vote.isPending,
386
+ isExecuting: executeProposal.isPending,
387
+ isClaiming: claimAirdrop.isPending,
388
+ };
389
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-governance.js","sourceRoot":"","sources":["../../../../src/client/hook/use-governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ import { decodeFunctionResult } from "viem";
4
+ import { usePublicClient, useWalletClient } from "wagmi";
5
+ import { LevrFactory_v1 } from "../../abis/index.js";
6
+ /**
7
+ * Prepares a project for the Levr factory registration.
8
+ * @param factoryAddress - The address of the Levr factory.
9
+ * @param options - The options for the prepare mutation.
10
+ * @returns The hash of the transaction.
11
+ */
12
+ export function usePrepare({ factoryAddress, onSuccess, onError }) {
13
+ const wallet = useWalletClient();
14
+ const publicClient = usePublicClient();
15
+ return useMutation({
16
+ mutationFn: async () => {
17
+ if (!wallet.data)
18
+ throw new Error("Wallet is not connected");
19
+ if (!factoryAddress)
20
+ throw new Error("Factory address is required");
21
+ const hash = await wallet.data.writeContract({
22
+ address: factoryAddress,
23
+ abi: LevrFactory_v1,
24
+ functionName: "prepareForDeployment",
25
+ });
26
+ const receipt = await publicClient?.waitForTransactionReceipt({ hash });
27
+ const data = receipt?.logs[0].data;
28
+ let treasury;
29
+ let staking;
30
+ if (data) {
31
+ ;
32
+ [treasury, staking] = decodeFunctionResult({
33
+ abi: LevrFactory_v1,
34
+ functionName: "prepareForDeployment",
35
+ data,
36
+ });
37
+ }
38
+ return {
39
+ hash,
40
+ treasury,
41
+ staking,
42
+ };
43
+ },
44
+ onSuccess,
45
+ onError,
46
+ });
47
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-prepare.js","sourceRoot":"","sources":["../../../../src/client/hook/use-prepare.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAY3C;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAoB;IACjF,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IAEtC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;YAC5D,IAAI,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAEnE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC3C,OAAO,EAAE,cAAc;gBACvB,GAAG,EAAE,cAAc;gBACnB,YAAY,EAAE,sBAAsB;aACrC,CAAC,CAAA;YAEF,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAElC,IAAI,QAAmC,CAAA;YACvC,IAAI,OAAkC,CAAA;YAEtC,IAAI,IAAI,EAAE,CAAC;gBACT,CAAC;gBAAA,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC;oBAC1C,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,sBAAsB;oBACpC,IAAI;iBACL,CAAC,CAAA;YACJ,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,QAAQ;gBACR,OAAO;aACR,CAAA;QACH,CAAC;QACD,SAAS;QACT,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useAccount, usePublicClient } from "wagmi";
4
+ import { GET_FACTORY_ADDRESS } from "../../constants.js";
5
+ import { project } from "../../project.js";
6
+ import { queryKeys } from "../query-keys.js";
7
+ /**
8
+ * Internal: Creates project query with all logic
9
+ * Used by LevrProvider
10
+ */
11
+ export function useProjectQuery({ clankerToken, enabled: e = true }) {
12
+ const { chainId } = useAccount();
13
+ const publicClient = usePublicClient();
14
+ const factoryAddress = GET_FACTORY_ADDRESS(chainId);
15
+ const enabled = !!publicClient && !!factoryAddress && !!clankerToken && e;
16
+ return useQuery({
17
+ queryKey: queryKeys.project(factoryAddress, clankerToken, chainId),
18
+ enabled,
19
+ queryFn: async () => {
20
+ return project({
21
+ publicClient: publicClient,
22
+ factoryAddress: factoryAddress,
23
+ chainId: chainId,
24
+ clankerToken: clankerToken,
25
+ });
26
+ },
27
+ staleTime: 15000,
28
+ });
29
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-project.js","sourceRoot":"","sources":["../../../../src/client/hook/use-project.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAOzC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAyB;IACxF,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAA;IAEzE,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,cAAe,EAAE,YAAa,EAAE,OAAQ,CAAC;QACrE,OAAO;QACP,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO,OAAO,CAAC;gBACb,YAAY,EAAE,YAAa;gBAC3B,cAAc,EAAE,cAAe;gBAC/B,OAAO,EAAE,OAAQ;gBACjB,YAAY,EAAE,YAAa;aAC5B,CAAC,CAAA;QACJ,CAAC;QACD,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useAccount, usePublicClient } from "wagmi";
4
+ import { GET_FACTORY_ADDRESS } from "../../constants.js";
5
+ import { projects } from "../../projects.js";
6
+ export function useProjects({ enabled: e = true, ...params } = {}) {
7
+ const { chainId } = useAccount();
8
+ const publicClient = usePublicClient();
9
+ const factoryAddress = GET_FACTORY_ADDRESS(chainId);
10
+ const enabled = !!publicClient && !!factoryAddress && e;
11
+ return useQuery({
12
+ queryKey: ["projects", factoryAddress, chainId, params],
13
+ enabled,
14
+ queryFn: () => projects({
15
+ publicClient: publicClient,
16
+ factoryAddress: factoryAddress,
17
+ chainId: chainId,
18
+ ...params,
19
+ }),
20
+ staleTime: 30000,
21
+ });
22
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-projects.js","sourceRoot":"","sources":["../../../../src/client/hook/use-projects.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAMzC,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,KAAwB,EAAE;IAClF,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAA;IAEvD,OAAO,QAAQ,CAAiB;QAC9B,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC;QACvD,OAAO;QACP,OAAO,EAAE,GAAG,EAAE,CACZ,QAAQ,CAAC;YACP,YAAY,EAAE,YAAa;YAC3B,cAAc,EAAE,cAAe;YAC/B,OAAO,EAAE,OAAQ;YACjB,GAAG,MAAM;SACV,CAAC;QACJ,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { usePublicClient } from "wagmi";
4
+ import { proposals as proposalsListQuery } from "../../proposals.js";
5
+ import { queryKeys } from "../query-keys.js";
6
+ /**
7
+ * Internal: Creates proposals query with all logic
8
+ * Used by LevrProvider
9
+ */
10
+ export function useProposalsQuery({ governorAddress, tokenDecimals = 18, enabled: e = true, }) {
11
+ const publicClient = usePublicClient();
12
+ return useQuery({
13
+ queryKey: queryKeys.proposals(governorAddress, tokenDecimals, undefined, "latest", 50),
14
+ queryFn: async () => {
15
+ if (!publicClient || !governorAddress)
16
+ return null;
17
+ return proposalsListQuery({
18
+ publicClient,
19
+ governorAddress,
20
+ tokenDecimals,
21
+ fromBlock: undefined,
22
+ toBlock: "latest",
23
+ pageSize: 50,
24
+ });
25
+ },
26
+ enabled: e && !!publicClient && !!governorAddress,
27
+ retry: 1,
28
+ staleTime: 5000,
29
+ refetchInterval: 30000,
30
+ });
31
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-proposals.js","sourceRoot":"","sources":["../../../../src/client/hook/use-proposals.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAYzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,eAAe,EACf,aAAa,GAAG,EAAE,EAClB,OAAO,EAAE,CAAC,GAAG,IAAI,GACO;IACxB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IAEtC,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,eAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC;QACvF,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe;gBAAE,OAAO,IAAI,CAAA;YAClD,OAAO,kBAAkB,CAAC;gBACxB,YAAY;gBACZ,eAAe;gBACf,aAAa;gBACb,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,EAAE;aACb,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,eAAe;QACjD,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,KAAK;KACvB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,101 @@
1
+ "use client";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ import { decodeEventLog, encodeFunctionData } from "viem";
4
+ import { usePublicClient, useWalletClient } from "wagmi";
5
+ import { LevrFactory_v1, LevrForwarder_v1 } from "../../abis/index.js";
6
+ import { GET_FACTORY_ADDRESS } from "../../constants.js";
7
+ /**
8
+ * Registers a project with the Levr factory.
9
+ * @param factoryAddress - The address of the Levr factory.
10
+ * @param options - The options for the register mutation.
11
+ * @returns The hash of the transaction.
12
+ */
13
+ export function useRegister({ onSuccess, onError }) {
14
+ const wallet = useWalletClient();
15
+ const publicClient = usePublicClient();
16
+ const chainId = publicClient?.chain?.id;
17
+ const factoryAddress = GET_FACTORY_ADDRESS(chainId);
18
+ return useMutation({
19
+ mutationFn: async (params) => {
20
+ if (!wallet.data)
21
+ throw new Error("Wallet is not connected");
22
+ if (!factoryAddress)
23
+ throw new Error("Factory address is required");
24
+ if (!publicClient)
25
+ throw new Error("Public client is not connected");
26
+ const prepareTransaction = encodeFunctionData({
27
+ abi: LevrFactory_v1,
28
+ functionName: "prepareForDeployment",
29
+ args: [],
30
+ });
31
+ const registerTransaction = encodeFunctionData({
32
+ abi: LevrFactory_v1,
33
+ functionName: "register",
34
+ args: [params.clankerToken],
35
+ });
36
+ const callDatas = [
37
+ {
38
+ target: factoryAddress,
39
+ allowFailure: false,
40
+ value: 0n,
41
+ callData: prepareTransaction,
42
+ },
43
+ {
44
+ target: factoryAddress,
45
+ allowFailure: false,
46
+ value: 0n,
47
+ callData: registerTransaction,
48
+ },
49
+ ];
50
+ const forwarderAddress = await publicClient.readContract({
51
+ address: factoryAddress,
52
+ abi: LevrFactory_v1,
53
+ functionName: "trustedForwarder",
54
+ });
55
+ const hash = await wallet.data.writeContract({
56
+ address: forwarderAddress,
57
+ abi: LevrForwarder_v1,
58
+ functionName: "executeMulticall",
59
+ args: [callDatas],
60
+ });
61
+ const receipt = await publicClient?.waitForTransactionReceipt({ hash });
62
+ let project;
63
+ // Find the Registered event (emitted by LevrFactory_v1.register)
64
+ const registeredLog = receipt?.logs.find((log) => {
65
+ try {
66
+ const decoded = decodeEventLog({
67
+ abi: LevrFactory_v1,
68
+ data: log.data,
69
+ topics: log.topics,
70
+ });
71
+ return decoded.eventName === "Registered";
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ });
77
+ if (registeredLog) {
78
+ const decoded = decodeEventLog({
79
+ abi: LevrFactory_v1,
80
+ data: registeredLog.data,
81
+ topics: registeredLog.topics,
82
+ });
83
+ if (decoded.eventName === "Registered") {
84
+ // Event signature: Registered(address indexed clankerToken, address indexed treasury, address governor, address staking, address stakedToken)
85
+ project = {
86
+ treasury: decoded.args.treasury,
87
+ governor: decoded.args.governor,
88
+ staking: decoded.args.staking,
89
+ stakedToken: decoded.args.stakedToken,
90
+ };
91
+ }
92
+ }
93
+ return {
94
+ hash,
95
+ project,
96
+ };
97
+ },
98
+ onSuccess,
99
+ onError,
100
+ });
101
+ }