@clawnch/clawncher-sdk 0.1.3 → 0.3.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 +190 -0
- package/dist/analytics.d.ts +157 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +468 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api-deployer.d.ts.map +1 -1
- package/dist/api-deployer.js +38 -35
- package/dist/api-deployer.js.map +1 -1
- package/dist/claimer.d.ts.map +1 -1
- package/dist/claimer.js +9 -7
- package/dist/claimer.js.map +1 -1
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +50 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/liquidity.d.ts +13 -7
- package/dist/liquidity.d.ts.map +1 -1
- package/dist/liquidity.js +143 -46
- package/dist/liquidity.js.map +1 -1
- package/dist/orders.d.ts +338 -0
- package/dist/orders.d.ts.map +1 -0
- package/dist/orders.js +611 -0
- package/dist/orders.js.map +1 -0
- package/dist/permit2.d.ts +258 -0
- package/dist/permit2.d.ts.map +1 -0
- package/dist/permit2.js +520 -0
- package/dist/permit2.js.map +1 -0
- package/dist/price.d.ts +95 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +207 -0
- package/dist/price.js.map +1 -0
- package/dist/swap.d.ts.map +1 -1
- package/dist/swap.js +21 -19
- package/dist/swap.js.map +1 -1
- package/dist/trader.d.ts +188 -0
- package/dist/trader.d.ts.map +1 -0
- package/dist/trader.js +277 -0
- package/dist/trader.js.map +1 -0
- package/dist/uniswap-abis.d.ts +525 -0
- package/dist/uniswap-abis.d.ts.map +1 -1
- package/dist/uniswap-abis.js +432 -1
- package/dist/uniswap-abis.js.map +1 -1
- package/dist/uniswap-chains.d.ts +77 -0
- package/dist/uniswap-chains.d.ts.map +1 -0
- package/dist/uniswap-chains.js +362 -0
- package/dist/uniswap-chains.js.map +1 -0
- package/dist/uniswap-quoter.d.ts +178 -0
- package/dist/uniswap-quoter.d.ts.map +1 -0
- package/dist/uniswap-quoter.js +432 -0
- package/dist/uniswap-quoter.js.map +1 -0
- package/dist/uniswap-trading.d.ts +203 -0
- package/dist/uniswap-trading.d.ts.map +1 -0
- package/dist/uniswap-trading.js +380 -0
- package/dist/uniswap-trading.js.map +1 -0
- package/dist/watcher.d.ts +117 -2
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +147 -2
- package/dist/watcher.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UniswapTradingApi — Swap execution via Uniswap's Trading API.
|
|
3
|
+
*
|
|
4
|
+
* Implements the 3-step flow:
|
|
5
|
+
* 1. POST /check_approval → tells you if token approval is needed
|
|
6
|
+
* 2. POST /quote → returns a firm swap quote
|
|
7
|
+
* 3. POST /swap → returns signed calldata for UniversalRouter
|
|
8
|
+
*
|
|
9
|
+
* Supports all 15 Uniswap chains via the multi-chain registry.
|
|
10
|
+
* Falls through to direct V4 UniversalRouter execution if no API key
|
|
11
|
+
* is available (see uniswap-quoter.ts for on-chain quoting).
|
|
12
|
+
*
|
|
13
|
+
* @see https://docs.uniswap.org/api/trading-api
|
|
14
|
+
*
|
|
15
|
+
* Critical Trading API rules (from Uniswap AI swap-integration skill):
|
|
16
|
+
* - Spread the quote response INTO the swap request (don't nest/wrap it)
|
|
17
|
+
* - Strip `permitData: null` before sending to /swap
|
|
18
|
+
* - Quotes expire in ~30 seconds — execute promptly
|
|
19
|
+
* - Use `x-universal-router-version: 2.0` header
|
|
20
|
+
*/
|
|
21
|
+
import { erc20Abi, maxUint256, } from 'viem';
|
|
22
|
+
import { ClawnchErrorCode, ClawnchDeployError, withRetry } from './errors.js';
|
|
23
|
+
import { getUniswapChain } from './uniswap-chains.js';
|
|
24
|
+
import { Permit2Client, PERMIT2_ADDRESS } from './permit2.js';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Constants
|
|
27
|
+
// ============================================================================
|
|
28
|
+
const TRADING_API_BASE = 'https://trade-api.gateway.uniswap.org/v1';
|
|
29
|
+
const NATIVE_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// UniswapTradingApi
|
|
32
|
+
// ============================================================================
|
|
33
|
+
export class UniswapTradingApi {
|
|
34
|
+
wallet;
|
|
35
|
+
publicClient;
|
|
36
|
+
chainId;
|
|
37
|
+
apiKey;
|
|
38
|
+
slippageBps;
|
|
39
|
+
chainConfig;
|
|
40
|
+
constructor(config) {
|
|
41
|
+
if (!config.wallet) {
|
|
42
|
+
throw new ClawnchDeployError(ClawnchErrorCode.WALLET_NOT_CONFIGURED, 'Wallet client is required for UniswapTradingApi');
|
|
43
|
+
}
|
|
44
|
+
this.wallet = config.wallet;
|
|
45
|
+
this.publicClient = config.publicClient;
|
|
46
|
+
this.chainId = config.chainId ?? 8453;
|
|
47
|
+
this.apiKey = config.apiKey;
|
|
48
|
+
this.slippageBps = config.slippageBps ?? 50;
|
|
49
|
+
const chain = getUniswapChain(this.chainId);
|
|
50
|
+
if (!chain) {
|
|
51
|
+
throw new ClawnchDeployError(ClawnchErrorCode.INVALID_CHAIN, `Chain ${this.chainId} is not supported by Uniswap`);
|
|
52
|
+
}
|
|
53
|
+
if (!chain.tradingApi) {
|
|
54
|
+
throw new ClawnchDeployError(ClawnchErrorCode.INVALID_CHAIN, `Chain ${chain.name} (${this.chainId}) does not support the Uniswap Trading API`);
|
|
55
|
+
}
|
|
56
|
+
this.chainConfig = chain;
|
|
57
|
+
}
|
|
58
|
+
/** Lazy-initialized Permit2 client for signature-based approvals */
|
|
59
|
+
_permit2 = null;
|
|
60
|
+
/** Check if the Trading API is available (has API key) */
|
|
61
|
+
get isAvailable() {
|
|
62
|
+
return !!this.apiKey;
|
|
63
|
+
}
|
|
64
|
+
/** Get the taker address */
|
|
65
|
+
get taker() {
|
|
66
|
+
return this.wallet.account.address;
|
|
67
|
+
}
|
|
68
|
+
/** Get Permit2 client for advanced approval flows */
|
|
69
|
+
get permit2() {
|
|
70
|
+
if (!this._permit2) {
|
|
71
|
+
this._permit2 = new Permit2Client({
|
|
72
|
+
wallet: this.wallet,
|
|
73
|
+
publicClient: this.publicClient,
|
|
74
|
+
chainId: this.chainId,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return this._permit2;
|
|
78
|
+
}
|
|
79
|
+
// ==========================================================================
|
|
80
|
+
// API helpers
|
|
81
|
+
// ==========================================================================
|
|
82
|
+
async apiPost(path, body) {
|
|
83
|
+
if (!this.apiKey) {
|
|
84
|
+
throw new ClawnchDeployError(ClawnchErrorCode.WALLET_NOT_CONFIGURED, 'Uniswap Trading API key is required. Set apiKey in config.');
|
|
85
|
+
}
|
|
86
|
+
return withRetry(async () => {
|
|
87
|
+
const url = `${TRADING_API_BASE}${path}`;
|
|
88
|
+
const response = await fetch(url, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
'x-api-key': this.apiKey,
|
|
93
|
+
'x-universal-router-version': '2.0',
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify(body),
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
let errorMsg;
|
|
99
|
+
try {
|
|
100
|
+
const errBody = await response.json();
|
|
101
|
+
errorMsg = errBody.errorCode
|
|
102
|
+
? `${errBody.errorCode}: ${errBody.detail || errBody.message || JSON.stringify(errBody)}`
|
|
103
|
+
: JSON.stringify(errBody);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
errorMsg = `HTTP ${response.status}: ${response.statusText}`;
|
|
107
|
+
}
|
|
108
|
+
throw new ClawnchDeployError(ClawnchErrorCode.RPC_ERROR, `Uniswap Trading API error (${path}): ${errorMsg}`);
|
|
109
|
+
}
|
|
110
|
+
return response.json();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// ==========================================================================
|
|
114
|
+
// Step 1: Check Approval
|
|
115
|
+
// ==========================================================================
|
|
116
|
+
/**
|
|
117
|
+
* Check if the sell token needs approval for Permit2 / UniversalRouter.
|
|
118
|
+
*
|
|
119
|
+
* Native ETH never needs approval.
|
|
120
|
+
*/
|
|
121
|
+
async checkApproval(tokenIn, amount) {
|
|
122
|
+
if (this.isNative(tokenIn)) {
|
|
123
|
+
return { approvalNeeded: false, approvalTarget: null, token: null, approvalTx: null };
|
|
124
|
+
}
|
|
125
|
+
const response = await this.apiPost('/check_approval', {
|
|
126
|
+
token: tokenIn,
|
|
127
|
+
amount: amount.toString(),
|
|
128
|
+
chainId: this.chainId,
|
|
129
|
+
walletAddress: this.taker,
|
|
130
|
+
});
|
|
131
|
+
const approval = response.approval;
|
|
132
|
+
if (!approval) {
|
|
133
|
+
return { approvalNeeded: false, approvalTarget: null, token: null, approvalTx: null };
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
approvalNeeded: true,
|
|
137
|
+
approvalTarget: (approval.spender ?? this.chainConfig.permit2),
|
|
138
|
+
token: tokenIn,
|
|
139
|
+
approvalTx: approval.txRequest
|
|
140
|
+
? {
|
|
141
|
+
to: approval.txRequest.to,
|
|
142
|
+
data: approval.txRequest.data,
|
|
143
|
+
value: approval.txRequest.value ?? '0',
|
|
144
|
+
}
|
|
145
|
+
: null,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// ==========================================================================
|
|
149
|
+
// Step 2: Get Quote
|
|
150
|
+
// ==========================================================================
|
|
151
|
+
/**
|
|
152
|
+
* Get a firm swap quote from the Trading API.
|
|
153
|
+
*
|
|
154
|
+
* The raw quote response must be spread into the /swap request — the API
|
|
155
|
+
* expects the same shape, not a nested `quote` key.
|
|
156
|
+
*/
|
|
157
|
+
async getQuote(params) {
|
|
158
|
+
const slippage = params.slippageBps ?? this.slippageBps;
|
|
159
|
+
const body = {
|
|
160
|
+
type: params.type ?? 'EXACT_INPUT',
|
|
161
|
+
tokenInChainId: this.chainId,
|
|
162
|
+
tokenOutChainId: this.chainId,
|
|
163
|
+
tokenIn: params.tokenIn,
|
|
164
|
+
tokenOut: params.tokenOut,
|
|
165
|
+
amount: params.amount.toString(),
|
|
166
|
+
swapper: this.taker,
|
|
167
|
+
slippageTolerance: (slippage / 10000).toString(), // API expects decimal like "0.005"
|
|
168
|
+
};
|
|
169
|
+
const raw = await this.apiPost('/quote', body);
|
|
170
|
+
// Parse useful fields
|
|
171
|
+
const quoteAmount = BigInt(raw.quote?.amount ?? raw.quoteGasAdjusted ?? '0');
|
|
172
|
+
const gasEstimate = BigInt(raw.gasEstimate ?? raw.gasFeeEstimate ?? '0');
|
|
173
|
+
const priceImpact = parseFloat(raw.priceImpact ?? '0');
|
|
174
|
+
const routeDescription = this.buildRouteDescription(raw);
|
|
175
|
+
return {
|
|
176
|
+
raw,
|
|
177
|
+
quoteAmount,
|
|
178
|
+
gasEstimate,
|
|
179
|
+
priceImpact,
|
|
180
|
+
routeDescription,
|
|
181
|
+
expiresAt: Date.now() + 30_000, // ~30s expiry
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// ==========================================================================
|
|
185
|
+
// Step 3: Execute Swap
|
|
186
|
+
// ==========================================================================
|
|
187
|
+
/**
|
|
188
|
+
* Execute a swap using the Trading API's /swap endpoint.
|
|
189
|
+
*
|
|
190
|
+
* The quote response is spread directly into the swap request body.
|
|
191
|
+
* `permitData: null` is stripped (the API rejects it if present).
|
|
192
|
+
*/
|
|
193
|
+
async executeSwap(quote) {
|
|
194
|
+
// Check quote hasn't expired
|
|
195
|
+
if (Date.now() > quote.expiresAt) {
|
|
196
|
+
throw new ClawnchDeployError(ClawnchErrorCode.DEPLOY_FAILED, 'Trading API quote has expired. Re-fetch a fresh quote.');
|
|
197
|
+
}
|
|
198
|
+
// Spread quote into swap request — key rule from Uniswap AI
|
|
199
|
+
const swapBody = { ...quote.raw };
|
|
200
|
+
// Strip null permitData — the API rejects it
|
|
201
|
+
if (swapBody.permitData === null || swapBody.permitData === undefined) {
|
|
202
|
+
delete swapBody.permitData;
|
|
203
|
+
}
|
|
204
|
+
const response = await this.apiPost('/swap', swapBody);
|
|
205
|
+
// The response contains the transaction to send
|
|
206
|
+
const swap = response.swap ?? response;
|
|
207
|
+
if (!swap.to || !swap.data) {
|
|
208
|
+
throw new ClawnchDeployError(ClawnchErrorCode.DEPLOY_FAILED, 'Trading API /swap did not return transaction data');
|
|
209
|
+
}
|
|
210
|
+
const txHash = await this.wallet.sendTransaction({
|
|
211
|
+
account: this.wallet.account,
|
|
212
|
+
chain: null, // let wallet decide
|
|
213
|
+
to: swap.to,
|
|
214
|
+
data: swap.data,
|
|
215
|
+
value: BigInt(swap.value ?? '0'),
|
|
216
|
+
gas: swap.gasLimit ? BigInt(swap.gasLimit) : undefined,
|
|
217
|
+
});
|
|
218
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
219
|
+
if (receipt.status === 'reverted') {
|
|
220
|
+
throw new ClawnchDeployError(ClawnchErrorCode.TX_REVERTED, `Uniswap Trading API swap reverted: ${txHash}`);
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
txHash,
|
|
224
|
+
quoteAmount: quote.quoteAmount,
|
|
225
|
+
receipt,
|
|
226
|
+
gasUsed: receipt.gasUsed,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ==========================================================================
|
|
230
|
+
// Full swap flow (approve + quote + swap)
|
|
231
|
+
// ==========================================================================
|
|
232
|
+
/**
|
|
233
|
+
* Execute a full swap: check approval → approve if needed → quote → swap.
|
|
234
|
+
*
|
|
235
|
+
* This is the primary high-level method.
|
|
236
|
+
*
|
|
237
|
+
* Approval flow:
|
|
238
|
+
* 1. If Trading API returns an approval tx, execute it directly
|
|
239
|
+
* 2. Otherwise, use Permit2Client for the full two-step flow:
|
|
240
|
+
* a. ERC20.approve(Permit2, MAX) — one-time per token
|
|
241
|
+
* b. Permit2.approve(token, UniversalRouter, amount, expiry) — grant router access
|
|
242
|
+
*/
|
|
243
|
+
async swap(params) {
|
|
244
|
+
// 1. Check & execute approval if needed
|
|
245
|
+
const approval = await this.checkApproval(params.tokenIn, params.amount);
|
|
246
|
+
if (approval.approvalNeeded && approval.approvalTx) {
|
|
247
|
+
// Use the Trading API's suggested approval tx
|
|
248
|
+
const approveTx = await this.wallet.sendTransaction({
|
|
249
|
+
account: this.wallet.account,
|
|
250
|
+
chain: null,
|
|
251
|
+
to: approval.approvalTx.to,
|
|
252
|
+
data: approval.approvalTx.data,
|
|
253
|
+
value: BigInt(approval.approvalTx.value),
|
|
254
|
+
});
|
|
255
|
+
await this.publicClient.waitForTransactionReceipt({ hash: approveTx });
|
|
256
|
+
}
|
|
257
|
+
else if (approval.approvalNeeded && !approval.approvalTx) {
|
|
258
|
+
// Fallback: full Permit2 flow (ERC20→Permit2, then Permit2→UniversalRouter)
|
|
259
|
+
await this.ensureFullPermit2Approval(params.tokenIn, params.amount);
|
|
260
|
+
}
|
|
261
|
+
// 2. Get firm quote
|
|
262
|
+
const quote = await this.getQuote(params);
|
|
263
|
+
// 3. Execute swap
|
|
264
|
+
return this.executeSwap(quote);
|
|
265
|
+
}
|
|
266
|
+
// ==========================================================================
|
|
267
|
+
// Approval helpers
|
|
268
|
+
// ==========================================================================
|
|
269
|
+
/**
|
|
270
|
+
* Full Permit2 approval flow for swaps:
|
|
271
|
+
* 1. ERC20.approve(Permit2, MAX) — one-time per token
|
|
272
|
+
* 2. Permit2.approve(token, UniversalRouter, amount, expiry)
|
|
273
|
+
*
|
|
274
|
+
* Uses direct on-chain approve (not signature) since agent wallets
|
|
275
|
+
* control their own private key and don't benefit from gasless signing.
|
|
276
|
+
*/
|
|
277
|
+
async ensureFullPermit2Approval(token, amount) {
|
|
278
|
+
if (this.isNative(token)) {
|
|
279
|
+
return { approvalTxHash: null, permitTxHash: null };
|
|
280
|
+
}
|
|
281
|
+
const universalRouter = this.chainConfig.v4UniversalRouter;
|
|
282
|
+
return this.permit2.ensurePermit2Allowance(token, universalRouter, amount);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Approve a token for Permit2 (ERC20→Permit2 only, step 1).
|
|
286
|
+
*
|
|
287
|
+
* For the full flow (ERC20→Permit2 + Permit2→Router), use
|
|
288
|
+
* `ensureFullPermit2Approval()` or the `permit2` client directly.
|
|
289
|
+
*/
|
|
290
|
+
async approveTokenForPermit2(token) {
|
|
291
|
+
return this.permit2.ensureTokenApproval(token);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Check ERC20 allowance to the Permit2 contract.
|
|
295
|
+
*/
|
|
296
|
+
async getErc20Permit2Allowance(token) {
|
|
297
|
+
if (this.isNative(token))
|
|
298
|
+
return maxUint256;
|
|
299
|
+
return this.publicClient.readContract({
|
|
300
|
+
address: token,
|
|
301
|
+
abi: erc20Abi,
|
|
302
|
+
functionName: 'allowance',
|
|
303
|
+
args: [this.taker, PERMIT2_ADDRESS],
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Check Permit2 AllowanceTransfer state for a token → spender pair.
|
|
308
|
+
*
|
|
309
|
+
* Returns the Permit2 internal allowance (amount, expiration, nonce),
|
|
310
|
+
* NOT the ERC20 allowance to Permit2 itself.
|
|
311
|
+
*/
|
|
312
|
+
async getPermit2Allowance(token, spender) {
|
|
313
|
+
if (this.isNative(token)) {
|
|
314
|
+
return { amount: maxUint256, expiration: 2 ** 48 - 1, nonce: 0 };
|
|
315
|
+
}
|
|
316
|
+
const target = spender ?? this.chainConfig.v4UniversalRouter;
|
|
317
|
+
return this.permit2.getAllowance(token, target);
|
|
318
|
+
}
|
|
319
|
+
// ==========================================================================
|
|
320
|
+
// Deep link generation
|
|
321
|
+
// ==========================================================================
|
|
322
|
+
/**
|
|
323
|
+
* Generate a Uniswap app deep link for a swap.
|
|
324
|
+
*
|
|
325
|
+
* Useful for sharing swap links or as a fallback UI for users.
|
|
326
|
+
*
|
|
327
|
+
* @example
|
|
328
|
+
* ```
|
|
329
|
+
* const link = trading.getSwapDeepLink({
|
|
330
|
+
* tokenIn: WETH,
|
|
331
|
+
* tokenOut: TOKEN,
|
|
332
|
+
* amount: parseEther('0.1'),
|
|
333
|
+
* });
|
|
334
|
+
* // => "https://app.uniswap.org/swap?chain=base&inputCurrency=0x...&outputCurrency=0x...&value=0.1&field=INPUT"
|
|
335
|
+
* ```
|
|
336
|
+
*/
|
|
337
|
+
getSwapDeepLink(params) {
|
|
338
|
+
const chain = this.chainConfig.slug;
|
|
339
|
+
const input = this.isNative(params.tokenIn) ? 'NATIVE' : params.tokenIn;
|
|
340
|
+
const output = this.isNative(params.tokenOut) ? 'NATIVE' : params.tokenOut;
|
|
341
|
+
let url = `https://app.uniswap.org/swap?chain=${chain}&inputCurrency=${input}&outputCurrency=${output}`;
|
|
342
|
+
if (params.amount !== undefined) {
|
|
343
|
+
const decimals = params.decimals ?? 18;
|
|
344
|
+
const humanAmount = Number(params.amount) / 10 ** decimals;
|
|
345
|
+
url += `&value=${humanAmount}&field=INPUT`;
|
|
346
|
+
}
|
|
347
|
+
return url;
|
|
348
|
+
}
|
|
349
|
+
// ==========================================================================
|
|
350
|
+
// Utilities
|
|
351
|
+
// ==========================================================================
|
|
352
|
+
isNative(token) {
|
|
353
|
+
return (token.toLowerCase() === NATIVE_ADDRESS.toLowerCase() ||
|
|
354
|
+
token === '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE');
|
|
355
|
+
}
|
|
356
|
+
buildRouteDescription(raw) {
|
|
357
|
+
try {
|
|
358
|
+
const route = raw.route;
|
|
359
|
+
if (!route)
|
|
360
|
+
return 'Unknown route';
|
|
361
|
+
if (Array.isArray(route)) {
|
|
362
|
+
return route
|
|
363
|
+
.map((r) => {
|
|
364
|
+
const pools = r.route?.map((p) => `${p.protocol ?? 'V4'} ${p.fee ? `(${Number(p.fee) / 10000}%)` : ''}`);
|
|
365
|
+
return pools?.join(' → ') ?? 'Unknown';
|
|
366
|
+
})
|
|
367
|
+
.join(' | ');
|
|
368
|
+
}
|
|
369
|
+
return JSON.stringify(route).slice(0, 200);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return 'Route parsing failed';
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/** Get chain config */
|
|
376
|
+
get chain() {
|
|
377
|
+
return this.chainConfig;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=uniswap-trading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniswap-trading.js","sourceRoot":"","sources":["../src/uniswap-trading.ts"],"names":[],"mappings":"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"}
|
package/dist/watcher.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ClawnchWatcher - Live event watching for Clawncher tokens
|
|
3
3
|
*
|
|
4
|
-
* Watches for new token deployments and
|
|
5
|
-
* using viem's event subscription (WebSocket recommended)
|
|
4
|
+
* Watches for new token deployments, swaps, and transfers in real-time
|
|
5
|
+
* using viem's event subscription (WebSocket recommended) or historical
|
|
6
|
+
* log fetching (HTTP).
|
|
6
7
|
*
|
|
7
8
|
* Uses `publicClient.watchContractEvent()` which works with both
|
|
8
9
|
* polling (HTTP) and subscription (WebSocket) transports.
|
|
@@ -36,6 +37,75 @@ export interface NewTokenEvent {
|
|
|
36
37
|
/** Transaction hash */
|
|
37
38
|
txHash: `0x${string}`;
|
|
38
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* ERC-20 Transfer event (token movement)
|
|
42
|
+
*/
|
|
43
|
+
export interface TokenTransferEvent {
|
|
44
|
+
/** Token contract address */
|
|
45
|
+
token: Address;
|
|
46
|
+
/** Sender */
|
|
47
|
+
from: Address;
|
|
48
|
+
/** Recipient */
|
|
49
|
+
to: Address;
|
|
50
|
+
/** Amount transferred (raw) */
|
|
51
|
+
amount: bigint;
|
|
52
|
+
/** Amount formatted (18 decimals assumed) */
|
|
53
|
+
amountFormatted: string;
|
|
54
|
+
/** Block number */
|
|
55
|
+
blockNumber: bigint;
|
|
56
|
+
/** Transaction hash */
|
|
57
|
+
txHash: `0x${string}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Swap event from Uniswap V4 PoolManager
|
|
61
|
+
*/
|
|
62
|
+
export interface PoolSwapEvent {
|
|
63
|
+
/** Pool ID (bytes32) */
|
|
64
|
+
poolId: `0x${string}`;
|
|
65
|
+
/** Swapper address */
|
|
66
|
+
sender: Address;
|
|
67
|
+
/** Amount of currency0 swapped (negative = sold, positive = bought) */
|
|
68
|
+
amount0: bigint;
|
|
69
|
+
/** Amount of currency1 swapped (negative = sold, positive = bought) */
|
|
70
|
+
amount1: bigint;
|
|
71
|
+
/** New sqrtPriceX96 after swap */
|
|
72
|
+
sqrtPriceX96: bigint;
|
|
73
|
+
/** Pool liquidity after swap */
|
|
74
|
+
liquidity: bigint;
|
|
75
|
+
/** New tick after swap */
|
|
76
|
+
tick: number;
|
|
77
|
+
/** Fee paid */
|
|
78
|
+
fee: number;
|
|
79
|
+
/** Block number */
|
|
80
|
+
blockNumber: bigint;
|
|
81
|
+
/** Transaction hash */
|
|
82
|
+
txHash: `0x${string}`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Recent activity summary for an agent's token
|
|
86
|
+
*/
|
|
87
|
+
export interface TokenActivity {
|
|
88
|
+
/** Token address */
|
|
89
|
+
token: Address;
|
|
90
|
+
/** Recent transfers (sorted newest first) */
|
|
91
|
+
transfers: TokenTransferEvent[];
|
|
92
|
+
/** Recent swaps (sorted newest first) */
|
|
93
|
+
swaps: PoolSwapEvent[];
|
|
94
|
+
/** Block range scanned */
|
|
95
|
+
fromBlock: bigint;
|
|
96
|
+
toBlock: bigint;
|
|
97
|
+
/** Summary stats */
|
|
98
|
+
stats: {
|
|
99
|
+
transferCount: number;
|
|
100
|
+
swapCount: number;
|
|
101
|
+
uniqueAddresses: number;
|
|
102
|
+
/** Largest single transfer (raw amount) */
|
|
103
|
+
largestTransfer: bigint;
|
|
104
|
+
/** Total volume through swaps (absolute amount0 sum) */
|
|
105
|
+
totalVolume0: bigint;
|
|
106
|
+
totalVolume1: bigint;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
39
109
|
/**
|
|
40
110
|
* Watcher configuration
|
|
41
111
|
*/
|
|
@@ -108,5 +178,50 @@ export declare class ClawnchWatcher {
|
|
|
108
178
|
toBlock?: bigint;
|
|
109
179
|
tokenAdmin?: Address;
|
|
110
180
|
}): Promise<NewTokenEvent[]>;
|
|
181
|
+
/**
|
|
182
|
+
* Get recent ERC-20 Transfer events for a token.
|
|
183
|
+
*
|
|
184
|
+
* Useful for detecting whale movements, new holders, and distribution changes.
|
|
185
|
+
* Default block range: last 2,000 blocks (~1.1 hours on Base at 2s blocks).
|
|
186
|
+
*/
|
|
187
|
+
getRecentTransfers(token: Address, options?: {
|
|
188
|
+
fromBlock?: bigint;
|
|
189
|
+
toBlock?: bigint;
|
|
190
|
+
/** Max results to return (default 50) */
|
|
191
|
+
limit?: number;
|
|
192
|
+
}): Promise<TokenTransferEvent[]>;
|
|
193
|
+
/**
|
|
194
|
+
* Get recent swap events from the Uniswap V4 PoolManager for a given poolId.
|
|
195
|
+
*
|
|
196
|
+
* The PoolManager emits `Swap(bytes32 indexed id, address indexed sender,
|
|
197
|
+
* int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity,
|
|
198
|
+
* int24 tick, uint24 fee)`.
|
|
199
|
+
*
|
|
200
|
+
* Default range: last 2,000 blocks.
|
|
201
|
+
*/
|
|
202
|
+
getRecentSwaps(poolId: `0x${string}`, options?: {
|
|
203
|
+
fromBlock?: bigint;
|
|
204
|
+
toBlock?: bigint;
|
|
205
|
+
limit?: number;
|
|
206
|
+
}): Promise<PoolSwapEvent[]>;
|
|
207
|
+
/**
|
|
208
|
+
* Get a combined activity summary for a Clawncher token.
|
|
209
|
+
*
|
|
210
|
+
* Fetches both ERC-20 transfers and V4 pool swaps, computes summary stats
|
|
211
|
+
* including unique addresses, largest transfer, and total volume.
|
|
212
|
+
*
|
|
213
|
+
* Requires the poolId (get it from `ClawnchReader.getTokenRewards(token).poolKey`
|
|
214
|
+
* and compute the hash, or pass it directly).
|
|
215
|
+
*
|
|
216
|
+
* @param token - Token contract address
|
|
217
|
+
* @param poolId - V4 pool ID (bytes32)
|
|
218
|
+
* @param options - Block range and limits
|
|
219
|
+
*/
|
|
220
|
+
getTokenActivity(token: Address, poolId: `0x${string}`, options?: {
|
|
221
|
+
fromBlock?: bigint;
|
|
222
|
+
toBlock?: bigint;
|
|
223
|
+
transferLimit?: number;
|
|
224
|
+
swapLimit?: number;
|
|
225
|
+
}): Promise<TokenActivity>;
|
|
111
226
|
}
|
|
112
227
|
//# sourceMappingURL=watcher.d.ts.map
|
package/dist/watcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
|