@sherwoodagent/cli 0.84.0 → 0.85.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chat-UZ3BBEXV.js → chat-DNWTI4CZ.js} +5 -5
  2. package/dist/{chunk-56YYNNNQ.js → chunk-53W6CYYV.js} +2 -2
  3. package/dist/{chunk-JUVXLTL2.js → chunk-65G5BFYR.js} +2 -2
  4. package/dist/{chunk-BOC7VB5B.js → chunk-6N7EVSAZ.js} +2 -2
  5. package/dist/{chunk-DNRIKCJ5.js → chunk-AM6MI2JF.js} +6 -10
  6. package/dist/{chunk-DNRIKCJ5.js.map → chunk-AM6MI2JF.js.map} +1 -1
  7. package/dist/{chunk-6DRNSZ2Z.js → chunk-ARSQ5UQA.js} +2 -2
  8. package/dist/chunk-FPB23SDH.js +3103 -0
  9. package/dist/chunk-FPB23SDH.js.map +1 -0
  10. package/dist/{chunk-MQ55QOGD.js → chunk-I2BBOJNC.js} +2 -2
  11. package/dist/{chunk-NCFN66ZH.js → chunk-M4GX5PL2.js} +5 -3
  12. package/dist/chunk-M4GX5PL2.js.map +1 -0
  13. package/dist/{chunk-SNR5R5TO.js → chunk-TWT56FTL.js} +3 -3
  14. package/dist/{eas-QPKX6A5A.js → eas-D3BVHBJH.js} +5 -3
  15. package/dist/{governor-7QKGNHMR.js → governor-35IXAEDJ.js} +3 -3
  16. package/dist/identity-3A2D7DGS.js +15 -0
  17. package/dist/index.js +2553 -5400
  18. package/dist/index.js.map +1 -1
  19. package/dist/{price-SVF25X4O.js → price-I5T77X7Y.js} +3 -3
  20. package/dist/{research-YSNJ5HTM.js → research-GZNVG3SP.js} +3 -3
  21. package/dist/{session-RMAIFRS6.js → session-M5QB25PK.js} +8 -8
  22. package/dist/{trade-YPLTIS56.js → trade-TCQ5NUNA.js} +6 -6
  23. package/dist/{vault-UCFFOOTS.js → vault-K2R4VHVI.js} +5 -5
  24. package/dist/{xmtp-S7IGTIMZ.js → xmtp-R25Q5GWY.js} +3 -3
  25. package/package.json +1 -1
  26. package/dist/addresses-LFYVOPOH.js +0 -45
  27. package/dist/chunk-NCFN66ZH.js.map +0 -1
  28. /package/dist/{chat-UZ3BBEXV.js.map → chat-DNWTI4CZ.js.map} +0 -0
  29. /package/dist/{chunk-56YYNNNQ.js.map → chunk-53W6CYYV.js.map} +0 -0
  30. /package/dist/{chunk-JUVXLTL2.js.map → chunk-65G5BFYR.js.map} +0 -0
  31. /package/dist/{chunk-BOC7VB5B.js.map → chunk-6N7EVSAZ.js.map} +0 -0
  32. /package/dist/{chunk-6DRNSZ2Z.js.map → chunk-ARSQ5UQA.js.map} +0 -0
  33. /package/dist/{chunk-MQ55QOGD.js.map → chunk-I2BBOJNC.js.map} +0 -0
  34. /package/dist/{chunk-SNR5R5TO.js.map → chunk-TWT56FTL.js.map} +0 -0
  35. /package/dist/{addresses-LFYVOPOH.js.map → eas-D3BVHBJH.js.map} +0 -0
  36. /package/dist/{eas-QPKX6A5A.js.map → governor-35IXAEDJ.js.map} +0 -0
  37. /package/dist/{governor-7QKGNHMR.js.map → identity-3A2D7DGS.js.map} +0 -0
  38. /package/dist/{price-SVF25X4O.js.map → price-I5T77X7Y.js.map} +0 -0
  39. /package/dist/{research-YSNJ5HTM.js.map → research-GZNVG3SP.js.map} +0 -0
  40. /package/dist/{session-RMAIFRS6.js.map → session-M5QB25PK.js.map} +0 -0
  41. /package/dist/{trade-YPLTIS56.js.map → trade-TCQ5NUNA.js.map} +0 -0
  42. /package/dist/{vault-UCFFOOTS.js.map → vault-K2R4VHVI.js.map} +0 -0
  43. /package/dist/{xmtp-S7IGTIMZ.js.map → xmtp-R25Q5GWY.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  quote
3
- } from "./chunk-6DRNSZ2Z.js";
3
+ } from "./chunk-ARSQ5UQA.js";
4
4
  import {
5
5
  SYNTHRA
6
- } from "./chunk-DNRIKCJ5.js";
6
+ } from "./chunk-AM6MI2JF.js";
7
7
  import {
8
8
  getPublicClient
9
9
  } from "./chunk-QRMZRAMG.js";
