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
@@ -0,0 +1,188 @@
1
+ import type { Project } from './project';
2
+ import type { BalanceResult, PopPublicClient } from './types';
3
+ export type UserParams = {
4
+ publicClient: PopPublicClient;
5
+ userAddress: `0x${string}`;
6
+ project: Project;
7
+ };
8
+ export type UserBalances = {
9
+ token: BalanceResult;
10
+ weth: BalanceResult;
11
+ eth: BalanceResult;
12
+ };
13
+ export type UserStaking = {
14
+ stakedBalance: BalanceResult;
15
+ allowance: BalanceResult;
16
+ claimableRewards: {
17
+ staking: BalanceResult;
18
+ weth: BalanceResult | null;
19
+ };
20
+ };
21
+ export type User = {
22
+ balances: UserBalances;
23
+ staking: UserStaking;
24
+ votingPower: BalanceResult;
25
+ };
26
+ /**
27
+ * Helper: Get balance contracts for multicall composition
28
+ */
29
+ export declare function balanceContracts(params: {
30
+ userAddress: `0x${string}`;
31
+ clankerToken: `0x${string}`;
32
+ wethAddress?: `0x${string}`;
33
+ }): {
34
+ address: `0x${string}`;
35
+ abi: readonly [{
36
+ readonly type: "event";
37
+ readonly name: "Approval";
38
+ readonly inputs: readonly [{
39
+ readonly indexed: true;
40
+ readonly name: "owner";
41
+ readonly type: "address";
42
+ }, {
43
+ readonly indexed: true;
44
+ readonly name: "spender";
45
+ readonly type: "address";
46
+ }, {
47
+ readonly indexed: false;
48
+ readonly name: "value";
49
+ readonly type: "uint256";
50
+ }];
51
+ }, {
52
+ readonly type: "event";
53
+ readonly name: "Transfer";
54
+ readonly inputs: readonly [{
55
+ readonly indexed: true;
56
+ readonly name: "from";
57
+ readonly type: "address";
58
+ }, {
59
+ readonly indexed: true;
60
+ readonly name: "to";
61
+ readonly type: "address";
62
+ }, {
63
+ readonly indexed: false;
64
+ readonly name: "value";
65
+ readonly type: "uint256";
66
+ }];
67
+ }, {
68
+ readonly type: "function";
69
+ readonly name: "allowance";
70
+ readonly stateMutability: "view";
71
+ readonly inputs: readonly [{
72
+ readonly name: "owner";
73
+ readonly type: "address";
74
+ }, {
75
+ readonly name: "spender";
76
+ readonly type: "address";
77
+ }];
78
+ readonly outputs: readonly [{
79
+ readonly type: "uint256";
80
+ }];
81
+ }, {
82
+ readonly type: "function";
83
+ readonly name: "approve";
84
+ readonly stateMutability: "nonpayable";
85
+ readonly inputs: readonly [{
86
+ readonly name: "spender";
87
+ readonly type: "address";
88
+ }, {
89
+ readonly name: "amount";
90
+ readonly type: "uint256";
91
+ }];
92
+ readonly outputs: readonly [{
93
+ readonly type: "bool";
94
+ }];
95
+ }, {
96
+ readonly type: "function";
97
+ readonly name: "balanceOf";
98
+ readonly stateMutability: "view";
99
+ readonly inputs: readonly [{
100
+ readonly name: "account";
101
+ readonly type: "address";
102
+ }];
103
+ readonly outputs: readonly [{
104
+ readonly type: "uint256";
105
+ }];
106
+ }, {
107
+ readonly type: "function";
108
+ readonly name: "decimals";
109
+ readonly stateMutability: "view";
110
+ readonly inputs: readonly [];
111
+ readonly outputs: readonly [{
112
+ readonly type: "uint8";
113
+ }];
114
+ }, {
115
+ readonly type: "function";
116
+ readonly name: "name";
117
+ readonly stateMutability: "view";
118
+ readonly inputs: readonly [];
119
+ readonly outputs: readonly [{
120
+ readonly type: "string";
121
+ }];
122
+ }, {
123
+ readonly type: "function";
124
+ readonly name: "symbol";
125
+ readonly stateMutability: "view";
126
+ readonly inputs: readonly [];
127
+ readonly outputs: readonly [{
128
+ readonly type: "string";
129
+ }];
130
+ }, {
131
+ readonly type: "function";
132
+ readonly name: "totalSupply";
133
+ readonly stateMutability: "view";
134
+ readonly inputs: readonly [];
135
+ readonly outputs: readonly [{
136
+ readonly type: "uint256";
137
+ }];
138
+ }, {
139
+ readonly type: "function";
140
+ readonly name: "transfer";
141
+ readonly stateMutability: "nonpayable";
142
+ readonly inputs: readonly [{
143
+ readonly name: "recipient";
144
+ readonly type: "address";
145
+ }, {
146
+ readonly name: "amount";
147
+ readonly type: "uint256";
148
+ }];
149
+ readonly outputs: readonly [{
150
+ readonly type: "bool";
151
+ }];
152
+ }, {
153
+ readonly type: "function";
154
+ readonly name: "transferFrom";
155
+ readonly stateMutability: "nonpayable";
156
+ readonly inputs: readonly [{
157
+ readonly name: "sender";
158
+ readonly type: "address";
159
+ }, {
160
+ readonly name: "recipient";
161
+ readonly type: "address";
162
+ }, {
163
+ readonly name: "amount";
164
+ readonly type: "uint256";
165
+ }];
166
+ readonly outputs: readonly [{
167
+ readonly type: "bool";
168
+ }];
169
+ }];
170
+ functionName: "balanceOf";
171
+ args: `0x${string}`[];
172
+ }[];
173
+ /**
174
+ * Helper: Get user-specific staking contracts for multicall composition
175
+ * Pool-level stats (totalStaked, apr, outstandingRewards) now in project.ts
176
+ */
177
+ export declare function stakingContracts(params: {
178
+ userAddress: `0x${string}`;
179
+ stakingAddress: `0x${string}`;
180
+ clankerToken: `0x${string}`;
181
+ wethAddress?: `0x${string}`;
182
+ }): any[];
183
+ /**
184
+ * Get all user-related data in a single efficient multicall
185
+ * Composes balances, staking, and governance data with USD values
186
+ */
187
+ export declare function getUser({ publicClient, userAddress, project }: UserParams): Promise<User>;
188
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/user.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE7D,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,eAAe,CAAA;IAC7B,WAAW,EAAE,KAAK,MAAM,EAAE,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,aAAa,CAAA;IACpB,IAAI,EAAE,aAAa,CAAA;IACnB,GAAG,EAAE,aAAa,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,aAAa,EAAE,aAAa,CAAA;IAC5B,SAAS,EAAE,aAAa,CAAA;IACxB,gBAAgB,EAAE;QAChB,OAAO,EAAE,aAAa,CAAA;QACtB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAA;KAC3B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,aAAa,CAAA;CAC3B,CAAA;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAA;IAC1B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBA;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,KAAK,MAAM,EAAE,CAAA;IAC7B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAA;IAC3B,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CAC5B,SAsCA;AAMD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF/F"}
@@ -1,3 +1,20 @@
1
+ import type { PopPublicClient } from './types';
2
+ /**
3
+ * Get a configured public client for a given chain
4
+ * @param chainId - The chain ID to connect to
5
+ * @param rpcUrl - Optional custom RPC URL (falls back to public endpoints)
6
+ * @returns Configured public client
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Use default public RPC
11
+ * const client = getPublicClient(8453)
12
+ *
13
+ * // Use custom RPC
14
+ * const client = getPublicClient(8453, 'https://my-rpc.com')
15
+ * ```
16
+ */
17
+ export declare function getPublicClient(chainId: number, rpcUrl?: string): PopPublicClient;
1
18
  /**
2
19
  * Check if approval is needed for a given amount
3
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAC1C,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAiBT"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAU9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAsBjF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAC1C,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAiBT"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "levr-sdk",
3
3
  "description": "Leverage your Clanker launch with DAO capabilities",
4
- "version": "0.0.1",
4
+ "version": "0.1.0",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
7
7
  "exports": {
@@ -23,7 +23,7 @@
23
23
  "update-abis": "bun run script/update-abis.ts && prettier --write src/abis/**/*.ts",
