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.
- package/LICENSE.md +201 -0
- package/README.md +711 -0
- package/dist/esm/abis/IClankerAirdrop.js +443 -0
- package/dist/esm/abis/IClankerHookDynamicFee.js +198 -0
- package/dist/esm/abis/IClankerHookStaticFee.js +75 -0
- package/dist/esm/abis/IClankerLPLocker.js +402 -0
- package/dist/esm/abis/IClankerLpLockerMultiple.js +609 -0
- package/dist/esm/abis/IClankerToken.js +421 -0
- package/dist/esm/abis/LevrFactory_v1.js +608 -0
- package/dist/esm/abis/LevrForwarder_v1.js +622 -0
- package/dist/esm/abis/LevrGovernor_v1.js +726 -0
- package/dist/esm/abis/LevrStakedToken_v1.js +441 -0
- package/dist/esm/abis/LevrStaking_v1.js +607 -0
- package/dist/esm/abis/LevrTreasury_v1.js +219 -0
- package/dist/esm/abis/Permit2.js +29 -0
- package/dist/esm/abis/V4Quoter.js +466 -0
- package/dist/esm/abis/WETH9.js +153 -0
- package/dist/esm/abis/index.js +23 -0
- package/dist/esm/balance.js +72 -0
- package/dist/esm/balance.js.map +1 -0
- package/dist/esm/build-calldatas-v4.js +98 -0
- package/dist/esm/build-calldatas-v4.js.map +1 -0
- package/dist/esm/build-clanker-v4.js +128 -0
- package/dist/esm/build-clanker-v4.js.map +1 -0
- package/dist/esm/client/hook/index.js +36 -0
- package/dist/esm/client/hook/index.js.map +1 -0
- package/dist/esm/client/hook/use-balance.js +56 -0
- package/dist/esm/client/hook/use-balance.js.map +1 -0
- package/dist/esm/client/hook/use-clanker.js +57 -0
- package/dist/esm/client/hook/use-clanker.js.map +1 -0
- package/dist/esm/client/hook/use-deploy.js +16 -0
- package/dist/esm/client/hook/use-deploy.js.map +1 -0
- package/dist/esm/client/hook/use-fee-receivers.js +54 -0
- package/dist/esm/client/hook/use-fee-receivers.js.map +1 -0
- package/dist/esm/client/hook/use-governance.js +389 -0
- package/dist/esm/client/hook/use-governance.js.map +1 -0
- package/dist/esm/client/hook/use-prepare.js +47 -0
- package/dist/esm/client/hook/use-prepare.js.map +1 -0
- package/dist/esm/client/hook/use-project.js +29 -0
- package/dist/esm/client/hook/use-project.js.map +1 -0
- package/dist/esm/client/hook/use-projects.js +22 -0
- package/dist/esm/client/hook/use-projects.js.map +1 -0
- package/dist/esm/client/hook/use-proposals.js +31 -0
- package/dist/esm/client/hook/use-proposals.js.map +1 -0
- package/dist/esm/client/hook/use-register.js +101 -0
- package/dist/esm/client/hook/use-register.js.map +1 -0
- package/dist/esm/client/hook/use-stake.js +327 -0
- package/dist/esm/client/hook/use-stake.js.map +1 -0
- package/dist/esm/client/hook/use-swap.js +110 -0
- package/dist/esm/client/hook/use-swap.js.map +1 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/levr-provider.js +201 -0
- package/dist/esm/client/levr-provider.js.map +1 -0
- package/dist/esm/client/query-keys.js +61 -0
- package/dist/esm/client/query-keys.js.map +1 -0
- package/dist/esm/constants.js +182 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/deploy-v4.js +46 -0
- package/dist/esm/deploy-v4.js.map +1 -0
- package/dist/esm/fee-receivers.js +52 -0
- package/dist/esm/fee-receivers.js.map +1 -0
- package/dist/esm/governance.js +555 -0
- package/dist/esm/governance.js.map +1 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/project.js +146 -0
- package/dist/esm/project.js.map +1 -0
- package/dist/esm/projects.js +212 -0
- package/dist/esm/projects.js.map +1 -0
- package/dist/esm/proposals.js +98 -0
- package/dist/esm/proposals.js.map +1 -0
- package/dist/esm/quote-v4.js +169 -0
- package/dist/esm/quote-v4.js.map +1 -0
- package/dist/esm/schema/base.schema.js +11 -0
- package/dist/esm/schema/base.schema.js.map +1 -0
- package/dist/esm/schema/clanker.schema.js +191 -0
- package/dist/esm/schema/clanker.schema.js.map +1 -0
- package/dist/esm/schema/index.js +4 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/levr.schema.js +114 -0
- package/dist/esm/schema/levr.schema.js.map +1 -0
- package/dist/esm/stake.js +384 -0
- package/dist/esm/stake.js.map +1 -0
- package/dist/esm/swap-v4.js +281 -0
- package/dist/esm/swap-v4.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.js +19 -0
- package/dist/esm/util.js.map +1 -0
- package/dist/types/abis/IClankerAirdrop.d.ts +348 -0
- package/dist/types/abis/IClankerHookDynamicFee.d.ts +156 -0
- package/dist/types/abis/IClankerHookStaticFee.d.ts +58 -0
- package/dist/types/abis/IClankerLPLocker.d.ts +316 -0
- package/dist/types/abis/IClankerLpLockerMultiple.d.ts +481 -0
- package/dist/types/abis/IClankerToken.d.ts +326 -0
- package/dist/types/abis/LevrFactory_v1.d.ts +471 -0
- package/dist/types/abis/LevrForwarder_v1.d.ts +478 -0
- package/dist/types/abis/LevrGovernor_v1.d.ts +562 -0
- package/dist/types/abis/LevrStakedToken_v1.d.ts +338 -0
- package/dist/types/abis/LevrStaking_v1.d.ts +468 -0
- package/dist/types/abis/LevrTreasury_v1.d.ts +169 -0
- package/dist/types/abis/Permit2.d.ts +54 -0
- package/dist/types/abis/V4Quoter.d.ts +496 -0
- package/dist/types/abis/WETH9.d.ts +244 -0
- package/dist/types/abis/index.d.ts +15 -0
- package/dist/types/balance.d.ts +24 -0
- package/dist/types/balance.d.ts.map +1 -0
- package/dist/types/build-calldatas-v4.d.ts +20 -0
- package/dist/types/build-calldatas-v4.d.ts.map +1 -0
- package/dist/types/build-clanker-v4.d.ts +12 -0
- package/dist/types/build-clanker-v4.d.ts.map +1 -0
- package/dist/types/client/hook/index.d.ts +32 -0
- package/dist/types/client/hook/index.d.ts.map +1 -0
- package/dist/types/client/hook/use-balance.d.ts +18 -0
- package/dist/types/client/hook/use-balance.d.ts.map +1 -0
- package/dist/types/client/hook/use-clanker.d.ts +23 -0
- package/dist/types/client/hook/use-clanker.d.ts.map +1 -0
- package/dist/types/client/hook/use-deploy.d.ts +45 -0
- package/dist/types/client/hook/use-deploy.d.ts.map +1 -0
- package/dist/types/client/hook/use-fee-receivers.d.ts +26 -0
- package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -0
- package/dist/types/client/hook/use-governance.d.ts +145 -0
- package/dist/types/client/hook/use-governance.d.ts.map +1 -0
- package/dist/types/client/hook/use-prepare.d.ts +21 -0
- package/dist/types/client/hook/use-prepare.d.ts.map +1 -0
- package/dist/types/client/hook/use-project.d.ts +11 -0
- package/dist/types/client/hook/use-project.d.ts.map +1 -0
- package/dist/types/client/hook/use-projects.d.ts +6 -0
- package/dist/types/client/hook/use-projects.d.ts.map +1 -0
- package/dist/types/client/hook/use-proposals.d.ts +16 -0
- package/dist/types/client/hook/use-proposals.d.ts.map +1 -0
- package/dist/types/client/hook/use-register.d.ts +31 -0
- package/dist/types/client/hook/use-register.d.ts.map +1 -0
- package/dist/types/client/hook/use-stake.d.ts +195 -0
- package/dist/types/client/hook/use-stake.d.ts.map +1 -0
- package/dist/types/client/hook/use-swap.d.ts +59 -0
- package/dist/types/client/hook/use-swap.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +4 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/client/levr-provider.d.ts +127 -0
- package/dist/types/client/levr-provider.d.ts.map +1 -0
- package/dist/types/client/query-keys.d.ts +61 -0
- package/dist/types/client/query-keys.d.ts.map +1 -0
- package/dist/types/constants.d.ts +101 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/deploy-v4.d.ts +13 -0
- package/dist/types/deploy-v4.d.ts.map +1 -0
- package/dist/types/fee-receivers.d.ts +29 -0
- package/dist/types/fee-receivers.d.ts.map +1 -0
- package/dist/types/governance.d.ts +205 -0
- package/dist/types/governance.d.ts.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/project.d.ts +51 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/projects.d.ts +20 -0
- package/dist/types/projects.d.ts.map +1 -0
- package/dist/types/proposals.d.ts +20 -0
- package/dist/types/proposals.d.ts.map +1 -0
- package/dist/types/quote-v4.d.ts +54 -0
- package/dist/types/quote-v4.d.ts.map +1 -0
- package/dist/types/schema/base.schema.d.ts +5 -0
- package/dist/types/schema/base.schema.d.ts.map +1 -0
- package/dist/types/schema/clanker.schema.d.ts +104 -0
- package/dist/types/schema/clanker.schema.d.ts.map +1 -0
- package/dist/types/schema/index.d.ts +4 -0
- package/dist/types/schema/index.d.ts.map +1 -0
- package/dist/types/schema/levr.schema.d.ts +34 -0
- package/dist/types/schema/levr.schema.d.ts.map +1 -0
- package/dist/types/stake.d.ts +137 -0
- package/dist/types/stake.d.ts.map +1 -0
- package/dist/types/swap-v4.d.ts +97 -0
- package/dist/types/swap-v4.d.ts.map +1 -0
- package/dist/types/types.d.ts +20 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/util.d.ts +5 -0
- package/dist/types/util.d.ts.map +1 -0
- 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
|
+
}
|