@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.
Files changed (63) hide show
  1. package/README.md +190 -0
  2. package/dist/analytics.d.ts +157 -0
  3. package/dist/analytics.d.ts.map +1 -0
  4. package/dist/analytics.js +468 -0
  5. package/dist/analytics.js.map +1 -0
  6. package/dist/api-deployer.d.ts.map +1 -1
  7. package/dist/api-deployer.js +38 -35
  8. package/dist/api-deployer.js.map +1 -1
  9. package/dist/claimer.d.ts.map +1 -1
  10. package/dist/claimer.js +9 -7
  11. package/dist/claimer.js.map +1 -1
  12. package/dist/errors.d.ts +13 -0
  13. package/dist/errors.d.ts.map +1 -1
  14. package/dist/errors.js +50 -0
  15. package/dist/errors.js.map +1 -1
  16. package/dist/index.d.ts +8 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +16 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/liquidity.d.ts +13 -7
  21. package/dist/liquidity.d.ts.map +1 -1
  22. package/dist/liquidity.js +143 -46
  23. package/dist/liquidity.js.map +1 -1
  24. package/dist/orders.d.ts +338 -0
  25. package/dist/orders.d.ts.map +1 -0
  26. package/dist/orders.js +611 -0
  27. package/dist/orders.js.map +1 -0
  28. package/dist/permit2.d.ts +258 -0
  29. package/dist/permit2.d.ts.map +1 -0
  30. package/dist/permit2.js +520 -0
  31. package/dist/permit2.js.map +1 -0
  32. package/dist/price.d.ts +95 -0
  33. package/dist/price.d.ts.map +1 -0
  34. package/dist/price.js +207 -0
  35. package/dist/price.js.map +1 -0
  36. package/dist/swap.d.ts.map +1 -1
  37. package/dist/swap.js +21 -19
  38. package/dist/swap.js.map +1 -1
  39. package/dist/trader.d.ts +188 -0
  40. package/dist/trader.d.ts.map +1 -0
  41. package/dist/trader.js +277 -0
  42. package/dist/trader.js.map +1 -0
  43. package/dist/uniswap-abis.d.ts +525 -0
  44. package/dist/uniswap-abis.d.ts.map +1 -1
  45. package/dist/uniswap-abis.js +432 -1
  46. package/dist/uniswap-abis.js.map +1 -1
  47. package/dist/uniswap-chains.d.ts +77 -0
  48. package/dist/uniswap-chains.d.ts.map +1 -0
  49. package/dist/uniswap-chains.js +362 -0
  50. package/dist/uniswap-chains.js.map +1 -0
  51. package/dist/uniswap-quoter.d.ts +178 -0
  52. package/dist/uniswap-quoter.d.ts.map +1 -0
  53. package/dist/uniswap-quoter.js +432 -0
  54. package/dist/uniswap-quoter.js.map +1 -0
  55. package/dist/uniswap-trading.d.ts +203 -0
  56. package/dist/uniswap-trading.d.ts.map +1 -0
  57. package/dist/uniswap-trading.js +380 -0
  58. package/dist/uniswap-trading.js.map +1 -0
  59. package/dist/watcher.d.ts +117 -2
  60. package/dist/watcher.d.ts.map +1 -1
  61. package/dist/watcher.js +147 -2
  62. package/dist/watcher.js.map +1 -1
  63. package/package.json +3 -1
