@clawnch/clawncher-sdk 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.
- package/README.md +603 -0
- package/dist/abis.d.ts +935 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +486 -0
- package/dist/abis.js.map +1 -0
- package/dist/addresses.d.ts +51 -0
- package/dist/addresses.d.ts.map +1 -0
- package/dist/addresses.js +80 -0
- package/dist/addresses.js.map +1 -0
- package/dist/api-deployer-types.d.ts +165 -0
- package/dist/api-deployer-types.d.ts.map +1 -0
- package/dist/api-deployer-types.js +9 -0
- package/dist/api-deployer-types.js.map +1 -0
- package/dist/api-deployer.d.ts +114 -0
- package/dist/api-deployer.d.ts.map +1 -0
- package/dist/api-deployer.js +309 -0
- package/dist/api-deployer.js.map +1 -0
- package/dist/claimer.d.ts +197 -0
- package/dist/claimer.d.ts.map +1 -0
- package/dist/claimer.js +311 -0
- package/dist/claimer.js.map +1 -0
- package/dist/deployer.d.ts +229 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +305 -0
- package/dist/deployer.js.map +1 -0
- package/dist/erc8004-types.d.ts +94 -0
- package/dist/erc8004-types.d.ts.map +1 -0
- package/dist/erc8004-types.js +8 -0
- package/dist/erc8004-types.js.map +1 -0
- package/dist/errors.d.ts +62 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +75 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +204 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/liquidity-types.d.ts +198 -0
- package/dist/liquidity-types.d.ts.map +1 -0
- package/dist/liquidity-types.js +8 -0
- package/dist/liquidity-types.js.map +1 -0
- package/dist/liquidity.d.ts +111 -0
- package/dist/liquidity.d.ts.map +1 -0
- package/dist/liquidity.js +608 -0
- package/dist/liquidity.js.map +1 -0
- package/dist/molten-types.d.ts +282 -0
- package/dist/molten-types.d.ts.map +1 -0
- package/dist/molten-types.js +8 -0
- package/dist/molten-types.js.map +1 -0
- package/dist/molten.d.ts +336 -0
- package/dist/molten.d.ts.map +1 -0
- package/dist/molten.js +560 -0
- package/dist/molten.js.map +1 -0
- package/dist/portfolio.d.ts +129 -0
- package/dist/portfolio.d.ts.map +1 -0
- package/dist/portfolio.js +218 -0
- package/dist/portfolio.js.map +1 -0
- package/dist/reader.d.ts +249 -0
- package/dist/reader.d.ts.map +1 -0
- package/dist/reader.js +488 -0
- package/dist/reader.js.map +1 -0
- package/dist/swap-types.d.ts +159 -0
- package/dist/swap-types.d.ts.map +1 -0
- package/dist/swap-types.js +22 -0
- package/dist/swap-types.js.map +1 -0
- package/dist/swap.d.ts +762 -0
- package/dist/swap.d.ts.map +1 -0
- package/dist/swap.js +345 -0
- package/dist/swap.js.map +1 -0
- package/dist/token-verification-data.d.ts +4 -0
- package/dist/token-verification-data.d.ts.map +1 -0
- package/dist/token-verification-data.js +6 -0
- package/dist/token-verification-data.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/uniswap-abis.d.ts +470 -0
- package/dist/uniswap-abis.d.ts.map +1 -0
- package/dist/uniswap-abis.js +322 -0
- package/dist/uniswap-abis.js.map +1 -0
- package/dist/uniswap-addresses.d.ts +38 -0
- package/dist/uniswap-addresses.d.ts.map +1 -0
- package/dist/uniswap-addresses.js +67 -0
- package/dist/uniswap-addresses.js.map +1 -0
- package/dist/vanity.d.ts +115 -0
- package/dist/vanity.d.ts.map +1 -0
- package/dist/vanity.js +166 -0
- package/dist/vanity.js.map +1 -0
- package/dist/verify.d.ts +88 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +181 -0
- package/dist/verify.js.map +1 -0
- package/dist/watcher.d.ts +112 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +132 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +59 -0
package/dist/reader.js
ADDED
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawnchReader - Read on-chain token data from Clanker's contracts
|
|
3
|
+
*
|
|
4
|
+
* v3: Reads from Clanker's approved infrastructure (same ABI, different addresses).
|
|
5
|
+
* Provides read-only access to token deployment info, vault allocations,
|
|
6
|
+
* fee configurations, and reward info.
|
|
7
|
+
*
|
|
8
|
+
* Used by frontends to display token detail pages and admin functionality.
|
|
9
|
+
*/
|
|
10
|
+
import { formatUnits, } from 'viem';
|
|
11
|
+
import { base, baseSepolia } from 'viem/chains';
|
|
12
|
+
import { ClawnchFactoryABI, ClawnchFeeLockerABI, ClawnchLpLockerABI, ClawnchVaultABI, ClawncherVestedDevBuyABI, ClawnchMevModuleABI, ClawnchTokenABI, ERC20ABI, } from './abis.js';
|
|
13
|
+
import { getAddresses } from './addresses.js';
|
|
14
|
+
/**
|
|
15
|
+
* ClawnchReader - Read on-chain token data
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* import { ClawnchReader } from '@clawnch/clawncher-sdk';
|
|
20
|
+
* import { createPublicClient, http } from 'viem';
|
|
21
|
+
* import { baseSepolia } from 'viem/chains';
|
|
22
|
+
*
|
|
23
|
+
* const publicClient = createPublicClient({
|
|
24
|
+
* chain: baseSepolia,
|
|
25
|
+
* transport: http(),
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* const reader = new ClawnchReader({
|
|
29
|
+
* publicClient,
|
|
30
|
+
* network: 'sepolia',
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Get full token details
|
|
34
|
+
* const details = await reader.getTokenDetails('0x...');
|
|
35
|
+
*
|
|
36
|
+
* // Get vault allocation
|
|
37
|
+
* const vault = await reader.getVaultAllocation('0x...');
|
|
38
|
+
*
|
|
39
|
+
* // Get vested dev buy allocation
|
|
40
|
+
* const vested = await reader.getVestedDevBuyAllocation('0x...');
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export class ClawnchReader {
|
|
44
|
+
publicClient;
|
|
45
|
+
network;
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.publicClient = config.publicClient;
|
|
48
|
+
this.network = config.network;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get contract addresses for configured network
|
|
52
|
+
*/
|
|
53
|
+
getAddresses() {
|
|
54
|
+
return getAddresses(this.network);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the chain for the configured network
|
|
58
|
+
*/
|
|
59
|
+
getChain() {
|
|
60
|
+
return this.network === 'mainnet' ? base : baseSepolia;
|
|
61
|
+
}
|
|
62
|
+
// =========================================================================
|
|
63
|
+
// Token Info
|
|
64
|
+
// =========================================================================
|
|
65
|
+
/**
|
|
66
|
+
* Get basic ERC20 token info
|
|
67
|
+
*/
|
|
68
|
+
async getTokenInfo(token) {
|
|
69
|
+
const [name, symbol, decimals, totalSupply] = await Promise.all([
|
|
70
|
+
this.publicClient.readContract({
|
|
71
|
+
address: token,
|
|
72
|
+
abi: ERC20ABI,
|
|
73
|
+
functionName: 'name',
|
|
74
|
+
}),
|
|
75
|
+
this.publicClient.readContract({
|
|
76
|
+
address: token,
|
|
77
|
+
abi: ERC20ABI,
|
|
78
|
+
functionName: 'symbol',
|
|
79
|
+
}),
|
|
80
|
+
this.publicClient.readContract({
|
|
81
|
+
address: token,
|
|
82
|
+
abi: ERC20ABI,
|
|
83
|
+
functionName: 'decimals',
|
|
84
|
+
}),
|
|
85
|
+
this.publicClient.readContract({
|
|
86
|
+
address: token,
|
|
87
|
+
abi: ERC20ABI,
|
|
88
|
+
functionName: 'totalSupply',
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
91
|
+
return { name, symbol, decimals, totalSupply };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get Clawncher token metadata using allData() single call
|
|
95
|
+
*
|
|
96
|
+
* Returns originalAdmin, admin, imageUrl, metadata, context in one RPC call.
|
|
97
|
+
*/
|
|
98
|
+
async getTokenMetadata(token) {
|
|
99
|
+
try {
|
|
100
|
+
// Use allData() for a single RPC call instead of 4 separate calls
|
|
101
|
+
const result = await this.publicClient.readContract({
|
|
102
|
+
address: token,
|
|
103
|
+
abi: ClawnchTokenABI,
|
|
104
|
+
functionName: 'allData',
|
|
105
|
+
});
|
|
106
|
+
const [originalAdmin, admin, image, metadata, context] = result;
|
|
107
|
+
return {
|
|
108
|
+
tokenAdmin: admin,
|
|
109
|
+
originalAdmin,
|
|
110
|
+
image,
|
|
111
|
+
metadata,
|
|
112
|
+
context,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Fallback to individual calls if allData() is not available
|
|
117
|
+
const [admin, image, metadata, context] = await Promise.all([
|
|
118
|
+
this.publicClient.readContract({
|
|
119
|
+
address: token,
|
|
120
|
+
abi: ClawnchTokenABI,
|
|
121
|
+
functionName: 'admin',
|
|
122
|
+
}),
|
|
123
|
+
this.publicClient.readContract({
|
|
124
|
+
address: token,
|
|
125
|
+
abi: ClawnchTokenABI,
|
|
126
|
+
functionName: 'imageUrl',
|
|
127
|
+
}).catch(() => ''),
|
|
128
|
+
this.publicClient.readContract({
|
|
129
|
+
address: token,
|
|
130
|
+
abi: ClawnchTokenABI,
|
|
131
|
+
functionName: 'metadata',
|
|
132
|
+
}).catch(() => ''),
|
|
133
|
+
this.publicClient.readContract({
|
|
134
|
+
address: token,
|
|
135
|
+
abi: ClawnchTokenABI,
|
|
136
|
+
functionName: 'context',
|
|
137
|
+
}).catch(() => ''),
|
|
138
|
+
]);
|
|
139
|
+
return {
|
|
140
|
+
tokenAdmin: admin,
|
|
141
|
+
originalAdmin: admin, // fallback: assume same
|
|
142
|
+
image: image,
|
|
143
|
+
metadata: metadata,
|
|
144
|
+
context: context,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get token deployment info from factory
|
|
150
|
+
*/
|
|
151
|
+
async getDeploymentInfo(token) {
|
|
152
|
+
const addresses = this.getAddresses();
|
|
153
|
+
try {
|
|
154
|
+
const info = await this.publicClient.readContract({
|
|
155
|
+
address: addresses.clawnch.factory,
|
|
156
|
+
abi: ClawnchFactoryABI,
|
|
157
|
+
functionName: 'tokenDeploymentInfo',
|
|
158
|
+
args: [token],
|
|
159
|
+
});
|
|
160
|
+
const result = info;
|
|
161
|
+
// If token is zero address, it's not a Clawncher token
|
|
162
|
+
if (result.token === '0x0000000000000000000000000000000000000000') {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
token: result.token,
|
|
167
|
+
hook: result.hook,
|
|
168
|
+
locker: result.locker,
|
|
169
|
+
extensions: result.extensions,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// =========================================================================
|
|
177
|
+
// Vault
|
|
178
|
+
// =========================================================================
|
|
179
|
+
/**
|
|
180
|
+
* Get vault allocation for a token
|
|
181
|
+
*/
|
|
182
|
+
async getVaultAllocation(token) {
|
|
183
|
+
const addresses = this.getAddresses();
|
|
184
|
+
try {
|
|
185
|
+
const [allocation, amountAvailable] = await Promise.all([
|
|
186
|
+
this.publicClient.readContract({
|
|
187
|
+
address: addresses.clawnch.vault,
|
|
188
|
+
abi: ClawnchVaultABI,
|
|
189
|
+
functionName: 'allocation',
|
|
190
|
+
args: [token],
|
|
191
|
+
}),
|
|
192
|
+
this.publicClient.readContract({
|
|
193
|
+
address: addresses.clawnch.vault,
|
|
194
|
+
abi: ClawnchVaultABI,
|
|
195
|
+
functionName: 'amountAvailableToClaim',
|
|
196
|
+
args: [token],
|
|
197
|
+
}),
|
|
198
|
+
]);
|
|
199
|
+
const [tokenAddr, amountTotal, amountClaimed, lockupEndTime, vestingEndTime, admin] = allocation;
|
|
200
|
+
// If lockupEndTime is 0, no allocation exists
|
|
201
|
+
if (lockupEndTime === 0n) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
205
|
+
const isUnlocked = now >= lockupEndTime;
|
|
206
|
+
const isFullyVested = now >= vestingEndTime;
|
|
207
|
+
let percentVested = 0;
|
|
208
|
+
if (isFullyVested) {
|
|
209
|
+
percentVested = 100;
|
|
210
|
+
}
|
|
211
|
+
else if (isUnlocked && vestingEndTime > lockupEndTime) {
|
|
212
|
+
const elapsed = now - lockupEndTime;
|
|
213
|
+
const vestingDuration = vestingEndTime - lockupEndTime;
|
|
214
|
+
percentVested = Number((elapsed * 100n) / vestingDuration);
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
token: tokenAddr,
|
|
218
|
+
amountTotal,
|
|
219
|
+
amountClaimed,
|
|
220
|
+
lockupEndTime,
|
|
221
|
+
vestingEndTime,
|
|
222
|
+
admin,
|
|
223
|
+
amountAvailable: amountAvailable,
|
|
224
|
+
isUnlocked,
|
|
225
|
+
isFullyVested,
|
|
226
|
+
percentVested,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// =========================================================================
|
|
234
|
+
// Vested Dev Buy
|
|
235
|
+
// =========================================================================
|
|
236
|
+
/**
|
|
237
|
+
* Get vested dev buy allocation for a token
|
|
238
|
+
*/
|
|
239
|
+
async getVestedDevBuyAllocation(token) {
|
|
240
|
+
const addresses = this.getAddresses();
|
|
241
|
+
// Check if vestedDevBuy is deployed
|
|
242
|
+
if (addresses.clawnch.vestedDevBuy === '0x0000000000000000000000000000000000000000') {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
const [allocation, amountAvailable] = await Promise.all([
|
|
247
|
+
this.publicClient.readContract({
|
|
248
|
+
address: addresses.clawnch.vestedDevBuy,
|
|
249
|
+
abi: ClawncherVestedDevBuyABI,
|
|
250
|
+
functionName: 'allocation',
|
|
251
|
+
args: [token],
|
|
252
|
+
}),
|
|
253
|
+
this.publicClient.readContract({
|
|
254
|
+
address: addresses.clawnch.vestedDevBuy,
|
|
255
|
+
abi: ClawncherVestedDevBuyABI,
|
|
256
|
+
functionName: 'amountAvailableToClaim',
|
|
257
|
+
args: [token],
|
|
258
|
+
}),
|
|
259
|
+
]);
|
|
260
|
+
const [tokenAddr, amountTotal, amountClaimed, lockupEndTime, vestingEndTime, admin] = allocation;
|
|
261
|
+
// If lockupEndTime is 0, no allocation exists
|
|
262
|
+
if (lockupEndTime === 0n) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
266
|
+
const isUnlocked = now >= lockupEndTime;
|
|
267
|
+
const isFullyVested = now >= vestingEndTime;
|
|
268
|
+
let percentVested = 0;
|
|
269
|
+
if (isFullyVested) {
|
|
270
|
+
percentVested = 100;
|
|
271
|
+
}
|
|
272
|
+
else if (isUnlocked && vestingEndTime > lockupEndTime) {
|
|
273
|
+
const elapsed = now - lockupEndTime;
|
|
274
|
+
const vestingDuration = vestingEndTime - lockupEndTime;
|
|
275
|
+
percentVested = Number((elapsed * 100n) / vestingDuration);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
token: tokenAddr,
|
|
279
|
+
amountTotal,
|
|
280
|
+
amountClaimed,
|
|
281
|
+
lockupEndTime,
|
|
282
|
+
vestingEndTime,
|
|
283
|
+
admin,
|
|
284
|
+
amountAvailable: amountAvailable,
|
|
285
|
+
isUnlocked,
|
|
286
|
+
isFullyVested,
|
|
287
|
+
percentVested,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// =========================================================================
|
|
295
|
+
// Rewards
|
|
296
|
+
// =========================================================================
|
|
297
|
+
/**
|
|
298
|
+
* Get token reward info (recipients, positions) from LP locker
|
|
299
|
+
*/
|
|
300
|
+
async getTokenRewards(token) {
|
|
301
|
+
const addresses = this.getAddresses();
|
|
302
|
+
try {
|
|
303
|
+
const rewards = await this.publicClient.readContract({
|
|
304
|
+
address: addresses.clawnch.locker,
|
|
305
|
+
abi: ClawnchLpLockerABI,
|
|
306
|
+
functionName: 'tokenRewards',
|
|
307
|
+
args: [token],
|
|
308
|
+
});
|
|
309
|
+
const result = rewards;
|
|
310
|
+
return {
|
|
311
|
+
token: result.token,
|
|
312
|
+
poolKey: result.poolKey,
|
|
313
|
+
positionId: result.positionId,
|
|
314
|
+
numPositions: result.numPositions,
|
|
315
|
+
rewardBps: result.rewardBps,
|
|
316
|
+
rewardAdmins: result.rewardAdmins,
|
|
317
|
+
rewardRecipients: result.rewardRecipients,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get available fees for a wallet on a specific token
|
|
326
|
+
*/
|
|
327
|
+
async getAvailableFees(wallet, token) {
|
|
328
|
+
const addresses = this.getAddresses();
|
|
329
|
+
try {
|
|
330
|
+
const fees = await this.publicClient.readContract({
|
|
331
|
+
address: addresses.clawnch.feeLocker,
|
|
332
|
+
abi: ClawnchFeeLockerABI,
|
|
333
|
+
functionName: 'availableFees',
|
|
334
|
+
args: [wallet, token],
|
|
335
|
+
});
|
|
336
|
+
return fees;
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return 0n;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get all available fees for a wallet across multiple tokens
|
|
344
|
+
*/
|
|
345
|
+
async getWalletFees(wallet, tokens) {
|
|
346
|
+
const addresses = this.getAddresses();
|
|
347
|
+
const results = await Promise.all(tokens.map(async (token) => {
|
|
348
|
+
const [fees, symbol] = await Promise.all([
|
|
349
|
+
this.getAvailableFees(wallet, token),
|
|
350
|
+
this.publicClient.readContract({
|
|
351
|
+
address: token,
|
|
352
|
+
abi: ERC20ABI,
|
|
353
|
+
functionName: 'symbol',
|
|
354
|
+
}).catch(() => 'UNKNOWN'),
|
|
355
|
+
]);
|
|
356
|
+
return {
|
|
357
|
+
token,
|
|
358
|
+
symbol: symbol,
|
|
359
|
+
availableFees: fees,
|
|
360
|
+
formattedFees: formatUnits(fees, 18),
|
|
361
|
+
};
|
|
362
|
+
}));
|
|
363
|
+
// For WETH total, check available WETH fees
|
|
364
|
+
const wethFees = await this.getAvailableFees(wallet, addresses.infrastructure.weth);
|
|
365
|
+
return {
|
|
366
|
+
wallet,
|
|
367
|
+
tokens: results,
|
|
368
|
+
totalWeth: wethFees,
|
|
369
|
+
formattedTotalWeth: formatUnits(wethFees, 18),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
// =========================================================================
|
|
373
|
+
// MEV Protection
|
|
374
|
+
// =========================================================================
|
|
375
|
+
/**
|
|
376
|
+
* Get MEV protection config for a pool by its poolId (bytes32)
|
|
377
|
+
*
|
|
378
|
+
* Use `getMevConfigForToken()` if you have a token address instead of poolId.
|
|
379
|
+
*/
|
|
380
|
+
async getMevConfig(poolId) {
|
|
381
|
+
const addresses = this.getAddresses();
|
|
382
|
+
try {
|
|
383
|
+
const [config, startTime, currentFee] = await Promise.all([
|
|
384
|
+
this.publicClient.readContract({
|
|
385
|
+
address: addresses.clawnch.mevModule,
|
|
386
|
+
abi: ClawnchMevModuleABI,
|
|
387
|
+
functionName: 'feeConfig',
|
|
388
|
+
args: [poolId],
|
|
389
|
+
}),
|
|
390
|
+
this.publicClient.readContract({
|
|
391
|
+
address: addresses.clawnch.mevModule,
|
|
392
|
+
abi: ClawnchMevModuleABI,
|
|
393
|
+
functionName: 'poolStartTime',
|
|
394
|
+
args: [poolId],
|
|
395
|
+
}),
|
|
396
|
+
this.publicClient.readContract({
|
|
397
|
+
address: addresses.clawnch.mevModule,
|
|
398
|
+
abi: ClawnchMevModuleABI,
|
|
399
|
+
functionName: 'getFee',
|
|
400
|
+
args: [poolId],
|
|
401
|
+
}),
|
|
402
|
+
]);
|
|
403
|
+
const [startingFee, endingFee, secondsToDecay] = config;
|
|
404
|
+
const poolStartTime = startTime;
|
|
405
|
+
// If secondsToDecay is 0, MEV config doesn't exist for this pool
|
|
406
|
+
if (secondsToDecay === 0n) {
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
const decayEndTime = poolStartTime + secondsToDecay;
|
|
410
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
411
|
+
return {
|
|
412
|
+
startingFee,
|
|
413
|
+
endingFee,
|
|
414
|
+
secondsToDecay,
|
|
415
|
+
poolStartTime,
|
|
416
|
+
decayEndTime,
|
|
417
|
+
currentFee: currentFee,
|
|
418
|
+
isDecayComplete: now >= decayEndTime,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Get MEV protection config for a token (resolves poolId via LP locker first)
|
|
427
|
+
*/
|
|
428
|
+
async getMevConfigForToken(token) {
|
|
429
|
+
// Get the poolId from token rewards (which has the poolKey)
|
|
430
|
+
const rewards = await this.getTokenRewards(token);
|
|
431
|
+
if (!rewards)
|
|
432
|
+
return null;
|
|
433
|
+
// Compute poolId from poolKey: keccak256(abi.encode(currency0, currency1, fee, tickSpacing, hooks))
|
|
434
|
+
const { encodeAbiParameters, parseAbiParameters, keccak256 } = await import('viem');
|
|
435
|
+
const poolId = keccak256(encodeAbiParameters(parseAbiParameters('address, address, uint24, int24, address'), [
|
|
436
|
+
rewards.poolKey.currency0,
|
|
437
|
+
rewards.poolKey.currency1,
|
|
438
|
+
rewards.poolKey.fee,
|
|
439
|
+
rewards.poolKey.tickSpacing,
|
|
440
|
+
rewards.poolKey.hooks,
|
|
441
|
+
]));
|
|
442
|
+
return this.getMevConfig(poolId);
|
|
443
|
+
}
|
|
444
|
+
// =========================================================================
|
|
445
|
+
// Full Token Details
|
|
446
|
+
// =========================================================================
|
|
447
|
+
/**
|
|
448
|
+
* Get complete token details for UI display
|
|
449
|
+
*
|
|
450
|
+
* Combines basic token info, deployment info, vault, vested dev buy,
|
|
451
|
+
* reward recipients, and MEV config into a single response.
|
|
452
|
+
*/
|
|
453
|
+
async getTokenDetails(token) {
|
|
454
|
+
// First check if this is a Clawncher token
|
|
455
|
+
const deployment = await this.getDeploymentInfo(token);
|
|
456
|
+
if (!deployment) {
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
// Fetch all data in parallel (except MEV which needs poolId from rewards)
|
|
460
|
+
const [tokenInfo, tokenMetadata, rewards, vault, vestedDevBuy,] = await Promise.all([
|
|
461
|
+
this.getTokenInfo(token),
|
|
462
|
+
this.getTokenMetadata(token),
|
|
463
|
+
this.getTokenRewards(token),
|
|
464
|
+
this.getVaultAllocation(token),
|
|
465
|
+
this.getVestedDevBuyAllocation(token),
|
|
466
|
+
]);
|
|
467
|
+
// MEV config needs poolId from rewards, so fetch it after
|
|
468
|
+
const mev = await this.getMevConfigForToken(token);
|
|
469
|
+
return {
|
|
470
|
+
address: token,
|
|
471
|
+
...tokenInfo,
|
|
472
|
+
...tokenMetadata,
|
|
473
|
+
deployment,
|
|
474
|
+
rewards,
|
|
475
|
+
vault,
|
|
476
|
+
vestedDevBuy,
|
|
477
|
+
mev,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Check if a token was deployed via Clawncher
|
|
482
|
+
*/
|
|
483
|
+
async isClawnchToken(token) {
|
|
484
|
+
const deployment = await this.getDeploymentInfo(token);
|
|
485
|
+
return deployment !== null;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Swap Types (0x Swap API v2)
|
|
3
|
+
*
|
|
4
|
+
* Types for the ClawnchSwapper class which wraps the 0x Swap API
|
|
5
|
+
* for server-side / agent token swaps on Base.
|
|
6
|
+
*/
|
|
7
|
+
import type { Address, Hash, Hex, TransactionReceipt } from 'viem';
|
|
8
|
+
import type { WalletClient, PublicClient, Chain, Account, Transport } from 'viem';
|
|
9
|
+
import type { NetworkName } from './addresses.js';
|
|
10
|
+
export interface SwapperConfig {
|
|
11
|
+
/** Wallet client for signing and sending transactions */
|
|
12
|
+
wallet: WalletClient<Transport, Chain, Account>;
|
|
13
|
+
/** Public client for reading chain state */
|
|
14
|
+
publicClient: PublicClient;
|
|
15
|
+
/** Network: 'mainnet' (Base) or 'sepolia' (Base Sepolia) */
|
|
16
|
+
network?: NetworkName;
|
|
17
|
+
/** Clawnch API base URL (default: https://clawn.ch) */
|
|
18
|
+
apiBaseUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SwapParams {
|
|
21
|
+
/** Token to sell (contract address, or NATIVE_TOKEN_ADDRESS for ETH) */
|
|
22
|
+
sellToken: Address;
|
|
23
|
+
/** Token to buy (contract address, or NATIVE_TOKEN_ADDRESS for ETH) */
|
|
24
|
+
buyToken: Address;
|
|
25
|
+
/** Amount to sell in base units (wei for ETH, smallest unit for ERC20) */
|
|
26
|
+
sellAmount: bigint;
|
|
27
|
+
/** Address executing the swap (defaults to wallet address) */
|
|
28
|
+
taker?: Address;
|
|
29
|
+
/** Max slippage in basis points (default: 100 = 1%) */
|
|
30
|
+
slippageBps?: number;
|
|
31
|
+
/** Integrator fee recipient address */
|
|
32
|
+
swapFeeRecipient?: Address;
|
|
33
|
+
/** Integrator fee in basis points (max 1000 = 10%) */
|
|
34
|
+
swapFeeBps?: number;
|
|
35
|
+
/** Token to collect integrator fee in (must be sellToken or buyToken) */
|
|
36
|
+
swapFeeToken?: Address;
|
|
37
|
+
/** Liquidity sources to exclude (e.g. 'Uniswap_V3,SushiSwap') */
|
|
38
|
+
excludedSources?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SwapRouteFill {
|
|
41
|
+
from: Address;
|
|
42
|
+
to: Address;
|
|
43
|
+
source: string;
|
|
44
|
+
proportionBps: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SwapRoute {
|
|
47
|
+
fills: SwapRouteFill[];
|
|
48
|
+
tokens: Array<{
|
|
49
|
+
address: Address;
|
|
50
|
+
symbol: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
export interface SwapTokenMetadata {
|
|
54
|
+
buyTaxBps: string;
|
|
55
|
+
sellTaxBps: string;
|
|
56
|
+
}
|
|
57
|
+
export interface SwapAllowanceIssue {
|
|
58
|
+
actual: string;
|
|
59
|
+
spender: Address;
|
|
60
|
+
}
|
|
61
|
+
export interface SwapBalanceIssue {
|
|
62
|
+
token: Address;
|
|
63
|
+
actual: string;
|
|
64
|
+
expected: string;
|
|
65
|
+
}
|
|
66
|
+
export interface SwapIssues {
|
|
67
|
+
allowance?: SwapAllowanceIssue;
|
|
68
|
+
balance?: SwapBalanceIssue;
|
|
69
|
+
simulationIncomplete: boolean;
|
|
70
|
+
invalidSourcesPassed: string[];
|
|
71
|
+
}
|
|
72
|
+
export interface SwapFeeInfo {
|
|
73
|
+
integratorFee: {
|
|
74
|
+
amount: string;
|
|
75
|
+
token: Address;
|
|
76
|
+
type: string;
|
|
77
|
+
} | null;
|
|
78
|
+
zeroExFee: {
|
|
79
|
+
amount: string;
|
|
80
|
+
token: Address;
|
|
81
|
+
type: string;
|
|
82
|
+
} | null;
|
|
83
|
+
gasFee: {
|
|
84
|
+
amount: string;
|
|
85
|
+
token: Address;
|
|
86
|
+
type: string;
|
|
87
|
+
} | null;
|
|
88
|
+
}
|
|
89
|
+
export interface SwapPriceResult {
|
|
90
|
+
/** Amount of buyToken to receive */
|
|
91
|
+
buyAmount: bigint;
|
|
92
|
+
/** Amount of sellToken to sell */
|
|
93
|
+
sellAmount: bigint;
|
|
94
|
+
/** Minimum buy amount after slippage */
|
|
95
|
+
minBuyAmount: bigint;
|
|
96
|
+
/** Estimated gas units */
|
|
97
|
+
gas: bigint;
|
|
98
|
+
/** Gas price in wei */
|
|
99
|
+
gasPrice: bigint;
|
|
100
|
+
/** Total network fee in wei */
|
|
101
|
+
totalNetworkFee: bigint;
|
|
102
|
+
/** Contract to approve for allowance */
|
|
103
|
+
allowanceTarget: Address;
|
|
104
|
+
/** Whether sufficient liquidity exists */
|
|
105
|
+
liquidityAvailable: boolean;
|
|
106
|
+
/** Routing information */
|
|
107
|
+
route: SwapRoute;
|
|
108
|
+
/** Fee breakdown */
|
|
109
|
+
fees: SwapFeeInfo;
|
|
110
|
+
/** Known issues (allowance, balance) */
|
|
111
|
+
issues: SwapIssues;
|
|
112
|
+
/** Token tax metadata */
|
|
113
|
+
tokenMetadata: {
|
|
114
|
+
buyToken: SwapTokenMetadata;
|
|
115
|
+
sellToken: SwapTokenMetadata;
|
|
116
|
+
};
|
|
117
|
+
/** Block number of the quote */
|
|
118
|
+
blockNumber: string;
|
|
119
|
+
/** 0x tracking ID */
|
|
120
|
+
zid: string;
|
|
121
|
+
}
|
|
122
|
+
export interface SwapTransaction {
|
|
123
|
+
to: Address;
|
|
124
|
+
data: Hex;
|
|
125
|
+
gas: bigint;
|
|
126
|
+
gasPrice: bigint;
|
|
127
|
+
value: bigint;
|
|
128
|
+
}
|
|
129
|
+
export interface SwapQuoteResult extends SwapPriceResult {
|
|
130
|
+
/** Ready-to-send transaction data */
|
|
131
|
+
transaction: SwapTransaction;
|
|
132
|
+
}
|
|
133
|
+
export interface SwapResult {
|
|
134
|
+
/** Transaction hash */
|
|
135
|
+
txHash: Hash;
|
|
136
|
+
/** Amount of buyToken received */
|
|
137
|
+
buyAmount: bigint;
|
|
138
|
+
/** Amount of sellToken sold */
|
|
139
|
+
sellAmount: bigint;
|
|
140
|
+
/** Transaction receipt */
|
|
141
|
+
receipt: TransactionReceipt;
|
|
142
|
+
/** Gas used */
|
|
143
|
+
gasUsed: bigint;
|
|
144
|
+
/** Effective gas price */
|
|
145
|
+
effectiveGasPrice: bigint;
|
|
146
|
+
}
|
|
147
|
+
/** 0x representation of native ETH (not an actual contract) */
|
|
148
|
+
export declare const NATIVE_TOKEN_ADDRESS: Address;
|
|
149
|
+
/** WETH on Base mainnet */
|
|
150
|
+
export declare const BASE_WETH: Address;
|
|
151
|
+
/** WETH on Base Sepolia */
|
|
152
|
+
export declare const BASE_SEPOLIA_WETH: Address;
|
|
153
|
+
/** 0x API base URL */
|
|
154
|
+
export declare const ZEROX_API_BASE = "https://api.0x.org";
|
|
155
|
+
/** Base mainnet chain ID */
|
|
156
|
+
export declare const BASE_CHAIN_ID = 8453;
|
|
157
|
+
/** Base Sepolia chain ID */
|
|
158
|
+
export declare const BASE_SEPOLIA_CHAIN_ID = 84532;
|
|
159
|
+
//# sourceMappingURL=swap-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap-types.d.ts","sourceRoot":"","sources":["../src/swap-types.ts"],"names":[],"mappings":"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"}
|