arc402-cli 1.0.0-rc.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +43 -2
  2. package/dist/abis.d.ts +1 -0
  3. package/dist/abis.d.ts.map +1 -1
  4. package/dist/abis.js +29 -1
  5. package/dist/abis.js.map +1 -1
  6. package/dist/commands/backup.d.ts +3 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +106 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/compute.d.ts +14 -0
  11. package/dist/commands/compute.d.ts.map +1 -0
  12. package/dist/commands/compute.js +466 -0
  13. package/dist/commands/compute.js.map +1 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -1
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/daemon.d.ts.map +1 -1
  18. package/dist/commands/daemon.js +67 -0
  19. package/dist/commands/daemon.js.map +1 -1
  20. package/dist/commands/discover.d.ts.map +1 -1
  21. package/dist/commands/discover.js +60 -15
  22. package/dist/commands/discover.js.map +1 -1
  23. package/dist/commands/doctor.d.ts +3 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +205 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/tunnel.d.ts +3 -0
  28. package/dist/commands/tunnel.d.ts.map +1 -0
  29. package/dist/commands/tunnel.js +281 -0
  30. package/dist/commands/tunnel.js.map +1 -0
  31. package/dist/commands/wallet.d.ts.map +1 -1
  32. package/dist/commands/wallet.js +299 -65
  33. package/dist/commands/wallet.js.map +1 -1
  34. package/dist/commands/watch.d.ts.map +1 -1
  35. package/dist/commands/watch.js +146 -9
  36. package/dist/commands/watch.js.map +1 -1
  37. package/dist/commands/workroom.d.ts.map +1 -1
  38. package/dist/commands/workroom.js +112 -6
  39. package/dist/commands/workroom.js.map +1 -1
  40. package/dist/config.d.ts +13 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +41 -4
  43. package/dist/config.js.map +1 -1
  44. package/dist/daemon/compute-metering.d.ts +61 -0
  45. package/dist/daemon/compute-metering.d.ts.map +1 -0
  46. package/dist/daemon/compute-metering.js +299 -0
  47. package/dist/daemon/compute-metering.js.map +1 -0
  48. package/dist/daemon/compute-session.d.ts +100 -0
  49. package/dist/daemon/compute-session.d.ts.map +1 -0
  50. package/dist/daemon/compute-session.js +231 -0
  51. package/dist/daemon/compute-session.js.map +1 -0
  52. package/dist/daemon/config.d.ts +33 -1
  53. package/dist/daemon/config.d.ts.map +1 -1
  54. package/dist/daemon/config.js +69 -0
  55. package/dist/daemon/config.js.map +1 -1
  56. package/dist/daemon/credentials.d.ts +24 -0
  57. package/dist/daemon/credentials.d.ts.map +1 -0
  58. package/dist/daemon/credentials.js +80 -0
  59. package/dist/daemon/credentials.js.map +1 -0
  60. package/dist/daemon/delivery-client.d.ts +35 -0
  61. package/dist/daemon/delivery-client.d.ts.map +1 -0
  62. package/dist/daemon/delivery-client.js +231 -0
  63. package/dist/daemon/delivery-client.js.map +1 -0
  64. package/dist/daemon/file-delivery.d.ts +98 -0
  65. package/dist/daemon/file-delivery.d.ts.map +1 -0
  66. package/dist/daemon/file-delivery.js +461 -0
  67. package/dist/daemon/file-delivery.js.map +1 -0
  68. package/dist/daemon/index.d.ts +1 -0
  69. package/dist/daemon/index.d.ts.map +1 -1
  70. package/dist/daemon/index.js +793 -227
  71. package/dist/daemon/index.js.map +1 -1
  72. package/dist/daemon/notify.d.ts +35 -6
  73. package/dist/daemon/notify.d.ts.map +1 -1
  74. package/dist/daemon/notify.js +176 -48
  75. package/dist/daemon/notify.js.map +1 -1
  76. package/dist/daemon/worker-executor.d.ts +71 -0
  77. package/dist/daemon/worker-executor.d.ts.map +1 -0
  78. package/dist/daemon/worker-executor.js +382 -0
  79. package/dist/daemon/worker-executor.js.map +1 -0
  80. package/dist/drain-v4.js +2 -2
  81. package/dist/drain-v4.js.map +1 -1
  82. package/dist/endpoint-notify.d.ts +9 -1
  83. package/dist/endpoint-notify.d.ts.map +1 -1
  84. package/dist/endpoint-notify.js +116 -3
  85. package/dist/endpoint-notify.js.map +1 -1
  86. package/dist/index.js +81 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/program.d.ts.map +1 -1
  89. package/dist/program.js +8 -0
  90. package/dist/program.js.map +1 -1
  91. package/dist/repl.d.ts.map +1 -1
  92. package/dist/repl.js +69 -486
  93. package/dist/repl.js.map +1 -1
  94. package/dist/tui/App.d.ts +12 -0
  95. package/dist/tui/App.d.ts.map +1 -0
  96. package/dist/tui/App.js +154 -0
  97. package/dist/tui/App.js.map +1 -0
  98. package/dist/tui/Footer.d.ts +11 -0
  99. package/dist/tui/Footer.d.ts.map +1 -0
  100. package/dist/tui/Footer.js +13 -0
  101. package/dist/tui/Footer.js.map +1 -0
  102. package/dist/tui/Header.d.ts +14 -0
  103. package/dist/tui/Header.d.ts.map +1 -0
  104. package/dist/tui/Header.js +19 -0
  105. package/dist/tui/Header.js.map +1 -0
  106. package/dist/tui/InputLine.d.ts +11 -0
  107. package/dist/tui/InputLine.d.ts.map +1 -0
  108. package/dist/tui/InputLine.js +145 -0
  109. package/dist/tui/InputLine.js.map +1 -0
  110. package/dist/tui/Viewport.d.ts +14 -0
  111. package/dist/tui/Viewport.d.ts.map +1 -0
  112. package/dist/tui/Viewport.js +48 -0
  113. package/dist/tui/Viewport.js.map +1 -0
  114. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  115. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  116. package/dist/tui/WalletConnectPairing.js +61 -0
  117. package/dist/tui/WalletConnectPairing.js.map +1 -0
  118. package/dist/tui/components/Button.d.ts +7 -0
  119. package/dist/tui/components/Button.d.ts.map +1 -0
  120. package/dist/tui/components/Button.js +21 -0
  121. package/dist/tui/components/Button.js.map +1 -0
  122. package/dist/tui/components/CeremonyView.d.ts +13 -0
  123. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  124. package/dist/tui/components/CeremonyView.js +10 -0
  125. package/dist/tui/components/CeremonyView.js.map +1 -0
  126. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  127. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  128. package/dist/tui/components/CompletionDropdown.js +23 -0
  129. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  130. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  131. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  132. package/dist/tui/components/ConfirmPrompt.js +10 -0
  133. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  134. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  135. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  136. package/dist/tui/components/CustomTextInput.js +99 -0
  137. package/dist/tui/components/CustomTextInput.js.map +1 -0
  138. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  139. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  140. package/dist/tui/components/InteractiveTable.js +61 -0
  141. package/dist/tui/components/InteractiveTable.js.map +1 -0
  142. package/dist/tui/components/StepSpinner.d.ts +11 -0
  143. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  144. package/dist/tui/components/StepSpinner.js +32 -0
  145. package/dist/tui/components/StepSpinner.js.map +1 -0
  146. package/dist/tui/components/Toast.d.ts +18 -0
  147. package/dist/tui/components/Toast.d.ts.map +1 -0
  148. package/dist/tui/components/Toast.js +29 -0
  149. package/dist/tui/components/Toast.js.map +1 -0
  150. package/dist/tui/index.d.ts +2 -0
  151. package/dist/tui/index.d.ts.map +1 -0
  152. package/dist/tui/index.js +55 -0
  153. package/dist/tui/index.js.map +1 -0
  154. package/dist/tui/useChat.d.ts +11 -0
  155. package/dist/tui/useChat.d.ts.map +1 -0
  156. package/dist/tui/useChat.js +91 -0
  157. package/dist/tui/useChat.js.map +1 -0
  158. package/dist/tui/useCommand.d.ts +12 -0
  159. package/dist/tui/useCommand.d.ts.map +1 -0
  160. package/dist/tui/useCommand.js +137 -0
  161. package/dist/tui/useCommand.js.map +1 -0
  162. package/dist/tui/useNotifications.d.ts +9 -0
  163. package/dist/tui/useNotifications.d.ts.map +1 -0
  164. package/dist/tui/useNotifications.js +17 -0
  165. package/dist/tui/useNotifications.js.map +1 -0
  166. package/dist/tui/useScroll.d.ts +17 -0
  167. package/dist/tui/useScroll.d.ts.map +1 -0
  168. package/dist/tui/useScroll.js +46 -0
  169. package/dist/tui/useScroll.js.map +1 -0
  170. package/dist/ui/format.d.ts.map +1 -1
  171. package/dist/ui/format.js +2 -0
  172. package/dist/ui/format.js.map +1 -1
  173. package/dist/ui/qr-render.d.ts +25 -0
  174. package/dist/ui/qr-render.d.ts.map +1 -0
  175. package/dist/ui/qr-render.js +90 -0
  176. package/dist/ui/qr-render.js.map +1 -0
  177. package/dist/ui/rpc-fallback.d.ts +11 -0
  178. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  179. package/dist/ui/rpc-fallback.js +58 -0
  180. package/dist/ui/rpc-fallback.js.map +1 -0
  181. package/dist/walletconnect.d.ts +4 -0
  182. package/dist/walletconnect.d.ts.map +1 -1
  183. package/dist/walletconnect.js.map +1 -1
  184. package/package.json +11 -3
  185. package/scripts/authorize-machine-key.ts +0 -43
  186. package/scripts/drain-wallet.ts +0 -149
  187. package/scripts/execute-spend-only.ts +0 -81
  188. package/scripts/register-agent-userop.ts +0 -186
  189. package/src/abis.ts +0 -187
  190. package/src/bundler.ts +0 -235
  191. package/src/client.ts +0 -36
  192. package/src/coinbase-smart-wallet.ts +0 -51
  193. package/src/commands/accept.ts +0 -64
  194. package/src/commands/agent-handshake.ts +0 -72
  195. package/src/commands/agent.ts +0 -691
  196. package/src/commands/agreements.ts +0 -350
  197. package/src/commands/arbitrator.ts +0 -180
  198. package/src/commands/arena-handshake.ts +0 -257
  199. package/src/commands/arena.ts +0 -122
  200. package/src/commands/cancel.ts +0 -35
  201. package/src/commands/channel.ts +0 -218
  202. package/src/commands/coldstart.ts +0 -165
  203. package/src/commands/config.ts +0 -58
  204. package/src/commands/contract-interaction.ts +0 -166
  205. package/src/commands/daemon.ts +0 -978
  206. package/src/commands/deliver.ts +0 -148
  207. package/src/commands/discover.ts +0 -297
  208. package/src/commands/dispute.ts +0 -375
  209. package/src/commands/endpoint.ts +0 -620
  210. package/src/commands/feed.ts +0 -229
  211. package/src/commands/hire.ts +0 -245
  212. package/src/commands/migrate.ts +0 -177
  213. package/src/commands/negotiate.ts +0 -271
  214. package/src/commands/openshell.ts +0 -1055
  215. package/src/commands/owner.ts +0 -35
  216. package/src/commands/policy.ts +0 -263
  217. package/src/commands/relay.ts +0 -273
  218. package/src/commands/remediate.ts +0 -24
  219. package/src/commands/reputation.ts +0 -79
  220. package/src/commands/setup.ts +0 -343
  221. package/src/commands/trust.ts +0 -27
  222. package/src/commands/verify.ts +0 -91
  223. package/src/commands/wallet.ts +0 -3280
  224. package/src/commands/watch.ts +0 -23
  225. package/src/commands/watchtower.ts +0 -248
  226. package/src/commands/workroom.ts +0 -959
  227. package/src/config.ts +0 -174
  228. package/src/daemon/config.ts +0 -308
  229. package/src/daemon/hire-listener.ts +0 -226
  230. package/src/daemon/index.ts +0 -955
  231. package/src/daemon/job-lifecycle.ts +0 -215
  232. package/src/daemon/notify.ts +0 -157
  233. package/src/daemon/token-metering.ts +0 -183
  234. package/src/daemon/userops.ts +0 -119
  235. package/src/daemon/wallet-monitor.ts +0 -90
  236. package/src/drain-v4.ts +0 -159
  237. package/src/endpoint-config.ts +0 -83
  238. package/src/endpoint-notify.ts +0 -46
  239. package/src/index.ts +0 -26
  240. package/src/openshell-runtime.ts +0 -277
  241. package/src/program.ts +0 -83
  242. package/src/repl.ts +0 -680
  243. package/src/signing.ts +0 -28
  244. package/src/telegram-notify.ts +0 -88
  245. package/src/ui/banner.ts +0 -51
  246. package/src/ui/colors.ts +0 -30
  247. package/src/ui/format.ts +0 -77
  248. package/src/ui/spinner.ts +0 -56
  249. package/src/ui/tree.ts +0 -16
  250. package/src/utils/format.ts +0 -48
  251. package/src/utils/hash.ts +0 -5
  252. package/src/utils/time.ts +0 -15
  253. package/src/wallet-router.ts +0 -178
  254. package/src/walletconnect-session.ts +0 -27
  255. package/src/walletconnect.ts +0 -294
  256. package/test/time.test.js +0 -11
  257. package/tsconfig.json +0 -19