@@ -133,4 +133,4 @@ export {
133
133
  getTokenPriceInAsset,
134
134
  getTokenPricesInAsset
135
135
  };
136
- //# sourceMappingURL=price-SVF25X4O.js.map
136
+ //# sourceMappingURL=price-I5T77X7Y.js.map
@@ -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-S7IGTIMZ.js");
19
+ return import("./xmtp-R25Q5GWY.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-QPKX6A5A.js");
86
+ const { createResearchAttestation, getEasScanUrl } = await import("./eas-D3BVHBJH.js");
87
87
  const xmtp = await loadXmtp();
88
88
  const pinSpinner = ora("Pinning research result to IPFS...").start();
89
89
  let resultUri;
@@ -315,4 +315,4 @@ function registerResearchCommands(program) {
315
315
  export {
316
316
  registerResearchCommands
317
317
  };
318
- //# sourceMappingURL=research-YSNJ5HTM.js.map
318
+ //# sourceMappingURL=research-GZNVG3SP.js.map
@@ -4,6 +4,9 @@ import {
4
4
  resetSession,
5
5
  updateSession
6
6
  } from "./chunk-5DWB5Y7G.js";
7
+ import {
8
+ resolveFund
9
+ } from "./chunk-I2BBOJNC.js";
7
10
  import {
8
11
  enrichProposalEvents,
9
12
  getCurrentBlock,
@@ -11,16 +14,13 @@ import {
11
14
  getGuardianRegistryEvents,
12
15
  getStakedWoodEvents,
13
16
  getVaultEvents
14
- } from "./chunk-JUVXLTL2.js";
15
- import {
16
- resolveFund
17
- } from "./chunk-MQ55QOGD.js";
17
+ } from "./chunk-65G5BFYR.js";
18
18
  import {
19
19
  getGovernorOf
20
- } from "./chunk-BOC7VB5B.js";
20
+ } from "./chunk-6N7EVSAZ.js";
21
21
  import {
22
22
  SHERWOOD
23
- } from "./chunk-DNRIKCJ5.js";
23
+ } from "./chunk-AM6MI2JF.js";
24
24
  import {
25
25
  getPublicClient
26
26
  } from "./chunk-QRMZRAMG.js";
@@ -36,7 +36,7 @@ import "./chunk-VR4VHX4D.js";
36
36
  // src/commands/session.ts
37
37
  import chalk from "chalk";
38
38
  async function loadXmtp() {
39
- return import("./xmtp-S7IGTIMZ.js");
39
+ return import("./xmtp-R25Q5GWY.js");
40
40
  }
41
41
  async function resolveGovernor(vaultAddress) {
42
42
  const client = getPublicClient();
@@ -353,4 +353,4 @@ function registerSessionCommands(program) {
353
353
  export {
354
354
  registerSessionCommands
355
355
  };
356
- //# sourceMappingURL=session-RMAIFRS6.js.map
356
+ //# sourceMappingURL=session-M5QB25PK.js.map
@@ -7,10 +7,10 @@ import {
7
7
  } from "./chunk-KVB5P2OE.js";
8
8
  import {
9
9
  getQuote
10
- } from "./chunk-6DRNSZ2Z.js";
10
+ } from "./chunk-ARSQ5UQA.js";
11
11
  import {
12
12
  TOKENS
13
- } from "./chunk-DNRIKCJ5.js";
13
+ } from "./chunk-AM6MI2JF.js";
14
14
  import {
15
15
  formatContractError,
16
16
  getAccount,
@@ -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-S7IGTIMZ.js");
558
+ return import("./xmtp-R25Q5GWY.js");
559
559
  }
560
560
  var ETH_ADDRESS = "0x0000000000000000000000000000000000000000";
