@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
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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"}
|