@clawnch/clawtomaton 0.2.2 → 0.4.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 +82 -10
- package/dist/agent/index.d.ts +5 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +120 -10
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/prompt.d.ts +2 -0
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +199 -2
- package/dist/agent/prompt.js.map +1 -1
- package/dist/bunker/client.d.ts +113 -0
- package/dist/bunker/client.d.ts.map +1 -0
- package/dist/bunker/client.js +404 -0
- package/dist/bunker/client.js.map +1 -0
- package/dist/bunker/self-deploy.d.ts +54 -0
- package/dist/bunker/self-deploy.d.ts.map +1 -0
- package/dist/bunker/self-deploy.js +353 -0
- package/dist/bunker/self-deploy.js.map +1 -0
- package/dist/bunker/threat-monitor.d.ts +47 -0
- package/dist/bunker/threat-monitor.d.ts.map +1 -0
- package/dist/bunker/threat-monitor.js +173 -0
- package/dist/bunker/threat-monitor.js.map +1 -0
- package/dist/bunker/types.d.ts +320 -0
- package/dist/bunker/types.d.ts.map +1 -0
- package/dist/bunker/types.js +9 -0
- package/dist/bunker/types.js.map +1 -0
- package/dist/cli.js +207 -9
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/heartbeat/index.d.ts +28 -0
- package/dist/heartbeat/index.d.ts.map +1 -1
- package/dist/heartbeat/index.js +240 -11
- package/dist/heartbeat/index.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/market/index.d.ts +20 -1
- package/dist/market/index.d.ts.map +1 -1
- package/dist/market/index.js +76 -4
- package/dist/market/index.js.map +1 -1
- package/dist/skills/analyze-market.d.ts +17 -0
- package/dist/skills/analyze-market.d.ts.map +1 -0
- package/dist/skills/analyze-market.js +156 -0
- package/dist/skills/analyze-market.js.map +1 -0
- package/dist/skills/bunker.d.ts +29 -0
- package/dist/skills/bunker.d.ts.map +1 -0
- package/dist/skills/bunker.js +502 -0
- package/dist/skills/bunker.js.map +1 -0
- package/dist/skills/check-balance.d.ts +2 -2
- package/dist/skills/check-balance.d.ts.map +1 -1
- package/dist/skills/check-balance.js +43 -8
- package/dist/skills/check-balance.js.map +1 -1
- package/dist/skills/check-price.d.ts +11 -0
- package/dist/skills/check-price.d.ts.map +1 -0
- package/dist/skills/check-price.js +83 -0
- package/dist/skills/check-price.js.map +1 -0
- package/dist/skills/claim-vault.d.ts +15 -0
- package/dist/skills/claim-vault.d.ts.map +1 -0
- package/dist/skills/claim-vault.js +96 -0
- package/dist/skills/claim-vault.js.map +1 -0
- package/dist/skills/deploy.d.ts.map +1 -1
- package/dist/skills/deploy.js +10 -1
- package/dist/skills/deploy.js.map +1 -1
- package/dist/skills/index.d.ts +9 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +34 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/manage-orders.d.ts +26 -0
- package/dist/skills/manage-orders.d.ts.map +1 -0
- package/dist/skills/manage-orders.js +470 -0
- package/dist/skills/manage-orders.js.map +1 -0
- package/dist/skills/portfolio.d.ts +19 -0
- package/dist/skills/portfolio.d.ts.map +1 -0
- package/dist/skills/portfolio.js +189 -0
- package/dist/skills/portfolio.js.map +1 -0
- package/dist/skills/watch-activity.d.ts +12 -0
- package/dist/skills/watch-activity.d.ts.map +1 -0
- package/dist/skills/watch-activity.js +130 -0
- package/dist/skills/watch-activity.js.map +1 -0
- package/dist/skills/xmtp.d.ts +18 -0
- package/dist/skills/xmtp.d.ts.map +1 -0
- package/dist/skills/xmtp.js +180 -0
- package/dist/skills/xmtp.js.map +1 -0
- package/dist/state/index.d.ts +25 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -1
- package/dist/survival/index.d.ts.map +1 -1
- package/dist/survival/index.js +3 -0
- package/dist/survival/index.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/xmtp/client.d.ts +79 -0
- package/dist/xmtp/client.d.ts.map +1 -0
- package/dist/xmtp/client.js +282 -0
- package/dist/xmtp/client.js.map +1 -0
- package/dist/xmtp/index.d.ts +9 -0
- package/dist/xmtp/index.d.ts.map +1 -0
- package/dist/xmtp/index.js +8 -0
- package/dist/xmtp/index.js.map +1 -0
- package/dist/xmtp/types.d.ts +59 -0
- package/dist/xmtp/types.d.ts.map +1 -0
- package/dist/xmtp/types.js +5 -0
- package/dist/xmtp/types.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: portfolio — View multi-token portfolio with P&L and allocation.
|
|
3
|
+
*
|
|
4
|
+
* Shows:
|
|
5
|
+
* - All token positions with current value and unrealized P&L
|
|
6
|
+
* - Realized P&L from past sells
|
|
7
|
+
* - Portfolio allocation percentages
|
|
8
|
+
* - Concentration warnings
|
|
9
|
+
* - Historical performance (if snapshots exist)
|
|
10
|
+
*
|
|
11
|
+
* Actions: view, history, record_trade
|
|
12
|
+
*
|
|
13
|
+
* The portfolio is populated automatically by handleSkillSideEffects
|
|
14
|
+
* when the agent executes swaps. The agent can also manually record
|
|
15
|
+
* trades via the record_trade action for OTC / external transfers.
|
|
16
|
+
*/
|
|
17
|
+
import { ClawnchTrader, ClawnchPrice } from '@clawnch/clawncher-sdk';
|
|
18
|
+
export const portfolioSkill = {
|
|
19
|
+
name: 'portfolio',
|
|
20
|
+
description: [
|
|
21
|
+
'View your multi-token portfolio: positions, P&L, allocation, performance.',
|
|
22
|
+
'Actions: view (full summary), history (value over time), record_trade (manual entry).',
|
|
23
|
+
'Positions auto-update on swaps. No gas cost (read-only, except record_trade).',
|
|
24
|
+
].join(' '),
|
|
25
|
+
parameters: [
|
|
26
|
+
{
|
|
27
|
+
name: 'action',
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'One of: view, history, record_trade',
|
|
30
|
+
required: true,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'period',
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'For history: time period — "24h", "7d", "30d" (default "7d")',
|
|
36
|
+
required: false,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'token',
|
|
40
|
+
type: 'address',
|
|
41
|
+
description: 'Token address (for record_trade)',
|
|
42
|
+
required: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'symbol',
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Token symbol (for record_trade)',
|
|
48
|
+
required: false,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'side',
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'Trade side: buy or sell (for record_trade)',
|
|
54
|
+
required: false,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'amount',
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'Amount traded in token units (for record_trade)',
|
|
60
|
+
required: false,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'priceEth',
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'Price per token in ETH (for record_trade)',
|
|
66
|
+
required: false,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'txHash',
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: 'Transaction hash (for record_trade)',
|
|
72
|
+
required: false,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
execute: async (params, ctx) => {
|
|
76
|
+
try {
|
|
77
|
+
if (!ctx.stateStore) {
|
|
78
|
+
return { callId: '', success: false, result: null, error: 'No state store available.' };
|
|
79
|
+
}
|
|
80
|
+
const action = params.action;
|
|
81
|
+
switch (action) {
|
|
82
|
+
case 'view':
|
|
83
|
+
return handleView(ctx);
|
|
84
|
+
case 'history':
|
|
85
|
+
return handleHistory(ctx, params);
|
|
86
|
+
case 'record_trade':
|
|
87
|
+
return handleRecordTrade(ctx, params);
|
|
88
|
+
default:
|
|
89
|
+
return { callId: '', success: false, result: null, error: `Unknown action: ${action}. Use: view, history, record_trade` };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
async function handleView(ctx) {
|
|
98
|
+
const trader = new ClawnchTrader(ctx.stateStore.asTraderStorage());
|
|
99
|
+
// Build price fetcher using ClawnchPrice
|
|
100
|
+
const { buildClients } = await import('../identity/index.js');
|
|
101
|
+
const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
|
|
102
|
+
const { publicClient } = buildClients(ctx.identity, rpcUrl);
|
|
103
|
+
const price = new ClawnchPrice({ publicClient: publicClient, network: 'mainnet' });
|
|
104
|
+
const priceFetcher = async (token) => {
|
|
105
|
+
try {
|
|
106
|
+
const info = await price.getQuickPrice(token);
|
|
107
|
+
return { priceEth: info.priceInEth, priceUsd: info.priceInUsd };
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
// Get ETH balance
|
|
114
|
+
let ethBalanceEth = 0;
|
|
115
|
+
try {
|
|
116
|
+
const ethBal = await publicClient.getBalance({ address: ctx.identity.address });
|
|
117
|
+
ethBalanceEth = Number(ethBal) / 1e18;
|
|
118
|
+
}
|
|
119
|
+
catch { }
|
|
120
|
+
const summary = await trader.getSummary(priceFetcher, ethBalanceEth);
|
|
121
|
+
if (summary.positions.length === 0) {
|
|
122
|
+
return {
|
|
123
|
+
callId: '',
|
|
124
|
+
success: true,
|
|
125
|
+
result: `No token positions tracked yet.\nETH Balance: ${ethBalanceEth.toFixed(6)} ETH\n\nPositions are automatically recorded when you execute swaps. Use portfolio action=record_trade for manual entries.`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
callId: '',
|
|
130
|
+
success: true,
|
|
131
|
+
result: ClawnchTrader.formatSummary(summary),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function handleHistory(ctx, params) {
|
|
135
|
+
const trader = new ClawnchTrader(ctx.stateStore.asTraderStorage());
|
|
136
|
+
const periodStr = params.period ?? '7d';
|
|
137
|
+
const periodMs = parsePeriod(periodStr);
|
|
138
|
+
const perf = trader.getPerformance(periodMs);
|
|
139
|
+
if (!perf) {
|
|
140
|
+
return { callId: '', success: true, result: 'No portfolio snapshots yet. Snapshots are taken each heartbeat.' };
|
|
141
|
+
}
|
|
142
|
+
const snapshots = trader.getHistory(20);
|
|
143
|
+
const lines = [
|
|
144
|
+
`Portfolio performance (${perf.period}):`,
|
|
145
|
+
` Start: ${perf.startValue.toFixed(6)} ETH`,
|
|
146
|
+
` End: ${perf.endValue.toFixed(6)} ETH`,
|
|
147
|
+
` Change: ${perf.changeEth >= 0 ? '+' : ''}${perf.changeEth.toFixed(6)} ETH (${perf.changePct >= 0 ? '+' : ''}${perf.changePct.toFixed(1)}%)`,
|
|
148
|
+
];
|
|
149
|
+
if (snapshots.length > 0) {
|
|
150
|
+
lines.push(``, `Recent snapshots (${snapshots.length}):`);
|
|
151
|
+
for (const s of snapshots.slice(-10)) {
|
|
152
|
+
lines.push(` ${new Date(s.timestamp).toISOString().slice(0, 16)} | ${s.totalValueEth.toFixed(6)} ETH | ${s.positionCount} positions`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return { callId: '', success: true, result: lines.join('\n') };
|
|
156
|
+
}
|
|
157
|
+
async function handleRecordTrade(ctx, params) {
|
|
158
|
+
const token = params.token;
|
|
159
|
+
const side = params.side;
|
|
160
|
+
const amount = params.amount;
|
|
161
|
+
const priceEth = params.priceEth;
|
|
162
|
+
const txHash = params.txHash ?? 'manual';
|
|
163
|
+
if (!token || !side || !amount || !priceEth) {
|
|
164
|
+
return { callId: '', success: false, result: null, error: 'Missing parameters: token, side, amount, priceEth are required.' };
|
|
165
|
+
}
|
|
166
|
+
const trader = new ClawnchTrader(ctx.stateStore.asTraderStorage());
|
|
167
|
+
const trade = trader.recordTrade({
|
|
168
|
+
token,
|
|
169
|
+
symbol: params.symbol,
|
|
170
|
+
side: side,
|
|
171
|
+
amount,
|
|
172
|
+
priceEth: parseFloat(priceEth),
|
|
173
|
+
txHash,
|
|
174
|
+
});
|
|
175
|
+
return {
|
|
176
|
+
callId: '',
|
|
177
|
+
success: true,
|
|
178
|
+
result: `Trade recorded: ${trade.id}\n ${trade.side} ${trade.amount} @ ${trade.priceEth} ETH = ${trade.valueEth.toFixed(6)} ETH\n TX: ${trade.txHash}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function parsePeriod(period) {
|
|
182
|
+
const match = period.match(/^(\d+)(h|d)$/);
|
|
183
|
+
if (!match)
|
|
184
|
+
return 7 * 24 * 60 * 60 * 1000; // default 7d
|
|
185
|
+
const value = parseInt(match[1]);
|
|
186
|
+
const unit = match[2];
|
|
187
|
+
return unit === 'h' ? value * 60 * 60 * 1000 : value * 24 * 60 * 60 * 1000;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/skills/portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: watch_activity — Check recent on-chain activity for a token.
|
|
3
|
+
*
|
|
4
|
+
* Fetches recent ERC-20 transfers and Uniswap V4 swaps for the agent's token.
|
|
5
|
+
* Reports: swap count, transfer count, unique addresses, largest transfer,
|
|
6
|
+
* total volume, and whale alerts (transfers > 1% of supply).
|
|
7
|
+
*
|
|
8
|
+
* No gas cost — pure read operation.
|
|
9
|
+
*/
|
|
10
|
+
import type { SkillDefinition } from '../types.js';
|
|
11
|
+
export declare const watchActivitySkill: SkillDefinition;
|
|
12
|
+
//# sourceMappingURL=watch-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-activity.d.ts","sourceRoot":"","sources":["../../src/skills/watch-activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAQ7E,eAAO,MAAM,kBAAkB,EAAE,eAgIhC,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill: watch_activity — Check recent on-chain activity for a token.
|
|
3
|
+
*
|
|
4
|
+
* Fetches recent ERC-20 transfers and Uniswap V4 swaps for the agent's token.
|
|
5
|
+
* Reports: swap count, transfer count, unique addresses, largest transfer,
|
|
6
|
+
* total volume, and whale alerts (transfers > 1% of supply).
|
|
7
|
+
*
|
|
8
|
+
* No gas cost — pure read operation.
|
|
9
|
+
*/
|
|
10
|
+
import { ClawnchWatcher, ClawnchReader, } from '@clawnch/clawncher-sdk';
|
|
11
|
+
import { formatEther } from 'viem';
|
|
12
|
+
/** Transfers above this % of supply are flagged as whale moves */
|
|
13
|
+
const WHALE_THRESHOLD_PCT = 1;
|
|
14
|
+
/** Default lookback: 5,000 blocks (~2.8 hours on Base) */
|
|
15
|
+
const DEFAULT_LOOKBACK_BLOCKS = 5000n;
|
|
16
|
+
export const watchActivitySkill = {
|
|
17
|
+
name: 'watch_activity',
|
|
18
|
+
description: [
|
|
19
|
+
'Check recent on-chain activity for a token: swaps, transfers, whale alerts.',
|
|
20
|
+
'Scans the last ~3 hours of blocks. Reports volume, unique traders,',
|
|
21
|
+
'and flags large transfers (>1% of supply). No gas cost (read-only).',
|
|
22
|
+
].join(' '),
|
|
23
|
+
parameters: [
|
|
24
|
+
{
|
|
25
|
+
name: 'token',
|
|
26
|
+
type: 'address',
|
|
27
|
+
description: 'Token address to monitor. Defaults to own token.',
|
|
28
|
+
required: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'blocks',
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: 'Number of blocks to look back. Default: 5000 (~3 hours).',
|
|
34
|
+
required: false,
|
|
35
|
+
default: 5000,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
execute: async (params, ctx) => {
|
|
39
|
+
try {
|
|
40
|
+
const tokenAddress = params.token ?? ctx.identity.tokenAddress;
|
|
41
|
+
if (!tokenAddress) {
|
|
42
|
+
return { callId: '', success: false, result: null, error: 'No token address. Deploy a token first or specify one.' };
|
|
43
|
+
}
|
|
44
|
+
const { buildClients } = await import('../identity/index.js');
|
|
45
|
+
const rpcUrl = process.env.BASE_RPC_URL ?? 'https://mainnet.base.org';
|
|
46
|
+
const { publicClient } = buildClients(ctx.identity, rpcUrl);
|
|
47
|
+
const watcher = new ClawnchWatcher({ publicClient: publicClient, network: 'mainnet' });
|
|
48
|
+
const reader = new ClawnchReader({ publicClient: publicClient, network: 'mainnet' });
|
|
49
|
+
// Get pool ID from token rewards
|
|
50
|
+
const rewards = await reader.getTokenRewards(tokenAddress);
|
|
51
|
+
if (!rewards) {
|
|
52
|
+
return { callId: '', success: false, result: null, error: 'No pool found for this token. Is it a Clawncher token?' };
|
|
53
|
+
}
|
|
54
|
+
// Compute pool ID
|
|
55
|
+
const { keccak256, encodeAbiParameters } = await import('viem');
|
|
56
|
+
const poolId = keccak256(encodeAbiParameters([
|
|
57
|
+
{ type: 'address' },
|
|
58
|
+
{ type: 'address' },
|
|
59
|
+
{ type: 'uint24' },
|
|
60
|
+
{ type: 'int24' },
|
|
61
|
+
{ type: 'address' },
|
|
62
|
+
], [
|
|
63
|
+
rewards.poolKey.currency0,
|
|
64
|
+
rewards.poolKey.currency1,
|
|
65
|
+
rewards.poolKey.fee,
|
|
66
|
+
rewards.poolKey.tickSpacing,
|
|
67
|
+
rewards.poolKey.hooks,
|
|
68
|
+
]));
|
|
69
|
+
// Determine block range
|
|
70
|
+
const lookback = BigInt(params.blocks ?? 5000);
|
|
71
|
+
const currentBlock = await publicClient.getBlockNumber();
|
|
72
|
+
const fromBlock = currentBlock > lookback ? currentBlock - lookback : 0n;
|
|
73
|
+
// Fetch activity
|
|
74
|
+
const activity = await watcher.getTokenActivity(tokenAddress, poolId, {
|
|
75
|
+
fromBlock,
|
|
76
|
+
toBlock: currentBlock,
|
|
77
|
+
transferLimit: 100,
|
|
78
|
+
swapLimit: 100,
|
|
79
|
+
});
|
|
80
|
+
// Get total supply for whale detection
|
|
81
|
+
const tokenInfo = await reader.getTokenInfo(tokenAddress);
|
|
82
|
+
const whaleThreshold = tokenInfo.totalSupply / 100n; // 1%
|
|
83
|
+
// Build report
|
|
84
|
+
const lines = [
|
|
85
|
+
`Activity for ${tokenAddress} (last ${lookback} blocks, ~${Math.round(Number(lookback) * 2 / 3600)}h):`,
|
|
86
|
+
` Swaps: ${activity.stats.swapCount}`,
|
|
87
|
+
` Transfers: ${activity.stats.transferCount}`,
|
|
88
|
+
` Unique addresses: ${activity.stats.uniqueAddresses}`,
|
|
89
|
+
];
|
|
90
|
+
if (activity.stats.totalVolume0 > 0n || activity.stats.totalVolume1 > 0n) {
|
|
91
|
+
lines.push(` Volume (currency0): ${formatEther(activity.stats.totalVolume0)}`);
|
|
92
|
+
lines.push(` Volume (currency1): ${formatEther(activity.stats.totalVolume1)}`);
|
|
93
|
+
}
|
|
94
|
+
if (activity.stats.largestTransfer > 0n) {
|
|
95
|
+
lines.push(` Largest transfer: ${formatEther(activity.stats.largestTransfer)} tokens`);
|
|
96
|
+
}
|
|
97
|
+
// Whale alerts
|
|
98
|
+
const whaleTransfers = activity.transfers.filter(t => t.amount >= whaleThreshold);
|
|
99
|
+
if (whaleTransfers.length > 0) {
|
|
100
|
+
lines.push('');
|
|
101
|
+
lines.push(`WHALE ALERTS (>${WHALE_THRESHOLD_PCT}% of supply):`);
|
|
102
|
+
for (const w of whaleTransfers.slice(0, 10)) {
|
|
103
|
+
const pct = Number((w.amount * 10000n) / tokenInfo.totalSupply) / 100;
|
|
104
|
+
lines.push(` ${shortenAddr(w.from)} → ${shortenAddr(w.to)}: ${formatEther(w.amount)} (${pct.toFixed(2)}%) [block ${w.blockNumber}]`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Recent swaps summary (last 5)
|
|
108
|
+
if (activity.swaps.length > 0) {
|
|
109
|
+
lines.push('');
|
|
110
|
+
lines.push('Recent swaps:');
|
|
111
|
+
for (const s of activity.swaps.slice(0, 5)) {
|
|
112
|
+
const side = s.amount0 < 0n ? 'sell' : 'buy';
|
|
113
|
+
const amt = s.amount0 < 0n ? -s.amount0 : s.amount0;
|
|
114
|
+
lines.push(` ${side} ${formatEther(amt)} [${shortenAddr(s.sender)}, block ${s.blockNumber}]`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (activity.stats.swapCount === 0 && activity.stats.transferCount === 0) {
|
|
118
|
+
lines.push(' No activity in this period.');
|
|
119
|
+
}
|
|
120
|
+
return { callId: '', success: true, result: lines.join('\n') };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return { callId: '', success: false, result: null, error: err instanceof Error ? err.message : String(err) };
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
function shortenAddr(addr) {
|
|
128
|
+
return `${addr.slice(0, 6)}...${addr.slice(-4)}`;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=watch-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-activity.js","sourceRoot":"","sources":["../../src/skills/watch-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XMTP skill — encrypted messaging via the XMTP protocol.
|
|
3
|
+
*
|
|
4
|
+
* Actions:
|
|
5
|
+
* - send_message: Send a text message to a conversation by ID
|
|
6
|
+
* - send_dm: Send a DM to an Ethereum address (creates convo if needed)
|
|
7
|
+
* - read_messages: Read recent messages from a conversation
|
|
8
|
+
* - list_convos: List recent conversations with previews
|
|
9
|
+
* - check_inbox: Check for unread messages in the queue
|
|
10
|
+
* - reply: Reply to the most recent message in a conversation
|
|
11
|
+
*
|
|
12
|
+
* The XMTP client is managed by the agent runtime (started at boot,
|
|
13
|
+
* available via `ctx.xmtpClient`). This skill is the agent's interface
|
|
14
|
+
* to send/read messages.
|
|
15
|
+
*/
|
|
16
|
+
import type { SkillDefinition } from '../types.js';
|
|
17
|
+
export declare const xmtpSkill: SkillDefinition;
|
|
18
|
+
//# sourceMappingURL=xmtp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xmtp.d.ts","sourceRoot":"","sources":["../../src/skills/xmtp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AAO7E,eAAO,MAAM,SAAS,EAAE,eA+KvB,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XMTP skill — encrypted messaging via the XMTP protocol.
|
|
3
|
+
*
|
|
4
|
+
* Actions:
|
|
5
|
+
* - send_message: Send a text message to a conversation by ID
|
|
6
|
+
* - send_dm: Send a DM to an Ethereum address (creates convo if needed)
|
|
7
|
+
* - read_messages: Read recent messages from a conversation
|
|
8
|
+
* - list_convos: List recent conversations with previews
|
|
9
|
+
* - check_inbox: Check for unread messages in the queue
|
|
10
|
+
* - reply: Reply to the most recent message in a conversation
|
|
11
|
+
*
|
|
12
|
+
* The XMTP client is managed by the agent runtime (started at boot,
|
|
13
|
+
* available via `ctx.xmtpClient`). This skill is the agent's interface
|
|
14
|
+
* to send/read messages.
|
|
15
|
+
*/
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Skill Definition
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export const xmtpSkill = {
|
|
20
|
+
name: 'xmtp',
|
|
21
|
+
description: 'Send and receive encrypted messages via XMTP. Discoverable on Base App, World App, and xmtp.chat. Actions: send_message, send_dm, read_messages, list_convos, check_inbox, reply.',
|
|
22
|
+
parameters: [
|
|
23
|
+
{
|
|
24
|
+
name: 'action',
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Action: send_message | send_dm | read_messages | list_convos | check_inbox | reply',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'conversationId',
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Conversation ID (for send_message, read_messages, reply)',
|
|
33
|
+
required: false,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'address',
|
|
37
|
+
type: 'address',
|
|
38
|
+
description: 'Ethereum address to DM (for send_dm)',
|
|
39
|
+
required: false,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'message',
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Text message to send (for send_message, send_dm, reply)',
|
|
45
|
+
required: false,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'limit',
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: 'Number of items to return (default: 20)',
|
|
51
|
+
required: false,
|
|
52
|
+
default: 20,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
execute: async (params, ctx) => {
|
|
56
|
+
const action = params.action;
|
|
57
|
+
const callId = `xmtp_${Date.now()}`;
|
|
58
|
+
// Get the XMTP client from the agent context
|
|
59
|
+
const xmtpClient = ctx.xmtpClient;
|
|
60
|
+
if (!xmtpClient || !xmtpClient.isStarted()) {
|
|
61
|
+
return {
|
|
62
|
+
callId,
|
|
63
|
+
success: false,
|
|
64
|
+
result: null,
|
|
65
|
+
error: 'XMTP client is not running. XMTP may not be configured for this agent.',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
switch (action) {
|
|
70
|
+
case 'send_message': {
|
|
71
|
+
const conversationId = params.conversationId;
|
|
72
|
+
const message = params.message;
|
|
73
|
+
if (!conversationId || !message) {
|
|
74
|
+
return { callId, success: false, result: null, error: 'send_message requires conversationId and message' };
|
|
75
|
+
}
|
|
76
|
+
await xmtpClient.sendMessage(conversationId, message);
|
|
77
|
+
return {
|
|
78
|
+
callId,
|
|
79
|
+
success: true,
|
|
80
|
+
result: `Message sent to conversation ${conversationId}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
case 'send_dm': {
|
|
84
|
+
const address = params.address;
|
|
85
|
+
const message = params.message;
|
|
86
|
+
if (!address || !message) {
|
|
87
|
+
return { callId, success: false, result: null, error: 'send_dm requires address and message' };
|
|
88
|
+
}
|
|
89
|
+
const conversationId = await xmtpClient.sendToAddress(address, message);
|
|
90
|
+
return {
|
|
91
|
+
callId,
|
|
92
|
+
success: true,
|
|
93
|
+
result: `DM sent to ${address} (conversation: ${conversationId})`,
|
|
94
|
+
metadata: { conversationId, address },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case 'read_messages': {
|
|
98
|
+
const conversationId = params.conversationId;
|
|
99
|
+
if (!conversationId) {
|
|
100
|
+
return { callId, success: false, result: null, error: 'read_messages requires conversationId' };
|
|
101
|
+
}
|
|
102
|
+
const limit = params.limit ?? 20;
|
|
103
|
+
const messages = await xmtpClient.getConversationHistory(conversationId, limit);
|
|
104
|
+
if (messages.length === 0) {
|
|
105
|
+
return { callId, success: true, result: 'No messages in this conversation.' };
|
|
106
|
+
}
|
|
107
|
+
const formatted = messages.map(m => {
|
|
108
|
+
const time = new Date(m.sentAt).toISOString();
|
|
109
|
+
return `[${time}] ${m.senderAddress}: ${m.content}`;
|
|
110
|
+
}).join('\n');
|
|
111
|
+
return {
|
|
112
|
+
callId,
|
|
113
|
+
success: true,
|
|
114
|
+
result: `${messages.length} messages:\n${formatted}`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
case 'list_convos': {
|
|
118
|
+
const limit = params.limit ?? 20;
|
|
119
|
+
const convos = await xmtpClient.listConversations(limit);
|
|
120
|
+
if (convos.length === 0) {
|
|
121
|
+
return { callId, success: true, result: 'No conversations yet.' };
|
|
122
|
+
}
|
|
123
|
+
const formatted = convos.map(c => {
|
|
124
|
+
const type = c.isDm ? 'DM' : `Group(${c.memberCount})`;
|
|
125
|
+
const time = c.lastMessageAt > 0 ? new Date(c.lastMessageAt).toISOString() : 'no messages';
|
|
126
|
+
const preview = c.lastMessagePreview ? `: "${c.lastMessagePreview}"` : '';
|
|
127
|
+
return ` ${c.id} [${type}] last: ${time}${preview}`;
|
|
128
|
+
}).join('\n');
|
|
129
|
+
return {
|
|
130
|
+
callId,
|
|
131
|
+
success: true,
|
|
132
|
+
result: `${convos.length} conversations:\n${formatted}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
case 'check_inbox': {
|
|
136
|
+
const messages = xmtpClient.peekMessages();
|
|
137
|
+
if (messages.length === 0) {
|
|
138
|
+
return { callId, success: true, result: 'Inbox empty. No unread messages.' };
|
|
139
|
+
}
|
|
140
|
+
const formatted = messages.map(m => {
|
|
141
|
+
const time = new Date(m.sentAt).toISOString();
|
|
142
|
+
const type = m.isDm ? 'DM' : 'Group';
|
|
143
|
+
return `[${time}] [${type}] ${m.senderAddress}: ${m.content}`;
|
|
144
|
+
}).join('\n');
|
|
145
|
+
return {
|
|
146
|
+
callId,
|
|
147
|
+
success: true,
|
|
148
|
+
result: `${messages.length} unread messages:\n${formatted}`,
|
|
149
|
+
metadata: { count: messages.length },
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
case 'reply': {
|
|
153
|
+
const conversationId = params.conversationId;
|
|
154
|
+
const message = params.message;
|
|
155
|
+
if (!conversationId || !message) {
|
|
156
|
+
return { callId, success: false, result: null, error: 'reply requires conversationId and message' };
|
|
157
|
+
}
|
|
158
|
+
await xmtpClient.sendMessage(conversationId, message);
|
|
159
|
+
return {
|
|
160
|
+
callId,
|
|
161
|
+
success: true,
|
|
162
|
+
result: `Reply sent to conversation ${conversationId}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
default:
|
|
166
|
+
return {
|
|
167
|
+
callId,
|
|
168
|
+
success: false,
|
|
169
|
+
result: null,
|
|
170
|
+
error: `Unknown action: ${action}. Available: send_message, send_dm, read_messages, list_convos, check_inbox, reply`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
176
|
+
return { callId, success: false, result: null, error: `XMTP error: ${msg}` };
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=xmtp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xmtp.js","sourceRoot":"","sources":["../../src/skills/xmtp.ts"],"names":[],"mappings":"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"}
|
package/dist/state/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* and SOUL.md content. All data is local — the agent owns its own state.
|
|
6
6
|
*/
|
|
7
7
|
import type { ClawtomatonIdentity, SurvivalState, ConversationTurn, ActivationResult } from '../types.js';
|
|
8
|
+
import type { BunkerState, ThreatLevel } from '../bunker/types.js';
|
|
9
|
+
import type { TraderPosition, TraderTrade, TraderSnapshot, TraderStorage, RiskConfig, RiskStorage } from '@clawnch/clawncher-sdk';
|
|
8
10
|
export declare class StateStore {
|
|
9
11
|
private db;
|
|
10
12
|
constructor(stateDir: string);
|
|
@@ -32,6 +34,29 @@ export declare class StateStore {
|
|
|
32
34
|
delete(key: string): void;
|
|
33
35
|
getSoul(): string;
|
|
34
36
|
setSoul(content: string): void;
|
|
37
|
+
saveBunkerState(state: BunkerState): void;
|
|
38
|
+
getBunkerState(): BunkerState | null;
|
|
39
|
+
updateBunkerThreat(level: ThreatLevel): void;
|
|
40
|
+
addBunkerClone(cloneId: string): void;
|
|
41
|
+
removeBunkerClone(cloneId: string): void;
|
|
42
|
+
getOrders(): import('@clawnch/clawncher-sdk').Order[];
|
|
43
|
+
saveOrders(orders: import('@clawnch/clawncher-sdk').Order[]): void;
|
|
44
|
+
getRiskConfig(): RiskConfig | null;
|
|
45
|
+
saveRiskConfig(config: RiskConfig): void;
|
|
46
|
+
getTraderPositions(): TraderPosition[];
|
|
47
|
+
saveTraderPositions(positions: TraderPosition[]): void;
|
|
48
|
+
getTraderTrades(): TraderTrade[];
|
|
49
|
+
saveTraderTrades(trades: TraderTrade[]): void;
|
|
50
|
+
getTraderSnapshots(): TraderSnapshot[];
|
|
51
|
+
saveTraderSnapshots(snapshots: TraderSnapshot[]): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get a TraderStorage adapter for use with ClawnchTrader.
|
|
54
|
+
*/
|
|
55
|
+
asTraderStorage(): TraderStorage;
|
|
56
|
+
/**
|
|
57
|
+
* Get a RiskStorage adapter for use with ClawnchOrders.
|
|
58
|
+
*/
|
|
59
|
+
asRiskStorage(): RiskStorage;
|
|
35
60
|
close(): void;
|
|
36
61
|
}
|
|
37
62
|
export interface AuditEntry {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,cAAc,EACd,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAMhC,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAoB;gBAElB,QAAQ,EAAE,MAAM;IAa5B,OAAO,CAAC,OAAO;IA8Ef,YAAY,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAiBjD,WAAW,IAAI,mBAAmB,GAAG,IAAI;IAgBzC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAU1F,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAO9C,aAAa,IAAI,gBAAgB,GAAG,IAAI;IAUxC,WAAW,IAAI,OAAO;IAQtB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAcxC,WAAW,IAAI,aAAa;IA0B5B,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAarC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAc7C,YAAY,IAAI,MAAM;IAKtB,YAAY,IAAI,IAAI;IAQpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAW7D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAM7D,WAAW,CAAC,KAAK,GAAE,MAAY,GAAG,UAAU,EAAE;IAU9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS9B,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAgBzC,cAAc,IAAI,WAAW,GAAG,IAAI;IAepC,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAM5C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAWxC,SAAS,IAAI,OAAO,wBAAwB,EAAE,KAAK,EAAE;IAUrD,UAAU,CAAC,MAAM,EAAE,OAAO,wBAAwB,EAAE,KAAK,EAAE,GAAG,IAAI;IAQlE,aAAa,IAAI,UAAU,GAAG,IAAI;IAUlC,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAQxC,kBAAkB,IAAI,cAAc,EAAE;IAUtC,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI;IAItD,eAAe,IAAI,WAAW,EAAE;IAUhC,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI;IAI7C,kBAAkB,IAAI,cAAc,EAAE;IAUtC,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI;IAItD;;OAEG;IACH,eAAe,IAAI,aAAa;IAWhC;;OAEG;IACH,aAAa,IAAI,WAAW;IAW5B,KAAK,IAAI,IAAI;CAGd;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB"}
|