package/dist/trader.js ADDED
@@ -0,0 +1,277 @@
1
+ /**
2
+ * ClawnchTrader — Trade-level portfolio tracking with cost basis, P&L, and snapshots.
3
+ *
4
+ * Complements ClawnchPortfolio (which tracks on-chain fee balances) by adding:
5
+ * - Per-token cost basis tracking (average entry price)
6
+ * - Unrealized P&L (current value vs cost basis)
7
+ * - Realized P&L (from sells, computed against avg cost)
8
+ * - Portfolio allocation / concentration monitoring
9
+ * - Historical portfolio value snapshots for performance analysis
10
+ * - Trade history ledger
11
+ *
12
+ * Storage is pluggable — same pattern as ClawnchOrders.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const trader = new ClawnchTrader(storage);
17
+ *
18
+ * // Record a buy
19
+ * trader.recordTrade({
20
+ * token: '0xABC...',
21
+ * symbol: 'FOO',
22
+ * side: 'buy',
23
+ * amount: '1000',
24
+ * priceEth: 0.000005,
25
+ * txHash: '0x...',
26
+ * });
27
+ *
28
+ * // Get portfolio summary with live pricing
29
+ * const summary = await trader.getSummary(priceFetcher);
30
+ * console.log(summary.totalValueEth, summary.unrealizedPnlPct);
31
+ * ```
32
+ */
33
+ // ============================================================================
34
+ // ClawnchTrader
35
+ // ============================================================================
36
+ /** Max snapshots to retain (~96/day * 30 days) */
37
+ const MAX_SNAPSHOTS = 3000;
38
+ export class ClawnchTrader {
39
+ storage;
40
+ constructor(storage) {
41
+ this.storage = storage;
42
+ }
43
+ // --------------------------------------------------------------------------
44
+ // Trade recording
45
+ // --------------------------------------------------------------------------
46
+ /**
47
+ * Record a trade. Updates position cost basis and P&L.
48
+ *
49
+ * For buys: increases position size, adjusts average cost basis.
50
+ * For sells: decreases position size, realizes P&L against cost basis.
51
+ */
52
+ recordTrade(params) {
53
+ const positions = this.storage.getPositions();
54
+ const trades = this.storage.getTrades();
55
+ const now = Date.now();
56
+ const trade = {
57
+ id: `trd_${now}_${Math.random().toString(36).slice(2, 8)}`,
58
+ token: params.token,
59
+ symbol: params.symbol ?? '???',
60
+ side: params.side,
61
+ amount: params.amount,
62
+ priceEth: params.priceEth,
63
+ valueEth: parseFloat(params.amount) * params.priceEth,
64
+ txHash: params.txHash,
65
+ timestamp: now,
66
+ tag: params.tag,
67
+ };
68
+ // Find or create position
69
+ let position = positions.find(p => p.token.toLowerCase() === params.token.toLowerCase());
70
+ if (!position) {
71
+ position = {
72
+ token: params.token,
73
+ symbol: params.symbol ?? '???',
74
+ amount: '0',
75
+ avgCostEth: 0,
76
+ totalCostEth: 0,
77
+ totalBought: '0',
78
+ totalSold: '0',
79
+ realizedPnlEth: 0,
80
+ firstBuyAt: now,
81
+ lastTradeAt: now,
82
+ tradeCount: 0,
83
+ };
84
+ positions.push(position);
85
+ }
86
+ const currentAmount = parseFloat(position.amount);
87
+ const tradeAmount = parseFloat(params.amount);
88
+ if (params.side === 'buy') {
89
+ // Average cost basis: (existing_cost + new_cost) / (existing_amount + new_amount)
90
+ const existingCost = currentAmount * position.avgCostEth;
91
+ const newCost = tradeAmount * params.priceEth;
92
+ const newTotal = currentAmount + tradeAmount;
93
+ position.amount = newTotal.toString();
94
+ position.avgCostEth = newTotal > 0 ? (existingCost + newCost) / newTotal : 0;
95
+ position.totalCostEth += newCost;
96
+ position.totalBought = (parseFloat(position.totalBought) + tradeAmount).toString();
97
+ }
98
+ else {
99
+ // Sell: realize P&L against average cost basis
100
+ const sellValue = tradeAmount * params.priceEth;
101
+ const costBasis = tradeAmount * position.avgCostEth;
102
+ const pnl = sellValue - costBasis;
103
+ position.realizedPnlEth += pnl;
104
+ position.amount = Math.max(0, currentAmount - tradeAmount).toString();
105
+ position.totalSold = (parseFloat(position.totalSold) + tradeAmount).toString();
106
+ // Avg cost stays the same on sells (FIFO approximation via avg cost)
107
+ }
108
+ position.lastTradeAt = now;
109
+ position.tradeCount++;
110
+ if (params.symbol)
111
+ position.symbol = params.symbol;
112
+ trades.push(trade);
113
+ this.storage.saveTrades(trades);
114
+ this.storage.savePositions(positions);
115
+ return trade;
116
+ }
117
+ // --------------------------------------------------------------------------
118
+ // Portfolio queries
119
+ // --------------------------------------------------------------------------
120
+ /**
121
+ * Get full portfolio summary with live pricing.
122
+ */
123
+ async getSummary(priceFetcher, ethBalanceEth) {
124
+ const positions = this.storage.getPositions();
125
+ const priced = [];
126
+ let totalValueEth = 0;
127
+ let totalValueUsd = 0;
128
+ let totalUnrealizedPnlEth = 0;
129
+ let totalCostBasis = 0;
130
+ for (const pos of positions) {
131
+ const amount = parseFloat(pos.amount);
132
+ if (amount <= 0)
133
+ continue;
134
+ const priceInfo = await priceFetcher(pos.token);
135
+ const currentPriceEth = priceInfo?.priceEth ?? 0;
136
+ const currentValueEth = amount * currentPriceEth;
137
+ const currentValueUsd = priceInfo?.priceUsd != null ? amount * priceInfo.priceUsd : null;
138
+ const unrealizedPnlEth = currentValueEth - (amount * pos.avgCostEth);
139
+ const costBasis = amount * pos.avgCostEth;
140
+ const unrealizedPnlPct = costBasis > 0 ? (unrealizedPnlEth / costBasis) * 100 : 0;
141
+ priced.push({
142
+ ...pos,
143
+ currentPriceEth,
144
+ currentValueEth,
145
+ currentValueUsd,
146
+ unrealizedPnlEth,
147
+ unrealizedPnlPct,
148
+ allocationPct: 0, // filled below
149
+ });
150
+ totalValueEth += currentValueEth;
151
+ if (totalValueUsd !== null && currentValueUsd !== null) {
152
+ totalValueUsd += currentValueUsd;
153
+ }
154
+ else {
155
+ totalValueUsd = null;
156
+ }
157
+ totalUnrealizedPnlEth += unrealizedPnlEth;
158
+ totalCostBasis += costBasis;
159
+ }
160
+ // Allocation percentages
161
+ let maxConcentrationPct = 0;
162
+ let maxConcentrationToken = '';
163
+ for (const p of priced) {
164
+ p.allocationPct = totalValueEth > 0 ? (p.currentValueEth / totalValueEth) * 100 : 0;
165
+ if (p.allocationPct > maxConcentrationPct) {
166
+ maxConcentrationPct = p.allocationPct;
167
+ maxConcentrationToken = `$${p.symbol}`;
168
+ }
169
+ }
170
+ const totalRealizedPnlEth = positions.reduce((sum, p) => sum + p.realizedPnlEth, 0);
171
+ const unrealizedPnlPct = totalCostBasis > 0 ? (totalUnrealizedPnlEth / totalCostBasis) * 100 : 0;
172
+ return {
173
+ positions: priced,
174
+ totalValueEth,
175
+ totalValueUsd,
176
+ ethBalanceEth: ethBalanceEth ?? 0,
177
+ grandTotalEth: totalValueEth + (ethBalanceEth ?? 0),
178
+ unrealizedPnlEth: totalUnrealizedPnlEth,
179
+ unrealizedPnlPct,
180
+ realizedPnlEth: totalRealizedPnlEth,
181
+ maxConcentrationPct,
182
+ maxConcentrationToken,
183
+ timestamp: Date.now(),
184
+ };
185
+ }
186
+ /** Get positions list (raw, no pricing). */
187
+ getPositions() {
188
+ return this.storage.getPositions();
189
+ }
190
+ /** Get trade history, optionally filtered by token. */
191
+ getTrades(token) {
192
+ const trades = this.storage.getTrades();
193
+ if (!token)
194
+ return trades;
195
+ return trades.filter(t => t.token.toLowerCase() === token.toLowerCase());
196
+ }
197
+ /** Get position for a specific token. */
198
+ getPosition(token) {
199
+ return this.storage.getPositions().find(p => p.token.toLowerCase() === token.toLowerCase()) ?? null;
200
+ }
201
+ // --------------------------------------------------------------------------
202
+ // Snapshots
203
+ // --------------------------------------------------------------------------
204
+ /** Take a snapshot of current portfolio value. Call once per heartbeat. */
205
+ recordSnapshot(totalValueEth, totalValueUsd, ethBalance) {
206
+ const snapshots = this.storage.getSnapshots();
207
+ const positionCount = this.storage.getPositions().filter(p => parseFloat(p.amount) > 0).length;
208
+ snapshots.push({
209
+ timestamp: Date.now(),
210
+ totalValueEth,
211
+ totalValueUsd,
212
+ ethBalance,
213
+ positionCount,
214
+ });
215
+ while (snapshots.length > MAX_SNAPSHOTS) {
216
+ snapshots.shift();
217
+ }
218
+ this.storage.saveSnapshots(snapshots);
219
+ }
220
+ /** Get portfolio value history for charting / analysis. */
221
+ getHistory(limit) {
222
+ const snapshots = this.storage.getSnapshots();
223
+ if (limit)
224
+ return snapshots.slice(-limit);
225
+ return snapshots;
226
+ }
227
+ /**
228
+ * Compute portfolio performance over a time window.
229
+ */
230
+ getPerformance(windowMs) {
231
+ const snapshots = this.storage.getSnapshots();
232
+ if (snapshots.length < 2)
233
+ return null;
234
+ const cutoff = Date.now() - windowMs;
235
+ const startSnap = snapshots.find(s => s.timestamp >= cutoff) ?? snapshots[0];
236
+ const endSnap = snapshots[snapshots.length - 1];
237
+ const changeEth = endSnap.totalValueEth - startSnap.totalValueEth;
238
+ const changePct = startSnap.totalValueEth > 0
239
+ ? (changeEth / startSnap.totalValueEth) * 100
240
+ : 0;
241
+ const hours = windowMs / (60 * 60 * 1000);
242
+ const period = hours >= 24 ? `${(hours / 24).toFixed(0)}d` : `${hours.toFixed(0)}h`;
243
+ return { startValue: startSnap.totalValueEth, endValue: endSnap.totalValueEth, changePct, changeEth, period };
244
+ }
245
+ // --------------------------------------------------------------------------
246
+ // Formatting
247
+ // --------------------------------------------------------------------------
248
+ /** Format portfolio summary for the agent's system prompt. */
249
+ static formatSummary(summary) {
250
+ const lines = [];
251
+ lines.push(`=== Trading Portfolio ===`);
252
+ lines.push(`Tokens: ${summary.totalValueEth.toFixed(6)} ETH${summary.totalValueUsd != null ? ` ($${summary.totalValueUsd.toFixed(2)})` : ''}`);
253
+ lines.push(`ETH: ${summary.ethBalanceEth.toFixed(6)}`);
254
+ lines.push(`Total: ${summary.grandTotalEth.toFixed(6)} ETH`);
255
+ if (summary.unrealizedPnlEth !== 0) {
256
+ const s = summary.unrealizedPnlEth >= 0 ? '+' : '';
257
+ lines.push(`Unrealized P&L: ${s}${summary.unrealizedPnlEth.toFixed(6)} ETH (${s}${summary.unrealizedPnlPct.toFixed(1)}%)`);
258
+ }
259
+ if (summary.realizedPnlEth !== 0) {
260
+ const s = summary.realizedPnlEth >= 0 ? '+' : '';
261
+ lines.push(`Realized P&L: ${s}${summary.realizedPnlEth.toFixed(6)} ETH`);
262
+ }
263
+ if (summary.positions.length > 0) {
264
+ lines.push(``);
265
+ for (const p of summary.positions) {
266
+ const pnlSign = p.unrealizedPnlPct >= 0 ? '+' : '';
267
+ lines.push(` $${p.symbol}: ${parseFloat(p.amount).toFixed(2)} @ ${p.currentPriceEth.toExponential(3)} ETH = ${p.currentValueEth.toFixed(6)} ETH [${pnlSign}${p.unrealizedPnlPct.toFixed(1)}%] (${p.allocationPct.toFixed(0)}%)`);
268
+ }
269
+ }
270
+ if (summary.maxConcentrationPct > 50) {
271
+ lines.push(``);
272
+ lines.push(`WARN: ${summary.maxConcentrationToken} = ${summary.maxConcentrationPct.toFixed(0)}% of portfolio`);
273
+ }
274
+ return lines.join('\n');
275
+ }
276
+ }
277
+ //# sourceMappingURL=trader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trader.js","sourceRoot":"","sources":["../src/trader.ts"],"names":[],"mappings":"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"}