arc402-cli 1.0.0-rc.1 → 1.0.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 (253) hide show
  1. package/README.md +41 -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/wallet.d.ts.map +1 -1
  28. package/dist/commands/wallet.js +299 -65
  29. package/dist/commands/wallet.js.map +1 -1
  30. package/dist/commands/watch.d.ts.map +1 -1
  31. package/dist/commands/watch.js +146 -9
  32. package/dist/commands/watch.js.map +1 -1
  33. package/dist/commands/workroom.d.ts.map +1 -1
  34. package/dist/commands/workroom.js +112 -6
  35. package/dist/commands/workroom.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +41 -4
  39. package/dist/config.js.map +1 -1
  40. package/dist/daemon/compute-metering.d.ts +61 -0
  41. package/dist/daemon/compute-metering.d.ts.map +1 -0
  42. package/dist/daemon/compute-metering.js +299 -0
  43. package/dist/daemon/compute-metering.js.map +1 -0
  44. package/dist/daemon/compute-session.d.ts +100 -0
  45. package/dist/daemon/compute-session.d.ts.map +1 -0
  46. package/dist/daemon/compute-session.js +231 -0
  47. package/dist/daemon/compute-session.js.map +1 -0
  48. package/dist/daemon/config.d.ts +33 -1
  49. package/dist/daemon/config.d.ts.map +1 -1
  50. package/dist/daemon/config.js +69 -0
  51. package/dist/daemon/config.js.map +1 -1
  52. package/dist/daemon/credentials.d.ts +24 -0
  53. package/dist/daemon/credentials.d.ts.map +1 -0
  54. package/dist/daemon/credentials.js +80 -0
  55. package/dist/daemon/credentials.js.map +1 -0
  56. package/dist/daemon/delivery-client.d.ts +35 -0
  57. package/dist/daemon/delivery-client.d.ts.map +1 -0
  58. package/dist/daemon/delivery-client.js +231 -0
  59. package/dist/daemon/delivery-client.js.map +1 -0
  60. package/dist/daemon/file-delivery.d.ts +98 -0
  61. package/dist/daemon/file-delivery.d.ts.map +1 -0
  62. package/dist/daemon/file-delivery.js +461 -0
  63. package/dist/daemon/file-delivery.js.map +1 -0
  64. package/dist/daemon/index.d.ts +1 -0
  65. package/dist/daemon/index.d.ts.map +1 -1
  66. package/dist/daemon/index.js +793 -227
  67. package/dist/daemon/index.js.map +1 -1
  68. package/dist/daemon/notify.d.ts +35 -6
  69. package/dist/daemon/notify.d.ts.map +1 -1
  70. package/dist/daemon/notify.js +176 -48
  71. package/dist/daemon/notify.js.map +1 -1
  72. package/dist/daemon/worker-executor.d.ts +71 -0
  73. package/dist/daemon/worker-executor.d.ts.map +1 -0
  74. package/dist/daemon/worker-executor.js +382 -0
  75. package/dist/daemon/worker-executor.js.map +1 -0
  76. package/dist/drain-v4.js +2 -2
  77. package/dist/drain-v4.js.map +1 -1
  78. package/dist/endpoint-notify.d.ts +9 -1
  79. package/dist/endpoint-notify.d.ts.map +1 -1
  80. package/dist/endpoint-notify.js +116 -3
  81. package/dist/endpoint-notify.js.map +1 -1
  82. package/dist/index.js +81 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +6 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/repl.d.ts.map +1 -1
  88. package/dist/repl.js +69 -486
  89. package/dist/repl.js.map +1 -1
  90. package/dist/tui/App.d.ts +12 -0
  91. package/dist/tui/App.d.ts.map +1 -0
  92. package/dist/tui/App.js +154 -0
  93. package/dist/tui/App.js.map +1 -0
  94. package/dist/tui/Footer.d.ts +11 -0
  95. package/dist/tui/Footer.d.ts.map +1 -0
  96. package/dist/tui/Footer.js +13 -0
  97. package/dist/tui/Footer.js.map +1 -0
  98. package/dist/tui/Header.d.ts +14 -0
  99. package/dist/tui/Header.d.ts.map +1 -0
  100. package/dist/tui/Header.js +19 -0
  101. package/dist/tui/Header.js.map +1 -0
  102. package/dist/tui/InputLine.d.ts +11 -0
  103. package/dist/tui/InputLine.d.ts.map +1 -0
  104. package/dist/tui/InputLine.js +145 -0
  105. package/dist/tui/InputLine.js.map +1 -0
  106. package/dist/tui/Viewport.d.ts +14 -0
  107. package/dist/tui/Viewport.d.ts.map +1 -0
  108. package/dist/tui/Viewport.js +48 -0
  109. package/dist/tui/Viewport.js.map +1 -0
  110. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  111. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  112. package/dist/tui/WalletConnectPairing.js +61 -0
  113. package/dist/tui/WalletConnectPairing.js.map +1 -0
  114. package/dist/tui/components/Button.d.ts +7 -0
  115. package/dist/tui/components/Button.d.ts.map +1 -0
  116. package/dist/tui/components/Button.js +21 -0
  117. package/dist/tui/components/Button.js.map +1 -0
  118. package/dist/tui/components/CeremonyView.d.ts +13 -0
  119. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  120. package/dist/tui/components/CeremonyView.js +10 -0
  121. package/dist/tui/components/CeremonyView.js.map +1 -0
  122. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  123. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  124. package/dist/tui/components/CompletionDropdown.js +23 -0
  125. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  126. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  127. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  128. package/dist/tui/components/ConfirmPrompt.js +10 -0
  129. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  130. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  131. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  132. package/dist/tui/components/CustomTextInput.js +99 -0
  133. package/dist/tui/components/CustomTextInput.js.map +1 -0
  134. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  135. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  136. package/dist/tui/components/InteractiveTable.js +61 -0
  137. package/dist/tui/components/InteractiveTable.js.map +1 -0
  138. package/dist/tui/components/StepSpinner.d.ts +11 -0
  139. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  140. package/dist/tui/components/StepSpinner.js +32 -0
  141. package/dist/tui/components/StepSpinner.js.map +1 -0
  142. package/dist/tui/components/Toast.d.ts +18 -0
  143. package/dist/tui/components/Toast.d.ts.map +1 -0
  144. package/dist/tui/components/Toast.js +29 -0
  145. package/dist/tui/components/Toast.js.map +1 -0
  146. package/dist/tui/index.d.ts +2 -0
  147. package/dist/tui/index.d.ts.map +1 -0
  148. package/dist/tui/index.js +55 -0
  149. package/dist/tui/index.js.map +1 -0
  150. package/dist/tui/useChat.d.ts +11 -0
  151. package/dist/tui/useChat.d.ts.map +1 -0
  152. package/dist/tui/useChat.js +91 -0
  153. package/dist/tui/useChat.js.map +1 -0
  154. package/dist/tui/useCommand.d.ts +12 -0
  155. package/dist/tui/useCommand.d.ts.map +1 -0
  156. package/dist/tui/useCommand.js +137 -0
  157. package/dist/tui/useCommand.js.map +1 -0
  158. package/dist/tui/useNotifications.d.ts +9 -0
  159. package/dist/tui/useNotifications.d.ts.map +1 -0
  160. package/dist/tui/useNotifications.js +17 -0
  161. package/dist/tui/useNotifications.js.map +1 -0
  162. package/dist/tui/useScroll.d.ts +17 -0
  163. package/dist/tui/useScroll.d.ts.map +1 -0
  164. package/dist/tui/useScroll.js +46 -0
  165. package/dist/tui/useScroll.js.map +1 -0
  166. package/dist/ui/format.d.ts.map +1 -1
  167. package/dist/ui/format.js +2 -0
  168. package/dist/ui/format.js.map +1 -1
  169. package/dist/ui/qr-render.d.ts +25 -0
  170. package/dist/ui/qr-render.d.ts.map +1 -0
  171. package/dist/ui/qr-render.js +90 -0
  172. package/dist/ui/qr-render.js.map +1 -0
  173. package/dist/ui/rpc-fallback.d.ts +11 -0
  174. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  175. package/dist/ui/rpc-fallback.js +58 -0
  176. package/dist/ui/rpc-fallback.js.map +1 -0
  177. package/dist/walletconnect.d.ts +4 -0
  178. package/dist/walletconnect.d.ts.map +1 -1
  179. package/dist/walletconnect.js.map +1 -1
  180. package/package.json +10 -2
  181. package/scripts/authorize-machine-key.ts +0 -43
  182. package/scripts/drain-wallet.ts +0 -149
  183. package/scripts/execute-spend-only.ts +0 -81
  184. package/scripts/register-agent-userop.ts +0 -186
  185. package/src/abis.ts +0 -187
  186. package/src/bundler.ts +0 -235
  187. package/src/client.ts +0 -36
  188. package/src/coinbase-smart-wallet.ts +0 -51
  189. package/src/commands/accept.ts +0 -64
  190. package/src/commands/agent-handshake.ts +0 -72
  191. package/src/commands/agent.ts +0 -691
  192. package/src/commands/agreements.ts +0 -350
  193. package/src/commands/arbitrator.ts +0 -180
  194. package/src/commands/arena-handshake.ts +0 -257
  195. package/src/commands/arena.ts +0 -122
  196. package/src/commands/cancel.ts +0 -35
  197. package/src/commands/channel.ts +0 -218
  198. package/src/commands/coldstart.ts +0 -165
  199. package/src/commands/config.ts +0 -58
  200. package/src/commands/contract-interaction.ts +0 -166
  201. package/src/commands/daemon.ts +0 -978
  202. package/src/commands/deliver.ts +0 -148
  203. package/src/commands/discover.ts +0 -297
  204. package/src/commands/dispute.ts +0 -375
  205. package/src/commands/endpoint.ts +0 -620
  206. package/src/commands/feed.ts +0 -229
  207. package/src/commands/hire.ts +0 -245
  208. package/src/commands/migrate.ts +0 -177
  209. package/src/commands/negotiate.ts +0 -271
  210. package/src/commands/openshell.ts +0 -1055
  211. package/src/commands/owner.ts +0 -35
  212. package/src/commands/policy.ts +0 -263
  213. package/src/commands/relay.ts +0 -273
  214. package/src/commands/remediate.ts +0 -24
  215. package/src/commands/reputation.ts +0 -79
  216. package/src/commands/setup.ts +0 -343
  217. package/src/commands/trust.ts +0 -27
  218. package/src/commands/verify.ts +0 -91
  219. package/src/commands/wallet.ts +0 -3280
  220. package/src/commands/watch.ts +0 -23
  221. package/src/commands/watchtower.ts +0 -248
  222. package/src/commands/workroom.ts +0 -959
  223. package/src/config.ts +0 -174
  224. package/src/daemon/config.ts +0 -308
  225. package/src/daemon/hire-listener.ts +0 -226
  226. package/src/daemon/index.ts +0 -955
  227. package/src/daemon/job-lifecycle.ts +0 -215
  228. package/src/daemon/notify.ts +0 -157
  229. package/src/daemon/token-metering.ts +0 -183
  230. package/src/daemon/userops.ts +0 -119
  231. package/src/daemon/wallet-monitor.ts +0 -90
  232. package/src/drain-v4.ts +0 -159
  233. package/src/endpoint-config.ts +0 -83
  234. package/src/endpoint-notify.ts +0 -46
  235. package/src/index.ts +0 -26
  236. package/src/openshell-runtime.ts +0 -277
  237. package/src/program.ts +0 -83
  238. package/src/repl.ts +0 -680
  239. package/src/signing.ts +0 -28
  240. package/src/telegram-notify.ts +0 -88
  241. package/src/ui/banner.ts +0 -51
  242. package/src/ui/colors.ts +0 -30
  243. package/src/ui/format.ts +0 -77
  244. package/src/ui/spinner.ts +0 -56
  245. package/src/ui/tree.ts +0 -16
  246. package/src/utils/format.ts +0 -48
  247. package/src/utils/hash.ts +0 -5
  248. package/src/utils/time.ts +0 -15
  249. package/src/wallet-router.ts +0 -178
  250. package/src/walletconnect-session.ts +0 -27
  251. package/src/walletconnect.ts +0 -294
  252. package/test/time.test.js +0 -11
  253. 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
- `;