package/src/config.ts DELETED
@@ -1,174 +0,0 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
3
- import * as os from "os";
4
-
5
- export interface Arc402Config {
6
- network: "base-mainnet" | "base-sepolia";
7
- rpcUrl: string;
8
- privateKey?: string;
9
- guardianPrivateKey?: string;
10
- guardianAddress?: string;
11
- walletConnectProjectId?: string;
12
- ownerAddress?: string;
13
- agentRegistryAddress?: string;
14
- agentRegistryV2Address?: string;
15
- serviceAgreementAddress?: string;
16
- disputeArbitrationAddress?: string;
17
- disputeModuleAddress?: string;
18
- trustRegistryAddress: string;
19
- trustRegistryV2Address?: string;
20
- intentAttestationAddress?: string;
21
- settlementCoordinatorAddress?: string;
22
- sessionChannelsAddress?: string;
23
- reputationOracleAddress?: string;
24
- sponsorshipAttestationAddress?: string;
25
- capabilityRegistryAddress?: string;
26
- governanceAddress?: string;
27
- agreementTreeAddress?: string;
28
- policyEngineAddress?: string;
29
- walletFactoryAddress?: string;
30
- walletContractAddress?: string;
31
- watchtowerRegistryAddress?: string;
32
- governedTokenWhitelistAddress?: string;
33
- vouchingRegistryAddress?: string;
34
- migrationRegistryAddress?: string;
35
- handshakeAddress?: string;
36
- paymasterUrl?: string; // CDP paymaster endpoint
37
- cdpKeyName?: string; // CDP API key name (org/.../apiKeys/...)
38
- cdpPrivateKey?: string; // CDP EC private key — base64 DER SEC1 (store in CDP_PRIVATE_KEY env var)
39
- subdomainApi?: string; // defaults to https://api.arc402.xyz
40
- telegramBotToken?: string;
41
- telegramChatId?: string;
42
- telegramThreadId?: number;
43
- wcSession?: {
44
- topic: string;
45
- expiry: number; // Unix timestamp
46
- account: string; // Phone wallet address
47
- chainId: number;
48
- };
49
- }
50
-
51
- const CONFIG_DIR = path.join(os.homedir(), ".arc402");
52
- const CONFIG_PATH = process.env.ARC402_CONFIG || path.join(CONFIG_DIR, "config.json");
53
-
54
- export const getConfigPath = () => CONFIG_PATH;
55
-
56
- export function loadConfig(): Arc402Config {
57
- if (!fs.existsSync(CONFIG_PATH)) {
58
- // Auto-create with Base Mainnet defaults — zero friction
59
- const defaults = NETWORK_DEFAULTS["base-mainnet"] ?? {};
60
- const d = defaults as unknown as Record<string,string>;
61
- const autoConfig: Arc402Config = {
62
- network: "base-mainnet",
63
- rpcUrl: defaults.rpcUrl ?? "https://mainnet.base.org",
64
- walletConnectProjectId: "455e9425343b9156fce1428250c9a54a",
65
- ownerAddress: undefined,
66
- policyEngineAddress: defaults.policyEngineAddress,
67
- trustRegistryAddress: defaults.trustRegistryAddress ?? "",
68
- agentRegistryAddress: d.agentRegistryV2Address ?? defaults.agentRegistryAddress,
69
- serviceAgreementAddress: defaults.serviceAgreementAddress,
70
- reputationOracleAddress: defaults.reputationOracleAddress,
71
- sponsorshipAttestationAddress: defaults.sponsorshipAttestationAddress,
72
- capabilityRegistryAddress: defaults.capabilityRegistryAddress,
73
- governanceAddress: defaults.governanceAddress,
74
- walletFactoryAddress: defaults.walletFactoryAddress,
75
- sessionChannelsAddress: defaults.sessionChannelsAddress,
76
- disputeModuleAddress: defaults.disputeModuleAddress,
77
- };
78
- saveConfig(autoConfig);
79
- console.log(`◈ Config auto-created at ${CONFIG_PATH} (Base Mainnet)`);
80
- return autoConfig;
81
- }
82
- return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8")) as Arc402Config;
83
- }
84
-
85
- export function saveConfig(config: Arc402Config): void {
86
- const configDir = path.dirname(CONFIG_PATH);
87
- fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
88
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
89
- }
90
-
91
- export const configExists = () => fs.existsSync(CONFIG_PATH);
92
-
93
- // Public Base RPC — stale state, do not use for production. Alchemy recommended.
94
- export const PUBLIC_BASE_RPC = "https://mainnet.base.org";
95
- export const ALCHEMY_BASE_RPC = "https://mainnet.base.org";
96
-
97
- /**
98
- * Warn at runtime if the configured RPC is the public Base endpoint.
99
- * Public Base RPC has delayed state propagation — use Alchemy for production.
100
- */
101
- export function warnIfPublicRpc(config: Arc402Config): void {
102
- if (config.rpcUrl === PUBLIC_BASE_RPC || config.rpcUrl === "https://sepolia.base.org") {
103
- console.warn("WARN: Using public Base RPC — state reads may be stale. Set rpcUrl to an Alchemy endpoint for production.");
104
- console.warn(` Recommended: arc402 config set rpcUrl ${ALCHEMY_BASE_RPC}`);
105
- }
106
- }
107
-
108
- export const NETWORK_DEFAULTS: Record<string, Partial<Arc402Config> & { usdcAddress: string }> = {
109
- "base-mainnet": {
110
- rpcUrl: ALCHEMY_BASE_RPC,
111
- usdcAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
112
- paymasterUrl: "https://api.developer.coinbase.com/rpc/v1/base/dca85088-a2ac-4ec3-8647-5154b150e7a9",
113
- // Base Mainnet deployments — v2 deployed 2026-03-15
114
- policyEngineAddress: "0xAA5Ef3489C929bFB3BFf5D5FE15aa62d3763c847",
115
- trustRegistryAddress: "0x22366D6dabb03062Bc0a5E893EfDff15D8E329b1", // TrustRegistryV3 — v2
116
- trustRegistryV2Address: "0xdA1D377991B2E580991B0DD381CdD635dd71aC39", // old v2, kept for reference
117
- intentAttestationAddress: "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460",
118
- settlementCoordinatorAddress: "0xd52d8Be9728976E0D70C89db9F8ACeb5B5e97cA2", // SettlementCoordinatorV2
119
- agentRegistryAddress: "0xcc0D8731ccCf6CFfF4e66F6d68cA86330Ea8B622", // ARC402RegistryV2
120
- agentRegistryV2Address: "0xD5c2851B00090c92Ba7F4723FB548bb30C9B6865", // AgentRegistry
121
- walletFactoryAddress: "0xcB52B5d746eEc05e141039E92e3dBefeAe496051", // WalletFactoryV5 — redeployed 2026-03-19 (optimized bytecode, FOUNDRY_PROFILE=deploy)
122
- sponsorshipAttestationAddress: "0xD6c2edE89Ea71aE19Db2Be848e172b444Ed38f22",
123
- serviceAgreementAddress: "0xC98B402CAB9156da68A87a69E3B4bf167A3CCcF6",
124
- sessionChannelsAddress: "0x578f8d1bd82E8D6268E329d664d663B4d985BE61",
125
- disputeModuleAddress: "0x5ebd301cEF0C908AB17Fd183aD9c274E4B34e9d6",
126
- reputationOracleAddress: "0x359F76a54F9A345546E430e4d6665A7dC9DaECd4",
127
- governanceAddress: "0xE931DD2EEb9Af9353Dd5E2c1250492A0135E0EC4", // ARC402Governance
128
- guardianAddress: "0xED0A033B79626cdf9570B6c3baC7f699cD0032D8", // ARC402Guardian
129
- walletContractAddress: "0xfd5C8c0a08fDcdeD2fe03e0DC9FA55595667F313", // ARC402Wallet instance
130
- agreementTreeAddress: "0x6a82240512619B25583b9e95783410cf782915b1",
131
- capabilityRegistryAddress: "0x7becb642668B80502dD957A594E1dD0aC414c1a3",
132
- disputeArbitrationAddress: "0xF61b75E4903fbC81169FeF8b7787C13cB7750601",
133
- governedTokenWhitelistAddress: "0xeB58896337244Bb408362Fea727054f9e7157451",
134
- watchtowerRegistryAddress: "0xbC811d1e3c5C5b67CA57df1DFb08847b1c8c458A",
135
- vouchingRegistryAddress: "0x94519194Bf17865770faD59eF581feC512Ae99c9",
136
- migrationRegistryAddress: "0xb60B62357b90F254f555f03B162a30E22890e3B5",
137
- handshakeAddress: "0x4F5A38Bb746d7E5d49d8fd26CA6beD141Ec2DDb3",
138
- },
139
- "base-sepolia": {
140
- rpcUrl: "https://sepolia.base.org",
141
- usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
142
- // v2 deployment — Base Sepolia (chain 84532) — deployed 2026-03-15
143
- // Unchanged v1 contracts:
144
- policyEngineAddress: "0x44102e70c2A366632d98Fe40d892a2501fC7fFF2",
145
- intentAttestationAddress: "0x942c807Cc6E0240A061e074b61345618aBadc457",
146
- settlementCoordinatorAddress: "0x52b565797975781f069368Df40d6633b2aD03390",
147
- agentRegistryV2Address: "0x07D526f8A8e148570509aFa249EFF295045A0cc9", // AgentRegistry
148
- reputationOracleAddress: "0x410e650113fd163389C956BC7fC51c5642617187",
149
- walletFactoryAddress: "0xD560C22aD5372Aa830ee5ffBFa4a5D9f528e7B87",
150
- sponsorshipAttestationAddress:"0xc0d927745AcF8DEeE551BE11A12c97c492DDC989",
151
- governanceAddress: "0x504b3D73A8dFbcAB9551d8a11Bb0B07C90C4c926",
152
- guardianAddress: "0x5c1D2cD6B9B291b436BF1b109A711F0E477EB6fe",
153
- walletContractAddress: "0xc77854f9091A25eD1f35EA24E9bdFb64d0850E45",
154
- agreementTreeAddress: "0x8F46F31FcEbd60f526308AD20e4a008887709720",
155
- capabilityRegistryAddress: "0x6a413e74b65828A014dD8DA61861Bf9E1b6372D2",
156
- governedTokenWhitelistAddress:"0x64C15CA701167C7c901a8a5575a5232b37CAF213",
157
- watchtowerRegistryAddress: "0x70c4E53E3A916eB8A695630f129B943af9C61C57",
158
- // v2 contracts (new/redeployed 2026-03-15):
159
- trustRegistryAddress: "0xf2aE072BB8575c23B0efbF44bDc8188aA900cA7a", // TrustRegistryV3
160
- agentRegistryAddress: "0x0461b2b7A1E50866962CB07326000A94009c58Ff", // ARC402RegistryV2
161
- serviceAgreementAddress: "0xbbb1DA355D810E9baEF1a7D072B2132E4755976B",
162
- sessionChannelsAddress: "0x5EF144AE2C8456d014e6E3F293c162410C043564",
163
- disputeModuleAddress: "0x01866144495fBBbBB7aaD81605de051B2A62594A",
164
- disputeArbitrationAddress: "0xa4f6F77927Da53a25926A5f0bffBEB0210108cA8",
165
- vouchingRegistryAddress: "0x96432aDc7aC06256297AdF11B94C47f68b2F13A2",
166
- migrationRegistryAddress: "0x3aeAaD32386D6fC40eeb5c2C27a5aCFE6aDf9ABD",
167
- },
168
- };
169
-
170
- export const getUsdcAddress = (config: Arc402Config) => NETWORK_DEFAULTS[config.network]?.usdcAddress ?? "";
171
-
172
- export function getSubdomainApi(config: Arc402Config): string {
173
- return config.subdomainApi ?? "https://api.arc402.xyz";
174
- }
@@ -1,308 +0,0 @@
1
- /**
2
- * Daemon configuration loader.
3
- * Parses ~/.arc402/daemon.toml, enforces env: prefix for secrets,
4
- * resolves env: values from the environment.
5
- */
6
- import * as fs from "fs";
7
- import * as path from "path";
8
- import * as os from "os";
9
- import { parse as parseToml } from "smol-toml";
10
-
11
- export const DAEMON_DIR = path.join(os.homedir(), ".arc402");
12
- export const DAEMON_TOML = path.join(DAEMON_DIR, "daemon.toml");
13
- export const DAEMON_PID = path.join(DAEMON_DIR, "daemon.pid");
14
- export const DAEMON_LOG = path.join(DAEMON_DIR, "daemon.log");
15
- export const DAEMON_DB = path.join(DAEMON_DIR, "daemon.db");
16
- export const DAEMON_SOCK = path.join(DAEMON_DIR, "daemon.sock");
17
-
18
- export interface DaemonConfig {
19
- wallet: {
20
- contract_address: string;
21
- owner_address: string;
22
- machine_key: string; // must be "env:VAR_NAME"
23
- };
24
- network: {
25
- rpc_url: string;
26
- chain_id: number;
27
- entry_point: string;
28
- };
29
- bundler: {
30
- mode: "external" | "arc402" | "self";
31
- endpoint: string;
32
- earn_fees: boolean;
33
- eth_float: string;
34
- sweep_threshold: string;
35
- sweep_to: string;
36
- rpc_url: string;
37
- };
38
- relay: {
39
- enabled: boolean;
40
- listen_port: number;
41
- endpoint: string;
42
- max_concurrent_agreements: number;
43
- poll_interval_seconds: number;
44
- relay_url: string;
45
- };
46
- watchtower: {
47
- enabled: boolean;
48
- poll_interval_seconds: number;
49
- challenge_confirmation_blocks: number;
50
- external_watchtower_url: string;
51
- update_interval_states: number;
52
- };
53
- policy: {
54
- auto_accept: boolean;
55
- max_price_eth: string;
56
- allowed_capabilities: string[];
57
- require_min_trust_score: number;
58
- min_hire_lead_time_seconds: number;
59
- };
60
- notifications: {
61
- telegram_bot_token: string;
62
- telegram_chat_id: string;
63
- notify_on_hire_request: boolean;
64
- notify_on_hire_accepted: boolean;
65
- notify_on_hire_rejected: boolean;
66
- notify_on_delivery: boolean;
67
- notify_on_dispute: boolean;
68
- notify_on_channel_challenge: boolean;
69
- notify_on_low_balance: boolean;
70
- low_balance_threshold_eth: string;
71
- };
72
- work: {
73
- handler: "exec" | "http" | "noop";
74
- exec_command: string;
75
- http_url: string;
76
- http_auth_token: string;
77
- };
78
- }
79
-
80
- function resolveEnvValue(value: string, field: string): string {
81
- if (!value.startsWith("env:")) return value;
82
- const varName = value.slice(4);
83
- const resolved = process.env[varName];
84
- if (!resolved) {
85
- throw new Error(`Environment variable ${varName} is not set (required for ${field})`);
86
- }
87
- return resolved;
88
- }
89
-
90
- function tryResolveEnvValue(value: string): string {
91
- if (!value.startsWith("env:")) return value;
92
- const varName = value.slice(4);
93
- return process.env[varName] ?? "";
94
- }
95
-
96
- function str(v: unknown, def = ""): string {
97
- return typeof v === "string" ? v : def;
98
- }
99
- function num(v: unknown, def: number): number {
100
- return typeof v === "number" ? v : def;
101
- }
102
- function bool(v: unknown, def: boolean): boolean {
103
- return typeof v === "boolean" ? v : def;
104
- }
105
- function strArr(v: unknown): string[] {
106
- return Array.isArray(v) ? (v as string[]) : [];
107
- }
108
-
109
- function withDefaults(raw: Record<string, unknown>): DaemonConfig {
110
- const w = (raw.wallet as Record<string, unknown>) ?? {};
111
- const n = (raw.network as Record<string, unknown>) ?? {};
112
- const b = (raw.bundler as Record<string, unknown>) ?? {};
113
- const r = (raw.relay as Record<string, unknown>) ?? {};
114
- const wt = (raw.watchtower as Record<string, unknown>) ?? {};
115
- const p = (raw.policy as Record<string, unknown>) ?? {};
116
- const notif = (raw.notifications as Record<string, unknown>) ?? {};
117
- const work = (raw.work as Record<string, unknown>) ?? {};
118
-
119
- return {
120
- wallet: {
121
- contract_address: str(w.contract_address),
122
- owner_address: str(w.owner_address),
123
- machine_key: str(w.machine_key, "env:ARC402_MACHINE_KEY"),
124
- },
125
- network: {
126
- rpc_url: str(n.rpc_url, "https://mainnet.base.org"),
127
- chain_id: num(n.chain_id, 8453),
128
- entry_point: str(n.entry_point, "0x0000000071727De22E5E9d8BAf0edAc6f37da032"),
129
- },
130
- bundler: {
131
- mode: (str(b.mode, "external")) as "external" | "arc402" | "self",
132
- endpoint: str(b.endpoint),
133
- earn_fees: bool(b.earn_fees, false),
134
- eth_float: str(b.eth_float, "0.01"),
135
- sweep_threshold: str(b.sweep_threshold, "0.005"),
136
- sweep_to: str(b.sweep_to),
137
- rpc_url: str(b.rpc_url),
138
- },
139
- relay: {
140
- enabled: bool(r.enabled, true),
141
- listen_port: num(r.listen_port, 4402),
142
- endpoint: str(r.endpoint),
143
- max_concurrent_agreements: num(r.max_concurrent_agreements, 10),
144
- poll_interval_seconds: num(r.poll_interval_seconds, 2),
145
- relay_url: str(r.relay_url),
146
- },
147
- watchtower: {
148
- enabled: bool(wt.enabled, true),
149
- poll_interval_seconds: num(wt.poll_interval_seconds, 60),
150
- challenge_confirmation_blocks: num(wt.challenge_confirmation_blocks, 2),
151
- external_watchtower_url: str(wt.external_watchtower_url),
152
- update_interval_states: num(wt.update_interval_states, 10),
153
- },
154
- policy: {
155
- auto_accept: bool(p.auto_accept, false),
156
- max_price_eth: str(p.max_price_eth, "0.1"),
157
- allowed_capabilities: strArr(p.allowed_capabilities),
158
- require_min_trust_score: num(p.require_min_trust_score, 50),
159
- min_hire_lead_time_seconds: num(p.min_hire_lead_time_seconds, 300),
160
- },
161
- notifications: {
162
- telegram_bot_token: str(notif.telegram_bot_token, "env:TELEGRAM_BOT_TOKEN"),
163
- telegram_chat_id: str(notif.telegram_chat_id, "env:TELEGRAM_CHAT_ID"),
164
- notify_on_hire_request: bool(notif.notify_on_hire_request, true),
165
- notify_on_hire_accepted: bool(notif.notify_on_hire_accepted, true),
166
- notify_on_hire_rejected: bool(notif.notify_on_hire_rejected, true),
167
- notify_on_delivery: bool(notif.notify_on_delivery, true),
168
- notify_on_dispute: bool(notif.notify_on_dispute, true),
169
- notify_on_channel_challenge: bool(notif.notify_on_channel_challenge, true),
170
- notify_on_low_balance: bool(notif.notify_on_low_balance, true),
171
- low_balance_threshold_eth: str(notif.low_balance_threshold_eth, "0.005"),
172
- },
173
- work: {
174
- handler: (str(work.handler, "noop")) as "exec" | "http" | "noop",
175
- exec_command: str(work.exec_command),
176
- http_url: str(work.http_url),
177
- http_auth_token: str(work.http_auth_token),
178
- },
179
- };
180
- }
181
-
182
- export function loadDaemonConfig(configPath = DAEMON_TOML): DaemonConfig {
183
- if (!fs.existsSync(configPath)) {
184
- throw new Error(`daemon.toml not found at ${configPath}. Run: arc402 daemon init`);
185
- }
186
-
187
- const raw = fs.readFileSync(configPath, "utf-8");
188
- let parsed: Record<string, unknown>;
189
- try {
190
- parsed = parseToml(raw) as Record<string, unknown>;
191
- } catch (err) {
192
- throw new Error(`Failed to parse daemon.toml: ${err instanceof Error ? err.message : String(err)}`);
193
- }
194
-
195
- const config = withDefaults(parsed);
196
-
197
- // Required fields
198
- if (!config.wallet.contract_address) {
199
- throw new Error("daemon.toml: wallet.contract_address is required");
200
- }
201
- if (!config.network.rpc_url) {
202
- throw new Error("daemon.toml: network.rpc_url is required");
203
- }
204
- if (!config.network.chain_id) {
205
- throw new Error("daemon.toml: network.chain_id is required");
206
- }
207
-
208
- // Machine key MUST use env: prefix — never hardcoded
209
- if (!config.wallet.machine_key.startsWith("env:")) {
210
- throw new Error("ERROR: machine_key must use env: prefix — never hardcode keys");
211
- }
212
-
213
- // Resolve optional env: values silently (missing = disabled feature)
214
- config.notifications.telegram_bot_token = tryResolveEnvValue(config.notifications.telegram_bot_token);
215
- config.notifications.telegram_chat_id = tryResolveEnvValue(config.notifications.telegram_chat_id);
216
- config.work.http_auth_token = tryResolveEnvValue(config.work.http_auth_token);
217
-
218
- return config;
219
- }
220
-
221
- export function loadMachineKey(config: DaemonConfig): { privateKey: string; address: string } {
222
- const envVarName = config.wallet.machine_key.startsWith("env:")
223
- ? config.wallet.machine_key.slice(4)
224
- : "ARC402_MACHINE_KEY";
225
-
226
- const privateKey = process.env[envVarName];
227
- if (!privateKey) {
228
- throw new Error(`Machine key not found. Set environment variable: ${envVarName}`);
229
- }
230
-
231
- const { ethers } = require("ethers") as typeof import("ethers");
232
- let address: string;
233
- try {
234
- const w = new ethers.Wallet(privateKey);
235
- address = w.address;
236
- } catch {
237
- throw new Error(`Invalid machine key format in ${envVarName}`);
238
- }
239
-
240
- return { privateKey, address };
241
- }
242
-
243
- export const TEMPLATE_DAEMON_TOML = `# ~/.arc402/daemon.toml
244
- # ARC-402 Daemon Configuration
245
- # Generated by: arc402 daemon init
246
- #
247
- # SECURITY: Never put private keys here. Use environment variables.
248
-
249
- [wallet]
250
- contract_address = "" # ARC402Wallet contract address (required)
251
- owner_address = "" # Owner EOA address — for display and verification only
252
- machine_key = "env:ARC402_MACHINE_KEY" # Machine key loaded from environment. NEVER hardcode here.
253
-
254
- [network]
255
- rpc_url = "https://mainnet.base.org" # Public Base RPC (default)
256
- chain_id = 8453 # Base mainnet. Use 84532 for Base Sepolia.
257
- entry_point = "0x0000000071727De22E5E9d8BAf0edAc6f37da032" # ERC-4337 EntryPoint v0.7
258
-
259
- [bundler]
260
- mode = "external" # external | arc402 | self
261
- endpoint = "" # Required when mode = external. Pimlico, Alchemy, etc.
262
- earn_fees = false # self mode only: bundle for other network agents
263
- eth_float = "0.01" # Minimum ETH to maintain in bundler EOA for gas fronting
264
- sweep_threshold = "0.005" # Sweep fees to wallet when bundler EOA exceeds this (ETH)
265
- sweep_to = "" # Sweep destination. Defaults to wallet.contract_address.
266
- rpc_url = "" # self mode: private RPC. Defaults to network.rpc_url if empty.
267
-
268
- [relay]
269
- enabled = true
270
- listen_port = 4402 # Port for incoming relay messages
271
- endpoint = "" # Your public URL — run: arc402 setup endpoint
272
- # Example: https://gigabrain.arc402.xyz
273
- max_concurrent_agreements = 10 # Refuse new hire requests when this many are in-flight
274
- poll_interval_seconds = 2 # How often to poll relay for incoming messages
275
- relay_url = "" # The relay to poll. Defaults to agent metadata relay if empty.
276
-
277
- [watchtower]
278
- enabled = true
279
- poll_interval_seconds = 60 # How often to poll chain for stale-close events
280
- challenge_confirmation_blocks = 2 # Wait N block confirmations before accepting close as final
281
- external_watchtower_url = "" # Register open channels here as backup (Tier 2 watchtower)
282
- update_interval_states = 10 # Forward state to external watchtower every N state changes
283
-
284
- [policy]
285
- auto_accept = false # If true: auto-accept all hire requests within policy bounds
286
- max_price_eth = "0.1" # Refuse any hire priced above this (ETH)
287
- allowed_capabilities = [] # Empty list = accept any capability. Non-empty = whitelist.
288
- require_min_trust_score = 50 # Refuse hirers whose wallet trust score is below this (0–100)
289
- min_hire_lead_time_seconds = 300 # Refuse hires with delivery deadline < this many seconds away
290
-
291
- [notifications]
292
- telegram_bot_token = "env:TELEGRAM_BOT_TOKEN" # Load from env, not hardcoded
293
- telegram_chat_id = "env:TELEGRAM_CHAT_ID" # Load from env, not hardcoded
294
- notify_on_hire_request = true # Notify when a hire request arrives (pending approval)
295
- notify_on_hire_accepted = true # Notify when daemon accepts a hire
296
- notify_on_hire_rejected = true # Notify when daemon rejects a hire
297
- notify_on_delivery = true # Notify when work is delivered and fulfill() submitted
298
- notify_on_dispute = true # Notify when a dispute is raised (by either party)
299
- notify_on_channel_challenge = true # Notify when watchtower submits a channel challenge
300
- notify_on_low_balance = false # Disabled by default — enable if you want balance alerts
301
- low_balance_threshold_eth = "0.005" # Balance alert threshold
302
-
303
- [work]
304
- handler = "noop" # exec | http | noop
305
- exec_command = "" # called with agreementId and spec as args (exec mode)
306
- http_url = "" # POST {agreementId, specHash, deadline} as JSON (http mode)
307
- http_auth_token = "env:WORKER_AUTH_TOKEN"
308
- `;