24
24
  "watch": "bun run script/tsgo-watch.ts",
25
25
  "type-check": "tsgo --noEmit --pretty",
26
- "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"",
26
+ "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\" && eslint --fix --quiet",
27
27
  "lint": "eslint",
28
28
  "fill-placeholders": "sh ./script/fill-placeholders.sh",
29
29
  "warp": "bun -e \"import { warpAnvil } from './test/util.ts'; await warpAnvil(120)\"",
@@ -69,10 +69,13 @@
69
69
  "devDependencies": {
70
70
  "@commitlint/cli": "^19.8.1",
71
71
  "@commitlint/config-conventional": "^19.8.1",
72
+ "@happy-dom/global-registrator": "^20.0.0",
73
+ "@testing-library/react": "^16.3.0",
72
74
  "@types/bun": "^1.2.22",
73
75
  "@types/debug": "^4.1.12",
74
76
  "eslint-plugin-prettier": "^5.5.4",
75
77
  "eslint-plugin-simple-import-sort": "^12.1.1",
78
+ "happy-dom": "^20.0.0",
76
79
  "husky": "^9.1.7",
77
80
  "lint-staged": "^15.5.2",
78
81
  "pinst": "^3.0.0",
@@ -1,56 +0,0 @@
1
- "use client";
2
- import { useQuery } from "@tanstack/react-query";
3
- import { useMemo } from "react";
4
- import { zeroAddress } from "viem";
5
- import { useAccount, useChainId, usePublicClient } from "wagmi";
6
- import { balance } from "../../balance.js";
7
- import { WETH } from "../../constants.js";
8
- import { queryKeys } from "../query-keys.js";
9
- /**
10
- * Internal: Creates balance query with all logic
11
- * Used by LevrProvider
12
- */
13
- export function useBalanceQuery({ clankerToken, projectTokenDecimals = 18, enabled: e = true, }) {
14
- const publicClient = usePublicClient();
15
- const chainId = useChainId();
16
- const { address: userAddress } = useAccount();
17
- const wethAddress = WETH(chainId)?.address;
18
- const tokenAddresses = useMemo(() => {
19
- const addresses = [];
20
- if (clankerToken) {
21
- addresses.push({
22
- address: clankerToken,
23
- decimals: projectTokenDecimals,
24
- key: "token",
25
- });
26
- }
27
- if (wethAddress) {
28
- addresses.push({
29
- address: wethAddress,
30
- decimals: 18,
31
- key: "weth",
32
- });
33
- }
34
- // Add native ETH balance
35
- addresses.push({
36
- address: zeroAddress,
37
- decimals: 18,
38
- key: "eth",
39
- });
40
- return addresses;
41
- }, [clankerToken, projectTokenDecimals, wethAddress]);
42
- return useQuery({
43
- queryKey: queryKeys.balance(tokenAddresses.map((t) => t.address).join(","), userAddress),
44
- queryFn: async () => {
45
- if (!userAddress || tokenAddresses.length === 0)
46
- return {};
47
- return balance({
48
- publicClient: publicClient,
49
- address: userAddress,
50
- tokens: tokenAddresses,
51
- });
52
- },
53
- enabled: e && !!publicClient && !!userAddress && tokenAddresses.length > 0,
54
- refetchInterval: 10000,
55
- });
56
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-balance.js","sourceRoot":"","sources":["../../../../src/client/hook/use-balance.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAczC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,YAAY,EACZ,oBAAoB,GAAG,EAAE,EACzB,OAAO,EAAE,CAAC,GAAG,IAAI,GACK;IACtB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAA;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAE1C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,SAAS,GAA+D,EAAE,CAAA;QAEhF,IAAI,YAAY,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,oBAAoB;gBAC9B,GAAG,EAAE,OAAO;aACb,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,MAAM;aACZ,CAAC,CAAA;QACJ,CAAC;QAED,yBAAyB;QACzB,SAAS,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,KAAK;SACX,CAAC,CAAA;QAEF,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAA;IAErD,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAY,CAAC;QACzF,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC1D,OAAO,OAAO,CAAC;gBACb,YAAY,EAAE,YAAa;gBAC3B,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,cAAc;aACvB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;QAC1E,eAAe,EAAE,MAAM;KACxB,CAAC,CAAA;AACJ,CAAC"}
@@ -1,22 +0,0 @@
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
- }
@@ -1 +0,0 @@
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"}
@@ -1,31 +0,0 @@
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
- }
@@ -1 +0,0 @@
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"}
@@ -1,212 +0,0 @@
1
- import { erc20Abi, formatUnits, zeroAddress } from "viem";
2
- import { IClankerToken, LevrFactory_v1 } from "./abis/index.js";
3
- import { WETH } from "./constants.js";
4
- const registeredEvent = LevrFactory_v1.find((item) => item.type === "event" && item.name === "Registered");
5
- /**
6
- * Get multiple projects data
7
- */
8
- export async function projects({ publicClient, factoryAddress, chainId, fromBlock, toBlock = "latest", pageSize = 100, }) {
9
- if (Object.values({ publicClient, factoryAddress, chainId }).some((value) => !value)) {
10
- throw new Error("Invalid projects params");
11
- }
12
- // Determine block range
13
- const latestBlock = await publicClient.getBlockNumber();
14
- const from = fromBlock ?? latestBlock - latestBlock / 10n; // Default to last 10% of blocks
15
- const to = toBlock === "latest" ? latestBlock : toBlock;
16
- // Fetch Registered events - indexed events are efficient even across large ranges
17
- const allLogs = (await publicClient.getLogs({
18
- address: factoryAddress,
19
- event: registeredEvent,
20
- fromBlock: from,
21
- toBlock: to,
22
- }));
23
- // Sort by block number descending (most recent first)
24
- const logs = allLogs.sort((a, b) => {
25
- if (a.blockNumber > b.blockNumber)
26
- return -1;
27
- if (a.blockNumber < b.blockNumber)
28
- return 1;
29
- return 0;
30
- });
31
- // Limit to pageSize
32
- const limitedLogs = logs.slice(0, pageSize);
33
- if (limitedLogs.length === 0) {
34
- return {
35
- projects: [],
36
- fromBlock: from,
37
- toBlock: to,
38
- };
39
- }
40
- // Extract unique clanker tokens
41
- const clankerTokens = limitedLogs.map((log) => log.args.clankerToken);
42
- // First, get project contracts for all tokens
43
- const projectContracts = await publicClient.multicall({
44
- contracts: clankerTokens.map((token) => ({
45
- address: factoryAddress,
46
- abi: LevrFactory_v1,
47
- functionName: "getProjectContracts",
48
- args: [token],
49
- })),
50
- });
51
- // Filter out unregistered projects and prepare valid tokens with their contracts
52
- const validTokensWithContracts = clankerTokens
53
- .map((token, index) => {
54
- const projectResult = projectContracts[index].result;
55
- if ([
56
- projectResult.treasury,
57
- projectResult.governor,
58
- projectResult.staking,
59
- projectResult.stakedToken,
60
- ].some((a) => a === zeroAddress)) {
61
- return null;
62
- }
63
- return { token, contracts: projectResult };
64
- })
65
- .filter(Boolean);
66
- if (validTokensWithContracts.length === 0) {
67
- return {
68
- projects: [],
69
- fromBlock: from,
70
- toBlock: to,
71
- };
72
- }
73
- // Batch fetch all token metadata and treasury stats
74
- const contracts = validTokensWithContracts.flatMap(({ token, contracts }) => [
75
- // Token metadata
76
- {
77
- address: token,
78
- abi: erc20Abi,
79
- functionName: "decimals",
80
- },
81
- {
82
- address: token,
83
- abi: erc20Abi,
84
- functionName: "name",
85
- },
86
- {
87
- address: token,
88
- abi: erc20Abi,
89
- functionName: "symbol",
90
- },
91
- {
92
- address: token,
93
- abi: erc20Abi,
94
- functionName: "totalSupply",
95
- },
96
- {
97
- address: token,
98
- abi: IClankerToken,
99
- functionName: "metadata",
100
- },
101
- {
102
- address: token,
103
- abi: IClankerToken,
104
- functionName: "imageUrl",
105
- },
106
- // Treasury stats
107
- {
108
- address: token,
109
- abi: erc20Abi,
110
- functionName: "balanceOf",
111
- args: [contracts.treasury],
112
- },
113
- {
114
- address: token,
115
- abi: erc20Abi,
116
- functionName: "balanceOf",
117
- args: [contracts.staking],
118
- },
119
- ]);
120
- const results = await publicClient.multicall({ contracts });
121
- // Parse results into Project objects
122
- const projects = [];
123
- const callsPerProject = 8; // Updated to include treasury and staking balance
124
- for (let i = 0; i < validTokensWithContracts.length; i++) {
125
- const { token, contracts: projectContracts } = validTokensWithContracts[i];
126
- const offset = i * callsPerProject;
127
- const decimals = results[offset].result;
128
- const name = results[offset + 1].result;
129
- const symbol = results[offset + 2].result;
130
- const totalSupply = results[offset + 3].result;
131
- const metadataStr = results[offset + 4].result;
132
- const imageUrl = results[offset + 5].result;
133
- const treasuryBalance = results[offset + 6].result;
134
- const stakingBalance = results[offset + 7].result;
135
- // Parse metadata JSON
136
- let parsedMetadata = null;
137
- if (metadataStr) {
138
- try {
139
- parsedMetadata = JSON.parse(metadataStr);
140
- }
141
- catch {
142
- // If parsing fails, leave as null
143
- }
144
- }
145
- // Calculate treasury stats
146
- const totalAllocated = treasuryBalance + stakingBalance;
147
- const utilization = totalSupply > 0n
148
- ? Number((totalAllocated * 10000n) / totalSupply) / 100 // Convert to percentage
149
- : 0;
150
- const treasuryStats = {
151
- balance: {
152
- raw: treasuryBalance,
153
- formatted: formatUnits(treasuryBalance, decimals),
154
- },
155
- totalAllocated: {
156
- raw: totalAllocated,
157
- formatted: formatUnits(totalAllocated, decimals),
158
- },
159
- utilization,
160
- };
161
- // Extract pool information
162
- // Clanker V4 tokens are always paired with WETH and use the token as the hook
163
- let poolInfo;
164
- try {
165
- const wethAddress = WETH(chainId)?.address;
166
- if (wethAddress) {
167
- // Determine currency ordering (currency0 < currency1)
168
- const isTokenCurrency0 = token.toLowerCase() < wethAddress.toLowerCase();
169
- // Standard Clanker V4 pool configuration
170
- const fee = 3000; // 0.3% fee
171
- const tickSpacing = 60;
172
- poolInfo = {
173
- poolKey: {
174
- currency0: isTokenCurrency0 ? token : wethAddress,
175
- currency1: isTokenCurrency0 ? wethAddress : token,
176
- fee,
177
- tickSpacing,
178
- hooks: token, // Token acts as the hook in Clanker V4
179
- },
180
- feeDisplay: `${(fee / 10000).toFixed(2)}%`,
181
- numPositions: 0n, // Would need separate query for actual count
182
- };
183
- }
184
- }
185
- catch {
186
- // If construction fails, poolInfo remains undefined
187
- }
188
- projects.push({
189
- treasury: projectContracts.treasury,
190
- governor: projectContracts.governor,
191
- staking: projectContracts.staking,
192
- stakedToken: projectContracts.stakedToken,
193
- token: {
194
- address: token,
195
- decimals,
196
- name,
197
- symbol,
198
- totalSupply,
199
- metadata: parsedMetadata,
200
- imageUrl,
201
- },
202
- pool: poolInfo,
203
- treasuryStats,
204
- });
205
- }
206
- return {
207
- projects,
208
- fromBlock: from,
209
- toBlock: to,
210
- };
211
- }
212
- //# sourceMappingURL=projects.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/projects.ts"],"names":[],"mappings":"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"}