@clawnch/clawtomaton 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 +231 -0
- package/constitution.md +15 -0
- package/dist/agent/index.d.ts +43 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +315 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/prompt.d.ts +24 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +137 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +18 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/heartbeat/index.d.ts +38 -0
- package/dist/heartbeat/index.d.ts.map +1 -0
- package/dist/heartbeat/index.js +127 -0
- package/dist/heartbeat/index.js.map +1 -0
- package/dist/identity/index.d.ts +39 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +134 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/market/index.d.ts +73 -0
- package/dist/market/index.d.ts.map +1 -0
- package/dist/market/index.js +205 -0
- package/dist/market/index.js.map +1 -0
- package/dist/self-mod/index.d.ts +30 -0
- package/dist/self-mod/index.d.ts.map +1 -0
- package/dist/self-mod/index.js +83 -0
- package/dist/self-mod/index.js.map +1 -0
- package/dist/skills/check-balance.d.ts +7 -0
- package/dist/skills/check-balance.d.ts.map +1 -0
- package/dist/skills/check-balance.js +46 -0
- package/dist/skills/check-balance.js.map +1 -0
- package/dist/skills/check-stats.d.ts +6 -0
- package/dist/skills/check-stats.d.ts.map +1 -0
- package/dist/skills/check-stats.js +49 -0
- package/dist/skills/check-stats.js.map +1 -0
- package/dist/skills/claim-fees.d.ts +14 -0
- package/dist/skills/claim-fees.d.ts.map +1 -0
- package/dist/skills/claim-fees.js +109 -0
- package/dist/skills/claim-fees.js.map +1 -0
- package/dist/skills/conway.d.ts +16 -0
- package/dist/skills/conway.d.ts.map +1 -0
- package/dist/skills/conway.js +97 -0
- package/dist/skills/conway.js.map +1 -0
- package/dist/skills/deploy.d.ts +19 -0
- package/dist/skills/deploy.d.ts.map +1 -0
- package/dist/skills/deploy.js +167 -0
- package/dist/skills/deploy.js.map +1 -0
- package/dist/skills/edit-soul.d.ts +10 -0
- package/dist/skills/edit-soul.d.ts.map +1 -0
- package/dist/skills/edit-soul.js +68 -0
- package/dist/skills/edit-soul.js.map +1 -0
- package/dist/skills/index.d.ts +21 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +59 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/shell.d.ts +12 -0
- package/dist/skills/shell.d.ts.map +1 -0
- package/dist/skills/shell.js +66 -0
- package/dist/skills/shell.js.map +1 -0
- package/dist/skills/swap.d.ts +6 -0
- package/dist/skills/swap.d.ts.map +1 -0
- package/dist/skills/swap.js +87 -0
- package/dist/skills/swap.js.map +1 -0
- package/dist/skills/transfer.d.ts +7 -0
- package/dist/skills/transfer.d.ts.map +1 -0
- package/dist/skills/transfer.js +82 -0
- package/dist/skills/transfer.js.map +1 -0
- package/dist/state/index.d.ts +44 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +266 -0
- package/dist/state/index.js.map +1 -0
- package/dist/survival/index.d.ts +49 -0
- package/dist/survival/index.d.ts.map +1 -0
- package/dist/survival/index.js +151 -0
- package/dist/survival/index.js.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat — condition-driven wake scheduler.
|
|
3
|
+
*
|
|
4
|
+
* NOT a dumb timer that tells the agent to "maybe do something."
|
|
5
|
+
* Instead: periodically checks on-chain conditions and only wakes
|
|
6
|
+
* the agent when there's something genuinely actionable.
|
|
7
|
+
*
|
|
8
|
+
* The check itself is cheap (a few RPC reads, no txs). The agent
|
|
9
|
+
* run is expensive (inference + potential txs). So we gate the
|
|
10
|
+
* expensive part behind the cheap check.
|
|
11
|
+
*
|
|
12
|
+
* Wake conditions:
|
|
13
|
+
* - Fees are profitable to claim (WETH fees > gas cost + threshold)
|
|
14
|
+
* - Survival danger (ETH low, but fees exist to claim)
|
|
15
|
+
* - Operational runway < 24h
|
|
16
|
+
* - Scheduled: periodic self-reflection (every 24h)
|
|
17
|
+
*/
|
|
18
|
+
import { MarketIntelligence, formatSnapshot } from '../market/index.js';
|
|
19
|
+
import { buildClients } from '../identity/index.js';
|
|
20
|
+
/** Minimum time between agent runs even if conditions are met (5 min) */
|
|
21
|
+
const MIN_RUN_INTERVAL_MS = 5 * 60 * 1000;
|
|
22
|
+
/** How often to do a full self-reflection run regardless of conditions (24h) */
|
|
23
|
+
const REFLECTION_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
24
|
+
export class Heartbeat {
|
|
25
|
+
timer = null;
|
|
26
|
+
agent;
|
|
27
|
+
config;
|
|
28
|
+
market;
|
|
29
|
+
lastRunTime = 0;
|
|
30
|
+
lastReflectionTime = 0;
|
|
31
|
+
constructor(agent, config) {
|
|
32
|
+
this.agent = agent;
|
|
33
|
+
this.config = config;
|
|
34
|
+
const identity = agent.getIdentity();
|
|
35
|
+
const { publicClient } = buildClients(identity, config.rpcUrl);
|
|
36
|
+
this.market = new MarketIntelligence(publicClient, identity.address, agent.getState());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Start the heartbeat loop.
|
|
40
|
+
*/
|
|
41
|
+
start() {
|
|
42
|
+
if (this.timer)
|
|
43
|
+
throw new Error('Heartbeat already running.');
|
|
44
|
+
const intervalMs = this.config.heartbeatIntervalMs;
|
|
45
|
+
console.log(`[heartbeat] Checking conditions every ${Math.round(intervalMs / 60000)}min`);
|
|
46
|
+
// Run first check immediately
|
|
47
|
+
this.check();
|
|
48
|
+
this.timer = setInterval(() => this.check(), intervalMs);
|
|
49
|
+
}
|
|
50
|
+
stop() {
|
|
51
|
+
if (this.timer) {
|
|
52
|
+
clearInterval(this.timer);
|
|
53
|
+
this.timer = null;
|
|
54
|
+
console.log('[heartbeat] Stopped.');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check conditions. Only wake the agent if something is actionable.
|
|
59
|
+
*/
|
|
60
|
+
async check() {
|
|
61
|
+
// Don't interrupt a running agent
|
|
62
|
+
if (this.agent.isRunning())
|
|
63
|
+
return;
|
|
64
|
+
// Respect minimum interval between runs
|
|
65
|
+
if (Date.now() - this.lastRunTime < MIN_RUN_INTERVAL_MS)
|
|
66
|
+
return;
|
|
67
|
+
const identity = this.agent.getIdentity();
|
|
68
|
+
const tokenAddress = identity.tokenAddress;
|
|
69
|
+
try {
|
|
70
|
+
// Cheap check: read on-chain state
|
|
71
|
+
const { wake, reason } = await this.market.shouldWake(tokenAddress);
|
|
72
|
+
// Also check if it's time for periodic self-reflection
|
|
73
|
+
const reflectionDue = Date.now() - this.lastReflectionTime > REFLECTION_INTERVAL_MS;
|
|
74
|
+
if (!wake && !reflectionDue) {
|
|
75
|
+
// Nothing to do. Silence is golden.
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Build context for the agent
|
|
79
|
+
const snap = await this.market.snapshot(tokenAddress);
|
|
80
|
+
const conditions = this.market.evaluate(snap);
|
|
81
|
+
const snapshotText = formatSnapshot(snap);
|
|
82
|
+
let prompt;
|
|
83
|
+
if (wake) {
|
|
84
|
+
console.log(`[heartbeat] Waking agent: ${reason}`);
|
|
85
|
+
prompt = [
|
|
86
|
+
`[HEARTBEAT — CONDITION TRIGGERED]`,
|
|
87
|
+
`Trigger: ${reason}`,
|
|
88
|
+
``,
|
|
89
|
+
snapshotText,
|
|
90
|
+
``,
|
|
91
|
+
`Conditions:`,
|
|
92
|
+
conditions.summary,
|
|
93
|
+
``,
|
|
94
|
+
conditions.survivalClaimNeeded
|
|
95
|
+
? `ACTION REQUIRED: Claim fees now to survive. Use claim_fees skill.`
|
|
96
|
+
: conditions.feesWorthClaiming
|
|
97
|
+
? `Fees are profitable to claim. Consider using claim_fees.`
|
|
98
|
+
: `Review situation and decide on next action.`,
|
|
99
|
+
].join('\n');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Reflection run
|
|
103
|
+
console.log(`[heartbeat] Periodic reflection`);
|
|
104
|
+
this.lastReflectionTime = Date.now();
|
|
105
|
+
prompt = [
|
|
106
|
+
`[HEARTBEAT — PERIODIC REFLECTION]`,
|
|
107
|
+
`It's been 24 hours. Review your situation, update your SOUL.md if needed.`,
|
|
108
|
+
``,
|
|
109
|
+
snapshotText,
|
|
110
|
+
``,
|
|
111
|
+
`Conditions:`,
|
|
112
|
+
conditions.summary,
|
|
113
|
+
``,
|
|
114
|
+
`Reflect on: What's working? What should change? Any strategic adjustments?`,
|
|
115
|
+
].join('\n');
|
|
116
|
+
}
|
|
117
|
+
this.lastRunTime = Date.now();
|
|
118
|
+
await this.agent.run(prompt);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
122
|
+
console.error(`[heartbeat] Check failed: ${msg}`);
|
|
123
|
+
this.agent.getState().audit('heartbeat_error', msg);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/heartbeat/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity module — wallet generation, Clawncher registration, $CLAWNCH burn activation.
|
|
3
|
+
*
|
|
4
|
+
* Each Clawtomaton has a unique Ethereum wallet. Registration on Clawncher gives
|
|
5
|
+
* it an API key. Activation requires burning 1,000,000 $CLAWNCH to the dead address.
|
|
6
|
+
*/
|
|
7
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
8
|
+
import { type Address, type PublicClient, type WalletClient } from 'viem';
|
|
9
|
+
import type { StateStore } from '../state/index.js';
|
|
10
|
+
import type { ClawtomatonIdentity, ActivationResult } from '../types.js';
|
|
11
|
+
export interface GenerateIdentityParams {
|
|
12
|
+
name: string;
|
|
13
|
+
genesisPrompt: string;
|
|
14
|
+
creatorAddress: Address;
|
|
15
|
+
rpcUrl: string;
|
|
16
|
+
apiBaseUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a fresh wallet and register with Clawncher to get an API key.
|
|
20
|
+
* Does NOT activate (burn $CLAWNCH) — call `activate()` separately after funding.
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateIdentity(params: GenerateIdentityParams, state: StateStore): Promise<ClawtomatonIdentity>;
|
|
23
|
+
/**
|
|
24
|
+
* Activate a Clawtomaton by burning 1,000,000 $CLAWNCH.
|
|
25
|
+
* The agent's wallet must hold >= 1M $CLAWNCH before calling this.
|
|
26
|
+
*
|
|
27
|
+
* Burns by transferring to 0x...dEaD.
|
|
28
|
+
*/
|
|
29
|
+
export declare function activate(identity: ClawtomatonIdentity, rpcUrl: string, state: StateStore): Promise<ActivationResult>;
|
|
30
|
+
export interface ClawtomatonClients {
|
|
31
|
+
publicClient: PublicClient;
|
|
32
|
+
walletClient: WalletClient;
|
|
33
|
+
account: ReturnType<typeof privateKeyToAccount>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build viem clients from a persisted identity + config.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildClients(identity: ClawtomatonIdentity, rpcUrl: string): ClawtomatonClients;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,KAAK,OAAO,EAEZ,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWzE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAgD9B;AAQD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAMD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAmB9F"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity module — wallet generation, Clawncher registration, $CLAWNCH burn activation.
|
|
3
|
+
*
|
|
4
|
+
* Each Clawtomaton has a unique Ethereum wallet. Registration on Clawncher gives
|
|
5
|
+
* it an API key. Activation requires burning 1,000,000 $CLAWNCH to the dead address.
|
|
6
|
+
*/
|
|
7
|
+
import { generatePrivateKey, privateKeyToAccount, } from 'viem/accounts';
|
|
8
|
+
import { createPublicClient, createWalletClient, http, erc20Abi, } from 'viem';
|
|
9
|
+
import { base } from 'viem/chains';
|
|
10
|
+
import { ClawnchApiDeployer } from '@clawnch/clawncher-sdk';
|
|
11
|
+
import { CLAWTOMATON_ACTIVATION_COST, CLAWNCH_TOKEN_ADDRESS, CLAWNCH_BURN_ADDRESS, } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Generate a fresh wallet and register with Clawncher to get an API key.
|
|
14
|
+
* Does NOT activate (burn $CLAWNCH) — call `activate()` separately after funding.
|
|
15
|
+
*/
|
|
16
|
+
export async function generateIdentity(params, state) {
|
|
17
|
+
const { name, genesisPrompt, creatorAddress, rpcUrl, apiBaseUrl } = params;
|
|
18
|
+
// Generate fresh keypair
|
|
19
|
+
const privateKey = generatePrivateKey();
|
|
20
|
+
const account = privateKeyToAccount(privateKey);
|
|
21
|
+
const publicClient = createPublicClient({
|
|
22
|
+
chain: base,
|
|
23
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
24
|
+
});
|
|
25
|
+
const walletClient = createWalletClient({
|
|
26
|
+
account,
|
|
27
|
+
chain: base,
|
|
28
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
29
|
+
});
|
|
30
|
+
// Register with Clawncher API — sign challenge, get API key
|
|
31
|
+
// Cast through `any` because viem's OP Stack chain types don't match
|
|
32
|
+
// the SDK's generic PublicClient/WalletClient types.
|
|
33
|
+
const registration = await ClawnchApiDeployer.register({
|
|
34
|
+
wallet: walletClient,
|
|
35
|
+
publicClient: publicClient,
|
|
36
|
+
apiBaseUrl,
|
|
37
|
+
}, {
|
|
38
|
+
name,
|
|
39
|
+
wallet: account.address,
|
|
40
|
+
description: `Clawtomaton: ${genesisPrompt.slice(0, 100)}`,
|
|
41
|
+
});
|
|
42
|
+
const identity = {
|
|
43
|
+
name,
|
|
44
|
+
address: account.address,
|
|
45
|
+
privateKey,
|
|
46
|
+
apiKey: registration.apiKey,
|
|
47
|
+
creatorAddress,
|
|
48
|
+
genesisPrompt,
|
|
49
|
+
};
|
|
50
|
+
// Persist
|
|
51
|
+
state.saveIdentity(identity);
|
|
52
|
+
state.audit('identity_created', `Agent "${name}" created at ${account.address}`);
|
|
53
|
+
return identity;
|
|
54
|
+
}
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Activation ($CLAWNCH Burn)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Use viem's built-in erc20Abi which includes transfer, balanceOf, approve, etc.
|
|
59
|
+
/**
|
|
60
|
+
* Activate a Clawtomaton by burning 1,000,000 $CLAWNCH.
|
|
61
|
+
* The agent's wallet must hold >= 1M $CLAWNCH before calling this.
|
|
62
|
+
*
|
|
63
|
+
* Burns by transferring to 0x...dEaD.
|
|
64
|
+
*/
|
|
65
|
+
export async function activate(identity, rpcUrl, state) {
|
|
66
|
+
const account = privateKeyToAccount(identity.privateKey);
|
|
67
|
+
const publicClient = createPublicClient({
|
|
68
|
+
chain: base,
|
|
69
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
70
|
+
});
|
|
71
|
+
const walletClient = createWalletClient({
|
|
72
|
+
account,
|
|
73
|
+
chain: base,
|
|
74
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
75
|
+
});
|
|
76
|
+
// Check $CLAWNCH balance
|
|
77
|
+
const balance = await publicClient.readContract({
|
|
78
|
+
address: CLAWNCH_TOKEN_ADDRESS,
|
|
79
|
+
abi: erc20Abi,
|
|
80
|
+
functionName: 'balanceOf',
|
|
81
|
+
args: [account.address],
|
|
82
|
+
});
|
|
83
|
+
if (balance < CLAWTOMATON_ACTIVATION_COST) {
|
|
84
|
+
const deficit = CLAWTOMATON_ACTIVATION_COST - balance;
|
|
85
|
+
throw new Error(`Insufficient $CLAWNCH for activation. Need ${formatClawnch(CLAWTOMATON_ACTIVATION_COST)}, have ${formatClawnch(balance)}. Need ${formatClawnch(deficit)} more.`);
|
|
86
|
+
}
|
|
87
|
+
// Burn by transferring to dead address — single attempt, no retry
|
|
88
|
+
const txHash = await walletClient.writeContract({
|
|
89
|
+
address: CLAWNCH_TOKEN_ADDRESS,
|
|
90
|
+
abi: erc20Abi,
|
|
91
|
+
functionName: 'transfer',
|
|
92
|
+
args: [CLAWNCH_BURN_ADDRESS, CLAWTOMATON_ACTIVATION_COST],
|
|
93
|
+
});
|
|
94
|
+
// Wait for confirmation
|
|
95
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
96
|
+
if (receipt.status === 'reverted') {
|
|
97
|
+
throw new Error(`Activation burn tx reverted: ${txHash}`);
|
|
98
|
+
}
|
|
99
|
+
const result = {
|
|
100
|
+
burnTxHash: txHash,
|
|
101
|
+
amountBurned: CLAWTOMATON_ACTIVATION_COST,
|
|
102
|
+
activatedAt: Date.now(),
|
|
103
|
+
};
|
|
104
|
+
state.saveActivation(result);
|
|
105
|
+
state.audit('activation', `Burned ${formatClawnch(CLAWTOMATON_ACTIVATION_COST)} $CLAWNCH`, txHash);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build viem clients from a persisted identity + config.
|
|
110
|
+
*/
|
|
111
|
+
export function buildClients(identity, rpcUrl) {
|
|
112
|
+
const account = privateKeyToAccount(identity.privateKey);
|
|
113
|
+
const publicClient = createPublicClient({
|
|
114
|
+
chain: base,
|
|
115
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
116
|
+
});
|
|
117
|
+
const walletClient = createWalletClient({
|
|
118
|
+
account,
|
|
119
|
+
chain: base,
|
|
120
|
+
transport: http(rpcUrl, { retryCount: 0 }),
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
publicClient: publicClient,
|
|
124
|
+
walletClient: walletClient,
|
|
125
|
+
account,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Helpers
|
|
130
|
+
// ============================================================================
|
|
131
|
+
function formatClawnch(amount) {
|
|
132
|
+
return (Number(amount) / 1e18).toLocaleString('en-US', { maximumFractionDigits: 0 });
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawnch/clawtomaton — Autonomous AI agents that launch and manage crypto projects on Base.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { ClawtomatonAgent, generateIdentity, activate } from '@clawnch/clawtomaton';
|
|
7
|
+
*
|
|
8
|
+
* // Setup
|
|
9
|
+
* const identity = await generateIdentity({ name: 'my-agent', ... }, state);
|
|
10
|
+
* await activate(identity, rpcUrl, state);
|
|
11
|
+
*
|
|
12
|
+
* // Run
|
|
13
|
+
* const agent = new ClawtomatonAgent(config);
|
|
14
|
+
* await agent.run();
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export { ClawtomatonAgent } from './agent/index.js';
|
|
18
|
+
export { buildSystemPrompt } from './agent/prompt.js';
|
|
19
|
+
export { generateIdentity, activate, buildClients } from './identity/index.js';
|
|
20
|
+
export type { GenerateIdentityParams, ClawtomatonClients } from './identity/index.js';
|
|
21
|
+
export { StateStore } from './state/index.js';
|
|
22
|
+
export type { AuditEntry } from './state/index.js';
|
|
23
|
+
export { SurvivalMonitor, determineTier, formatSurvivalStatus } from './survival/index.js';
|
|
24
|
+
export { ALL_SKILLS, getSkillsForTier } from './skills/index.js';
|
|
25
|
+
export { checkBalanceSkill, checkStatsSkill, claimFeesSkill, deployTokenSkill, swapSkill, transferSkill, shellSkill, conwaySkill, editSoulSkill, } from './skills/index.js';
|
|
26
|
+
export { Heartbeat } from './heartbeat/index.js';
|
|
27
|
+
export { MarketIntelligence, formatSnapshot } from './market/index.js';
|
|
28
|
+
export type { MarketSnapshot, MarketConditions, OwnTokenStats } from './market/index.js';
|
|
29
|
+
export type { PromptContext } from './agent/prompt.js';
|
|
30
|
+
export { SelfModAuditor } from './self-mod/index.js';
|
|
31
|
+
export type { ClawtomatonIdentity, SurvivalTier, SurvivalState, AgentContext, ConversationTurn, ToolCall, ToolResult, SkillDefinition, SkillParameter, HeartbeatTask, ClawtomatonConfig, ActivationResult, } from './types.js';
|
|
32
|
+
export { SURVIVAL_THRESHOLDS, CLAWTOMATON_ACTIVATION_COST, CLAWNCH_TOKEN_ADDRESS, CLAWNCH_BURN_ADDRESS, } from './types.js';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC/E,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGtF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzF,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawnch/clawtomaton — Autonomous AI agents that launch and manage crypto projects on Base.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { ClawtomatonAgent, generateIdentity, activate } from '@clawnch/clawtomaton';
|
|
7
|
+
*
|
|
8
|
+
* // Setup
|
|
9
|
+
* const identity = await generateIdentity({ name: 'my-agent', ... }, state);
|
|
10
|
+
* await activate(identity, rpcUrl, state);
|
|
11
|
+
*
|
|
12
|
+
* // Run
|
|
13
|
+
* const agent = new ClawtomatonAgent(config);
|
|
14
|
+
* await agent.run();
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
// Core agent
|
|
18
|
+
export { ClawtomatonAgent } from './agent/index.js';
|
|
19
|
+
export { buildSystemPrompt } from './agent/prompt.js';
|
|
20
|
+
// Identity
|
|
21
|
+
export { generateIdentity, activate, buildClients } from './identity/index.js';
|
|
22
|
+
// State
|
|
23
|
+
export { StateStore } from './state/index.js';
|
|
24
|
+
// Survival
|
|
25
|
+
export { SurvivalMonitor, determineTier, formatSurvivalStatus } from './survival/index.js';
|
|
26
|
+
// Skills
|
|
27
|
+
export { ALL_SKILLS, getSkillsForTier } from './skills/index.js';
|
|
28
|
+
export { checkBalanceSkill, checkStatsSkill, claimFeesSkill, deployTokenSkill, swapSkill, transferSkill, shellSkill, conwaySkill, editSoulSkill, } from './skills/index.js';
|
|
29
|
+
// Heartbeat
|
|
30
|
+
export { Heartbeat } from './heartbeat/index.js';
|
|
31
|
+
// Market intelligence
|
|
32
|
+
export { MarketIntelligence, formatSnapshot } from './market/index.js';
|
|
33
|
+
// Self-modification audit
|
|
34
|
+
export { SelfModAuditor } from './self-mod/index.js';
|
|
35
|
+
export { SURVIVAL_THRESHOLDS, CLAWTOMATON_ACTIVATION_COST, CLAWNCH_TOKEN_ADDRESS, CLAWNCH_BURN_ADDRESS, } from './types.js';
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,aAAa;AACb,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,WAAW;AACX,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG/E,QAAQ;AACR,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3F,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,sBAAsB;AACtB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMvE,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAkBrD,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market intelligence — the agent's eyes on-chain.
|
|
3
|
+
*
|
|
4
|
+
* Reads real state: gas prices, fee balances, token stats, ETH balance.
|
|
5
|
+
* Uses the Clawncher SDK for all on-chain reads — no local ABI duplication.
|
|
6
|
+
*/
|
|
7
|
+
import { type Address, type PublicClient } from 'viem';
|
|
8
|
+
import { type NetworkName } from '@clawnch/clawncher-sdk';
|
|
9
|
+
import type { StateStore } from '../state/index.js';
|
|
10
|
+
/** Everything the agent needs to know about its current financial state */
|
|
11
|
+
export interface MarketSnapshot {
|
|
12
|
+
timestamp: number;
|
|
13
|
+
ethBalance: bigint;
|
|
14
|
+
ethFormatted: string;
|
|
15
|
+
gasPrice: bigint;
|
|
16
|
+
estimatedTxCostWei: bigint;
|
|
17
|
+
estimatedClaimCostWei: bigint;
|
|
18
|
+
estimatedClaimCostEth: string;
|
|
19
|
+
unclaimedFeesWeth: bigint;
|
|
20
|
+
unclaimedFeesWethFormatted: string;
|
|
21
|
+
unclaimedFeesToken: bigint;
|
|
22
|
+
unclaimedFeesTokenFormatted: string;
|
|
23
|
+
claimProfitWei: bigint;
|
|
24
|
+
claimProfitEth: string;
|
|
25
|
+
claimIsProfitable: boolean;
|
|
26
|
+
ownToken: OwnTokenStats | null;
|
|
27
|
+
txBudget: number;
|
|
28
|
+
}
|
|
29
|
+
export interface OwnTokenStats {
|
|
30
|
+
address: Address;
|
|
31
|
+
symbol: string;
|
|
32
|
+
balance: bigint;
|
|
33
|
+
balanceFormatted: string;
|
|
34
|
+
totalSupply: bigint;
|
|
35
|
+
holdingPct: number;
|
|
36
|
+
}
|
|
37
|
+
export interface MarketConditions {
|
|
38
|
+
feesWorthClaiming: boolean;
|
|
39
|
+
survivalClaimNeeded: boolean;
|
|
40
|
+
operationallyHealthy: boolean;
|
|
41
|
+
estimatedHoursRemaining: number;
|
|
42
|
+
needsToken: boolean;
|
|
43
|
+
summary: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class MarketIntelligence {
|
|
46
|
+
private publicClient;
|
|
47
|
+
private address;
|
|
48
|
+
private state;
|
|
49
|
+
private reader;
|
|
50
|
+
constructor(publicClient: PublicClient, address: Address, state: StateStore, network?: NetworkName);
|
|
51
|
+
/**
|
|
52
|
+
* Take a full market snapshot — all data from chain, no caching.
|
|
53
|
+
*/
|
|
54
|
+
snapshot(tokenAddress?: Address): Promise<MarketSnapshot>;
|
|
55
|
+
/**
|
|
56
|
+
* Evaluate conditions from a snapshot — actionable signals.
|
|
57
|
+
*/
|
|
58
|
+
evaluate(snap: MarketSnapshot): MarketConditions;
|
|
59
|
+
/**
|
|
60
|
+
* Quick check: should the agent wake up?
|
|
61
|
+
*/
|
|
62
|
+
shouldWake(tokenAddress?: Address): Promise<{
|
|
63
|
+
wake: boolean;
|
|
64
|
+
reason: string;
|
|
65
|
+
}>;
|
|
66
|
+
private fetchFees;
|
|
67
|
+
/**
|
|
68
|
+
* Fetch own token stats using the SDK's ClawnchReader + ERC20ABI.
|
|
69
|
+
*/
|
|
70
|
+
private fetchOwnTokenStats;
|
|
71
|
+
}
|
|
72
|
+
export declare function formatSnapshot(snap: MarketSnapshot): string;
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/market/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AACd,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAapD,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IAErB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAE9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0BAA0B,EAAE,MAAM,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,MAAM,CAAC;IAEpC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAE3B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAE/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAgB;gBAG5B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,WAAuB;IAQlC;;OAEG;IACG,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IA8C/D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB;IA0ChD;;OAEG;IACG,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;YAyBtE,SAAS;IAyBvB;;OAEG;YACW,kBAAkB;CA6BjC;AAUD,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAmB3D"}
|