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,98 +0,0 @@
1
- import { formatUnits } from "viem";
2
- import { LevrGovernor_v1 } from "./abis/index.js";
3
- const proposalCreatedEvent = LevrGovernor_v1.find((item) => item.type === "event" && item.name === "ProposalCreated");
4
- /**
5
- * Get multiple proposals data from governor contract
6
- */
7
- export async function proposals({ publicClient, governorAddress, tokenDecimals = 18, fromBlock, toBlock = "latest", pageSize = 50, }) {
8
- if (Object.values({ publicClient, governorAddress }).some((value) => !value)) {
9
- throw new Error("Invalid proposals params");
10
- }
11
- // Determine block range
12
- const latestBlock = await publicClient.getBlockNumber();
13
- const from = fromBlock ?? latestBlock - latestBlock / 10n; // Default to last 10% of blocks
14
- const to = toBlock === "latest" ? latestBlock : toBlock;
15
- // Fetch ProposalCreated events - indexed events are efficient even across large ranges
16
- const allLogs = (await publicClient.getLogs({
17
- address: governorAddress,
18
- event: proposalCreatedEvent,
19
- fromBlock: from,
20
- toBlock: to,
21
- }));
22
- // Sort by block number descending (most recent first)
23
- const logs = allLogs.sort((a, b) => {
24
- if (a.blockNumber > b.blockNumber)
25
- return -1;
26
- if (a.blockNumber < b.blockNumber)
27
- return 1;
28
- return 0;
29
- });
30
- // Limit to pageSize
31
- const limitedLogs = logs.slice(0, pageSize);
32
- if (limitedLogs.length === 0) {
33
- return {
34
- proposals: [],
35
- fromBlock: from,
36
- toBlock: to,
37
- };
38
- }
39
- // Extract proposal IDs from events
40
- const proposalIds = limitedLogs.map((log) => log.args.proposalId);
41
- // Batch fetch all proposal details
42
- const contracts = proposalIds.map((proposalId) => ({
43
- address: governorAddress,
44
- abi: LevrGovernor_v1,
45
- functionName: "getProposal",
46
- args: [proposalId],
47
- }));
48
- const results = await publicClient.multicall({ contracts });
49
- // Parse results into FormattedProposalDetails objects
50
- const proposals = [];
51
- for (let i = 0; i < proposalIds.length; i++) {
52
- const result = results[i].result;
53
- // Skip if proposal data is invalid
54
- if (!result) {
55
- continue;
56
- }
57
- proposals.push({
58
- id: result.id,
59
- proposalType: result.proposalType,
60
- proposer: result.proposer,
61
- amount: {
62
- raw: result.amount,
63
- formatted: formatUnits(result.amount, tokenDecimals),
64
- },
65
- recipient: result.recipient,
66
- description: result.description,
67
- createdAt: {
68
- timestamp: result.createdAt,
69
- date: new Date(Number(result.createdAt) * 1000),
70
- },
71
- votingStartsAt: {
72
- timestamp: result.votingStartsAt,
73
- date: new Date(Number(result.votingStartsAt) * 1000),
74
- },
75
- votingEndsAt: {
76
- timestamp: result.votingEndsAt,
77
- date: new Date(Number(result.votingEndsAt) * 1000),
78
- },
79
- yesVotes: {
80
- raw: result.yesVotes,
81
- formatted: formatUnits(result.yesVotes, tokenDecimals),
82
- },
83
- noVotes: {
84
- raw: result.noVotes,
85
- formatted: formatUnits(result.noVotes, tokenDecimals),
86
- },
87
- totalBalanceVoted: result.totalBalanceVoted,
88
- executed: result.executed,
89
- cycleId: result.cycleId,
90
- });
91
- }
92
- return {
93
- proposals,
94
- fromBlock: from,
95
- toBlock: to,
96
- };
97
- }
98
- //# sourceMappingURL=proposals.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/proposals.ts"],"names":[],"mappings":"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"}
@@ -1,169 +0,0 @@
1
- import { encodeAbiParameters, keccak256 } from "viem";
2
- import { IClankerHookDynamicFee, IClankerHookStaticFee, V4Quoter } from "./abis/index.js";
3
- import { UNISWAP_V4_QUOTER } from "./constants.js";
4
- /**
5
- * @description Try to get static fees from a Clanker hook using multicall
6
- * @param publicClient Public client
7
- * @param hookAddress Hook address
8
- * @param poolId Pool ID
9
- * @returns Static fees or undefined
10
- */
11
- const tryGetStaticFees = async (publicClient, hookAddress, poolId) => {
12
- try {
13
- const results = await publicClient.multicall({
14
- contracts: [
15
- {
16
- address: hookAddress,
17
- abi: IClankerHookStaticFee,
18
- functionName: "clankerFee",
19
- args: [poolId],
20
- },
21
- {
22
- address: hookAddress,
23
- abi: IClankerHookStaticFee,
24
- functionName: "pairedFee",
25
- args: [poolId],
26
- },
27
- ],
28
- });
29
- if (results[0].status === "success" && results[1].status === "success") {
30
- return {
31
- clankerFee: Number(results[0].result),
32
- pairedFee: Number(results[1].result),
33
- };
34
- }
35
- return undefined;
36
- }
37
- catch {
38
- return undefined;
39
- }
40
- };
41
- /**
42
- * @description Try to get dynamic fee configuration from a Clanker hook
43
- * @param publicClient Public client
44
- * @param hookAddress Hook address
45
- * @param poolId Pool ID
46
- * @returns Dynamic fee config or undefined
47
- */
48
- const tryGetDynamicFees = async (publicClient, hookAddress, poolId) => {
49
- try {
50
- const config = await publicClient.readContract({
51
- address: hookAddress,
52
- abi: IClankerHookDynamicFee,
53
- functionName: "poolConfigVars",
54
- args: [poolId],
55
- });
56
- return {
57
- baseFee: Number(config.baseFee),
58
- maxLpFee: Number(config.maxLpFee),
59
- };
60
- }
61
- catch {
62
- return undefined;
63
- }
64
- };
65
- /**
66
- * @description Get hook fee information from Clanker hooks
67
- * @param publicClient Public client
68
- * @param poolKey Pool key containing hook address
69
- * @returns Hook fee information or undefined
70
- */
71
- const getHookFees = async (publicClient, poolKey) => {
72
- // Generate pool ID for hook queries (keccak256 of abi.encode(PoolKey))
73
- const poolId = keccak256(encodeAbiParameters([
74
- {
75
- type: "tuple",
76
- components: [
77
- { name: "currency0", type: "address" },
78
- { name: "currency1", type: "address" },
79
- { name: "fee", type: "uint24" },
80
- { name: "tickSpacing", type: "int24" },
81
- { name: "hooks", type: "address" },
82
- ],
83
- },
84
- ], [poolKey]));
85
- // Try static fees first
86
- const staticFees = await tryGetStaticFees(publicClient, poolKey.hooks, poolId);
87
- if (staticFees) {
88
- return {
89
- type: "static",
90
- clankerFee: staticFees.clankerFee,
91
- pairedFee: staticFees.pairedFee,
92
- };
93
- }
94
- // Try dynamic fees
95
- const dynamicFees = await tryGetDynamicFees(publicClient, poolKey.hooks, poolId);
96
- if (dynamicFees) {
97
- return {
98
- type: "dynamic",
99
- baseFee: dynamicFees.baseFee,
100
- maxLpFee: dynamicFees.maxLpFee,
101
- };
102
- }
103
- return undefined;
104
- };
105
- /**
106
- * @description Get a swap quote from Uniswap V4 Quoter
107
- * @param params Quote parameters including pool key and amount
108
- * @returns Quote result with output amount, gas estimate, and hook fees
109
- *
110
- * @remarks
111
- * The V4Quoter uses state-changing calls that are simulated via static call.
112
- * The quoter returns the expected output amount for the given input.
113
- *
114
- * This function works for both native ETH and ERC20 swaps:
115
- * - Native ETH → Token: Quote uses WETH address, swap router handles wrapping
116
- * - Token → Native ETH: Quote uses WETH address, swap router handles unwrapping
117
- *
118
- * @example
119
- * ```typescript
120
- * const quote = await quoteV4({
121
- * publicClient,
122
- * chainId: base.id,
123
- * poolKey,
124
- * zeroForOne: true,
125
- * amountIn: parseEther('1'),
126
- * })
127
- * console.log(`Output: ${formatEther(quote.amountOut)}`)
128
- * console.log(`Fees:`, quote.hookFees)
129
- * ```
130
- */
131
- export const quoteV4 = async ({ publicClient, chainId, poolKey, zeroForOne, amountIn, hookData = "0x", }) => {
132
- const quoterAddress = UNISWAP_V4_QUOTER(chainId);
133
- if (!quoterAddress)
134
- throw new Error("V4 Quoter address not found for chain");
135
- // Always fetch hook fee information (in parallel with quote)
136
- const hookFeesPromise = getHookFees(publicClient, poolKey);
137
- // Call the quoter using simulateContract (static call simulation)
138
- // This is equivalent to ethers.js callStatic
139
- const [{ result }, hookFees] = await Promise.all([
140
- publicClient.simulateContract({
141
- address: quoterAddress,
142
- abi: V4Quoter,
143
- functionName: "quoteExactInputSingle",
144
- args: [
145
- {
146
- poolKey: {
147
- currency0: poolKey.currency0,
148
- currency1: poolKey.currency1,
149
- fee: poolKey.fee,
150
- tickSpacing: poolKey.tickSpacing,
151
- hooks: poolKey.hooks,
152
- },
153
- zeroForOne,
154
- exactAmount: amountIn,
155
- hookData,
156
- },
157
- ],
158
- }),
159
- hookFeesPromise,
160
- ]);
161
- // The quoter returns [amountOut: bigint, gasEstimate: bigint]
162
- const [amountOut, gasEstimate] = result;
163
- return {
164
- amountOut,
165
- gasEstimate,
166
- hookFees,
167
- };
168
- };
169
- //# sourceMappingURL=quote-v4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quote-v4.js","sourceRoot":"","sources":["../../src/quote-v4.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { Address } from 'viem';
2
- import type { TokenConfig } from '../../balance';
3
- export type UseBalanceParams = {
4
- tokens?: TokenConfig[];
5
- enabled?: boolean;
6
- refetchInterval?: number | false;
7
- };
8
- export type UseBalanceQueryParams = {
9
- clankerToken: Address | null;
10
- projectTokenDecimals?: number;
11
- enabled?: boolean;
12
- };
13
- /**
14
- * Internal: Creates balance query with all logic
15
- * Used by LevrProvider
16
- */
17
- export declare function useBalanceQuery({ clankerToken, projectTokenDecimals, enabled: e, }: UseBalanceQueryParams): import("@tanstack/react-query").UseQueryResult<Record<string, import("../..").BalanceResult>, Error>;
18
- //# sourceMappingURL=use-balance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-balance.d.ts","sourceRoot":"","sources":["../../../../src/client/hook/use-balance.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAInC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,YAAY,EACZ,oBAAyB,EACzB,OAAO,EAAE,CAAQ,GAClB,EAAE,qBAAqB,wGAgDvB"}
@@ -1,6 +0,0 @@
1
- import type { ProjectsParams, ProjectsResult } from '../../projects';
2
- export type UseProjectsParams = {
3
- enabled?: boolean;
4
- } & Omit<ProjectsParams, 'publicClient' | 'factoryAddress' | 'chainId'>;
5
- export declare function useProjects({ enabled: e, ...params }?: UseProjectsParams): import("@tanstack/react-query").UseQueryResult<ProjectsResult, Error>;
6
- //# sourceMappingURL=use-projects.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-projects.d.ts","sourceRoot":"","sources":["../../../../src/client/hook/use-projects.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,IAAI,CAAC,cAAc,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAA;AAEvE,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAQ,EAAE,GAAG,MAAM,EAAE,GAAE,iBAAsB,yEAmBnF"}
@@ -1,16 +0,0 @@
1
- import type { Address } from 'viem';
2
- import type { ProposalsParams } from '../../proposals';
3
- export type UseProposalsParams = Omit<ProposalsParams, 'publicClient'> & {
4
- enabled?: boolean;
5
- };
6
- export type UseProposalsQueryParams = {
7
- governorAddress?: Address;
8
- tokenDecimals?: number;
9
- enabled?: boolean;
10
- };
11
- /**
12
- * Internal: Creates proposals query with all logic
13
- * Used by LevrProvider
14
- */
15
- export declare function useProposalsQuery({ governorAddress, tokenDecimals, enabled: e, }: UseProposalsQueryParams): import("@tanstack/react-query").UseQueryResult<import("../..").ProposalsResult | null, Error>;
16
- //# sourceMappingURL=use-proposals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-proposals.d.ts","sourceRoot":"","sources":["../../../../src/client/hook/use-proposals.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAItD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,GAAG;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,eAAe,EACf,aAAkB,EAClB,OAAO,EAAE,CAAQ,GAClB,EAAE,uBAAuB,iGAqBzB"}
@@ -1,20 +0,0 @@
1
- import type { Project } from './project';
2
- import type { PopPublicClient } from './types';
3
- export type ProjectsParams = {
4
- publicClient: PopPublicClient;
5
- factoryAddress: `0x${string}`;
6
- chainId: number;
7
- fromBlock?: bigint;
8
- toBlock?: bigint | 'latest';
9
- pageSize?: number;
10
- };
11
- export type ProjectsResult = {
12
- projects: Omit<Project, 'forwarder'>[];
13
- fromBlock: bigint;
14
- toBlock: bigint;
15
- };
16
- /**
17
- * Get multiple projects data
18
- */
19
- export declare function projects({ publicClient, factoryAddress, chainId, fromBlock, toBlock, pageSize, }: ProjectsParams): Promise<ProjectsResult>;
20
- //# sourceMappingURL=projects.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/projects.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAY,OAAO,EAAkC,MAAM,WAAW,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,eAAe,CAAA;IAC7B,cAAc,EAAE,KAAK,MAAM,EAAE,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAcD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAC7B,YAAY,EACZ,cAAc,EACd,OAAO,EACP,SAAS,EACT,OAAkB,EAClB,QAAc,GACf,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA+O1C"}
@@ -1,20 +0,0 @@
1
- import type { FormattedProposalDetails } from './governance';
2
- import type { PopPublicClient } from './types';
3
- export type ProposalsParams = {
4
- publicClient: PopPublicClient;
5
- governorAddress: `0x${string}`;
6
- tokenDecimals?: number;
7
- fromBlock?: bigint;
8
- toBlock?: bigint | 'latest';
9
- pageSize?: number;
10
- };
11
- export type ProposalsResult = {
12
- proposals: FormattedProposalDetails[];
13
- fromBlock: bigint;
14
- toBlock: bigint;
15
- };
16
- /**
17
- * Get multiple proposals data from governor contract
18
- */
19
- export declare function proposals({ publicClient, governorAddress, tokenDecimals, fromBlock, toBlock, pageSize, }: ProposalsParams): Promise<ProposalsResult>;
20
- //# sourceMappingURL=proposals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/proposals.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,eAAe,CAAA;IAC7B,eAAe,EAAE,KAAK,MAAM,EAAE,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,wBAAwB,EAAE,CAAA;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAcD;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAC9B,YAAY,EACZ,eAAe,EACf,aAAkB,EAClB,SAAS,EACT,OAAkB,EAClB,QAAa,GACd,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAoH5C"}
@@ -1,54 +0,0 @@
1
- import type { PublicClient } from 'viem';
2
- import type { PoolKey } from './types';
3
- export type QuoteV4Params = {
4
- publicClient: PublicClient;
5
- chainId: number;
6
- poolKey: PoolKey;
7
- zeroForOne: boolean;
8
- amountIn: bigint;
9
- hookData?: `0x${string}`;
10
- };
11
- export type QuoteV4ReturnType = {
12
- amountOut: bigint;
13
- gasEstimate: bigint;
14
- /**
15
- * Fee information from Clanker hooks (if available)
16
- * - Static fees: clankerFee and pairedFee in basis points
17
- * - Dynamic fees: baseFee and maxLpFee in basis points
18
- */
19
- hookFees?: {
20
- type: 'static' | 'dynamic';
21
- clankerFee?: number;
22
- pairedFee?: number;
23
- baseFee?: number;
24
- maxLpFee?: number;
25
- };
26
- };
27
- /**
28
- * @description Get a swap quote from Uniswap V4 Quoter
29
- * @param params Quote parameters including pool key and amount
30
- * @returns Quote result with output amount, gas estimate, and hook fees
31
- *
32
- * @remarks
33
- * The V4Quoter uses state-changing calls that are simulated via static call.
34
- * The quoter returns the expected output amount for the given input.
35
- *
36
- * This function works for both native ETH and ERC20 swaps:
37
- * - Native ETH → Token: Quote uses WETH address, swap router handles wrapping
38
- * - Token → Native ETH: Quote uses WETH address, swap router handles unwrapping
39
- *
40
- * @example
41
- * ```typescript
42
- * const quote = await quoteV4({
43
- * publicClient,
44
- * chainId: base.id,
45
- * poolKey,
46
- * zeroForOne: true,
47
- * amountIn: parseEther('1'),
48
- * })
49
- * console.log(`Output: ${formatEther(quote.amountOut)}`)
50
- * console.log(`Fees:`, quote.hookFees)
51
- * ```
52
- */
53
- export declare const quoteV4: ({ publicClient, chainId, poolKey, zeroForOne, amountIn, hookData, }: QuoteV4Params) => Promise<QuoteV4ReturnType>;
54
- //# sourceMappingURL=quote-v4.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quote-v4.d.ts","sourceRoot":"","sources":["../../src/quote-v4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAKxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,YAAY,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACF,CAAA;AA4HD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,OAAO,GAAU,qEAO3B,aAAa,KAAG,OAAO,CAAC,iBAAiB,CAwC3C,CAAA"}