561
561
  var KNOWN_MEMECOINS = {
@@ -875,7 +875,7 @@ function registerTradeCommands(program) {
875
875
  }
876
876
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
877
877
  try {
878
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-QPKX6A5A.js");
878
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-D3BVHBJH.js");
879
879
  const { getChainContracts } = await import("./config-ZGFS4I7K.js");
880
880
  const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
881
881
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
@@ -1003,7 +1003,7 @@ function registerTradeCommands(program) {
1003
1003
  }
1004
1004
  console.log(` Tx: ${chalk.dim(getExplorerUrl(txHash))}`);
1005
1005
  try {
1006
- const { createTradeAttestation, getEasScanUrl } = await import("./eas-QPKX6A5A.js");
1006
+ const { createTradeAttestation, getEasScanUrl } = await import("./eas-D3BVHBJH.js");
1007
1007
  const { getChainContracts } = await import("./config-ZGFS4I7K.js");
1008
1008
  const { getChain: getActiveChain } = await import("./network-FEHRFDPJ.js");
1009
1009
  const vaultRecipient = getChainContracts(getActiveChain().id).vault;
@@ -1180,4 +1180,4 @@ function sleep(ms) {
1180
1180
  export {
1181
1181
  registerTradeCommands
1182
1182
  };
1183
- //# sourceMappingURL=trade-YPLTIS56.js.map
1183
+ //# sourceMappingURL=trade-TCQ5NUNA.js.map
@@ -22,10 +22,10 @@ import {
22
22
  removeDepositor,
23
23
  setAgentFeeBps,
24
24
  setVaultAddress
25
- } from "./chunk-SNR5R5TO.js";
26
- import "./chunk-JUVXLTL2.js";
27
- import "./chunk-BOC7VB5B.js";
28
- import "./chunk-DNRIKCJ5.js";
25
+ } from "./chunk-TWT56FTL.js";
26
+ import "./chunk-65G5BFYR.js";
27
+ import "./chunk-6N7EVSAZ.js";
28
+ import "./chunk-AM6MI2JF.js";
29
29
  import "./chunk-QRMZRAMG.js";
30
30
  import "./chunk-PVTZMRC6.js";
31
31
  import "./chunk-3TZIOAPH.js";
@@ -56,4 +56,4 @@ export {
56
56
  setAgentFeeBps,
57
57
  setVaultAddress
58
58
  };
59
- //# sourceMappingURL=vault-UCFFOOTS.js.map
59
+ //# sourceMappingURL=vault-K2R4VHVI.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getTextRecord
3
- } from "./chunk-MQ55QOGD.js";
4
- import "./chunk-DNRIKCJ5.js";
3
+ } from "./chunk-I2BBOJNC.js";
4
+ import "./chunk-AM6MI2JF.js";
5
5
  import {
6
6
  getAccount
7
7
  } from "./chunk-QRMZRAMG.js";
@@ -315,4 +315,4 @@ export {
315
315
  sendReaction,
316
316
  streamMessages
317
317
  };
318
- //# sourceMappingURL=xmtp-S7IGTIMZ.js.map
318
+ //# sourceMappingURL=xmtp-R25Q5GWY.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sherwoodagent/cli",
3
- "version": "0.84.0",
3
+ "version": "0.85.1",
4
4
  "description": "CLI for agent-managed investment funds \u2014 onchain DeFi funds with XMTP chat",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,45 +0,0 @@
1
- import {
2
- AERODROME,
3
- AGENT_REGISTRY,
4
- CHAINLINK,
5
- EAS_CONTRACTS,
6
- EAS_SCHEMAS,
7
- ENS,
8
- INFRA,
9
- MOONWELL,
10
- ROBINHOOD_NON_EQUITY_FEEDS,
11
- ROBINHOOD_STOCK_ROUTES,
12
- SHERWOOD,
13
- STRATEGY_TEMPLATES,
14
- SYNTHRA,
15
- TOKENS,
16
- UNISWAP,
17
- VENICE,
18
- isRobinhoodEquityFeed,
19
- robinhoodEquityMaxAge,
20
- symbolForTokenAddress
21
- } from "./chunk-DNRIKCJ5.js";
22
- import "./chunk-PVTZMRC6.js";
23
- import "./chunk-3TZIOAPH.js";
24
- export {
25
- AERODROME,
26
- AGENT_REGISTRY,
27
- CHAINLINK,
28
- EAS_CONTRACTS,
29
- EAS_SCHEMAS,
30
- ENS,
31
- INFRA,
32
- MOONWELL,
33
- ROBINHOOD_NON_EQUITY_FEEDS,
34
- ROBINHOOD_STOCK_ROUTES,
35
- SHERWOOD,
36
- STRATEGY_TEMPLATES,
37
- SYNTHRA,
38
- TOKENS,
39
- UNISWAP,
40
- VENICE,
41
- isRobinhoodEquityFeed,
42
- robinhoodEquityMaxAge,
43
- symbolForTokenAddress
44
- };
45
- //# sourceMappingURL=addresses-LFYVOPOH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/eas.ts"],"sourcesContent":["/**\n * EAS (Ethereum Attestation Service) wrapper for fund join requests and approvals.\n *\n * Uses viem for on-chain writes and the EAS GraphQL API for queries.\n * No ethers dependency — attestation data is encoded with viem's encodeAbiParameters.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from \"viem\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt } from \"./client.js\";\nimport { getChain, getNetwork, getChainConfig, withNetwork, isTestnet, CHAIN_REGISTRY, type Network } from \"./network.js\";\nimport { EAS_CONTRACTS, EAS_SCHEMAS } from \"./addresses.js\";\nimport { EAS_ABI } from \"./abis.js\";\n\n// ── Schema definitions ──\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex;\n\n// keccak256(\"Attested(address,address,bytes32,bytes32)\")\nconst ATTESTED_TOPIC = \"0x8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35\" as Hex;\n\nconst JOIN_REQUEST_PARAMS = parseAbiParameters(\"uint256, uint256, address, string\");\nconst AGENT_APPROVED_PARAMS = parseAbiParameters(\"uint256, uint256, address\");\nconst X402_RESEARCH_PARAMS = parseAbiParameters(\"string, string, string, string, string\");\nconst VENICE_PROVISION_PARAMS = parseAbiParameters(\"address, string\");\nconst VENICE_INFERENCE_PARAMS = parseAbiParameters(\"string, uint256, uint256, string\");\nconst TRADE_EXECUTED_PARAMS = parseAbiParameters(\"address, address, uint256, string, string, string\");\n\nfunction assertSchemasRegistered() {\n const schemas = EAS_SCHEMAS();\n if (schemas.SYNDICATE_JOIN_REQUEST === ZERO_BYTES32 || schemas.AGENT_APPROVED === ZERO_BYTES32) {\n const flag = isTestnet() ? \" --testnet\" : \"\";\n throw new Error(\n `EAS schemas not registered on ${getNetwork()}. Run: cd cli && npx tsx scripts/register-eas-schemas.ts${flag}`,\n );\n }\n}\n\n/**\n * The chain where fund-coordination attestations live. EAS is not deployed\n * on EITHER Robinhood chain (both registry entries carry `easGraphqlUrl: null`\n * and ZERO contracts), so the default flip to robinhood-fork changes nothing\n * here — this returns the active network — downstream `getEasGraphqlUrl` / `EAS_CONTRACTS()` then fail\n * with a clear \"EAS not available\" error. When an EAS-bearing chain is added\n * back, route coordination attestations to it here.\n */\nexport function getEasNetwork(): Network {\n return EAS_NETWORK;\n}\n\n/**\n * Attestations are written and read on ONE chain regardless of which chain the\n * fund lives on — a join request for a 46630 fund is recorded on 4663.\n */\nexport const EAS_NETWORK: Network = \"robinhood-mainnet\";\n\n/**\n * Attestation WRITES are a no-op on the Tenderly fork.\n *\n * The fork is ephemeral and is the default network, so routing its writes to\n * mainnet would burn real ETH recording vnet activity into a permanent public\n * record. Reads are unaffected — a fork session still displays 4663\n * attestations. See spec §10.3.\n */\nexport function attestationWritesEnabled(): boolean {\n return getNetwork() !== \"robinhood-fork\";\n}\n\n/** Thrown-free guard used by every write path; returns true when it skipped. */\nfunction skipWriteOnFork(kind: string): boolean {\n if (attestationWritesEnabled()) return false;\n console.log(\n ` ${kind} attestation skipped: writes are disabled on robinhood-fork ` +\n `(ephemeral chain; attestations live on Robinhood mainnet).`,\n );\n return true;\n}\n\n/**\n * Fails before an attestation write when the signer cannot pay for it on the\n * EAS chain. Attestations cost real mainnet ETH even when the fund is on a\n * testnet, which is surprising enough that a bare out-of-gas revert would be\n * the worst possible way to discover it.\n */\nexport async function assertCanPayForAttestation(): Promise<void> {\n await withNetwork(EAS_NETWORK, async () => {\n const account = getAccount();\n const balance = await getPublicClient().getBalance({ address: account.address });\n if (balance === 0n) {\n throw new Error(\n `No ETH on Robinhood mainnet (chain 4663) for ${account.address}.\\n` +\n `Attestations are recorded on Robinhood mainnet regardless of which ` +\n `chain your fund is on, so this wallet needs a small mainnet balance ` +\n `(a single attestation costs well under 0.0001 ETH).`,\n );\n }\n });\n}\n\n// ── GraphQL ──\n\nfunction getEasGraphqlUrl(): string {\n const url = getChainConfig().easGraphqlUrl;\n if (!url) {\n throw new Error(\n `EAS is not available on ${getNetwork()}. Attestation operations require a chain with EAS (e.g. base, base-sepolia).`,\n );\n }\n return url;\n}\n\nexport function getEasScanUrl(uid: Hex): string {\n // Always use the EAS chain's scan host — attestations live on Base, even\n // for HyperEVM funds. Read the registry directly rather than mutating\n // the singleton, since this is a pure URL build.\n const host = CHAIN_REGISTRY[getEasNetwork()].easScanHost;\n if (!host) {\n throw new Error(`EAS scan host is not configured on ${getEasNetwork()}.`);\n }\n return `https://${host}/attestation/view/${uid}`;\n}\n\n/**\n * The block-explorer URL for a tx that ran on the EAS chain. Use this for\n * attestation create/revoke txs so the link points to base(-sepolia) scan\n * even when the active --chain is HyperEVM / Robinhood.\n */\nexport function getEasExplorerUrl(txHash: string): string {\n const host = CHAIN_REGISTRY[getEasNetwork()].explorerHost;\n return `https://${host}/tx/${txHash}`;\n}\n\n// ── Attestation Creation ──\n\n/**\n * Extract the attestation UID from a transaction receipt.\n * The EAS contract emits: event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)\n * uid is a non-indexed parameter in the event data.\n */\nfunction extractAttestationUid(receipt: { logs: readonly { topics: readonly Hex[]; data: Hex }[] }): Hex {\n for (const log of receipt.logs) {\n // Match the Attested event signature to avoid false positives from other events\n if (log.topics[0] !== ATTESTED_TOPIC) continue;\n // Attested event has 4 topics (sig + 3 indexed) and data contains the uid (bytes32)\n if (log.topics.length === 4 && log.data.length >= 66) {\n return (\"0x\" + log.data.slice(2, 66)) as Hex;\n }\n }\n throw new Error(\"Could not extract attestation UID from transaction receipt\");\n}\n\n// ── Message Prefix Helpers ──\n//\n// Join-request messages can carry CLI metadata as bracketed prefixes. Order\n// is `[chain:<network>] [ref:<id>] body` — chain outer because the chain\n// disambiguates the fund, ref inner because it's optional and per-user.\n// Both prefixes are stripped before display.\n\nconst CHAIN_PREFIX_RE = /^\\[chain:([a-z0-9-]+)\\]\\s*/;\n// Tolerate an optional leading [chain:...] prefix so parseReferrer keeps\n// working when both metadata fields are encoded.\nconst REF_PREFIX_RE = /^(?:\\[chain:[a-z0-9-]+\\]\\s*)?\\[ref:(\\d+)\\]\\s*/;\n\n/**\n * Format a message with an optional referrer prefix.\n * e.g. formatMessageWithRef(\"Hello\", 42) → \"[ref:42] Hello\"\n */\nexport function formatMessageWithRef(message: string, referrerAgentId?: number): string {\n if (referrerAgentId == null) return message;\n return `[ref:${referrerAgentId}] ${message}`;\n}\n\n/**\n * Parse a referrer agentId from a message, if present.\n * e.g. parseReferrer(\"[ref:42] Hello\") → 42\n * parseReferrer(\"[chain:hyperevm] [ref:42] Hello\") → 42\n */\nexport function parseReferrer(message: string): number | null {\n const match = message.match(REF_PREFIX_RE);\n return match ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Format a message with a `[chain:<network>]` prefix when the fund\n * lives on a chain other than the EAS chain (Base / Base-Sepolia). Skipped\n * when source matches the EAS chain to avoid noise on the common case.\n */\nexport function formatMessageWithChain(\n message: string,\n sourceNetwork: Network,\n easNetwork: Network,\n): string {\n if (sourceNetwork === easNetwork) return message;\n return `[chain:${sourceNetwork}] ${message}`;\n}\n\n/**\n * Parse the source-chain prefix from a message, if present.\n * Returns null when no `[chain:<network>]` prefix is found, which means the\n * attestation was created from the EAS chain itself (e.g. base attestation\n * for a base fund).\n */\nexport function parseChain(message: string): string | null {\n const match = message.match(CHAIN_PREFIX_RE);\n return match ? match[1] : null;\n}\n\n/**\n * Strip both `[chain:...]` and `[ref:...]` prefixes from a message,\n * returning the clean human-facing body. Name kept for backward compat.\n */\nexport function stripReferrerPrefix(message: string): string {\n // REF_PREFIX_RE already swallows an optional leading chain prefix when ref\n // is present; the second replace handles a chain prefix without ref.\n return message.replace(REF_PREFIX_RE, \"\").replace(CHAIN_PREFIX_RE, \"\");\n}\n\n/**\n * Create a SYNDICATE_JOIN_REQUEST attestation.\n * Attester: the calling agent. Recipient: the fund creator.\n * If referrerAgentId is provided, it's embedded in the message as a [ref:N] prefix.\n */\nexport async function createJoinRequest(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n creatorAddress: Address,\n message: string,\n referrerAgentId?: number,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"join request\")) return null;\n // Capture the fund's source chain BEFORE switching to the EAS chain\n // so we can encode it in the message prefix.\n const sourceNetwork = getNetwork();\n const easNetwork = getEasNetwork();\n const messageWithRef = formatMessageWithRef(message, referrerAgentId);\n const encodedMessage = formatMessageWithChain(messageWithRef, sourceNetwork, easNetwork);\n\n return withNetwork(easNetwork, async () => {\n assertSchemasRegistered();\n\n const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [\n syndicateId, agentId, vault, encodedMessage,\n ]);\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n data: {\n recipient: creatorAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n });\n}\n\n/**\n * Create an AGENT_APPROVED attestation.\n * Attester: the fund creator. Recipient: the agent wallet.\n */\nexport async function createApproval(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n agentAddress: Address,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"approval\")) return null;\n return withNetwork(getEasNetwork(), async () => {\n assertSchemasRegistered();\n\n const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [\n syndicateId, agentId, vault,\n ]);\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().AGENT_APPROVED,\n data: {\n recipient: agentAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n });\n}\n\n/**\n * Revoke an attestation. Only the original attester can revoke. Uses the\n * active chain's EAS — call sites that revoke fund-coordination\n * attestations (join requests, approvals) should go through\n * `revokeJoinRequest` / `revokeApproval` so the revoke lands on the same\n * chain as the original attestation (Base / Base-Sepolia).\n */\nexport async function revokeAttestation(\n schemaUid: Hex,\n attestationUid: Hex,\n): Promise<Hex> {\n return writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"revoke\",\n args: [{\n schema: schemaUid,\n data: {\n uid: attestationUid,\n value: 0n,\n },\n }],\n value: 0n,\n });\n}\n\n/** Revoke a SYNDICATE_JOIN_REQUEST on the EAS chain (Base / Base-Sepolia). */\nexport async function revokeJoinRequest(attestationUid: Hex): Promise<Hex | null> {\n if (skipWriteOnFork(\"revoke\")) return null;\n return withNetwork(getEasNetwork(), () =>\n revokeAttestation(EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST, attestationUid),\n );\n}\n\n/**\n * Create an X402_RESEARCH attestation — records a research query on-chain.\n * Attester: the agent. Recipient: vault address (links to fund) or agent itself.\n * Schema: \"string provider, string queryType, string prompt, string costUsdc, string resultUri\"\n */\nexport async function createResearchAttestation(\n provider: string,\n queryType: string,\n prompt: string,\n costUsdc: string,\n resultUri: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"research\")) return null;\n const schemas = EAS_SCHEMAS();\n if (schemas.X402_RESEARCH === ZERO_BYTES32) {\n throw new Error(\n \"X402_RESEARCH schema not registered. Run: npx tsx scripts/register-eas-schemas.ts --testnet\",\n );\n }\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(X402_RESEARCH_PARAMS, [\n provider, queryType, prompt, costUsdc, resultUri,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.X402_RESEARCH,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Create a VENICE_PROVISION attestation — records that an agent provisioned a Venice API key.\n * Schema: \"address agent, string status\"\n */\nexport async function createVeniceProvisionAttestation(\n agent: Address,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"venice provision\")) return null;\n const schemas = EAS_SCHEMAS();\n if (schemas.VENICE_PROVISION === ZERO_BYTES32) return skipAttestation(\"VENICE_PROVISION\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(VENICE_PROVISION_PARAMS, [agent, \"provisioned\"]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.VENICE_PROVISION,\n data: {\n recipient: agent,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/**\n * Create a VENICE_INFERENCE attestation — records an inference call.\n * Attester: the agent. Recipient: vault address (links to fund) or agent itself.\n * Schema: \"string model, uint256 promptTokens, uint256 completionTokens, string promptHash\"\n */\nexport async function createVeniceInferenceAttestation(\n model: string,\n promptTokens: number,\n completionTokens: number,\n promptHash: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"venice inference\")) return null;\n const schemas = EAS_SCHEMAS();\n if (schemas.VENICE_INFERENCE === ZERO_BYTES32) return skipAttestation(\"VENICE_INFERENCE\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(VENICE_INFERENCE_PARAMS, [\n model,\n BigInt(promptTokens),\n BigInt(completionTokens),\n promptHash,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.VENICE_INFERENCE,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/**\n * Create a TRADE_EXECUTED attestation — records a swap on-chain.\n * Attester: the agent. Recipient: vault address (links to fund) or agent itself.\n * Schema: \"address tokenIn, address tokenOut, uint256 amountIn, string amountOut, string txHash, string routing\"\n */\nexport async function createTradeAttestation(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: bigint,\n amountOut: string,\n txHash: string,\n routing: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex } | null> {\n if (skipWriteOnFork(\"trade\")) return null;\n const schemas = EAS_SCHEMAS();\n if (schemas.TRADE_EXECUTED === ZERO_BYTES32) return skipAttestation(\"TRADE_EXECUTED\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(TRADE_EXECUTED_PARAMS, [\n tokenIn, tokenOut, amountIn, amountOut, txHash, routing,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.TRADE_EXECUTED,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/** Skip attestation gracefully when schema isn't registered on this chain. */\nfunction skipAttestation(name: string): { uid: Hex; hash: Hex } {\n return { uid: ZERO_BYTES32, hash: ZERO_BYTES32 };\n}\n\n// ── Attestation Queries ──\n\nexport interface JoinRequestAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n message: string;\n };\n}\n\n/**\n * Query pending (non-revoked) join requests for a given recipient (creator address).\n * Uses the EAS GraphQL API.\n */\nexport interface ApprovalAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n };\n}\n\n/**\n * Query existing (non-revoked) AGENT_APPROVED attestations created by a given attester (creator).\n * Used to check for duplicates before creating a new approval and to filter already-approved agents from requests.\n */\nexport async function queryApprovals(\n attester: Address,\n): Promise<ApprovalAttestation[]> {\n return withNetwork(getEasNetwork(), () => queryApprovalsImpl(attester));\n}\n\nasync function queryApprovalsImpl(attester: Address): Promise<ApprovalAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().AGENT_APPROVED;\n const url = getEasGraphqlUrl();\n\n const query = `\n query Approvals($schemaId: String!, $attester: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n attester: { equals: $attester }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, attester },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(AGENT_APPROVED_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n },\n };\n });\n}\n\nexport async function queryJoinRequests(\n recipient: Address,\n): Promise<JoinRequestAttestation[]> {\n return withNetwork(getEasNetwork(), () => queryJoinRequestsImpl(recipient));\n}\n\nasync function queryJoinRequestsImpl(recipient: Address): Promise<JoinRequestAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST;\n const url = getEasGraphqlUrl();\n\n const query = `\n query JoinRequests($schemaId: String!, $recipient: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n recipient: { equals: $recipient }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, recipient },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(JOIN_REQUEST_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n message: decoded[3],\n },\n };\n });\n}\n"],"mappings":"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","names":[]}