@clawnch/clawncher-sdk 2.0.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.
package/dist/reader.js ADDED
@@ -0,0 +1,487 @@
1
+ /**
2
+ * ClawnchReader - Read on-chain token data from Clawncher contracts
3
+ *
4
+ * This class provides read-only access to token deployment info, vault allocations,
5
+ * vested dev buy allocations, fee configurations, and reward info.
6
+ *
7
+ * Used by frontends to display token detail pages and admin functionality.
8
+ */
9
+ import { formatUnits, } from 'viem';
10
+ import { base, baseSepolia } from 'viem/chains';
11
+ import { ClawnchFactoryABI, ClawnchFeeLockerABI, ClawnchLpLockerABI, ClawnchVaultABI, ClawncherVestedDevBuyABI, ClawnchMevModuleABI, ClawnchTokenABI, ERC20ABI, } from './abis.js';
12
+ import { getAddresses } from './addresses.js';
13
+ /**
14
+ * ClawnchReader - Read on-chain token data
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { ClawnchReader } from '@clawnch/clawncher-sdk';
19
+ * import { createPublicClient, http } from 'viem';
20
+ * import { baseSepolia } from 'viem/chains';
21
+ *
22
+ * const publicClient = createPublicClient({
23
+ * chain: baseSepolia,
24
+ * transport: http(),
25
+ * });
26
+ *
27
+ * const reader = new ClawnchReader({
28
+ * publicClient,
29
+ * network: 'sepolia',
30
+ * });
31
+ *
32
+ * // Get full token details
33
+ * const details = await reader.getTokenDetails('0x...');
34
+ *
35
+ * // Get vault allocation
36
+ * const vault = await reader.getVaultAllocation('0x...');
37
+ *
38
+ * // Get vested dev buy allocation
39
+ * const vested = await reader.getVestedDevBuyAllocation('0x...');
40
+ * ```
41
+ */
42
+ export class ClawnchReader {
43
+ publicClient;
44
+ network;
45
+ constructor(config) {
46
+ this.publicClient = config.publicClient;
47
+ this.network = config.network;
48
+ }
49
+ /**
50
+ * Get contract addresses for configured network
51
+ */
52
+ getAddresses() {
53
+ return getAddresses(this.network);
54
+ }
55
+ /**
56
+ * Get the chain for the configured network
57
+ */
58
+ getChain() {
59
+ return this.network === 'mainnet' ? base : baseSepolia;
60
+ }
61
+ // =========================================================================
62
+ // Token Info
63
+ // =========================================================================
64
+ /**
65
+ * Get basic ERC20 token info
66
+ */
67
+ async getTokenInfo(token) {
68
+ const [name, symbol, decimals, totalSupply] = await Promise.all([
69
+ this.publicClient.readContract({
70
+ address: token,
71
+ abi: ERC20ABI,
72
+ functionName: 'name',
73
+ }),
74
+ this.publicClient.readContract({
75
+ address: token,
76
+ abi: ERC20ABI,
77
+ functionName: 'symbol',
78
+ }),
79
+ this.publicClient.readContract({
80
+ address: token,
81
+ abi: ERC20ABI,
82
+ functionName: 'decimals',
83
+ }),
84
+ this.publicClient.readContract({
85
+ address: token,
86
+ abi: ERC20ABI,
87
+ functionName: 'totalSupply',
88
+ }),
89
+ ]);
90
+ return { name, symbol, decimals, totalSupply };
91
+ }
92
+ /**
93
+ * Get Clawncher token metadata using allData() single call
94
+ *
95
+ * Returns originalAdmin, admin, imageUrl, metadata, context in one RPC call.
96
+ */
97
+ async getTokenMetadata(token) {
98
+ try {
99
+ // Use allData() for a single RPC call instead of 4 separate calls
100
+ const result = await this.publicClient.readContract({
101
+ address: token,
102
+ abi: ClawnchTokenABI,
103
+ functionName: 'allData',
104
+ });
105
+ const [originalAdmin, admin, image, metadata, context] = result;
106
+ return {
107
+ tokenAdmin: admin,
108
+ originalAdmin,
109
+ image,
110
+ metadata,
111
+ context,
112
+ };
113
+ }
114
+ catch {
115
+ // Fallback to individual calls if allData() is not available
116
+ const [admin, image, metadata, context] = await Promise.all([
117
+ this.publicClient.readContract({
118
+ address: token,
119
+ abi: ClawnchTokenABI,
120
+ functionName: 'admin',
121
+ }),
122
+ this.publicClient.readContract({
123
+ address: token,
124
+ abi: ClawnchTokenABI,
125
+ functionName: 'imageUrl',
126
+ }).catch(() => ''),
127
+ this.publicClient.readContract({
128
+ address: token,
129
+ abi: ClawnchTokenABI,
130
+ functionName: 'metadata',
131
+ }).catch(() => ''),
132
+ this.publicClient.readContract({
133
+ address: token,
134
+ abi: ClawnchTokenABI,
135
+ functionName: 'context',
136
+ }).catch(() => ''),
137
+ ]);
138
+ return {
139
+ tokenAdmin: admin,
140
+ originalAdmin: admin, // fallback: assume same
141
+ image: image,
142
+ metadata: metadata,
143
+ context: context,
144
+ };
145
+ }
146
+ }
147
+ /**
148
+ * Get token deployment info from factory
149
+ */
150
+ async getDeploymentInfo(token) {
151
+ const addresses = this.getAddresses();
152
+ try {
153
+ const info = await this.publicClient.readContract({
154
+ address: addresses.clawnch.factory,
155
+ abi: ClawnchFactoryABI,
156
+ functionName: 'tokenDeploymentInfo',
157
+ args: [token],
158
+ });
159
+ const result = info;
160
+ // If token is zero address, it's not a Clawncher token
161
+ if (result.token === '0x0000000000000000000000000000000000000000') {
162
+ return null;
163
+ }
164
+ return {
165
+ token: result.token,
166
+ hook: result.hook,
167
+ locker: result.locker,
168
+ extensions: result.extensions,
169
+ };
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ // =========================================================================
176
+ // Vault
177
+ // =========================================================================
178
+ /**
179
+ * Get vault allocation for a token
180
+ */
181
+ async getVaultAllocation(token) {
182
+ const addresses = this.getAddresses();
183
+ try {
184
+ const [allocation, amountAvailable] = await Promise.all([
185
+ this.publicClient.readContract({
186
+ address: addresses.clawnch.vault,
187
+ abi: ClawnchVaultABI,
188
+ functionName: 'allocation',
189
+ args: [token],
190
+ }),
191
+ this.publicClient.readContract({
192
+ address: addresses.clawnch.vault,
193
+ abi: ClawnchVaultABI,
194
+ functionName: 'amountAvailableToClaim',
195
+ args: [token],
196
+ }),
197
+ ]);
198
+ const [tokenAddr, amountTotal, amountClaimed, lockupEndTime, vestingEndTime, admin] = allocation;
199
+ // If lockupEndTime is 0, no allocation exists
200
+ if (lockupEndTime === 0n) {
201
+ return null;
202
+ }
203
+ const now = BigInt(Math.floor(Date.now() / 1000));
204
+ const isUnlocked = now >= lockupEndTime;
205
+ const isFullyVested = now >= vestingEndTime;
206
+ let percentVested = 0;
207
+ if (isFullyVested) {
208
+ percentVested = 100;
209
+ }
210
+ else if (isUnlocked && vestingEndTime > lockupEndTime) {
211
+ const elapsed = now - lockupEndTime;
212
+ const vestingDuration = vestingEndTime - lockupEndTime;
213
+ percentVested = Number((elapsed * 100n) / vestingDuration);
214
+ }
215
+ return {
216
+ token: tokenAddr,
217
+ amountTotal,
218
+ amountClaimed,
219
+ lockupEndTime,
220
+ vestingEndTime,
221
+ admin,
222
+ amountAvailable: amountAvailable,
223
+ isUnlocked,
224
+ isFullyVested,
225
+ percentVested,
226
+ };
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ }
232
+ // =========================================================================
233
+ // Vested Dev Buy
234
+ // =========================================================================
235
+ /**
236
+ * Get vested dev buy allocation for a token
237
+ */
238
+ async getVestedDevBuyAllocation(token) {
239
+ const addresses = this.getAddresses();
240
+ // Check if vestedDevBuy is deployed
241
+ if (addresses.clawnch.vestedDevBuy === '0x0000000000000000000000000000000000000000') {
242
+ return null;
243
+ }
244
+ try {
245
+ const [allocation, amountAvailable] = await Promise.all([
246
+ this.publicClient.readContract({
247
+ address: addresses.clawnch.vestedDevBuy,
248
+ abi: ClawncherVestedDevBuyABI,
249
+ functionName: 'allocation',
250
+ args: [token],
251
+ }),
252
+ this.publicClient.readContract({
253
+ address: addresses.clawnch.vestedDevBuy,
254
+ abi: ClawncherVestedDevBuyABI,
255
+ functionName: 'amountAvailableToClaim',
256
+ args: [token],
257
+ }),
258
+ ]);
259
+ const [tokenAddr, amountTotal, amountClaimed, lockupEndTime, vestingEndTime, admin] = allocation;
260
+ // If lockupEndTime is 0, no allocation exists
261
+ if (lockupEndTime === 0n) {
262
+ return null;
263
+ }
264
+ const now = BigInt(Math.floor(Date.now() / 1000));
265
+ const isUnlocked = now >= lockupEndTime;
266
+ const isFullyVested = now >= vestingEndTime;
267
+ let percentVested = 0;
268
+ if (isFullyVested) {
269
+ percentVested = 100;
270
+ }
271
+ else if (isUnlocked && vestingEndTime > lockupEndTime) {
272
+ const elapsed = now - lockupEndTime;
273
+ const vestingDuration = vestingEndTime - lockupEndTime;
274
+ percentVested = Number((elapsed * 100n) / vestingDuration);
275
+ }
276
+ return {
277
+ token: tokenAddr,
278
+ amountTotal,
279
+ amountClaimed,
280
+ lockupEndTime,
281
+ vestingEndTime,
282
+ admin,
283
+ amountAvailable: amountAvailable,
284
+ isUnlocked,
285
+ isFullyVested,
286
+ percentVested,
287
+ };
288
+ }
289
+ catch {
290
+ return null;
291
+ }
292
+ }
293
+ // =========================================================================
294
+ // Rewards
295
+ // =========================================================================
296
+ /**
297
+ * Get token reward info (recipients, positions) from LP locker
298
+ */
299
+ async getTokenRewards(token) {
300
+ const addresses = this.getAddresses();
301
+ try {
302
+ const rewards = await this.publicClient.readContract({
303
+ address: addresses.clawnch.locker,
304
+ abi: ClawnchLpLockerABI,
305
+ functionName: 'tokenRewards',
306
+ args: [token],
307
+ });
308
+ const result = rewards;
309
+ return {
310
+ token: result.token,
311
+ poolKey: result.poolKey,
312
+ positionId: result.positionId,
313
+ numPositions: result.numPositions,
314
+ rewardBps: result.rewardBps,
315
+ rewardAdmins: result.rewardAdmins,
316
+ rewardRecipients: result.rewardRecipients,
317
+ };
318
+ }
319
+ catch {
320
+ return null;
321
+ }
322
+ }
323
+ /**
324
+ * Get available fees for a wallet on a specific token
325
+ */
326
+ async getAvailableFees(wallet, token) {
327
+ const addresses = this.getAddresses();
328
+ try {
329
+ const fees = await this.publicClient.readContract({
330
+ address: addresses.clawnch.feeLocker,
331
+ abi: ClawnchFeeLockerABI,
332
+ functionName: 'availableFees',
333
+ args: [wallet, token],
334
+ });
335
+ return fees;
336
+ }
337
+ catch {
338
+ return 0n;
339
+ }
340
+ }
341
+ /**
342
+ * Get all available fees for a wallet across multiple tokens
343
+ */
344
+ async getWalletFees(wallet, tokens) {
345
+ const addresses = this.getAddresses();
346
+ const results = await Promise.all(tokens.map(async (token) => {
347
+ const [fees, symbol] = await Promise.all([
348
+ this.getAvailableFees(wallet, token),
349
+ this.publicClient.readContract({
350
+ address: token,
351
+ abi: ERC20ABI,
352
+ functionName: 'symbol',
353
+ }).catch(() => 'UNKNOWN'),
354
+ ]);
355
+ return {
356
+ token,
357
+ symbol: symbol,
358
+ availableFees: fees,
359
+ formattedFees: formatUnits(fees, 18),
360
+ };
361
+ }));
362
+ // For WETH total, check available WETH fees
363
+ const wethFees = await this.getAvailableFees(wallet, addresses.infrastructure.weth);
364
+ return {
365
+ wallet,
366
+ tokens: results,
367
+ totalWeth: wethFees,
368
+ formattedTotalWeth: formatUnits(wethFees, 18),
369
+ };
370
+ }
371
+ // =========================================================================
372
+ // MEV Protection
373
+ // =========================================================================
374
+ /**
375
+ * Get MEV protection config for a pool by its poolId (bytes32)
376
+ *
377
+ * Use `getMevConfigForToken()` if you have a token address instead of poolId.
378
+ */
379
+ async getMevConfig(poolId) {
380
+ const addresses = this.getAddresses();
381
+ try {
382
+ const [config, startTime, currentFee] = await Promise.all([
383
+ this.publicClient.readContract({
384
+ address: addresses.clawnch.mevModule,
385
+ abi: ClawnchMevModuleABI,
386
+ functionName: 'feeConfig',
387
+ args: [poolId],
388
+ }),
389
+ this.publicClient.readContract({
390
+ address: addresses.clawnch.mevModule,
391
+ abi: ClawnchMevModuleABI,
392
+ functionName: 'poolStartTime',
393
+ args: [poolId],
394
+ }),
395
+ this.publicClient.readContract({
396
+ address: addresses.clawnch.mevModule,
397
+ abi: ClawnchMevModuleABI,
398
+ functionName: 'getFee',
399
+ args: [poolId],
400
+ }),
401
+ ]);
402
+ const [startingFee, endingFee, secondsToDecay] = config;
403
+ const poolStartTime = startTime;
404
+ // If secondsToDecay is 0, MEV config doesn't exist for this pool
405
+ if (secondsToDecay === 0n) {
406
+ return null;
407
+ }
408
+ const decayEndTime = poolStartTime + secondsToDecay;
409
+ const now = BigInt(Math.floor(Date.now() / 1000));
410
+ return {
411
+ startingFee,
412
+ endingFee,
413
+ secondsToDecay,
414
+ poolStartTime,
415
+ decayEndTime,
416
+ currentFee: currentFee,
417
+ isDecayComplete: now >= decayEndTime,
418
+ };
419
+ }
420
+ catch {
421
+ return null;
422
+ }
423
+ }
424
+ /**
425
+ * Get MEV protection config for a token (resolves poolId via LP locker first)
426
+ */
427
+ async getMevConfigForToken(token) {
428
+ // Get the poolId from token rewards (which has the poolKey)
429
+ const rewards = await this.getTokenRewards(token);
430
+ if (!rewards)
431
+ return null;
432
+ // Compute poolId from poolKey: keccak256(abi.encode(currency0, currency1, fee, tickSpacing, hooks))
433
+ const { encodeAbiParameters, parseAbiParameters, keccak256 } = await import('viem');
434
+ const poolId = keccak256(encodeAbiParameters(parseAbiParameters('address, address, uint24, int24, address'), [
435
+ rewards.poolKey.currency0,
436
+ rewards.poolKey.currency1,
437
+ rewards.poolKey.fee,
438
+ rewards.poolKey.tickSpacing,
439
+ rewards.poolKey.hooks,
440
+ ]));
441
+ return this.getMevConfig(poolId);
442
+ }
443
+ // =========================================================================
444
+ // Full Token Details
445
+ // =========================================================================
446
+ /**
447
+ * Get complete token details for UI display
448
+ *
449
+ * Combines basic token info, deployment info, vault, vested dev buy,
450
+ * reward recipients, and MEV config into a single response.
451
+ */
452
+ async getTokenDetails(token) {
453
+ // First check if this is a Clawncher token
454
+ const deployment = await this.getDeploymentInfo(token);
455
+ if (!deployment) {
456
+ return null;
457
+ }
458
+ // Fetch all data in parallel (except MEV which needs poolId from rewards)
459
+ const [tokenInfo, tokenMetadata, rewards, vault, vestedDevBuy,] = await Promise.all([
460
+ this.getTokenInfo(token),
461
+ this.getTokenMetadata(token),
462
+ this.getTokenRewards(token),
463
+ this.getVaultAllocation(token),
464
+ this.getVestedDevBuyAllocation(token),
465
+ ]);
466
+ // MEV config needs poolId from rewards, so fetch it after
467
+ const mev = await this.getMevConfigForToken(token);
468
+ return {
469
+ address: token,
470
+ ...tokenInfo,
471
+ ...tokenMetadata,
472
+ deployment,
473
+ rewards,
474
+ vault,
475
+ vestedDevBuy,
476
+ mev,
477
+ };
478
+ }
479
+ /**
480
+ * Check if a token was deployed via Clawncher
481
+ */
482
+ async isClawnchToken(token) {
483
+ const deployment = await this.getDeploymentInfo(token);
484
+ return deployment !== null;
485
+ }
486
+ }
487
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}