@sherwoodagent/cli 0.22.7 → 0.24.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/{chat-JYAJMP4D.js → chat-3SAX4VRO.js} +7 -7
- package/dist/{chunk-LVPBJ7MI.js → chunk-35536GNW.js} +2 -2
- package/dist/{chunk-4Y6Y4SVH.js → chunk-5NN424VN.js} +4 -4
- package/dist/{chunk-B42ZCCZ7.js → chunk-5S2TBADL.js} +4 -2
- package/dist/chunk-5S2TBADL.js.map +1 -0
- package/dist/{chunk-VO6DCRWV.js → chunk-LMDHM36X.js} +4 -4
- package/dist/{chunk-QGZUMIVO.js → chunk-NGET2RWT.js} +16 -7
- package/dist/chunk-NGET2RWT.js.map +1 -0
- package/dist/{chunk-Y7LS6DEF.js → chunk-PEJPTKLK.js} +5 -5
- package/dist/{chunk-JR5K5WVR.js → chunk-R75DM3VL.js} +163 -10
- package/dist/chunk-R75DM3VL.js.map +1 -0
- package/dist/{chunk-ASJTFFZH.js → chunk-R7Q2L6VV.js} +3 -3
- package/dist/{chunk-G7JQRLQE.js → chunk-ZIH3SCFJ.js} +5 -5
- package/dist/{client-SCIY6SUP.js → client-XG6LL6TS.js} +4 -4
- package/dist/{config-BGS5MX4D.js → config-EHCEKT2B.js} +2 -2
- package/dist/{eas-X5UIEM6D.js → eas-ZMTIOZH6.js} +6 -6
- package/dist/{governor-ZKRSAHG4.js → governor-JIXAG6WU.js} +6 -6
- package/dist/index.js +609 -74
- package/dist/index.js.map +1 -1
- package/dist/{network-UTSOP7EF.js → network-UVMYTKQX.js} +3 -3
- package/dist/price-AGCWXLZ6.js +156 -0
- package/dist/price-AGCWXLZ6.js.map +1 -0
- package/dist/research-2I6AA3BI.js +14 -0
- package/dist/{research-ZW6XVTGZ.js → research-KUIZM6AK.js} +9 -9
- package/dist/{session-XZNKLK3I.js → session-2FIR4LJP.js} +12 -12
- package/dist/{trade-OJM5HNHL.js → trade-UTM3DSO3.js} +16 -16
- package/dist/{xmtp-XKHXATPQ.js → xmtp-B2XFVPIV.js} +6 -6
- package/package.json +1 -1
- package/dist/chunk-B42ZCCZ7.js.map +0 -1
- package/dist/chunk-JR5K5WVR.js.map +0 -1
- package/dist/chunk-QGZUMIVO.js.map +0 -1
- package/dist/research-SJ6D3L2B.js +0 -14
- /package/dist/{chat-JYAJMP4D.js.map → chat-3SAX4VRO.js.map} +0 -0
- /package/dist/{chunk-LVPBJ7MI.js.map → chunk-35536GNW.js.map} +0 -0
- /package/dist/{chunk-4Y6Y4SVH.js.map → chunk-5NN424VN.js.map} +0 -0
- /package/dist/{chunk-VO6DCRWV.js.map → chunk-LMDHM36X.js.map} +0 -0
- /package/dist/{chunk-Y7LS6DEF.js.map → chunk-PEJPTKLK.js.map} +0 -0
- /package/dist/{chunk-ASJTFFZH.js.map → chunk-R7Q2L6VV.js.map} +0 -0
- /package/dist/{chunk-G7JQRLQE.js.map → chunk-ZIH3SCFJ.js.map} +0 -0
- /package/dist/{client-SCIY6SUP.js.map → client-XG6LL6TS.js.map} +0 -0
- /package/dist/{config-BGS5MX4D.js.map → config-EHCEKT2B.js.map} +0 -0
- /package/dist/{eas-X5UIEM6D.js.map → eas-ZMTIOZH6.js.map} +0 -0
- /package/dist/{governor-ZKRSAHG4.js.map → governor-JIXAG6WU.js.map} +0 -0
- /package/dist/{network-UTSOP7EF.js.map → network-UVMYTKQX.js.map} +0 -0
- /package/dist/{research-SJ6D3L2B.js.map → research-2I6AA3BI.js.map} +0 -0
- /package/dist/{research-ZW6XVTGZ.js.map → research-KUIZM6AK.js.map} +0 -0
- /package/dist/{session-XZNKLK3I.js.map → session-2FIR4LJP.js.map} +0 -0
- /package/dist/{trade-OJM5HNHL.js.map → trade-UTM3DSO3.js.map} +0 -0
- /package/dist/{xmtp-XKHXATPQ.js.map → xmtp-B2XFVPIV.js.map} +0 -0
|
@@ -2,23 +2,23 @@ import {
|
|
|
2
2
|
getTextRecord,
|
|
3
3
|
resolveSyndicate,
|
|
4
4
|
setTextRecord
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-ZIH3SCFJ.js";
|
|
6
|
+
import "./chunk-R75DM3VL.js";
|
|
7
7
|
import {
|
|
8
8
|
formatContractError,
|
|
9
9
|
getAccount
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-R7Q2L6VV.js";
|
|
11
|
+
import "./chunk-35536GNW.js";
|
|
12
12
|
import {
|
|
13
13
|
cacheGroupId,
|
|
14
14
|
getCachedGroupId
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-5S2TBADL.js";
|
|
16
16
|
|
|
17
17
|
// src/commands/chat.ts
|
|
18
18
|
import chalk from "chalk";
|
|
19
19
|
import ora from "ora";
|
|
20
20
|
async function loadXmtp() {
|
|
21
|
-
return import("./xmtp-
|
|
21
|
+
return import("./xmtp-B2XFVPIV.js");
|
|
22
22
|
}
|
|
23
23
|
function formatTimestamp(date) {
|
|
24
24
|
return `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`;
|
|
@@ -378,4 +378,4 @@ function registerChatCommands(program) {
|
|
|
378
378
|
export {
|
|
379
379
|
registerChatCommands
|
|
380
380
|
};
|
|
381
|
-
//# sourceMappingURL=chat-
|
|
381
|
+
//# sourceMappingURL=chat-3SAX4VRO.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getConfigRpcUrl
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-5S2TBADL.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/network.ts
|
|
6
6
|
import { defineChain } from "viem";
|
|
@@ -104,4 +104,4 @@ export {
|
|
|
104
104
|
getExplorerUrl,
|
|
105
105
|
isTestnet
|
|
106
106
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-35536GNW.js.map
|
|
@@ -2,18 +2,18 @@ import {
|
|
|
2
2
|
EAS_ABI,
|
|
3
3
|
EAS_CONTRACTS,
|
|
4
4
|
EAS_SCHEMAS
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-R75DM3VL.js";
|
|
6
6
|
import {
|
|
7
7
|
getAccount,
|
|
8
8
|
getPublicClient,
|
|
9
9
|
waitForReceipt,
|
|
10
10
|
writeContractWithRetry
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-R7Q2L6VV.js";
|
|
12
12
|
import {
|
|
13
13
|
getChain,
|
|
14
14
|
getChainConfig,
|
|
15
15
|
getNetwork
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-35536GNW.js";
|
|
17
17
|
|
|
18
18
|
// src/lib/eas.ts
|
|
19
19
|
import { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from "viem";
|
|
@@ -409,4 +409,4 @@ export {
|
|
|
409
409
|
queryApprovals,
|
|
410
410
|
queryJoinRequests
|
|
411
411
|
};
|
|
412
|
-
//# sourceMappingURL=chunk-
|
|
412
|
+
//# sourceMappingURL=chunk-5NN424VN.js.map
|
|
@@ -6,7 +6,9 @@ var CONFIG_DIR = path.join(os.homedir(), ".sherwood");
|
|
|
6
6
|
var CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
|
|
7
7
|
function loadConfig() {
|
|
8
8
|
if (fs.existsSync(CONFIG_PATH)) {
|
|
9
|
-
|
|
9
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
|
|
10
|
+
if (!config.groupCache) config.groupCache = {};
|
|
11
|
+
return config;
|
|
10
12
|
}
|
|
11
13
|
return { groupCache: {} };
|
|
12
14
|
}
|
|
@@ -157,4 +159,4 @@ export {
|
|
|
157
159
|
setPrimarySyndicate,
|
|
158
160
|
getPrimarySyndicate
|
|
159
161
|
};
|
|
160
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-5S2TBADL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts"],"sourcesContent":["/**\n * Local config management — ~/.sherwood/config.json\n *\n * Stores group ID cache, per-chain contract addresses, and wallet config.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst CONFIG_DIR = path.join(os.homedir(), \".sherwood\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\n/** Per-chain user-specific addresses (stored by chainId). */\nexport interface ChainContracts {\n vault?: string; // user's default vault address\n}\n\n/** A syndicate the agent belongs to (creator or member). */\nexport interface SyndicateMembership {\n subdomain: string;\n vault: string;\n role: \"creator\" | \"agent\";\n}\n\nexport interface SherwoodConfig {\n dbEncryptionKey?: string; // legacy — no longer used, XMTP CLI manages its own DB\n privateKey?: string; // wallet private key (0x-prefixed)\n xmtpInboxId?: string;\n groupCache: Record<string, string>; // subdomain → XMTP group ID\n veniceApiKey?: string; // Venice AI inference API key\n agentId?: number; // ERC-8004 identity token ID\n contracts?: Record<string, ChainContracts>; // chainId → user addresses\n syndicates?: Record<string, SyndicateMembership[]>; // chainId → syndicate memberships\n primarySyndicate?: Record<string, string>; // chainId → subdomain of the active syndicate\n rpc?: Record<string, string>; // network name → custom RPC URL\n notifyTo?: string; // destination for cron summaries (Telegram chat ID, phone, etc.)\n uniswapApiKey?: string; // Uniswap Trading API key (from developers.uniswap.org)\n positions?: unknown[]; // open trade positions (typed in positions.ts)\n closedPositions?: unknown[]; // historical closed positions\n _xmtpMigrated?: boolean; // one-time flag: revoked stale installations from ~/.xmtp/ era\n}\n\nexport function loadConfig(): SherwoodConfig {\n if (fs.existsSync(CONFIG_PATH)) {\n const config = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n if (!config.groupCache) config.groupCache = {};\n return config;\n }\n\n return { groupCache: {} };\n}\n\nexport function saveConfig(config: SherwoodConfig): void {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport function cacheGroupId(subdomain: string, groupId: string): void {\n const config = loadConfig();\n config.groupCache[subdomain] = groupId;\n saveConfig(config);\n}\n\nexport function getCachedGroupId(subdomain: string): string | undefined {\n const config = loadConfig();\n return config.groupCache[subdomain];\n}\n\nexport function setVeniceApiKey(apiKey: string): void {\n const config = loadConfig();\n config.veniceApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getVeniceApiKey(): string | undefined {\n return loadConfig().veniceApiKey ?? process.env.VENICE_API_KEY;\n}\n\nexport function setAgentId(agentId: number): void {\n const config = loadConfig();\n config.agentId = agentId;\n saveConfig(config);\n}\n\nexport function getAgentId(): number | undefined {\n return loadConfig().agentId;\n}\n\nexport function setPrivateKey(key: string): void {\n const config = loadConfig();\n config.privateKey = key.startsWith(\"0x\") ? key : `0x${key}`;\n saveConfig(config);\n}\n\nexport function getPrivateKey(): string | undefined {\n return loadConfig().privateKey;\n}\n\n// ── Uniswap Trading API Key ──\n\nexport function setUniswapApiKey(apiKey: string): void {\n const config = loadConfig();\n config.uniswapApiKey = apiKey;\n saveConfig(config);\n}\n\nexport function getUniswapApiKey(): string | undefined {\n return loadConfig().uniswapApiKey ?? process.env.UNISWAP_API_KEY;\n}\n\n// ── Per-network RPC URLs ──\n\nexport function getConfigRpcUrl(network: string): string | undefined {\n return loadConfig().rpc?.[network];\n}\n\nexport function setConfigRpcUrl(network: string, url: string): void {\n const config = loadConfig();\n if (!config.rpc) config.rpc = {};\n config.rpc[network] = url;\n saveConfig(config);\n}\n\n// ── Per-chain contract addresses ──\n\nexport function getChainContracts(chainId: number): ChainContracts {\n const config = loadConfig();\n return config.contracts?.[String(chainId)] ?? {};\n}\n\nexport function getNotifyTo(): string | undefined {\n return loadConfig().notifyTo;\n}\n\nexport function setNotifyTo(id: string): void {\n const config = loadConfig();\n config.notifyTo = id;\n saveConfig(config);\n}\n\nexport function setChainContract(\n chainId: number,\n key: keyof ChainContracts,\n value: string,\n): void {\n const config = loadConfig();\n if (!config.contracts) config.contracts = {};\n const cid = String(chainId);\n if (!config.contracts[cid]) config.contracts[cid] = {};\n config.contracts[cid][key] = value;\n saveConfig(config);\n}\n\n// ── Syndicate Membership ──\n\n/**\n * Add (or update) a syndicate membership. Deduplicates by subdomain.\n * Automatically sets it as primary if it's the first syndicate on this chain.\n */\nexport function addSyndicate(\n chainId: number,\n membership: SyndicateMembership,\n): void {\n const config = loadConfig();\n const cid = String(chainId);\n if (!config.syndicates) config.syndicates = {};\n if (!config.syndicates[cid]) config.syndicates[cid] = [];\n\n // Upsert — replace existing entry with same subdomain\n const idx = config.syndicates[cid].findIndex(\n (s) => s.subdomain === membership.subdomain,\n );\n if (idx >= 0) {\n config.syndicates[cid][idx] = membership;\n } else {\n config.syndicates[cid].push(membership);\n }\n\n // Auto-set as primary if it's the first syndicate (or no primary set)\n if (!config.primarySyndicate) config.primarySyndicate = {};\n if (!config.primarySyndicate[cid]) {\n config.primarySyndicate[cid] = membership.subdomain;\n }\n\n saveConfig(config);\n}\n\n/** Get all syndicate memberships for a chain. */\nexport function getSyndicates(chainId: number): SyndicateMembership[] {\n const config = loadConfig();\n return config.syndicates?.[String(chainId)] ?? [];\n}\n\n/** Set which syndicate is the active/primary one for CLI commands. */\nexport function setPrimarySyndicate(\n chainId: number,\n subdomain: string,\n): void {\n const config = loadConfig();\n if (!config.primarySyndicate) config.primarySyndicate = {};\n config.primarySyndicate[String(chainId)] = subdomain;\n saveConfig(config);\n}\n\n/**\n * Get the primary syndicate for this chain.\n * Falls back to ChainContracts.vault for backwards compat with older configs.\n */\nexport function getPrimarySyndicate(\n chainId: number,\n): SyndicateMembership | undefined {\n const config = loadConfig();\n const cid = String(chainId);\n\n // Check new syndicates store first\n const primarySubdomain = config.primarySyndicate?.[cid];\n if (primarySubdomain && config.syndicates?.[cid]) {\n const found = config.syndicates[cid].find(\n (s) => s.subdomain === primarySubdomain,\n );\n if (found) return found;\n }\n\n // Backwards compat: if syndicates list has entries but no primary, use the first one\n if (config.syndicates?.[cid]?.length) {\n return config.syndicates[cid][0];\n }\n\n // Legacy fallback: config only has a vault address, no subdomain\n const vault = config.contracts?.[cid]?.vault;\n if (vault) {\n return { subdomain: \"\", vault, role: \"creator\" };\n }\n\n return undefined;\n}\n"],"mappings":";AAMA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,IAAM,aAAa,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW;AACtD,IAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AAgChD,SAAS,aAA6B;AAC3C,MAAI,GAAG,WAAW,WAAW,GAAG;AAC9B,UAAM,SAAS,KAAK,MAAM,GAAG,aAAa,aAAa,OAAO,CAAC;AAC/D,QAAI,CAAC,OAAO,WAAY,QAAO,aAAa,CAAC;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,YAAY,CAAC,EAAE;AAC1B;AAEO,SAAS,WAAW,QAA8B;AACvD,KAAG,UAAU,YAAY,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACzD,KAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AAChF;AAEO,SAAS,aAAa,WAAmB,SAAuB;AACrE,QAAM,SAAS,WAAW;AAC1B,SAAO,WAAW,SAAS,IAAI;AAC/B,aAAW,MAAM;AACnB;AAEO,SAAS,iBAAiB,WAAuC;AACtE,QAAM,SAAS,WAAW;AAC1B,SAAO,OAAO,WAAW,SAAS;AACpC;AAEO,SAAS,gBAAgB,QAAsB;AACpD,QAAM,SAAS,WAAW;AAC1B,SAAO,eAAe;AACtB,aAAW,MAAM;AACnB;AAEO,SAAS,kBAAsC;AACpD,SAAO,WAAW,EAAE,gBAAgB,QAAQ,IAAI;AAClD;AAEO,SAAS,WAAW,SAAuB;AAChD,QAAM,SAAS,WAAW;AAC1B,SAAO,UAAU;AACjB,aAAW,MAAM;AACnB;AAEO,SAAS,aAAiC;AAC/C,SAAO,WAAW,EAAE;AACtB;AAEO,SAAS,cAAc,KAAmB;AAC/C,QAAM,SAAS,WAAW;AAC1B,SAAO,aAAa,IAAI,WAAW,IAAI,IAAI,MAAM,KAAK,GAAG;AACzD,aAAW,MAAM;AACnB;AAEO,SAAS,gBAAoC;AAClD,SAAO,WAAW,EAAE;AACtB;AAIO,SAAS,iBAAiB,QAAsB;AACrD,QAAM,SAAS,WAAW;AAC1B,SAAO,gBAAgB;AACvB,aAAW,MAAM;AACnB;AAEO,SAAS,mBAAuC;AACrD,SAAO,WAAW,EAAE,iBAAiB,QAAQ,IAAI;AACnD;AAIO,SAAS,gBAAgB,SAAqC;AACnE,SAAO,WAAW,EAAE,MAAM,OAAO;AACnC;AAEO,SAAS,gBAAgB,SAAiB,KAAmB;AAClE,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,IAAK,QAAO,MAAM,CAAC;AAC/B,SAAO,IAAI,OAAO,IAAI;AACtB,aAAW,MAAM;AACnB;AAIO,SAAS,kBAAkB,SAAiC;AACjE,QAAM,SAAS,WAAW;AAC1B,SAAO,OAAO,YAAY,OAAO,OAAO,CAAC,KAAK,CAAC;AACjD;AAEO,SAAS,cAAkC;AAChD,SAAO,WAAW,EAAE;AACtB;AAEO,SAAS,YAAY,IAAkB;AAC5C,QAAM,SAAS,WAAW;AAC1B,SAAO,WAAW;AAClB,aAAW,MAAM;AACnB;AAEO,SAAS,iBACd,SACA,KACA,OACM;AACN,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,UAAW,QAAO,YAAY,CAAC;AAC3C,QAAM,MAAM,OAAO,OAAO;AAC1B,MAAI,CAAC,OAAO,UAAU,GAAG,EAAG,QAAO,UAAU,GAAG,IAAI,CAAC;AACrD,SAAO,UAAU,GAAG,EAAE,GAAG,IAAI;AAC7B,aAAW,MAAM;AACnB;AAQO,SAAS,aACd,SACA,YACM;AACN,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,OAAO,OAAO;AAC1B,MAAI,CAAC,OAAO,WAAY,QAAO,aAAa,CAAC;AAC7C,MAAI,CAAC,OAAO,WAAW,GAAG,EAAG,QAAO,WAAW,GAAG,IAAI,CAAC;AAGvD,QAAM,MAAM,OAAO,WAAW,GAAG,EAAE;AAAA,IACjC,CAAC,MAAM,EAAE,cAAc,WAAW;AAAA,EACpC;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,WAAW,GAAG,EAAE,GAAG,IAAI;AAAA,EAChC,OAAO;AACL,WAAO,WAAW,GAAG,EAAE,KAAK,UAAU;AAAA,EACxC;AAGA,MAAI,CAAC,OAAO,iBAAkB,QAAO,mBAAmB,CAAC;AACzD,MAAI,CAAC,OAAO,iBAAiB,GAAG,GAAG;AACjC,WAAO,iBAAiB,GAAG,IAAI,WAAW;AAAA,EAC5C;AAEA,aAAW,MAAM;AACnB;AAGO,SAAS,cAAc,SAAwC;AACpE,QAAM,SAAS,WAAW;AAC1B,SAAO,OAAO,aAAa,OAAO,OAAO,CAAC,KAAK,CAAC;AAClD;AAGO,SAAS,oBACd,SACA,WACM;AACN,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,iBAAkB,QAAO,mBAAmB,CAAC;AACzD,SAAO,iBAAiB,OAAO,OAAO,CAAC,IAAI;AAC3C,aAAW,MAAM;AACnB;AAMO,SAAS,oBACd,SACiC;AACjC,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,OAAO,OAAO;AAG1B,QAAM,mBAAmB,OAAO,mBAAmB,GAAG;AACtD,MAAI,oBAAoB,OAAO,aAAa,GAAG,GAAG;AAChD,UAAM,QAAQ,OAAO,WAAW,GAAG,EAAE;AAAA,MACnC,CAAC,MAAM,EAAE,cAAc;AAAA,IACzB;AACA,QAAI,MAAO,QAAO;AAAA,EACpB;AAGA,MAAI,OAAO,aAAa,GAAG,GAAG,QAAQ;AACpC,WAAO,OAAO,WAAW,GAAG,EAAE,CAAC;AAAA,EACjC;AAGA,QAAM,QAAQ,OAAO,YAAY,GAAG,GAAG;AACvC,MAAI,OAAO;AACT,WAAO,EAAE,WAAW,IAAI,OAAO,MAAM,UAAU;AAAA,EACjD;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SHERWOOD,
|
|
3
3
|
SYNDICATE_GOVERNOR_ABI
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-R75DM3VL.js";
|
|
5
5
|
import {
|
|
6
6
|
getAccount,
|
|
7
7
|
getPublicClient,
|
|
8
8
|
waitForReceipt,
|
|
9
9
|
writeContractWithRetry
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-R7Q2L6VV.js";
|
|
11
11
|
import {
|
|
12
12
|
getChain
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-35536GNW.js";
|
|
14
14
|
|
|
15
15
|
// src/lib/governor.ts
|
|
16
16
|
import { parseEventLogs } from "viem";
|
|
@@ -427,4 +427,4 @@ export {
|
|
|
427
427
|
vetoProposal,
|
|
428
428
|
setProtocolFeeBps
|
|
429
429
|
};
|
|
430
|
-
//# sourceMappingURL=chunk-
|
|
430
|
+
//# sourceMappingURL=chunk-LMDHM36X.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getAccount
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-R7Q2L6VV.js";
|
|
4
4
|
|
|
5
5
|
// src/providers/research/messari.ts
|
|
6
6
|
import { base, baseSepolia } from "viem/chains";
|
|
@@ -331,17 +331,26 @@ var NansenProvider = class {
|
|
|
331
331
|
};
|
|
332
332
|
}
|
|
333
333
|
/**
|
|
334
|
-
* Wallet Profile — PnL
|
|
335
|
-
* Endpoint: POST /api/v1/profiler/
|
|
334
|
+
* Wallet Profile — PnL summary, realized/unrealized gains, token breakdown.
|
|
335
|
+
* Endpoint: POST /api/v1/profiler/address/pnl-summary
|
|
336
336
|
* Cost: ~$0.01 (basic tier)
|
|
337
|
+
*
|
|
338
|
+
* Note: /api/v1/profiler/wallet-pnl requires an API key and does not support x402.
|
|
339
|
+
* The correct x402 endpoint is /api/v1/profiler/address/pnl-summary.
|
|
337
340
|
*/
|
|
338
341
|
async walletProfile(address) {
|
|
339
342
|
const fetchWithPay = await getX402Fetch();
|
|
343
|
+
const now = /* @__PURE__ */ new Date();
|
|
344
|
+
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1e3);
|
|
340
345
|
const body = {
|
|
341
|
-
|
|
342
|
-
|
|
346
|
+
address,
|
|
347
|
+
chain: "base",
|
|
348
|
+
date: {
|
|
349
|
+
from: thirtyDaysAgo.toISOString().replace(/\.\d{3}Z$/, "Z"),
|
|
350
|
+
to: now.toISOString().replace(/\.\d{3}Z$/, "Z")
|
|
351
|
+
}
|
|
343
352
|
};
|
|
344
|
-
const res = await fetchWithPay(`${BASE_URL2}/api/v1/profiler/
|
|
353
|
+
const res = await fetchWithPay(`${BASE_URL2}/api/v1/profiler/address/pnl-summary`, {
|
|
345
354
|
method: "POST",
|
|
346
355
|
headers: { "Content-Type": "application/json" },
|
|
347
356
|
body: JSON.stringify(body)
|
|
@@ -436,4 +445,4 @@ export {
|
|
|
436
445
|
NansenProvider,
|
|
437
446
|
getResearchProvider
|
|
438
447
|
};
|
|
439
|
-
//# sourceMappingURL=chunk-
|
|
448
|
+
//# sourceMappingURL=chunk-NGET2RWT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/research/messari.ts","../src/lib/x402.ts","../src/providers/research/nansen.ts","../src/providers/research/index.ts"],"sourcesContent":["/**\n * Messari research provider — x402 micropayments for crypto market data.\n *\n * Docs: https://docs.messari.io\n * Payment: x402 (USDC on Base) — no API key required\n * Data: 34,000+ assets, market metrics, asset profiles\n * Pricing: $0.10/call for asset details, ROI, ATH. $0.15–$0.35 for timeseries.\n * $0.55 for news/signals. Full pricing: https://docs.messari.io/api-reference/x402-payments\n *\n * Supports:\n * token → asset details (description, category, sector, links, market snapshot)\n * market → market metrics + ATH (price, volume, market cap, ROI, ATH, cycle low)\n *\n * Not supported (use --provider nansen instead):\n * smart-money → on-chain analytics not available in Messari x402 API\n * wallet → wallet profiling not available in Messari x402 API\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.messari.io\";\n\n/** Known x402 cost per Messari query (approximate). */\nexport const MESSARI_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.10\",\n market: \"~$0.20\",\n};\n\nexport class MessariProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"messari\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenReport(params.target);\n case \"market\":\n return this.marketOverview(params.target);\n case \"smart-money\":\n throw new Error(\n \"Messari x402 API does not support on-chain analytics. Use --provider nansen for smart money data.\",\n );\n case \"wallet\":\n throw new Error(\n \"Messari does not support wallet analytics. Use --provider nansen for wallet profiling.\",\n );\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Resolve any user input (symbol, name, slug, address) to a Messari asset slug.\n * Uses the free /metrics/v2/assets endpoint ($0.00) to search.\n */\n private async resolveSlug(target: string): Promise<string> {\n const fetchWithPay = await getX402Fetch();\n const params = new URLSearchParams({\n search: target,\n limit: \"1\",\n });\n const url = `${BASE_URL}/metrics/v2/assets?${params}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari asset lookup failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<{ slug?: string }>;\n };\n\n const slug = json.data?.[0]?.slug;\n if (!slug) {\n throw new Error(\n `No Messari asset found for \"${target}\". Try a different name, symbol, or slug.`,\n );\n }\n return slug;\n }\n\n /**\n * Get asset details: description, category, sector, links, market snapshot.\n * Endpoint: GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n */\n private async tokenReport(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const url = `${BASE_URL}/metrics/v2/assets/details?assetIDs=${encodeURIComponent(slug)}`;\n\n const res = await fetchWithPay(url, { method: \"GET\" });\n if (!res.ok) {\n throw new Error(\n `Messari token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const costUsdc = this.extractCost(res, \"token\");\n const asset = json.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"token\",\n target,\n data: asset,\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Get market metrics + ATH: price, volume, market cap, ROI, all-time high, cycle low.\n * Makes two parallel calls:\n * GET /metrics/v2/assets/details?assetIDs={slug} ($0.10)\n * GET /metrics/v2/assets/ath?assetIDs={slug} ($0.10)\n * Total: ~$0.20\n */\n private async marketOverview(target: string): Promise<ResearchResult> {\n const slug = await this.resolveSlug(target);\n const fetchWithPay = await getX402Fetch();\n const assetParam = encodeURIComponent(slug);\n\n const [detailsRes, athRes] = await Promise.all([\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/details?assetIDs=${assetParam}`, { method: \"GET\" }),\n fetchWithPay(`${BASE_URL}/metrics/v2/assets/ath?assetIDs=${assetParam}`, { method: \"GET\" }),\n ]);\n\n if (!detailsRes.ok) {\n throw new Error(\n `Messari market query failed: ${detailsRes.status} ${detailsRes.statusText}`,\n );\n }\n if (!athRes.ok) {\n throw new Error(\n `Messari ATH query failed: ${athRes.status} ${athRes.statusText}`,\n );\n }\n\n const detailsJson = (await detailsRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n const athJson = (await athRes.json()) as {\n data?: Array<Record<string, unknown>>;\n };\n\n // Sum costs from both responses\n const cost1 = this.extractCostRaw(detailsRes);\n const cost2 = this.extractCostRaw(athRes);\n const totalCost = cost1 + cost2;\n const costUsdc = totalCost > 0\n ? totalCost.toFixed(4)\n : MESSARI_COST_ESTIMATE[\"market\"]?.replace(\"~$\", \"\") ?? \"unknown\";\n\n const details = detailsJson.data?.[0] ?? {};\n const ath = athJson.data?.[0] ?? {};\n\n return {\n provider: \"messari\",\n queryType: \"market\",\n target,\n data: {\n ...details,\n allTimeHigh: ath.allTimeHigh ?? null,\n },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Extract cost from x402 response headers as a number (USDC).\n * Returns 0 if no payment info found.\n */\n private extractCostRaw(res: Response): number {\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n return Number(parsed.amount) / 1e6;\n }\n } catch {\n // Fall through\n }\n }\n return 0;\n }\n\n /**\n * Extract cost from x402 response headers as a formatted string.\n * Falls back to the known estimate for the query type when headers are absent.\n */\n private extractCost(res: Response, queryType: string = \"token\"): string {\n const cost = this.extractCostRaw(res);\n if (cost > 0) return cost.toFixed(4);\n\n // Fall back to known estimate (strip \"~$\" prefix)\n const est = MESSARI_COST_ESTIMATE[queryType];\n if (est) return est.replace(\"~$\", \"\");\n\n return \"unknown\";\n }\n}\n","/**\n * x402 fetch wrapper — wraps native fetch with automatic USDC micropayments.\n *\n * Uses the Coinbase x402 protocol: when a server responds 402 Payment Required,\n * the wrapper automatically signs a USDC payment on Base and retries the request.\n * The agent pays from its own wallet — no vault interaction needed.\n *\n * Singleton pattern matching client.ts — cached after first creation.\n */\n\nimport { getAccount } from \"./client.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Returns a fetch function that automatically handles x402 (402 Payment Required)\n * responses by signing USDC micropayments on Base.\n *\n * Lazily initializes the x402 client on first call and caches it.\n * Uses dynamic imports so @x402 packages are only loaded when research commands run.\n */\nexport async function getX402Fetch(): Promise<typeof fetch> {\n if (_x402Fetch) return _x402Fetch;\n\n const { x402Client, wrapFetchWithPayment } = await import(\"@x402/fetch\");\n const { registerExactEvmScheme } = await import(\"@x402/evm/exact/client\");\n\n const signer = getAccount();\n const client = new x402Client();\n registerExactEvmScheme(client, { signer });\n\n _x402Fetch = wrapFetchWithPayment(fetch, client) as typeof fetch;\n return _x402Fetch;\n}\n\n/**\n * Reset cached x402 fetch. Required for tests that change accounts.\n */\nexport function resetX402Fetch(): void {\n _x402Fetch = null;\n}\n","/**\n * Nansen research provider — x402 micropayments for on-chain analytics.\n *\n * Docs: https://docs.nansen.ai\n * Payment: x402 (USDC on Base) — no API key required\n * Pricing: Basic $0.01/call (Token Screener, Wallet Balances, PnL, Transactions)\n * Smart Money $0.05/call (SM Net Flow, SM Holdings, SM DEX Trades)\n * Premium $0.05/call (Counterparties, Holders, PnL Leaderboard)\n *\n * Supports all query types:\n * token → token screener (on-chain metrics, holder quality)\n * market → token screener sorted by market cap / volume\n * smart-money → smart money net flow from labeled wallets\n * wallet → wallet profiler (PnL, tx patterns, counterparties)\n */\n\nimport { base, baseSepolia } from \"viem/chains\";\nimport type { ProviderInfo } from \"../../types.js\";\nimport type { ResearchProvider, ResearchQuery, ResearchResult } from \"./index.js\";\nimport { getX402Fetch } from \"../../lib/x402.js\";\n\nconst BASE_URL = \"https://api.nansen.ai\";\n\n/** Known x402 cost per Nansen query type. */\nexport const NANSEN_COST_ESTIMATE: Record<string, string> = {\n token: \"~$0.01\",\n market: \"~$0.01\",\n \"smart-money\": \"~$0.06\",\n wallet: \"~$0.01\",\n};\n\nexport class NansenProvider implements ResearchProvider {\n info(): ProviderInfo {\n return {\n name: \"nansen\",\n type: \"research\",\n capabilities: [\n \"research.token\",\n \"research.market\",\n \"research.smart-money\",\n \"research.wallet\",\n ],\n supportedChains: [base, baseSepolia],\n };\n }\n\n async query(params: ResearchQuery): Promise<ResearchResult> {\n switch (params.type) {\n case \"token\":\n return this.tokenScreener(params.target);\n case \"market\":\n return this.marketScreener(params.target);\n case \"smart-money\":\n return this.smartMoneyNetflow(params.options?.token ?? params.target);\n case \"wallet\":\n return this.walletProfile(params.target);\n default:\n throw new Error(`Unsupported query type: ${params.type}`);\n }\n }\n\n /**\n * Token Screener — comprehensive token discovery with on-chain metrics.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async tokenScreener(target: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // Determine if target is an address or symbol\n const isAddr = target.startsWith(\"0x\") && target.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [target] }\n : { token_symbol: [target.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen token query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"token\");\n\n return {\n provider: \"nansen\",\n queryType: \"token\",\n target,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Market Screener — token screener sorted by volume/market cap for market overview.\n * Endpoint: POST /api/v1/token-screener\n * Cost: ~$0.01 (basic tier)\n */\n private async marketScreener(asset: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n const isAddr = asset.startsWith(\"0x\") && asset.length === 42;\n const filters: Record<string, unknown> = isAddr\n ? { token_address: [asset] }\n : { token_symbol: [asset.toUpperCase()] };\n\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters,\n order_by: [{ field: \"buy_volume\", direction: \"desc\" }],\n pagination: { page: 1, records_per_page: 10 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen market query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"market\");\n\n return {\n provider: \"nansen\",\n queryType: \"market\",\n target: asset,\n data: { tokens: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Smart Money Net Flow — capital flow analysis from labeled wallets.\n * Endpoint: POST /api/v1/smart-money/netflow\n * Cost: ~$0.05 (premium tier)\n *\n * The netflow endpoint only accepts `token_address` filters (not `token_symbol`).\n * If the target is a symbol, we resolve it to an address via the token screener first.\n */\n private async smartMoneyNetflow(\n target: string,\n ): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // Resolve symbol → address if needed (token screener is $0.01)\n const tokenAddress = await this.resolveTokenAddress(target);\n\n const body: Record<string, unknown> = {\n chains: [\"base\"],\n pagination: { page: 1, records_per_page: 10 },\n };\n\n if (tokenAddress) {\n body.filters = { token_address: [tokenAddress] };\n }\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/smart-money/netflow`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen smart-money query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: unknown[] };\n const costUsdc = this.extractCost(res, \"smart-money\");\n\n return {\n provider: \"nansen\",\n queryType: \"smart-money\",\n target,\n data: { flows: json.data ?? [], count: (json.data ?? []).length },\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Wallet Profile — PnL summary, realized/unrealized gains, token breakdown.\n * Endpoint: POST /api/v1/profiler/address/pnl-summary\n * Cost: ~$0.01 (basic tier)\n *\n * Note: /api/v1/profiler/wallet-pnl requires an API key and does not support x402.\n * The correct x402 endpoint is /api/v1/profiler/address/pnl-summary.\n */\n private async walletProfile(address: string): Promise<ResearchResult> {\n const fetchWithPay = await getX402Fetch();\n\n // pnl-summary uses `chain` (singular) + a date range, not `chains` array\n const now = new Date();\n const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n const body = {\n address,\n chain: \"base\",\n date: {\n from: thirtyDaysAgo.toISOString().replace(/\\.\\d{3}Z$/, \"Z\"),\n to: now.toISOString().replace(/\\.\\d{3}Z$/, \"Z\"),\n },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/profiler/address/pnl-summary`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(\n `Nansen wallet query failed: ${res.status} ${res.statusText}`,\n );\n }\n\n const json = (await res.json()) as { data?: Record<string, unknown> };\n const costUsdc = this.extractCost(res, \"wallet\");\n\n return {\n provider: \"nansen\",\n queryType: \"wallet\",\n target: address,\n data: json.data ?? (json as Record<string, unknown>),\n costUsdc,\n timestamp: Math.floor(Date.now() / 1000),\n };\n }\n\n /**\n * Resolve a token symbol or name to its contract address on Base.\n * Uses the token screener endpoint ($0.01) to look up the address.\n * If the target is already an address (0x...), returns it as-is.\n */\n private async resolveTokenAddress(target: string): Promise<string | null> {\n if (target.startsWith(\"0x\") && target.length === 42) {\n return target;\n }\n\n const fetchWithPay = await getX402Fetch();\n const body = {\n chains: [\"base\"],\n timeframe: \"24h\",\n filters: { token_symbol: [target.toUpperCase()] },\n pagination: { page: 1, records_per_page: 1 },\n };\n\n const res = await fetchWithPay(`${BASE_URL}/api/v1/token-screener`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) return null;\n\n const json = (await res.json()) as {\n data?: Array<{ token_address?: string }>;\n };\n return json.data?.[0]?.token_address ?? null;\n }\n\n /**\n * Extract cost from x402 response headers.\n * Falls back to the known estimate for the query type when headers are absent.\n */\n private extractCost(res: Response, queryType: string): string {\n // Check Nansen-specific credit header\n const creditsUsed = res.headers.get(\"x-nansen-credits-used\");\n if (creditsUsed) {\n return creditsUsed;\n }\n\n // Fall back to x402 payment-response header\n const paymentResponse = res.headers.get(\"payment-response\");\n if (paymentResponse) {\n try {\n const parsed = JSON.parse(paymentResponse) as { amount?: string };\n if (parsed.amount) {\n const cents = Number(parsed.amount) / 1e6;\n return cents.toFixed(4);\n }\n } catch {\n // Fall through\n }\n }\n\n // Fall back to known estimate (strip \"~$\" prefix)\n const est = NANSEN_COST_ESTIMATE[queryType];\n if (est) {\n return est.replace(\"~$\", \"\");\n }\n\n return \"unknown\";\n }\n}\n","/**\n * Research providers — pluggable interface for DeFi research data via x402 micropayments.\n *\n * Same pattern as DeFi providers (Moonwell, Uniswap). Each research provider\n * implements ResearchProvider and uses x402-wrapped fetch for automatic USDC payments.\n */\n\nimport type { Provider } from \"../../types.js\";\nimport { MessariProvider } from \"./messari.js\";\nimport { NansenProvider } from \"./nansen.js\";\n\n// ── Types ──\n\nexport interface ResearchQuery {\n /** Query type determines which API endpoint is called */\n type: \"token\" | \"smart-money\" | \"market\" | \"wallet\";\n /** Token address, asset symbol, or wallet address depending on type */\n target: string;\n /** Additional query params (e.g. token symbol for smart-money queries) */\n options?: Record<string, string>;\n}\n\nexport interface ResearchResult {\n provider: string;\n queryType: string;\n target: string;\n /** Structured response data from the provider */\n data: Record<string, unknown>;\n /** Cost paid in USDC (human-readable, e.g. \"0.05\") */\n costUsdc: string;\n timestamp: number;\n}\n\nexport interface ResearchProvider extends Provider {\n /** Query the research provider. Payment is handled automatically via x402. */\n query(params: ResearchQuery): Promise<ResearchResult>;\n}\n\n// ── Factory ──\n\nexport function getResearchProvider(name: string): ResearchProvider {\n switch (name) {\n case \"messari\":\n return new MessariProvider();\n case \"nansen\":\n return new NansenProvider();\n default:\n throw new Error(\n `Unknown research provider: ${name}. Valid providers: messari, nansen`,\n );\n }\n}\n\n// ── Re-exports ──\n\nexport { MessariProvider, NansenProvider };\n"],"mappings":"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","names":["base","baseSepolia","BASE_URL","base","baseSepolia"]}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UNISWAP,
|
|
3
3
|
UNISWAP_QUOTER_V2_ABI
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-R75DM3VL.js";
|
|
5
5
|
import {
|
|
6
6
|
getAccount,
|
|
7
7
|
getPublicClient,
|
|
8
8
|
sendTxWithRetry,
|
|
9
9
|
waitForReceipt
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-R7Q2L6VV.js";
|
|
11
11
|
import {
|
|
12
12
|
getChain
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-35536GNW.js";
|
|
14
14
|
import {
|
|
15
15
|
getUniswapApiKey,
|
|
16
16
|
getVeniceApiKey,
|
|
17
17
|
setVeniceApiKey
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-5S2TBADL.js";
|
|
19
19
|
|
|
20
20
|
// src/providers/uniswap.ts
|
|
21
21
|
import { isAddress } from "viem";
|
|
@@ -449,4 +449,4 @@ export {
|
|
|
449
449
|
encodeSwapPath,
|
|
450
450
|
getMultiHopQuote
|
|
451
451
|
};
|
|
452
|
-
//# sourceMappingURL=chunk-
|
|
452
|
+
//# sourceMappingURL=chunk-PEJPTKLK.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getNetwork
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-35536GNW.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/addresses.ts
|
|
6
6
|
var ZERO = "0x0000000000000000000000000000000000000000";
|
|
@@ -57,13 +57,17 @@ var BASE_SEPOLIA_UNISWAP = {
|
|
|
57
57
|
};
|
|
58
58
|
var ROBINHOOD_TESTNET_TOKENS = {
|
|
59
59
|
USDC: ZERO,
|
|
60
|
-
// no Circle USDC on Robinhood L2
|
|
61
60
|
WETH: "0x7943e237c7F95DA44E0301572D358911207852Fa",
|
|
62
61
|
cbETH: ZERO,
|
|
63
62
|
wstETH: ZERO,
|
|
64
63
|
cbBTC: ZERO,
|
|
65
64
|
DAI: ZERO,
|
|
66
|
-
AERO: ZERO
|
|
65
|
+
AERO: ZERO,
|
|
66
|
+
TSLA: "0xC9f9c86933092BbbfFF3CCb4b105A4A94bf3Bd4E",
|
|
67
|
+
AMZN: "0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02",
|
|
68
|
+
PLTR: "0x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d0",
|
|
69
|
+
NFLX: "0x3b8262A63d25f0477c4DDE23F83cfe22Cb768C93",
|
|
70
|
+
AMD: "0x71178BAc73cBeb415514eB542a8995b82669778d"
|
|
67
71
|
};
|
|
68
72
|
var ROBINHOOD_TESTNET_MOONWELL = {
|
|
69
73
|
COMPTROLLER: ZERO,
|
|
@@ -79,6 +83,18 @@ var ROBINHOOD_TESTNET_UNISWAP = {
|
|
|
79
83
|
SWAP_ROUTER: ZERO,
|
|
80
84
|
QUOTER_V2: ZERO
|
|
81
85
|
};
|
|
86
|
+
var BASE_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
|
|
87
|
+
var BASE_SEPOLIA_SYNTHRA = { ROUTER: ZERO, QUOTER: ZERO, FACTORY: ZERO };
|
|
88
|
+
var ROBINHOOD_TESTNET_SYNTHRA = {
|
|
89
|
+
ROUTER: "0x3Ce954107b1A675826B33bF23060Dd655e3758fE",
|
|
90
|
+
QUOTER: "0x231606c321A99DE81e28fE48B07a93F1ba49e713",
|
|
91
|
+
FACTORY: "0x911b4000D3422F482F4062a913885f7b035382Df"
|
|
92
|
+
};
|
|
93
|
+
var BASE_CHAINLINK = { VERIFIER_PROXY: ZERO };
|
|
94
|
+
var BASE_SEPOLIA_CHAINLINK = { VERIFIER_PROXY: ZERO };
|
|
95
|
+
var ROBINHOOD_TESTNET_CHAINLINK = {
|
|
96
|
+
VERIFIER_PROXY: "0x72790f9eB82db492a7DDb6d2af22A270Dcc3Db64"
|
|
97
|
+
};
|
|
82
98
|
var BASE_ENS = {
|
|
83
99
|
L2_REGISTRAR: "0x866996c808E6244216a3d0df15464FCF5d495394",
|
|
84
100
|
L2_REGISTRY: "0x7a019ce699e27b0ad1e5b51344a58116b9f3b9b1"
|
|
@@ -112,8 +128,8 @@ var BASE_SEPOLIA_SHERWOOD = {
|
|
|
112
128
|
GOVERNOR: "0xE5ecf2B06E3f3e298B632C0cf6575f9d9422F55E"
|
|
113
129
|
};
|
|
114
130
|
var ROBINHOOD_TESTNET_SHERWOOD = {
|
|
115
|
-
FACTORY: "
|
|
116
|
-
GOVERNOR: "
|
|
131
|
+
FACTORY: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
|
|
132
|
+
GOVERNOR: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C"
|
|
117
133
|
};
|
|
118
134
|
var BASE_VENICE = {
|
|
119
135
|
VVV: "0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf",
|
|
@@ -148,21 +164,24 @@ var BASE_STRATEGY_TEMPLATES = {
|
|
|
148
164
|
AERODROME_LP: "0x1c61c740702690B86b874ab929A6F04A4Ec56C1c",
|
|
149
165
|
VENICE_INFERENCE: "0xd882056ba6b0aEd8908c541884B327121E2f2C9C",
|
|
150
166
|
WSTETH_MOONWELL: "0x6d026e2f5Ff0C34A01690EC46Cb601B8fF391985",
|
|
151
|
-
MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A"
|
|
167
|
+
MAMO_YIELD: "0x5c98808Ce5e51767ba2d969F75312eEFF0b14a6A",
|
|
168
|
+
PORTFOLIO: ZERO
|
|
152
169
|
};
|
|
153
170
|
var BASE_SEPOLIA_STRATEGY_TEMPLATES = {
|
|
154
171
|
MOONWELL_SUPPLY: ZERO,
|
|
155
172
|
AERODROME_LP: ZERO,
|
|
156
173
|
VENICE_INFERENCE: ZERO,
|
|
157
174
|
WSTETH_MOONWELL: ZERO,
|
|
158
|
-
MAMO_YIELD: ZERO
|
|
175
|
+
MAMO_YIELD: ZERO,
|
|
176
|
+
PORTFOLIO: ZERO
|
|
159
177
|
};
|
|
160
178
|
var ROBINHOOD_TESTNET_STRATEGY_TEMPLATES = {
|
|
161
179
|
MOONWELL_SUPPLY: ZERO,
|
|
162
180
|
AERODROME_LP: ZERO,
|
|
163
181
|
VENICE_INFERENCE: ZERO,
|
|
164
182
|
WSTETH_MOONWELL: ZERO,
|
|
165
|
-
MAMO_YIELD: ZERO
|
|
183
|
+
MAMO_YIELD: ZERO,
|
|
184
|
+
PORTFOLIO: "0xAe981882923E0C76A7F10E7cAa3782023c0abd9B"
|
|
166
185
|
};
|
|
167
186
|
var BASE_EAS = {
|
|
168
187
|
EAS: "0x4200000000000000000000000000000000000021",
|
|
@@ -245,6 +264,16 @@ var STRATEGY_TEMPLATE_REGISTRY = {
|
|
|
245
264
|
"base-sepolia": BASE_SEPOLIA_STRATEGY_TEMPLATES,
|
|
246
265
|
"robinhood-testnet": ROBINHOOD_TESTNET_STRATEGY_TEMPLATES
|
|
247
266
|
};
|
|
267
|
+
var SYNTHRA_REGISTRY = {
|
|
268
|
+
base: BASE_SYNTHRA,
|
|
269
|
+
"base-sepolia": BASE_SEPOLIA_SYNTHRA,
|
|
270
|
+
"robinhood-testnet": ROBINHOOD_TESTNET_SYNTHRA
|
|
271
|
+
};
|
|
272
|
+
var CHAINLINK_REGISTRY = {
|
|
273
|
+
base: BASE_CHAINLINK,
|
|
274
|
+
"base-sepolia": BASE_SEPOLIA_CHAINLINK,
|
|
275
|
+
"robinhood-testnet": ROBINHOOD_TESTNET_CHAINLINK
|
|
276
|
+
};
|
|
248
277
|
var EAS_CONTRACT_REGISTRY = {
|
|
249
278
|
base: BASE_EAS,
|
|
250
279
|
"base-sepolia": BASE_SEPOLIA_EAS,
|
|
@@ -288,6 +317,12 @@ function EAS_CONTRACTS() {
|
|
|
288
317
|
function EAS_SCHEMAS() {
|
|
289
318
|
return EAS_SCHEMA_REGISTRY[getNetwork()];
|
|
290
319
|
}
|
|
320
|
+
function SYNTHRA() {
|
|
321
|
+
return SYNTHRA_REGISTRY[getNetwork()];
|
|
322
|
+
}
|
|
323
|
+
function CHAINLINK() {
|
|
324
|
+
return CHAINLINK_REGISTRY[getNetwork()];
|
|
325
|
+
}
|
|
291
326
|
|
|
292
327
|
// src/lib/abis.ts
|
|
293
328
|
var SYNDICATE_VAULT_ABI = [
|
|
@@ -1477,6 +1512,121 @@ var BASE_STRATEGY_ABI = [
|
|
|
1477
1512
|
outputs: [{ name: "", type: "uint8" }]
|
|
1478
1513
|
}
|
|
1479
1514
|
];
|
|
1515
|
+
var PORTFOLIO_STRATEGY_ABI = [
|
|
1516
|
+
// Inherited from BaseStrategy
|
|
1517
|
+
...BASE_STRATEGY_ABI,
|
|
1518
|
+
// Rebalancing
|
|
1519
|
+
{
|
|
1520
|
+
name: "rebalance",
|
|
1521
|
+
type: "function",
|
|
1522
|
+
stateMutability: "nonpayable",
|
|
1523
|
+
inputs: [],
|
|
1524
|
+
outputs: []
|
|
1525
|
+
},
|
|
1526
|
+
{
|
|
1527
|
+
name: "rebalanceDelta",
|
|
1528
|
+
type: "function",
|
|
1529
|
+
stateMutability: "nonpayable",
|
|
1530
|
+
inputs: [{ name: "priceReports", type: "bytes[]" }],
|
|
1531
|
+
outputs: []
|
|
1532
|
+
},
|
|
1533
|
+
// View functions
|
|
1534
|
+
{
|
|
1535
|
+
name: "getAllocations",
|
|
1536
|
+
type: "function",
|
|
1537
|
+
stateMutability: "view",
|
|
1538
|
+
inputs: [],
|
|
1539
|
+
outputs: [
|
|
1540
|
+
{
|
|
1541
|
+
name: "",
|
|
1542
|
+
type: "tuple[]",
|
|
1543
|
+
components: [
|
|
1544
|
+
{ name: "token", type: "address" },
|
|
1545
|
+
{ name: "targetWeightBps", type: "uint256" },
|
|
1546
|
+
{ name: "tokenAmount", type: "uint256" },
|
|
1547
|
+
{ name: "investedAmount", type: "uint256" }
|
|
1548
|
+
]
|
|
1549
|
+
}
|
|
1550
|
+
]
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
name: "allocationCount",
|
|
1554
|
+
type: "function",
|
|
1555
|
+
stateMutability: "view",
|
|
1556
|
+
inputs: [],
|
|
1557
|
+
outputs: [{ name: "", type: "uint256" }]
|
|
1558
|
+
},
|
|
1559
|
+
{
|
|
1560
|
+
name: "asset",
|
|
1561
|
+
type: "function",
|
|
1562
|
+
stateMutability: "view",
|
|
1563
|
+
inputs: [],
|
|
1564
|
+
outputs: [{ name: "", type: "address" }]
|
|
1565
|
+
},
|
|
1566
|
+
{
|
|
1567
|
+
name: "totalAmount",
|
|
1568
|
+
type: "function",
|
|
1569
|
+
stateMutability: "view",
|
|
1570
|
+
inputs: [],
|
|
1571
|
+
outputs: [{ name: "", type: "uint256" }]
|
|
1572
|
+
},
|
|
1573
|
+
{
|
|
1574
|
+
name: "maxSlippageBps",
|
|
1575
|
+
type: "function",
|
|
1576
|
+
stateMutability: "view",
|
|
1577
|
+
inputs: [],
|
|
1578
|
+
outputs: [{ name: "", type: "uint256" }]
|
|
1579
|
+
},
|
|
1580
|
+
{
|
|
1581
|
+
name: "swapAdapter",
|
|
1582
|
+
type: "function",
|
|
1583
|
+
stateMutability: "view",
|
|
1584
|
+
inputs: [],
|
|
1585
|
+
outputs: [{ name: "", type: "address" }]
|
|
1586
|
+
},
|
|
1587
|
+
{
|
|
1588
|
+
name: "getSwapExtraData",
|
|
1589
|
+
type: "function",
|
|
1590
|
+
stateMutability: "view",
|
|
1591
|
+
inputs: [],
|
|
1592
|
+
outputs: [{ name: "", type: "bytes[]" }]
|
|
1593
|
+
},
|
|
1594
|
+
// Events
|
|
1595
|
+
{
|
|
1596
|
+
name: "WeightsUpdated",
|
|
1597
|
+
type: "event",
|
|
1598
|
+
inputs: [
|
|
1599
|
+
{ name: "tokens", type: "address[]", indexed: false },
|
|
1600
|
+
{ name: "oldWeights", type: "uint256[]", indexed: false },
|
|
1601
|
+
{ name: "newWeights", type: "uint256[]", indexed: false }
|
|
1602
|
+
]
|
|
1603
|
+
},
|
|
1604
|
+
{
|
|
1605
|
+
name: "Rebalanced",
|
|
1606
|
+
type: "event",
|
|
1607
|
+
inputs: [
|
|
1608
|
+
{ name: "tokens", type: "address[]", indexed: false },
|
|
1609
|
+
{ name: "oldWeights", type: "uint256[]", indexed: false },
|
|
1610
|
+
{ name: "newWeights", type: "uint256[]", indexed: false },
|
|
1611
|
+
{ name: "oldBalances", type: "uint256[]", indexed: false },
|
|
1612
|
+
{ name: "newBalances", type: "uint256[]", indexed: false },
|
|
1613
|
+
{ name: "totalAssetValue", type: "uint256", indexed: false }
|
|
1614
|
+
]
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
name: "RebalancedDelta",
|
|
1618
|
+
type: "event",
|
|
1619
|
+
inputs: [
|
|
1620
|
+
{ name: "tokens", type: "address[]", indexed: false },
|
|
1621
|
+
{ name: "oldWeights", type: "uint256[]", indexed: false },
|
|
1622
|
+
{ name: "newWeights", type: "uint256[]", indexed: false },
|
|
1623
|
+
{ name: "oldBalances", type: "uint256[]", indexed: false },
|
|
1624
|
+
{ name: "newBalances", type: "uint256[]", indexed: false },
|
|
1625
|
+
{ name: "totalAssetValue", type: "uint256", indexed: false },
|
|
1626
|
+
{ name: "swapsExecuted", type: "uint256", indexed: false }
|
|
1627
|
+
]
|
|
1628
|
+
}
|
|
1629
|
+
];
|
|
1480
1630
|
|
|
1481
1631
|
export {
|
|
1482
1632
|
TOKENS,
|
|
@@ -1490,6 +1640,8 @@ export {
|
|
|
1490
1640
|
STRATEGY_TEMPLATES,
|
|
1491
1641
|
EAS_CONTRACTS,
|
|
1492
1642
|
EAS_SCHEMAS,
|
|
1643
|
+
SYNTHRA,
|
|
1644
|
+
CHAINLINK,
|
|
1493
1645
|
SYNDICATE_VAULT_ABI,
|
|
1494
1646
|
UNISWAP_QUOTER_V2_ABI,
|
|
1495
1647
|
SWAP_ROUTER_ABI,
|
|
@@ -1500,6 +1652,7 @@ export {
|
|
|
1500
1652
|
VENICE_STAKING_ABI,
|
|
1501
1653
|
EAS_ABI,
|
|
1502
1654
|
SYNDICATE_GOVERNOR_ABI,
|
|
1503
|
-
BASE_STRATEGY_ABI
|
|
1655
|
+
BASE_STRATEGY_ABI,
|
|
1656
|
+
PORTFOLIO_STRATEGY_ABI
|
|
1504
1657
|
};
|
|
1505
|
-
//# sourceMappingURL=chunk-
|
|
1658
|
+
//# sourceMappingURL=chunk-R75DM3VL.js.map
|