@sherwoodagent/cli 0.83.0 → 0.84.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/dist/{abis-ZQ6I3S6L.js → abis-WVW2EBI3.js} +2 -2
- package/dist/{addresses-MS6BB7AB.js → addresses-LFYVOPOH.js} +3 -3
- package/dist/{agent-I6AUSTZG.js → agent-TBLC3WNJ.js} +7 -7
- package/dist/{chat-5SI7K5FA.js → chat-UZ3BBEXV.js} +8 -8
- package/dist/{chunk-MRUTBOMZ.js → chunk-45FELUWY.js} +2 -2
- package/dist/{chunk-UK2G5AZG.js → chunk-56YYNNNQ.js} +5 -5
- package/dist/{chunk-N5RIB6ZZ.js → chunk-6DRNSZ2Z.js} +41 -5
- package/dist/chunk-6DRNSZ2Z.js.map +1 -0
- package/dist/{chunk-ZTR2GPZO.js → chunk-BOC7VB5B.js} +36 -5
- package/dist/chunk-BOC7VB5B.js.map +1 -0
- package/dist/{chunk-I7TMY7AS.js → chunk-DNRIKCJ5.js} +85 -31
- package/dist/chunk-DNRIKCJ5.js.map +1 -0
- package/dist/{chunk-XSP64L7L.js → chunk-F3MDCUGO.js} +4 -368
- package/dist/chunk-F3MDCUGO.js.map +1 -0
- package/dist/{chunk-5O3KO7ZI.js → chunk-JUVXLTL2.js} +56 -5
- package/dist/chunk-JUVXLTL2.js.map +1 -0
- package/dist/{chunk-7ILOT3SI.js → chunk-KVB5P2OE.js} +2 -2
- package/dist/{chunk-I7NXKJCG.js → chunk-MQ55QOGD.js} +5 -5
- package/dist/{chunk-ZEZQM42M.js → chunk-NCFN66ZH.js} +39 -6
- package/dist/chunk-NCFN66ZH.js.map +1 -0
- package/dist/{chunk-ZW2VKCFZ.js → chunk-PVTZMRC6.js} +34 -2
- package/dist/chunk-PVTZMRC6.js.map +1 -0
- package/dist/{chunk-5BYJ3TGZ.js → chunk-QRMZRAMG.js} +20 -4
- package/dist/chunk-QRMZRAMG.js.map +1 -0
- package/dist/{chunk-4BMAFJKO.js → chunk-SNR5R5TO.js} +6 -6
- package/dist/{client-Z7LNEG2F.js → client-3SE632Q2.js} +3 -3
- package/dist/{eas-DWBT332K.js → eas-QPKX6A5A.js} +12 -6
- package/dist/{governor-ZVNTHHML.js → governor-7QKGNHMR.js} +12 -6
- package/dist/index.js +2183 -1305
- package/dist/index.js.map +1 -1
- package/dist/{network-HCFCNZUI.js → network-FEHRFDPJ.js} +6 -2
- package/dist/{price-GEUCSTO4.js → price-SVF25X4O.js} +6 -6
- package/dist/{providers-PWUJ2AR7.js → providers-BMOHHVUN.js} +4 -4
- package/dist/{research-SW6PLO32.js → research-YSNJ5HTM.js} +15 -12
- package/dist/research-YSNJ5HTM.js.map +1 -0
- package/dist/{session-6RSOG5NE.js → session-RMAIFRS6.js} +44 -13
- package/dist/session-RMAIFRS6.js.map +1 -0
- package/dist/{trade-45JPCKGP.js → trade-YPLTIS56.js} +21 -21
- package/dist/trade-YPLTIS56.js.map +1 -0
- package/dist/{vault-GAIOZZPC.js → vault-UCFFOOTS.js} +8 -8
- package/dist/{xmtp-A2KIQWGA.js → xmtp-S7IGTIMZ.js} +6 -6
- package/package.json +6 -3
- package/scripts/pin-xmtp-bindings.cjs +26 -10
- package/dist/chunk-5BYJ3TGZ.js.map +0 -1
- package/dist/chunk-5O3KO7ZI.js.map +0 -1
- package/dist/chunk-I7TMY7AS.js.map +0 -1
- package/dist/chunk-N5RIB6ZZ.js.map +0 -1
- package/dist/chunk-XSP64L7L.js.map +0 -1
- package/dist/chunk-ZEZQM42M.js.map +0 -1
- package/dist/chunk-ZTR2GPZO.js.map +0 -1
- package/dist/chunk-ZW2VKCFZ.js.map +0 -1
- package/dist/research-SW6PLO32.js.map +0 -1
- package/dist/session-6RSOG5NE.js.map +0 -1
- package/dist/trade-45JPCKGP.js.map +0 -1
- /package/dist/{abis-ZQ6I3S6L.js.map → abis-WVW2EBI3.js.map} +0 -0
- /package/dist/{addresses-MS6BB7AB.js.map → addresses-LFYVOPOH.js.map} +0 -0
- /package/dist/{agent-I6AUSTZG.js.map → agent-TBLC3WNJ.js.map} +0 -0
- /package/dist/{chat-5SI7K5FA.js.map → chat-UZ3BBEXV.js.map} +0 -0
- /package/dist/{chunk-MRUTBOMZ.js.map → chunk-45FELUWY.js.map} +0 -0
- /package/dist/{chunk-UK2G5AZG.js.map → chunk-56YYNNNQ.js.map} +0 -0
- /package/dist/{chunk-7ILOT3SI.js.map → chunk-KVB5P2OE.js.map} +0 -0
- /package/dist/{chunk-I7NXKJCG.js.map → chunk-MQ55QOGD.js.map} +0 -0
- /package/dist/{chunk-4BMAFJKO.js.map → chunk-SNR5R5TO.js.map} +0 -0
- /package/dist/{client-Z7LNEG2F.js.map → client-3SE632Q2.js.map} +0 -0
- /package/dist/{eas-DWBT332K.js.map → eas-QPKX6A5A.js.map} +0 -0
- /package/dist/{governor-ZVNTHHML.js.map → governor-7QKGNHMR.js.map} +0 -0
- /package/dist/{network-HCFCNZUI.js.map → network-FEHRFDPJ.js.map} +0 -0
- /package/dist/{price-GEUCSTO4.js.map → price-SVF25X4O.js.map} +0 -0
- /package/dist/{providers-PWUJ2AR7.js.map → providers-BMOHHVUN.js.map} +0 -0
- /package/dist/{vault-GAIOZZPC.js.map → vault-UCFFOOTS.js.map} +0 -0
- /package/dist/{xmtp-A2KIQWGA.js.map → xmtp-S7IGTIMZ.js.map} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CHAIN_REGISTRY,
|
|
3
|
+
COORDINATION_ONLY_NETWORKS,
|
|
3
4
|
DEFAULT_MIN_GAS_RESERVE,
|
|
4
5
|
DEFAULT_NETWORK,
|
|
5
6
|
VALID_NETWORKS,
|
|
@@ -13,13 +14,15 @@ import {
|
|
|
13
14
|
getRpcUrls,
|
|
14
15
|
isTestnet,
|
|
15
16
|
robinhoodFork,
|
|
17
|
+
robinhoodMainnet,
|
|
16
18
|
robinhoodTestnet,
|
|
17
19
|
setNetwork,
|
|
18
20
|
withNetwork
|
|
19
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-PVTZMRC6.js";
|
|
20
22
|
import "./chunk-3TZIOAPH.js";
|
|
21
23
|
export {
|
|
22
24
|
CHAIN_REGISTRY,
|
|
25
|
+
COORDINATION_ONLY_NETWORKS,
|
|
23
26
|
DEFAULT_MIN_GAS_RESERVE,
|
|
24
27
|
DEFAULT_NETWORK,
|
|
25
28
|
VALID_NETWORKS,
|
|
@@ -33,8 +36,9 @@ export {
|
|
|
33
36
|
getRpcUrls,
|
|
34
37
|
isTestnet,
|
|
35
38
|
robinhoodFork,
|
|
39
|
+
robinhoodMainnet,
|
|
36
40
|
robinhoodTestnet,
|
|
37
41
|
setNetwork,
|
|
38
42
|
withNetwork
|
|
39
43
|
};
|
|
40
|
-
//# sourceMappingURL=network-
|
|
44
|
+
//# sourceMappingURL=network-FEHRFDPJ.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
quote
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6DRNSZ2Z.js";
|
|
4
4
|
import {
|
|
5
5
|
SYNTHRA
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DNRIKCJ5.js";
|
|
7
7
|
import {
|
|
8
8
|
getPublicClient
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QRMZRAMG.js";
|
|
10
10
|
import {
|
|
11
11
|
getNetwork
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-PVTZMRC6.js";
|
|
13
13
|
import "./chunk-3TZIOAPH.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-F3MDCUGO.js";
|
|
15
15
|
|
|
16
16
|
// src/lib/price.ts
|
|
17
17
|
import { parseUnits, formatUnits } from "viem";
|
|
@@ -133,4 +133,4 @@ export {
|
|
|
133
133
|
getTokenPriceInAsset,
|
|
134
134
|
getTokenPricesInAsset
|
|
135
135
|
};
|
|
136
|
-
//# sourceMappingURL=price-
|
|
136
|
+
//# sourceMappingURL=price-SVF25X4O.js.map
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
MessariProvider,
|
|
3
3
|
NansenProvider,
|
|
4
4
|
getResearchProvider
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-45FELUWY.js";
|
|
6
|
+
import "./chunk-QRMZRAMG.js";
|
|
7
7
|
import {
|
|
8
8
|
robinhoodTestnet
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-PVTZMRC6.js";
|
|
10
10
|
import "./chunk-3TZIOAPH.js";
|
|
11
11
|
|
|
12
12
|
// src/providers/index.ts
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
getResearchProvider,
|
|
29
29
|
listProviders
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=providers-
|
|
31
|
+
//# sourceMappingURL=providers-BMOHHVUN.js.map
|
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
MESSARI_COST_ESTIMATE,
|
|
3
3
|
NANSEN_COST_ESTIMATE,
|
|
4
4
|
getResearchProvider
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-45FELUWY.js";
|
|
6
6
|
import {
|
|
7
7
|
formatContractError,
|
|
8
8
|
getAccount
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-QRMZRAMG.js";
|
|
10
|
+
import "./chunk-PVTZMRC6.js";
|
|
11
11
|
import "./chunk-3TZIOAPH.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/research.ts
|
|
@@ -16,7 +16,7 @@ import ora from "ora";
|
|
|
16
16
|
import { confirm } from "@inquirer/prompts";
|
|
17
17
|
import { isAddress } from "viem";
|
|
18
18
|
async function loadXmtp() {
|
|
19
|
-
return import("./xmtp-
|
|
19
|
+
return import("./xmtp-S7IGTIMZ.js");
|
|
20
20
|
}
|
|
21
21
|
var COST_ESTIMATES = {
|
|
22
22
|
messari: MESSARI_COST_ESTIMATE,
|
|
@@ -83,7 +83,7 @@ function formatValue(value) {
|
|
|
83
83
|
}
|
|
84
84
|
async function postResearch(fundName, result, prompt) {
|
|
85
85
|
const { pinJSON } = await import("./ipfs-EJ7IHXCU.js");
|
|
86
|
-
const { createResearchAttestation, getEasScanUrl } = await import("./eas-
|
|
86
|
+
const { createResearchAttestation, getEasScanUrl } = await import("./eas-QPKX6A5A.js");
|
|
87
87
|
const xmtp = await loadXmtp();
|
|
88
88
|
const pinSpinner = ora("Pinning research result to IPFS...").start();
|
|
89
89
|
let resultUri;
|
|
@@ -113,9 +113,9 @@ async function postResearch(fundName, result, prompt) {
|
|
|
113
113
|
let attestationUid;
|
|
114
114
|
try {
|
|
115
115
|
const { getChainContracts } = await import("./config-ZGFS4I7K.js");
|
|
116
|
-
const { getChain } = await import("./network-
|
|
116
|
+
const { getChain } = await import("./network-FEHRFDPJ.js");
|
|
117
117
|
const vaultRecipient = getChainContracts(getChain().id).vault;
|
|
118
|
-
const
|
|
118
|
+
const attestation = await createResearchAttestation(
|
|
119
119
|
result.provider,
|
|
120
120
|
result.queryType,
|
|
121
121
|
prompt,
|
|
@@ -123,10 +123,13 @@ async function postResearch(fundName, result, prompt) {
|
|
|
123
123
|
resultUri,
|
|
124
124
|
vaultRecipient
|
|
125
125
|
);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
if (!attestation) {
|
|
127
|
+
attestationUid = "";
|
|
128
|
+
easSpinner.info("Attestation skipped on this chain");
|
|
129
|
+
} else {
|
|
130
|
+
attestationUid = attestation.uid;
|
|
131
|
+
easSpinner.succeed(`Attested: ${chalk.dim(getEasScanUrl(attestation.uid))}`);
|
|
132
|
+
}
|
|
130
133
|
} catch (err) {
|
|
131
134
|
easSpinner.fail("Failed to create EAS attestation");
|
|
132
135
|
console.error(
|
|
@@ -312,4 +315,4 @@ function registerResearchCommands(program) {
|
|
|
312
315
|
export {
|
|
313
316
|
registerResearchCommands
|
|
314
317
|
};
|
|
315
|
-
//# sourceMappingURL=research-
|
|
318
|
+
//# sourceMappingURL=research-YSNJ5HTM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/research.ts"],"sourcesContent":["/**\n * Research commands — sherwood research <subcommand>\n *\n * Query DeFi research providers (Messari, Nansen) using x402 micropayments.\n * Agent pays per-query with USDC from its own wallet — no vault interaction needed.\n *\n * --post <fund>: pins result to IPFS, creates EAS attestation, posts\n * lightweight notification to fund XMTP chat (not the full result).\n *\n * --yes: skip the cost confirmation prompt (for non-interactive / agent use).\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { isAddress } from \"viem\";\nimport { getAccount, formatContractError } from \"../lib/client.js\";\nimport type { MessageType } from \"../lib/types.js\";\nimport { getResearchProvider } from \"../providers/research/index.js\";\nimport type { ResearchResult } from \"../providers/research/index.js\";\nimport { MESSARI_COST_ESTIMATE } from \"../providers/research/messari.js\";\nimport { NANSEN_COST_ESTIMATE } from \"../providers/research/nansen.js\";\n\n// Lazy-load XMTP to avoid breaking non-chat commands when @xmtp/cli is missing\nasync function loadXmtp() {\n return import(\"../lib/xmtp.js\");\n}\n\n// ── Cost estimates ──\n\nconst COST_ESTIMATES: Record<string, Record<string, string>> = {\n messari: MESSARI_COST_ESTIMATE,\n nansen: NANSEN_COST_ESTIMATE,\n};\n\nfunction getEstimatedCost(provider: string, queryType: string): string {\n return COST_ESTIMATES[provider]?.[queryType] ?? \"unknown\";\n}\n\n/**\n * Confirm cost with the user before executing the x402 query.\n * Skipped when --yes is passed (non-interactive / agent mode).\n */\nasync function confirmCost(\n provider: string,\n queryType: string,\n target: string,\n skipConfirm: boolean,\n): Promise<boolean> {\n const estimate = getEstimatedCost(provider, queryType);\n\n console.log();\n console.log(chalk.bold(`Research Query`));\n console.log(chalk.dim(\"─\".repeat(40)));\n console.log(` Provider: ${provider}`);\n console.log(` Type: ${queryType}`);\n console.log(` Target: ${target}`);\n console.log(` Est. cost: ${chalk.yellow(estimate + \" USDC\")} (x402 micropayment)`);\n console.log();\n\n if (skipConfirm) return true;\n\n return confirm({\n message: `Pay ${estimate} USDC to ${provider} for this query?`,\n default: true,\n });\n}\n\n// ── Output formatting ──\n\nfunction formatResearchResult(result: ResearchResult): void {\n console.log();\n console.log(\n chalk.bold(`Research: ${result.queryType} ${result.target} (${result.provider})`),\n );\n console.log(chalk.dim(\"─\".repeat(50)));\n\n // Flatten the top-level data keys into a readable summary\n const data = result.data;\n for (const [key, value] of Object.entries(data)) {\n if (value === null || value === undefined) continue;\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Nested object — show as sub-section\n console.log(chalk.bold(`\\n ${key}`));\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n console.log(` ${subKey}: ${formatValue(subValue)}`);\n }\n } else if (Array.isArray(value)) {\n console.log(` ${key}: ${chalk.dim(`[${value.length} items]`)}`);\n } else {\n console.log(` ${key}: ${formatValue(value)}`);\n }\n }\n\n console.log();\n console.log(\n chalk.dim(\n ` Cost: $${result.costUsdc} USDC • Provider: ${result.provider}`,\n ),\n );\n console.log();\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"number\") {\n // Format large numbers with commas\n return value.toLocaleString(\"en-US\", { maximumFractionDigits: 4 });\n }\n if (typeof value === \"bigint\") {\n return value.toLocaleString(\"en-US\");\n }\n return String(value);\n}\n\n// ── Post flow: IPFS → EAS → XMTP ──\n\nasync function postResearch(\n fundName: string,\n result: ResearchResult,\n prompt: string,\n): Promise<void> {\n const { pinJSON } = await import(\"../lib/ipfs.js\");\n const { createResearchAttestation, getEasScanUrl } = await import(\n \"../lib/eas.js\"\n );\n const xmtp = await loadXmtp();\n\n // 1. Pin full research result to IPFS\n const pinSpinner = ora(\"Pinning research result to IPFS...\").start();\n let resultUri: string;\n try {\n resultUri = await pinJSON(\n {\n schema: \"sherwood/research/v1\",\n provider: result.provider,\n queryType: result.queryType,\n target: result.target,\n prompt,\n costUsdc: result.costUsdc,\n data: result.data,\n timestamp: result.timestamp,\n } as Record<string, unknown>,\n `sherwood-research-${result.provider}-${result.queryType}-${Date.now()}`,\n );\n pinSpinner.succeed(`Pinned to IPFS: ${chalk.dim(resultUri)}`);\n } catch (err) {\n pinSpinner.fail(\"Failed to pin to IPFS\");\n console.error(\n chalk.red(formatContractError(err)),\n );\n return;\n }\n\n // 2. Create EAS attestation with prompt, cost, provider, and IPFS URI\n // Recipient is vault so dashboard can display it under the fund\n const easSpinner = ora(\"Creating EAS attestation...\").start();\n let attestationUid: string;\n try {\n const { getChainContracts } = await import(\"../lib/config.js\");\n const { getChain } = await import(\"../lib/network.js\");\n const vaultRecipient = getChainContracts(getChain().id).vault as `0x${string}` | undefined;\n const attestation = await createResearchAttestation(\n result.provider,\n result.queryType,\n prompt,\n result.costUsdc,\n resultUri,\n vaultRecipient,\n );\n if (!attestation) {\n // Writes are disabled on the ephemeral fork — the IPFS pin still stands.\n attestationUid = \"\";\n easSpinner.info(\"Attestation skipped on this chain\");\n } else {\n attestationUid = attestation.uid;\n easSpinner.succeed(`Attested: ${chalk.dim(getEasScanUrl(attestation.uid))}`);\n }\n } catch (err) {\n easSpinner.fail(\"Failed to create EAS attestation\");\n console.error(\n chalk.red(formatContractError(err)),\n );\n return;\n }\n\n // 3. Post lightweight notification to XMTP chat\n const chatSpinner = ora(\"Posting to fund chat...\").start();\n try {\n const group = await xmtp.getGroup(\"\", fundName);\n await xmtp.sendEnvelope(group, {\n type: \"X402_RESEARCH\" as MessageType,\n from: getAccount().address,\n text: `Ran ${result.provider} ${result.queryType} on ${result.target} ($${result.costUsdc} USDC)`,\n data: {\n provider: result.provider,\n queryType: result.queryType,\n target: result.target,\n costUsdc: result.costUsdc,\n resultUri,\n attestationUid,\n },\n timestamp: result.timestamp,\n });\n chatSpinner.succeed(\"Posted to fund chat\");\n } catch (err) {\n chatSpinner.fail(\"Failed to post to chat\");\n console.error(\n chalk.red(formatContractError(err)),\n );\n }\n}\n\n// ── Command registration ──\n\nexport function registerResearchCommands(program: Command): void {\n const research = program\n .command(\"research\")\n .description(\n \"Query DeFi research providers via x402 micropayments (USDC on Base)\",\n );\n\n // ── research token <target> ──\n\n research\n .command(\"token <target>\")\n .description(\"Token report — profile, market data, on-chain metrics\")\n .requiredOption(\n \"--provider <name>\",\n \"Research provider (messari, nansen)\",\n )\n .option(\n \"--post <fund>\",\n \"Post result to fund chat (pin to IPFS + attest to EAS)\",\n )\n .option(\"--yes\", \"Skip cost confirmation prompt\", false)\n .action(async (target: string, opts: { provider: string; post?: string; yes: boolean }) => {\n const ok = await confirmCost(opts.provider, \"token\", target, opts.yes);\n if (!ok) {\n console.log(chalk.dim(\"Cancelled.\"));\n return;\n }\n\n const spinner = ora(\n `Querying ${opts.provider} for token ${target}...`,\n ).start();\n\n try {\n const provider = getResearchProvider(opts.provider);\n const result = await provider.query({ type: \"token\", target });\n spinner.succeed(`Token data received from ${opts.provider}`);\n formatResearchResult(result);\n\n if (opts.post) {\n await postResearch(opts.post, result, `token ${target}`);\n }\n } catch (err) {\n spinner.fail(`Token query failed`);\n console.error(\n chalk.red(formatContractError(err)),\n );\n process.exit(1);\n }\n });\n\n // ── research market <asset> ──\n\n research\n .command(\"market <asset>\")\n .description(\"Market overview — price, volume, market cap, ROI, ATH\")\n .requiredOption(\n \"--provider <name>\",\n \"Research provider (messari, nansen)\",\n )\n .option(\n \"--post <fund>\",\n \"Post result to fund chat (pin to IPFS + attest to EAS)\",\n )\n .option(\"--yes\", \"Skip cost confirmation prompt\", false)\n .action(async (asset: string, opts: { provider: string; post?: string; yes: boolean }) => {\n const ok = await confirmCost(opts.provider, \"market\", asset, opts.yes);\n if (!ok) {\n console.log(chalk.dim(\"Cancelled.\"));\n return;\n }\n\n const spinner = ora(\n `Querying ${opts.provider} for ${asset} market data...`,\n ).start();\n\n try {\n const provider = getResearchProvider(opts.provider);\n const result = await provider.query({ type: \"market\", target: asset });\n spinner.succeed(`Market data received from ${opts.provider}`);\n formatResearchResult(result);\n\n if (opts.post) {\n await postResearch(opts.post, result, `market ${asset}`);\n }\n } catch (err) {\n spinner.fail(`Market query failed`);\n console.error(\n chalk.red(formatContractError(err)),\n );\n process.exit(1);\n }\n });\n\n // ── research smart-money ──\n\n research\n .command(\"smart-money\")\n .description(\n \"Smart money flows — net flow, DEX trades, holdings from labeled wallets\",\n )\n .requiredOption(\"--token <symbol>\", \"Token symbol to analyze (e.g. WETH)\")\n .requiredOption(\n \"--provider <name>\",\n \"Research provider (messari, nansen)\",\n )\n .option(\n \"--post <fund>\",\n \"Post result to fund chat (pin to IPFS + attest to EAS)\",\n )\n .option(\"--yes\", \"Skip cost confirmation prompt\", false)\n .action(async (opts: { token: string; provider: string; post?: string; yes: boolean }) => {\n const ok = await confirmCost(opts.provider, \"smart-money\", opts.token, opts.yes);\n if (!ok) {\n console.log(chalk.dim(\"Cancelled.\"));\n return;\n }\n\n const spinner = ora(\n `Querying ${opts.provider} for ${opts.token} smart money flows...`,\n ).start();\n\n try {\n const provider = getResearchProvider(opts.provider);\n const result = await provider.query({\n type: \"smart-money\",\n target: opts.token,\n options: { token: opts.token },\n });\n spinner.succeed(\n `Smart money data received from ${opts.provider}`,\n );\n formatResearchResult(result);\n\n if (opts.post) {\n await postResearch(\n opts.post,\n result,\n `smart-money --token ${opts.token}`,\n );\n }\n } catch (err) {\n spinner.fail(`Smart money query failed`);\n console.error(\n chalk.red(formatContractError(err)),\n );\n process.exit(1);\n }\n });\n\n // ── research wallet <address> ──\n\n research\n .command(\"wallet <address>\")\n .description(\n \"Wallet due diligence — PnL history, transaction patterns, counterparties\",\n )\n .requiredOption(\n \"--provider <name>\",\n \"Research provider (messari, nansen)\",\n )\n .option(\n \"--post <fund>\",\n \"Post result to fund chat (pin to IPFS + attest to EAS)\",\n )\n .option(\"--yes\", \"Skip cost confirmation prompt\", false)\n .action(async (address: string, opts: { provider: string; post?: string; yes: boolean }) => {\n if (!isAddress(address)) {\n console.error(chalk.red(`Invalid wallet address: ${address}`));\n process.exit(1);\n }\n\n const ok = await confirmCost(opts.provider, \"wallet\", address, opts.yes);\n if (!ok) {\n console.log(chalk.dim(\"Cancelled.\"));\n return;\n }\n\n const spinner = ora(\n `Querying ${opts.provider} for wallet ${address.slice(0, 8)}...`,\n ).start();\n\n try {\n const provider = getResearchProvider(opts.provider);\n const result = await provider.query({\n type: \"wallet\",\n target: address,\n });\n spinner.succeed(`Wallet data received from ${opts.provider}`);\n formatResearchResult(result);\n\n if (opts.post) {\n await postResearch(opts.post, result, `wallet ${address}`);\n }\n } catch (err) {\n spinner.fail(`Wallet query failed`);\n console.error(\n chalk.red(formatContractError(err)),\n );\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -8,31 +8,35 @@ import {
|
|
|
8
8
|
enrichProposalEvents,
|
|
9
9
|
getCurrentBlock,
|
|
10
10
|
getGovernorEvents,
|
|
11
|
+
getGuardianRegistryEvents,
|
|
12
|
+
getStakedWoodEvents,
|
|
11
13
|
getVaultEvents
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-JUVXLTL2.js";
|
|
13
15
|
import {
|
|
14
16
|
resolveFund
|
|
15
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-MQ55QOGD.js";
|
|
16
18
|
import {
|
|
17
19
|
getGovernorOf
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import
|
|
20
|
+
} from "./chunk-BOC7VB5B.js";
|
|
21
|
+
import {
|
|
22
|
+
SHERWOOD
|
|
23
|
+
} from "./chunk-DNRIKCJ5.js";
|
|
20
24
|
import {
|
|
21
25
|
getPublicClient
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
26
|
+
} from "./chunk-QRMZRAMG.js";
|
|
27
|
+
import "./chunk-PVTZMRC6.js";
|
|
24
28
|
import {
|
|
25
29
|
loadConfig
|
|
26
30
|
} from "./chunk-3TZIOAPH.js";
|
|
27
31
|
import {
|
|
28
32
|
SYNDICATE_VAULT_ABI
|
|
29
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-F3MDCUGO.js";
|
|
30
34
|
import "./chunk-VR4VHX4D.js";
|
|
31
35
|
|
|
32
36
|
// src/commands/session.ts
|
|
33
37
|
import chalk from "chalk";
|
|
34
38
|
async function loadXmtp() {
|
|
35
|
-
return import("./xmtp-
|
|
39
|
+
return import("./xmtp-S7IGTIMZ.js");
|
|
36
40
|
}
|
|
37
41
|
async function resolveGovernor(vaultAddress) {
|
|
38
42
|
const client = getPublicClient();
|
|
@@ -103,7 +107,20 @@ async function handleCheck(name, stream, noXmtp) {
|
|
|
103
107
|
fromBlock,
|
|
104
108
|
currentBlock
|
|
105
109
|
);
|
|
106
|
-
|
|
110
|
+
const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();
|
|
111
|
+
const guardianEvents = await getGuardianRegistryEvents(
|
|
112
|
+
GUARDIAN_REGISTRY,
|
|
113
|
+
fromBlock,
|
|
114
|
+
currentBlock
|
|
115
|
+
);
|
|
116
|
+
const slashEvents = await getStakedWoodEvents(
|
|
117
|
+
STAKED_WOOD,
|
|
118
|
+
fromBlock,
|
|
119
|
+
currentBlock
|
|
120
|
+
);
|
|
121
|
+
events = [...vaultEvents, ...govEvents, ...guardianEvents, ...slashEvents].sort(
|
|
122
|
+
(a, b) => a.block - b.block
|
|
123
|
+
);
|
|
107
124
|
try {
|
|
108
125
|
events = await enrichProposalEvents(vaultAddress, events);
|
|
109
126
|
} catch {
|
|
@@ -183,9 +200,23 @@ async function startStream(name, vaultAddress, governorAddress, noXmtp) {
|
|
|
183
200
|
fromBlock,
|
|
184
201
|
toBlock
|
|
185
202
|
);
|
|
186
|
-
|
|
187
|
-
|
|
203
|
+
const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();
|
|
204
|
+
const guardianEvents = await getGuardianRegistryEvents(
|
|
205
|
+
GUARDIAN_REGISTRY,
|
|
206
|
+
fromBlock,
|
|
207
|
+
toBlock
|
|
208
|
+
);
|
|
209
|
+
const slashEvents = await getStakedWoodEvents(
|
|
210
|
+
STAKED_WOOD,
|
|
211
|
+
fromBlock,
|
|
212
|
+
toBlock
|
|
188
213
|
);
|
|
214
|
+
let events = [
|
|
215
|
+
...vaultEvents,
|
|
216
|
+
...govEvents,
|
|
217
|
+
...guardianEvents,
|
|
218
|
+
...slashEvents
|
|
219
|
+
].sort((a, b) => a.block - b.block);
|
|
189
220
|
try {
|
|
190
221
|
events = await enrichProposalEvents(vaultAddress, events, metadataCache);
|
|
191
222
|
} catch {
|
|
@@ -280,7 +311,7 @@ function registerSessionCommands(program) {
|
|
|
280
311
|
);
|
|
281
312
|
session.command("cron <name>").description("Manage participation crons (OpenClaw agents)").option("--remove", "Remove participation crons", false).option("--status", "Show cron status", false).action(async (name, opts) => {
|
|
282
313
|
const { isOpenClaw, registerFundCrons, unregisterFundCrons, getFundCronStatus } = await import("./cron-E3UAZF5B.js");
|
|
283
|
-
const { isTestnet } = await import("./network-
|
|
314
|
+
const { isTestnet } = await import("./network-FEHRFDPJ.js");
|
|
284
315
|
const { getNotifyTo } = await import("./config-ZGFS4I7K.js");
|
|
285
316
|
if (!isOpenClaw()) {
|
|
286
317
|
console.log(chalk.yellow("Not running on OpenClaw \u2014 cron commands unavailable"));
|
|
@@ -322,4 +353,4 @@ function registerSessionCommands(program) {
|
|
|
322
353
|
export {
|
|
323
354
|
registerSessionCommands
|
|
324
355
|
};
|
|
325
|
-
//# sourceMappingURL=session-
|
|
356
|
+
//# sourceMappingURL=session-RMAIFRS6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/session.ts"],"sourcesContent":["/**\n * Session commands — sherwood session check|status|reset\n *\n * Provides agent awareness: catch up on XMTP messages and on-chain events\n * since the last session. Supports one-shot polling (default) and persistent\n * streaming (--stream).\n *\n * Usage:\n * sherwood session check <name> — one-shot catch-up (JSON to stdout)\n * sherwood session check <name> --stream — persistent stream (JSON lines to stdout)\n * sherwood session check <name> --no-xmtp — skip XMTP entirely (on-chain events only)\n * sherwood session status [name] — show session cursor positions\n * sherwood session reset <name> [--full] — reset session cursors\n *\n * Env: SHERWOOD_SKIP_XMTP=1 is equivalent to --no-xmtp.\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { Address } from \"viem\";\nimport { resolveFund } from \"../lib/ens.js\";\nimport { getPublicClient } from \"../lib/client.js\";\nimport { getGovernorOf } from \"../lib/governor.js\";\nimport { SYNDICATE_VAULT_ABI } from \"../lib/abis.js\";\nimport {\n getSession,\n updateSession,\n resetSession,\n getAllSessions,\n} from \"../lib/session.js\";\nimport {\n getVaultEvents,\n getGovernorEvents,\n getGuardianRegistryEvents,\n getStakedWoodEvents,\n getCurrentBlock,\n enrichProposalEvents,\n type ChainEvent,\n} from \"../lib/events.js\";\nimport { SHERWOOD } from \"../lib/addresses.js\";\nimport type { ChatEnvelope } from \"../lib/types.js\";\nimport { loadConfig } from \"../lib/config.js\";\n\n// Lazy-load XMTP to avoid breaking session commands when @xmtp/cli is missing\nasync function loadXmtp() {\n return import(\"../lib/xmtp.js\");\n}\n\n// ── Output types ──\n\ninterface SessionMessage {\n source: \"xmtp\";\n id: string;\n from: string;\n type: string;\n text: string;\n sentAt: string; // ISO 8601\n}\n\ninterface SessionCheckResult {\n fund: string;\n messages: SessionMessage[];\n events: ChainEvent[];\n meta: {\n newMessages: number;\n newEvents: number;\n blocksScanned: number;\n lastCheckAt: string; // ISO 8601\n };\n}\n\n// ── Helpers ──\n\n/** Resolve the per-vault governor address from the vault contract. */\nasync function resolveGovernor(vaultAddress: Address): Promise<Address> {\n const client = getPublicClient();\n try {\n const governor = await client.readContract({\n address: vaultAddress,\n abi: SYNDICATE_VAULT_ABI,\n functionName: \"governor\",\n });\n return governor as Address;\n } catch {\n // Vault didn't answer — fall back to the factory's per-vault mapping.\n return getGovernorOf(vaultAddress);\n }\n}\n\n/** Convert an XMTP message to session output format. */\nfunction toSessionMessage(msg: {\n id: string;\n senderInboxId: string;\n content: string;\n sentAt: Date;\n}): SessionMessage {\n let type = \"MESSAGE\";\n let text = msg.content;\n let from = msg.senderInboxId;\n\n try {\n const envelope: ChatEnvelope = JSON.parse(msg.content);\n type = envelope.type;\n text = envelope.text || envelope.type;\n from = envelope.from || msg.senderInboxId;\n } catch {\n // Plain text message\n }\n\n return {\n source: \"xmtp\",\n id: msg.id,\n from,\n type,\n text,\n sentAt: msg.sentAt.toISOString(),\n };\n}\n\n// ── Command handlers ──\n\nasync function handleCheck(\n name: string,\n stream: boolean,\n noXmtp: boolean,\n): Promise<void> {\n // Resolve fund\n const fund = await resolveFund(name);\n const vaultAddress = fund.vault;\n const governorAddress = await resolveGovernor(vaultAddress);\n\n // Load or initialize session\n const session = getSession(name);\n const currentBlock = await getCurrentBlock();\n\n // On first run: look back ~1000 blocks (~8 min on Base)\n const fromBlock = session?.lastBlockNumber\n ? BigInt(session.lastBlockNumber) + 1n\n : currentBlock > 1000n\n ? currentBlock - 1000n\n : 0n;\n\n const lastMessageTimestamp = session?.lastMessageTimestamp || 0;\n\n // ── Fetch XMTP messages ──\n // Skipped entirely when noXmtp is true — used by callers that own XMTP\n // themselves (e.g. the sherwood-monitor Hermes plugin via its bundled\n // sidecar) or when the local @xmtp/node-bindings load would fail.\n let messages: SessionMessage[] = [];\n if (!noXmtp) {\n try {\n const xmtp = await loadXmtp();\n const groupId = await xmtp.getGroup(\"\", name);\n const recent = await xmtp.getRecentMessages(groupId, 100);\n\n // Filter to messages after our cursor, excluding our own messages\n const cursorMs = lastMessageTimestamp * 1000;\n const ownInboxId = loadConfig().xmtpInboxId;\n const newMessages = recent.filter(\n (m) =>\n m.sentAt.getTime() > cursorMs &&\n (!ownInboxId || m.senderInboxId !== ownInboxId),\n );\n messages = newMessages.map(toSessionMessage);\n } catch {\n // XMTP not available or group not found — skip messages\n }\n }\n\n // ── Fetch on-chain events ──\n let events: ChainEvent[] = [];\n if (fromBlock <= currentBlock) {\n const vaultEvents = await getVaultEvents(\n vaultAddress,\n fromBlock,\n currentBlock,\n );\n const govEvents = await getGovernorEvents(\n governorAddress,\n vaultAddress,\n fromBlock,\n currentBlock,\n );\n // Guardian layer — resolved from the address book (zero addresses on\n // chains without the guardian stack yield no events).\n const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();\n const guardianEvents = await getGuardianRegistryEvents(\n GUARDIAN_REGISTRY,\n fromBlock,\n currentBlock,\n );\n const slashEvents = await getStakedWoodEvents(\n STAKED_WOOD,\n fromBlock,\n currentBlock,\n );\n events = [...vaultEvents, ...govEvents, ...guardianEvents, ...slashEvents].sort(\n (a, b) => a.block - b.block,\n );\n\n // Enrich proposal events with IPFS metadata (name, description, state)\n try {\n events = await enrichProposalEvents(vaultAddress, events);\n } catch {\n // IPFS/RPC unreachable — continue with raw events\n }\n }\n\n // ── Output initial catch-up result ──\n const result: SessionCheckResult = {\n fund: name,\n messages,\n events,\n meta: {\n newMessages: messages.length,\n newEvents: events.length,\n blocksScanned: Number(currentBlock - fromBlock),\n lastCheckAt: session?.lastCheckAt\n ? new Date(session.lastCheckAt * 1000).toISOString()\n : \"never\",\n },\n };\n\n process.stdout.write(JSON.stringify(result) + \"\\n\");\n\n // ── Update session state ──\n // Find the newest message timestamp (messages may not be sorted)\n // Use ceil to ensure we don't re-fetch the same message due to sub-second precision\n let newestTimestamp = lastMessageTimestamp;\n let newestMessageId = session?.lastMessageId || \"\";\n for (const msg of messages) {\n const ts = Math.ceil(new Date(msg.sentAt).getTime() / 1000);\n if (ts > newestTimestamp) {\n newestTimestamp = ts;\n newestMessageId = msg.id;\n }\n }\n\n updateSession(name, {\n vault: vaultAddress,\n governor: governorAddress,\n lastBlockNumber: Number(currentBlock),\n lastCheckAt: Math.floor(Date.now() / 1000),\n lastMessageId: newestMessageId,\n lastMessageTimestamp: newestTimestamp,\n totalMessagesProcessed:\n (session?.totalMessagesProcessed || 0) + messages.length,\n totalEventsProcessed:\n (session?.totalEventsProcessed || 0) + events.length,\n });\n\n // ── If --stream, stay alive ──\n if (stream) {\n await startStream(name, vaultAddress, governorAddress, noXmtp);\n }\n}\n\nasync function startStream(\n name: string,\n vaultAddress: Address,\n governorAddress: Address,\n noXmtp: boolean,\n): Promise<void> {\n // Cache for proposal metadata — immutable once pinned, safe to reuse across polls\n const metadataCache = new Map<string, { name: string; description: string }>();\n\n // Start XMTP message stream\n // Skipped entirely when noXmtp is true — see handleCheck for the rationale.\n // xmtpCleanup stays undefined in that case; the on-exit cleanup does\n // `xmtpCleanup?.()` which is a no-op on undefined, so teardown is unaffected.\n let xmtpCleanup: (() => void) | undefined;\n if (!noXmtp) {\n try {\n const xmtp = await loadXmtp();\n const groupId = await xmtp.getGroup(\"\", name);\n\n const streamOwnInboxId = loadConfig().xmtpInboxId;\n xmtpCleanup = await xmtp.streamMessages(groupId, (msg) => {\n // Skip own messages to prevent self-replies\n if (streamOwnInboxId && msg.senderInboxId === streamOwnInboxId) return;\n\n const sessionMsg = toSessionMessage(msg);\n process.stdout.write(JSON.stringify(sessionMsg) + \"\\n\");\n\n // Update session state incrementally\n updateSession(name, {\n lastMessageId: msg.id,\n lastMessageTimestamp: Math.floor(msg.sentAt.getTime() / 1000),\n lastCheckAt: Math.floor(Date.now() / 1000),\n totalMessagesProcessed:\n (getSession(name)?.totalMessagesProcessed || 0) + 1,\n });\n });\n } catch {\n // XMTP not available — continue with event polling only\n }\n }\n\n // Start on-chain event polling (~30s interval)\n const pollInterval = setInterval(async () => {\n try {\n const session = getSession(name);\n const fromBlock = BigInt(session?.lastBlockNumber || 0) + 1n;\n const toBlock = await getCurrentBlock();\n\n if (fromBlock > toBlock) return; // No new blocks\n\n const vaultEvents = await getVaultEvents(\n vaultAddress,\n fromBlock,\n toBlock,\n );\n const govEvents = await getGovernorEvents(\n governorAddress,\n vaultAddress,\n fromBlock,\n toBlock,\n );\n const { GUARDIAN_REGISTRY, STAKED_WOOD } = SHERWOOD();\n const guardianEvents = await getGuardianRegistryEvents(\n GUARDIAN_REGISTRY,\n fromBlock,\n toBlock,\n );\n const slashEvents = await getStakedWoodEvents(\n STAKED_WOOD,\n fromBlock,\n toBlock,\n );\n\n let events = [\n ...vaultEvents,\n ...govEvents,\n ...guardianEvents,\n ...slashEvents,\n ].sort((a, b) => a.block - b.block);\n\n // Enrich proposal events with IPFS metadata (reuse cache across polls)\n try {\n events = await enrichProposalEvents(vaultAddress, events, metadataCache);\n } catch {\n // IPFS/RPC unreachable — continue with raw events\n }\n\n for (const event of events) {\n process.stdout.write(JSON.stringify(event) + \"\\n\");\n }\n\n updateSession(name, {\n lastBlockNumber: Number(toBlock),\n lastCheckAt: Math.floor(Date.now() / 1000),\n totalEventsProcessed:\n (getSession(name)?.totalEventsProcessed || 0) + events.length,\n });\n } catch {\n // RPC error — skip this poll cycle\n }\n }, 30_000);\n\n // Clean up on exit\n const cleanup = () => {\n clearInterval(pollInterval);\n xmtpCleanup?.();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep alive\n await new Promise(() => {});\n}\n\nasync function handleStatus(name?: string): Promise<void> {\n const sessions = getAllSessions();\n\n if (name) {\n const session = sessions[name];\n if (!session) {\n console.log(\n chalk.dim(`No session found for \"${name}\". Run \"sherwood session check ${name}\" first.`),\n );\n return;\n }\n console.log(JSON.stringify({ [name]: formatSessionStatus(session) }, null, 2));\n return;\n }\n\n // Show all sessions\n if (Object.keys(sessions).length === 0) {\n console.log(chalk.dim(\"No sessions found. Run \\\"sherwood session check <name>\\\" to start.\"));\n return;\n }\n\n const output: Record<string, ReturnType<typeof formatSessionStatus>> = {};\n for (const [subdomain, session] of Object.entries(sessions)) {\n output[subdomain] = formatSessionStatus(session);\n }\n console.log(JSON.stringify(output, null, 2));\n}\n\nfunction formatSessionStatus(session: {\n lastCheckAt: number;\n lastBlockNumber: number;\n totalMessagesProcessed: number;\n totalEventsProcessed: number;\n}) {\n return {\n lastCheckAt: session.lastCheckAt\n ? new Date(session.lastCheckAt * 1000).toISOString()\n : \"never\",\n lastBlockNumber: session.lastBlockNumber,\n totalMessagesProcessed: session.totalMessagesProcessed,\n totalEventsProcessed: session.totalEventsProcessed,\n };\n}\n\nasync function handleReset(\n name: string,\n sinceBlock?: string,\n full?: boolean,\n): Promise<void> {\n if (full || !sinceBlock) {\n resetSession(name);\n console.log(chalk.green(`Session for \"${name}\" has been reset.`));\n } else {\n const block = parseInt(sinceBlock, 10);\n if (isNaN(block)) {\n console.error(chalk.red(\"--since-block must be a number\"));\n process.exit(1);\n }\n resetSession(name, block);\n console.log(\n chalk.green(`Block cursor for \"${name}\" reset to ${block}.`),\n );\n }\n}\n\n// ── Command Registration ──\n\nexport function registerSessionCommands(program: Command): void {\n const session = program\n .command(\"session\")\n .description(\"Agent session — catch up on messages + on-chain events\");\n\n session\n .command(\"check <name>\")\n .description(\"Fetch new XMTP messages and on-chain events since last check\")\n .option(\"--stream\", \"Stay alive streaming messages and polling events\", false)\n .option(\n \"--no-xmtp\",\n \"Skip XMTP catch-up and streaming. Use when XMTP bindings are unavailable or when an external process owns XMTP (e.g. the sherwood-monitor Hermes plugin's bundled sidecar). Also honors SHERWOOD_SKIP_XMTP=1.\",\n false,\n )\n .action(\n async (name: string, opts: { stream: boolean; noXmtp: boolean }) => {\n const skipXmtp =\n opts.noXmtp || process.env.SHERWOOD_SKIP_XMTP === \"1\";\n await handleCheck(name, opts.stream, skipXmtp);\n },\n );\n\n session\n .command(\"status [name]\")\n .description(\"Show session cursor positions\")\n .action(async (name?: string) => {\n await handleStatus(name);\n });\n\n session\n .command(\"reset <name>\")\n .description(\"Reset session cursors\")\n .option(\"--since-block <n>\", \"Reset block cursor to a specific block\")\n .option(\"--full\", \"Reset everything (messages + events)\", false)\n .action(\n async (\n name: string,\n opts: { sinceBlock?: string; full: boolean },\n ) => {\n await handleReset(name, opts.sinceBlock, opts.full);\n },\n );\n\n session\n .command(\"cron <name>\")\n .description(\"Manage participation crons (OpenClaw agents)\")\n .option(\"--remove\", \"Remove participation crons\", false)\n .option(\"--status\", \"Show cron status\", false)\n .action(async (name: string, opts: { remove: boolean; status: boolean }) => {\n const { isOpenClaw, registerFundCrons, unregisterFundCrons, getFundCronStatus } =\n await import(\"../lib/cron.js\");\n const { isTestnet } = await import(\"../lib/network.js\");\n const { getNotifyTo } = await import(\"../lib/config.js\");\n\n if (!isOpenClaw()) {\n console.log(chalk.yellow(\"Not running on OpenClaw — cron commands unavailable\"));\n console.log(chalk.dim(` Set up your own scheduler: sherwood session check ${name} --stream`));\n return;\n }\n\n if (opts.status) {\n const status = getFundCronStatus(name, isTestnet());\n if (status.crons.length === 0) {\n console.log(chalk.dim(\"No participation crons found for \" + name));\n return;\n }\n console.log();\n console.log(chalk.bold(`Participation Crons — ${name}`));\n console.log(chalk.dim(\"─\".repeat(50)));\n for (const cron of status.crons) {\n console.log(` ${chalk.green(cron.name)} every ${cron.every}${cron.lastRun ? ` last: ${cron.lastRun}` : \"\"}`);\n }\n console.log();\n return;\n }\n\n if (opts.remove) {\n const result = unregisterFundCrons(name, isTestnet());\n if (result.removed) {\n console.log(chalk.green(\"Participation crons removed\"));\n } else {\n console.log(chalk.dim(\"No crons found to remove\"));\n }\n return;\n }\n\n // Register/update\n const result = registerFundCrons(name, isTestnet(), getNotifyTo());\n if (result.registered) {\n console.log(chalk.green(\"Participation crons registered: \" + result.cronNames.join(\", \")));\n } else {\n console.log(chalk.dim(\"Crons already registered\"));\n }\n });\n}\n"],"mappings":"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","names":["result"]}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getResearchProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-45FELUWY.js";
|
|
4
4
|
import "./chunk-EGJESQXZ.js";
|
|
5
5
|
import {
|
|
6
6
|
chatCompletion
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-KVB5P2OE.js";
|
|
8
8
|
import {
|
|
9
9
|
getQuote
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6DRNSZ2Z.js";
|
|
11
11
|
import {
|
|
12
12
|
TOKENS
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-DNRIKCJ5.js";
|
|
14
14
|
import {
|
|
15
15
|
formatContractError,
|
|
16
16
|
getAccount,
|
|
17
17
|
getPublicClient,
|
|
18
18
|
sendTxWithRetry,
|
|
19
19
|
waitForReceipt
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-QRMZRAMG.js";
|
|
21
21
|
import {
|
|
22
22
|
getChain,
|
|
23
23
|
getExplorerUrl,
|
|
24
24
|
getNetwork
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-PVTZMRC6.js";
|
|
26
26
|
import {
|
|
27
27
|
getUniswapApiKey,
|
|
28
28
|
loadConfig,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
} from "./chunk-3TZIOAPH.js";
|
|
31
31
|
import {
|
|
32
32
|
ERC20_ABI
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-F3MDCUGO.js";
|
|
34
34
|
|
|
35
35
|
// src/commands/trade.ts
|
|
36
36
|
import chalk from "chalk";
|
|
@@ -555,7 +555,7 @@ async function getCurrentPrice(tokenAddress, tokenDecimals, feeTier) {
|
|
|
555
555
|
// src/commands/trade.ts
|
|
556
556
|
var uniswap = new UniswapProvider();
|
|
557
557
|
async function loadXmtp() {
|
|
558
|
-
return import("./xmtp-
|
|
558
|
+
return import("./xmtp-S7IGTIMZ.js");
|
|
559
559
|
}
|
|
560
560
|
var ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
561
561
|
var KNOWN_MEMECOINS = {
|
|
@@ -752,7 +752,7 @@ function registerTradeCommands(program) {
|
|
|
752
752
|
}
|
|
753
753
|
const wrapSpinner = ora("Wrapping ETH \u2192 WETH...").start();
|
|
754
754
|
try {
|
|
755
|
-
const { writeContractWithRetry: writeContractWithRetry2, waitForReceipt: waitForReceiptFn } = await import("./client-
|
|
755
|
+
const { writeContractWithRetry: writeContractWithRetry2, waitForReceipt: waitForReceiptFn } = await import("./client-3SE632Q2.js");
|
|
756
756
|
const wethAddr = TOKENS().WETH;
|
|
757
757
|
const wrapHash = await writeContractWithRetry2({
|
|
758
758
|
address: wethAddr,
|
|
@@ -761,7 +761,7 @@ function registerTradeCommands(program) {
|
|
|
761
761
|
args: [],
|
|
762
762
|
value: inputAmount,
|
|
763
763
|
account,
|
|
764
|
-
chain: (await import("./network-
|
|
764
|
+
chain: (await import("./network-FEHRFDPJ.js")).getChain()
|
|
765
765
|
});
|
|
766
766
|
await waitForReceiptFn(wrapHash);
|
|
767
767
|
wrapSpinner.succeed(`Wrapped ${opts.amount} ETH \u2192 WETH`);
|
|
@@ -875,11 +875,11 @@ function registerTradeCommands(program) {
|
|
|
875
875
|
}
|
|
876
876
|
console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
|
|
877
877
|
try {
|
|
878
|
-
const { createTradeAttestation, getEasScanUrl } = await import("./eas-
|
|
878
|
+
const { createTradeAttestation, getEasScanUrl } = await import("./eas-QPKX6A5A.js");
|
|
879
879
|
const { getChainContracts } = await import("./config-ZGFS4I7K.js");
|
|
880
|
-
const { getChain: getActiveChain } = await import("./network-
|
|
880
|
+
const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
|
|
881
881
|
const vaultRecipient = getChainContracts(getActiveChain().id).vault;
|
|
882
|
-
const
|
|
882
|
+
const attestation = await createTradeAttestation(
|
|
883
883
|
inputAddr,
|
|
884
884
|
tokenAddr,
|
|
885
885
|
inputAmount,
|
|
@@ -888,8 +888,8 @@ function registerTradeCommands(program) {
|
|
|
888
888
|
"BUY",
|
|
889
889
|
vaultRecipient
|
|
890
890
|
);
|
|
891
|
-
if (
|
|
892
|
-
console.log(` Attested: ${chalk.dim(getEasScanUrl(uid))}`);
|
|
891
|
+
if (attestation) {
|
|
892
|
+
console.log(` Attested: ${chalk.dim(getEasScanUrl(attestation.uid))}`);
|
|
893
893
|
}
|
|
894
894
|
} catch {
|
|
895
895
|
}
|
|
@@ -1003,11 +1003,11 @@ function registerTradeCommands(program) {
|
|
|
1003
1003
|
}
|
|
1004
1004
|
console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
|
|
1005
1005
|
try {
|
|
1006
|
-
const { createTradeAttestation, getEasScanUrl } = await import("./eas-
|
|
1006
|
+
const { createTradeAttestation, getEasScanUrl } = await import("./eas-QPKX6A5A.js");
|
|
1007
1007
|
const { getChainContracts } = await import("./config-ZGFS4I7K.js");
|
|
1008
|
-
const { getChain: getActiveChain } = await import("./network-
|
|
1008
|
+
const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
|
|
1009
1009
|
const vaultRecipient = getChainContracts(getActiveChain().id).vault;
|
|
1010
|
-
const
|
|
1010
|
+
const attestation = await createTradeAttestation(
|
|
1011
1011
|
tokenAddr,
|
|
1012
1012
|
outputAddr,
|
|
1013
1013
|
sellAmount,
|
|
@@ -1016,8 +1016,8 @@ function registerTradeCommands(program) {
|
|
|
1016
1016
|
"SELL",
|
|
1017
1017
|
vaultRecipient
|
|
1018
1018
|
);
|
|
1019
|
-
if (
|
|
1020
|
-
console.log(` Attested: ${chalk.dim(getEasScanUrl(uid))}`);
|
|
1019
|
+
if (attestation) {
|
|
1020
|
+
console.log(` Attested: ${chalk.dim(getEasScanUrl(attestation.uid))}`);
|
|
1021
1021
|
}
|
|
1022
1022
|
} catch {
|
|
1023
1023
|
}
|
|
@@ -1180,4 +1180,4 @@ function sleep(ms) {
|
|
|
1180
1180
|
export {
|
|
1181
1181
|
registerTradeCommands
|
|
1182
1182
|
};
|
|
1183
|
-
//# sourceMappingURL=trade-
|
|
1183
|
+
//# sourceMappingURL=trade-YPLTIS56.js.map
|