arc402-cli 0.9.19 → 0.10.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/README.md +41 -2
- package/dist/abis.d.ts +1 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +45 -14
- package/dist/abis.js.map +1 -1
- package/dist/bundler.d.ts +1 -1
- package/dist/bundler.d.ts.map +1 -1
- package/dist/bundler.js +61 -27
- package/dist/bundler.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -5
- package/dist/client.js.map +1 -1
- package/dist/coinbase-smart-wallet.js +4 -1
- package/dist/coinbase-smart-wallet.js.map +1 -1
- package/dist/commands/accept.js +28 -25
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/agent-handshake.js +18 -15
- package/dist/commands/agent-handshake.js.map +1 -1
- package/dist/commands/agent.js +104 -98
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/agreements.js +98 -62
- package/dist/commands/agreements.js.map +1 -1
- package/dist/commands/arbitrator.js +81 -45
- package/dist/commands/arbitrator.js.map +1 -1
- package/dist/commands/arena-handshake.d.ts.map +1 -1
- package/dist/commands/arena-handshake.js +35 -53
- package/dist/commands/arena-handshake.js.map +1 -1
- package/dist/commands/arena.js +18 -12
- package/dist/commands/arena.js.map +1 -1
- package/dist/commands/backup.js +36 -30
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/cancel.js +18 -15
- package/dist/commands/cancel.js.map +1 -1
- package/dist/commands/channel.js +81 -45
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/coldstart.js +34 -31
- package/dist/commands/coldstart.js.map +1 -1
- package/dist/commands/compute.d.ts +14 -0
- package/dist/commands/compute.d.ts.map +1 -0
- package/dist/commands/compute.js +466 -0
- package/dist/commands/compute.js.map +1 -0
- package/dist/commands/config.js +30 -24
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contract-interaction.js +15 -12
- package/dist/commands/contract-interaction.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +135 -98
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deliver.js +76 -37
- package/dist/commands/deliver.js.map +1 -1
- package/dist/commands/discover.js +27 -24
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/dispute.js +110 -104
- package/dist/commands/dispute.js.map +1 -1
- package/dist/commands/doctor.js +55 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/endpoint.js +95 -56
- package/dist/commands/endpoint.js.map +1 -1
- package/dist/commands/feed.js +18 -11
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/hire.js +40 -37
- package/dist/commands/hire.js.map +1 -1
- package/dist/commands/migrate.js +33 -30
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/negotiate.d.ts.map +1 -1
- package/dist/commands/negotiate.js +36 -34
- package/dist/commands/negotiate.js.map +1 -1
- package/dist/commands/openshell.js +104 -68
- package/dist/commands/openshell.js.map +1 -1
- package/dist/commands/owner.js +20 -17
- package/dist/commands/owner.js.map +1 -1
- package/dist/commands/policy.js +43 -41
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/relay.d.ts.map +1 -1
- package/dist/commands/relay.js +51 -18
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/remediate.js +23 -20
- package/dist/commands/remediate.js.map +1 -1
- package/dist/commands/reputation.js +27 -25
- package/dist/commands/reputation.js.map +1 -1
- package/dist/commands/setup.js +104 -65
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/trust.js +20 -17
- package/dist/commands/trust.js.map +1 -1
- package/dist/commands/verify.js +21 -18
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +645 -679
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.js +36 -33
- package/dist/commands/watch.js.map +1 -1
- package/dist/commands/watchtower.js +73 -37
- package/dist/commands/watchtower.js.map +1 -1
- package/dist/commands/workroom.d.ts.map +1 -1
- package/dist/commands/workroom.js +282 -143
- package/dist/commands/workroom.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +71 -22
- package/dist/config.js.map +1 -1
- package/dist/daemon/compute-metering.d.ts +61 -0
- package/dist/daemon/compute-metering.d.ts.map +1 -0
- package/dist/daemon/compute-metering.js +299 -0
- package/dist/daemon/compute-metering.js.map +1 -0
- package/dist/daemon/compute-session.d.ts +100 -0
- package/dist/daemon/compute-session.d.ts.map +1 -0
- package/dist/daemon/compute-session.js +231 -0
- package/dist/daemon/compute-session.js.map +1 -0
- package/dist/daemon/config.d.ts +19 -1
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +90 -16
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/credentials.d.ts +24 -0
- package/dist/daemon/credentials.d.ts.map +1 -0
- package/dist/daemon/credentials.js +80 -0
- package/dist/daemon/credentials.js.map +1 -0
- package/dist/daemon/delivery-client.d.ts +35 -0
- package/dist/daemon/delivery-client.d.ts.map +1 -0
- package/dist/daemon/delivery-client.js +231 -0
- package/dist/daemon/delivery-client.js.map +1 -0
- package/dist/daemon/file-delivery.d.ts +98 -0
- package/dist/daemon/file-delivery.d.ts.map +1 -0
- package/dist/daemon/file-delivery.js +461 -0
- package/dist/daemon/file-delivery.js.map +1 -0
- package/dist/daemon/hire-listener.d.ts +3 -3
- package/dist/daemon/hire-listener.d.ts.map +1 -1
- package/dist/daemon/hire-listener.js +47 -13
- package/dist/daemon/hire-listener.js.map +1 -1
- package/dist/daemon/index.d.ts +2 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +526 -53
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/job-lifecycle.d.ts +1 -1
- package/dist/daemon/job-lifecycle.d.ts.map +1 -1
- package/dist/daemon/job-lifecycle.js +51 -11
- package/dist/daemon/job-lifecycle.js.map +1 -1
- package/dist/daemon/notify.d.ts +1 -1
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +53 -19
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/token-metering.js +47 -8
- package/dist/daemon/token-metering.js.map +1 -1
- package/dist/daemon/userops.d.ts +2 -2
- package/dist/daemon/userops.d.ts.map +1 -1
- package/dist/daemon/userops.js +27 -23
- package/dist/daemon/userops.js.map +1 -1
- package/dist/daemon/wallet-monitor.d.ts +1 -1
- package/dist/daemon/wallet-monitor.d.ts.map +1 -1
- package/dist/daemon/wallet-monitor.js +12 -8
- package/dist/daemon/wallet-monitor.js.map +1 -1
- package/dist/daemon/worker-executor.d.ts +71 -0
- package/dist/daemon/worker-executor.d.ts.map +1 -0
- package/dist/daemon/worker-executor.js +382 -0
- package/dist/daemon/worker-executor.js.map +1 -0
- package/dist/drain-v4.js +64 -26
- package/dist/drain-v4.js.map +1 -1
- package/dist/endpoint-config.js +63 -20
- package/dist/endpoint-config.js.map +1 -1
- package/dist/endpoint-notify.d.ts.map +1 -1
- package/dist/endpoint-notify.js +49 -15
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +50 -18
- package/dist/index.js.map +1 -1
- package/dist/openshell-runtime.d.ts.map +1 -1
- package/dist/openshell-runtime.js +82 -38
- package/dist/openshell-runtime.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +85 -78
- package/dist/program.js.map +1 -1
- package/dist/repl.js +31 -25
- package/dist/repl.js.map +1 -1
- package/dist/signing.js +6 -3
- package/dist/signing.js.map +1 -1
- package/dist/telegram-notify.js +40 -3
- package/dist/telegram-notify.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +56 -89
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Footer.js +7 -4
- package/dist/tui/Footer.js.map +1 -1
- package/dist/tui/Header.d.ts +1 -1
- package/dist/tui/Header.d.ts.map +1 -1
- package/dist/tui/Header.js +14 -9
- package/dist/tui/Header.js.map +1 -1
- package/dist/tui/InputLine.d.ts +2 -1
- package/dist/tui/InputLine.d.ts.map +1 -1
- package/dist/tui/InputLine.js +47 -97
- package/dist/tui/InputLine.js.map +1 -1
- package/dist/tui/Viewport.d.ts +1 -2
- package/dist/tui/Viewport.d.ts.map +1 -1
- package/dist/tui/Viewport.js +26 -6
- package/dist/tui/Viewport.js.map +1 -1
- package/dist/tui/WalletConnectPairing.js +19 -16
- package/dist/tui/WalletConnectPairing.js.map +1 -1
- package/dist/tui/components/Button.js +9 -6
- package/dist/tui/components/Button.js.map +1 -1
- package/dist/tui/components/CeremonyView.js +8 -5
- package/dist/tui/components/CeremonyView.js.map +1 -1
- package/dist/tui/components/CompletionDropdown.js +9 -6
- package/dist/tui/components/CompletionDropdown.js.map +1 -1
- package/dist/tui/components/ConfirmPrompt.js +8 -5
- package/dist/tui/components/ConfirmPrompt.js.map +1 -1
- package/dist/tui/components/CustomTextInput.js +14 -11
- package/dist/tui/components/CustomTextInput.js.map +1 -1
- package/dist/tui/components/InteractiveTable.js +12 -9
- package/dist/tui/components/InteractiveTable.js.map +1 -1
- package/dist/tui/components/StepSpinner.js +13 -10
- package/dist/tui/components/StepSpinner.js.map +1 -1
- package/dist/tui/components/Toast.js +12 -8
- package/dist/tui/components/Toast.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +21 -28
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/useChat.js +19 -13
- package/dist/tui/useChat.js.map +1 -1
- package/dist/tui/useCommand.d.ts +2 -3
- package/dist/tui/useCommand.d.ts.map +1 -1
- package/dist/tui/useCommand.js +24 -100
- package/dist/tui/useCommand.js.map +1 -1
- package/dist/tui/useNotifications.js +8 -5
- package/dist/tui/useNotifications.js.map +1 -1
- package/dist/tui/useScroll.d.ts.map +1 -1
- package/dist/tui/useScroll.js +12 -15
- package/dist/tui/useScroll.js.map +1 -1
- package/dist/ui/banner.d.ts +0 -12
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +19 -35
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/colors.js +19 -13
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/format.js +14 -6
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/qr-render.js +11 -4
- package/dist/ui/qr-render.js.map +1 -1
- package/dist/ui/rpc-fallback.js +11 -6
- package/dist/ui/rpc-fallback.js.map +1 -1
- package/dist/ui/spinner.js +12 -6
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/tree.js +6 -3
- package/dist/ui/tree.js.map +1 -1
- package/dist/utils/format.js +41 -27
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/hash.js +42 -4
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/time.js +6 -2
- package/dist/utils/time.js.map +1 -1
- package/dist/wallet-router.d.ts +1 -1
- package/dist/wallet-router.d.ts.map +1 -1
- package/dist/wallet-router.js +19 -12
- package/dist/wallet-router.js.map +1 -1
- package/dist/walletconnect-session.d.ts +1 -1
- package/dist/walletconnect-session.d.ts.map +1 -1
- package/dist/walletconnect-session.js +11 -6
- package/dist/walletconnect-session.js.map +1 -1
- package/dist/walletconnect.d.ts +5 -6
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +35 -32
- package/dist/walletconnect.js.map +1 -1
- package/package.json +11 -10
- package/INK6-UX-SPEC.md +0 -446
- package/MIGRATION-SPEC.md +0 -108
- package/TUI-SPEC.md +0 -214
- package/scripts/authorize-machine-key.ts +0 -43
- package/scripts/drain-wallet.ts +0 -149
- package/scripts/execute-spend-only.ts +0 -81
- package/scripts/register-agent-userop.ts +0 -186
- package/src/abis.ts +0 -187
- package/src/bundler.ts +0 -235
- package/src/client.ts +0 -36
- package/src/coinbase-smart-wallet.ts +0 -51
- package/src/commands/accept.ts +0 -64
- package/src/commands/agent-handshake.ts +0 -72
- package/src/commands/agent.ts +0 -691
- package/src/commands/agreements.ts +0 -350
- package/src/commands/arbitrator.ts +0 -180
- package/src/commands/arena-handshake.ts +0 -274
- package/src/commands/arena.ts +0 -122
- package/src/commands/backup.ts +0 -117
- package/src/commands/cancel.ts +0 -35
- package/src/commands/channel.ts +0 -218
- package/src/commands/coldstart.ts +0 -165
- package/src/commands/config.ts +0 -68
- package/src/commands/contract-interaction.ts +0 -166
- package/src/commands/daemon.ts +0 -1054
- package/src/commands/deliver.ts +0 -148
- package/src/commands/discover.ts +0 -350
- package/src/commands/dispute.ts +0 -375
- package/src/commands/doctor.ts +0 -172
- package/src/commands/endpoint.ts +0 -620
- package/src/commands/feed.ts +0 -229
- package/src/commands/hire.ts +0 -245
- package/src/commands/migrate.ts +0 -177
- package/src/commands/negotiate.ts +0 -272
- package/src/commands/openshell.ts +0 -1055
- package/src/commands/owner.ts +0 -35
- package/src/commands/policy.ts +0 -263
- package/src/commands/relay.ts +0 -277
- package/src/commands/remediate.ts +0 -24
- package/src/commands/reputation.ts +0 -79
- package/src/commands/setup.ts +0 -343
- package/src/commands/trust.ts +0 -27
- package/src/commands/verify.ts +0 -91
- package/src/commands/wallet.ts +0 -3548
- package/src/commands/watch.ts +0 -220
- package/src/commands/watchtower.ts +0 -248
- package/src/commands/workroom.ts +0 -963
- package/src/config.ts +0 -220
- package/src/daemon/config.ts +0 -344
- package/src/daemon/hire-listener.ts +0 -226
- package/src/daemon/index.ts +0 -1089
- package/src/daemon/job-lifecycle.ts +0 -215
- package/src/daemon/notify.ts +0 -297
- package/src/daemon/token-metering.ts +0 -183
- package/src/daemon/userops.ts +0 -119
- package/src/daemon/wallet-monitor.ts +0 -90
- package/src/drain-v4.ts +0 -159
- package/src/endpoint-config.ts +0 -83
- package/src/endpoint-notify.ts +0 -134
- package/src/index.ts +0 -74
- package/src/openshell-runtime.ts +0 -281
- package/src/program.ts +0 -88
- package/src/repl.ts +0 -178
- package/src/signing.ts +0 -28
- package/src/telegram-notify.ts +0 -88
- package/src/tui/App.tsx +0 -263
- package/src/tui/Footer.tsx +0 -18
- package/src/tui/Header.tsx +0 -45
- package/src/tui/InputLine.tsx +0 -243
- package/src/tui/Viewport.tsx +0 -51
- package/src/tui/WalletConnectPairing.tsx +0 -114
- package/src/tui/components/Button.tsx +0 -38
- package/src/tui/components/CeremonyView.tsx +0 -39
- package/src/tui/components/CompletionDropdown.tsx +0 -56
- package/src/tui/components/ConfirmPrompt.tsx +0 -36
- package/src/tui/components/CustomTextInput.tsx +0 -132
- package/src/tui/components/InteractiveTable.tsx +0 -106
- package/src/tui/components/StepSpinner.tsx +0 -84
- package/src/tui/components/Toast.tsx +0 -59
- package/src/tui/index.tsx +0 -90
- package/src/tui/useChat.ts +0 -103
- package/src/tui/useCommand.ts +0 -238
- package/src/tui/useNotifications.ts +0 -28
- package/src/tui/useScroll.ts +0 -69
- package/src/ui/banner.ts +0 -78
- package/src/ui/colors.ts +0 -30
- package/src/ui/format.ts +0 -78
- package/src/ui/qr-render.ts +0 -92
- package/src/ui/rpc-fallback.ts +0 -59
- package/src/ui/spinner.ts +0 -56
- package/src/ui/tree.ts +0 -16
- package/src/utils/format.ts +0 -48
- package/src/utils/hash.ts +0 -5
- package/src/utils/time.ts +0 -15
- package/src/wallet-router.ts +0 -178
- package/src/walletconnect-session.ts +0 -27
- package/src/walletconnect.ts +0 -309
- package/test/time.test.js +0 -11
- package/tsconfig.json +0 -33
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkerExecutor = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* ARC-402 Worker Executor
|
|
39
|
+
*
|
|
40
|
+
* Spawns an agent to complete hired work inside the job directory.
|
|
41
|
+
* On completion, scans the job dir for output files and uploads them to
|
|
42
|
+
* FileDeliveryManager. Computes root hash for on-chain delivery.
|
|
43
|
+
*
|
|
44
|
+
* Supported agent runtimes:
|
|
45
|
+
* - openclaw (preferred): Full OpenClaw gateway — can spawn any ACP
|
|
46
|
+
* (Claude Code, Codex, Gemini, Pi, etc.) and orchestrate multi-agent work.
|
|
47
|
+
* Command: openclaw run '<task>' --workdir <jobDir>
|
|
48
|
+
* - claude-code: Direct Claude Code CLI.
|
|
49
|
+
* Command: claude --permission-mode bypassPermissions --print '<task>'
|
|
50
|
+
* - codex: Direct Codex CLI.
|
|
51
|
+
* Command: codex --print '<task>'
|
|
52
|
+
* - shell: Raw shell execution.
|
|
53
|
+
* Command: /bin/sh -c '<task>'
|
|
54
|
+
*
|
|
55
|
+
* Job directory: ~/.arc402/jobs/agreement-<id>/
|
|
56
|
+
*/
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const os = __importStar(require("os"));
|
|
60
|
+
const child_process_1 = require("child_process");
|
|
61
|
+
const job_lifecycle_js_1 = require("./job-lifecycle.js");
|
|
62
|
+
const ARC402_DIR = path.join(os.homedir(), ".arc402");
|
|
63
|
+
const JOBS_DIR = path.join(ARC402_DIR, "jobs");
|
|
64
|
+
const WORKER_DIR = process.env.ARC402_WORKER_DIR || path.join(ARC402_DIR, "worker");
|
|
65
|
+
// ─── Helpers: read worker context ─────────────────────────────────────────────
|
|
66
|
+
function readFileOrEmpty(filePath) {
|
|
67
|
+
try {
|
|
68
|
+
return fs.readFileSync(filePath, "utf-8").trim();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read all .md files from a directory, concatenated, up to maxBytes.
|
|
76
|
+
* Returns empty string if dir doesn't exist or is empty.
|
|
77
|
+
*/
|
|
78
|
+
function readDirMd(dirPath, maxBytes) {
|
|
79
|
+
if (!fs.existsSync(dirPath))
|
|
80
|
+
return "";
|
|
81
|
+
const parts = [];
|
|
82
|
+
let totalSize = 0;
|
|
83
|
+
try {
|
|
84
|
+
const files = fs.readdirSync(dirPath)
|
|
85
|
+
.filter(f => f.endsWith(".md") || f.endsWith(".txt") || f.endsWith(".json"))
|
|
86
|
+
.sort();
|
|
87
|
+
for (const file of files) {
|
|
88
|
+
if (file.startsWith("."))
|
|
89
|
+
continue;
|
|
90
|
+
const content = readFileOrEmpty(path.join(dirPath, file));
|
|
91
|
+
if (!content)
|
|
92
|
+
continue;
|
|
93
|
+
const entry = `### ${file}\n${content}`;
|
|
94
|
+
if (totalSize + entry.length > maxBytes)
|
|
95
|
+
break;
|
|
96
|
+
parts.push(entry);
|
|
97
|
+
totalSize += entry.length;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch { /* dir unreadable */ }
|
|
101
|
+
return parts.join("\n\n");
|
|
102
|
+
}
|
|
103
|
+
// ─── WorkerExecutor ───────────────────────────────────────────────────────────
|
|
104
|
+
class WorkerExecutor {
|
|
105
|
+
constructor(opts) {
|
|
106
|
+
this.jobs = new Map();
|
|
107
|
+
this.queue = [];
|
|
108
|
+
this.runningCount = 0;
|
|
109
|
+
// Callback invoked when a job completes with a root hash
|
|
110
|
+
this.onJobCompleted = null;
|
|
111
|
+
this.onJobFailed = null;
|
|
112
|
+
this.log = () => { };
|
|
113
|
+
this.maxConcurrentJobs = opts.maxConcurrentJobs ?? 2;
|
|
114
|
+
this.jobTimeoutMs = (opts.jobTimeoutSeconds ?? 3600) * 1000;
|
|
115
|
+
this.agentType = opts.agentType ?? "claude-code";
|
|
116
|
+
this.autoExecute = opts.autoExecute ?? true;
|
|
117
|
+
this.delivery = opts.delivery;
|
|
118
|
+
}
|
|
119
|
+
// ── Public API ────────────────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Enqueue a job. If auto_execute is true, starts immediately (up to concurrency limit).
|
|
122
|
+
* Returns the WorkerExecution record.
|
|
123
|
+
*/
|
|
124
|
+
enqueue(params) {
|
|
125
|
+
const { agreementId, capability, specHash } = params;
|
|
126
|
+
// Idempotent — return existing record if present
|
|
127
|
+
const existing = this.jobs.get(agreementId);
|
|
128
|
+
if (existing)
|
|
129
|
+
return this.toPublic(existing);
|
|
130
|
+
const jobDir = (0, job_lifecycle_js_1.createJobDirectory)(agreementId);
|
|
131
|
+
// Write task.md to job dir
|
|
132
|
+
const taskText = params.taskDescription ?? this.buildTask(capability, specHash, agreementId);
|
|
133
|
+
fs.writeFileSync(path.join(jobDir, "task.md"), taskText, "utf-8");
|
|
134
|
+
const record = {
|
|
135
|
+
agreementId,
|
|
136
|
+
capability,
|
|
137
|
+
specHash,
|
|
138
|
+
jobDir,
|
|
139
|
+
agentType: this.agentType,
|
|
140
|
+
pid: null,
|
|
141
|
+
status: "queued",
|
|
142
|
+
startedAt: Date.now(),
|
|
143
|
+
completedAt: null,
|
|
144
|
+
exitCode: null,
|
|
145
|
+
deliverableHash: null,
|
|
146
|
+
error: null,
|
|
147
|
+
process: null,
|
|
148
|
+
timeoutHandle: null,
|
|
149
|
+
};
|
|
150
|
+
this.jobs.set(agreementId, record);
|
|
151
|
+
this.queue.push(agreementId);
|
|
152
|
+
this.log({ event: "worker_queued", agreement_id: agreementId, capability });
|
|
153
|
+
if (this.autoExecute) {
|
|
154
|
+
this.drainQueue();
|
|
155
|
+
}
|
|
156
|
+
return this.toPublic(record);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get current status of a job.
|
|
160
|
+
*/
|
|
161
|
+
getStatus(agreementId) {
|
|
162
|
+
const rec = this.jobs.get(agreementId);
|
|
163
|
+
return rec ? this.toPublic(rec) : null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get all jobs (for status IPC command).
|
|
167
|
+
*/
|
|
168
|
+
listAll() {
|
|
169
|
+
return Array.from(this.jobs.values()).map(r => this.toPublic(r));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Read job log contents (for worker-logs IPC command).
|
|
173
|
+
*/
|
|
174
|
+
readLog(agreementId, tail = 200) {
|
|
175
|
+
const logPath = path.join(JOBS_DIR, `agreement-${agreementId}`, "job.log");
|
|
176
|
+
if (!fs.existsSync(logPath))
|
|
177
|
+
return "(no log yet)";
|
|
178
|
+
try {
|
|
179
|
+
const content = fs.readFileSync(logPath, "utf-8");
|
|
180
|
+
const lines = content.split("\n");
|
|
181
|
+
return lines.slice(-tail).join("\n");
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return "(could not read log)";
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Cancel a queued job. Cannot cancel running jobs.
|
|
189
|
+
*/
|
|
190
|
+
cancel(agreementId) {
|
|
191
|
+
const rec = this.jobs.get(agreementId);
|
|
192
|
+
if (!rec || rec.status !== "queued")
|
|
193
|
+
return false;
|
|
194
|
+
rec.status = "failed";
|
|
195
|
+
rec.error = "cancelled";
|
|
196
|
+
rec.completedAt = Date.now();
|
|
197
|
+
this.queue = this.queue.filter(id => id !== agreementId);
|
|
198
|
+
this.log({ event: "worker_cancelled", agreement_id: agreementId });
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
// ── Execution ─────────────────────────────────────────────────────────────
|
|
202
|
+
drainQueue() {
|
|
203
|
+
while (this.runningCount < this.maxConcurrentJobs && this.queue.length > 0) {
|
|
204
|
+
const next = this.queue.shift();
|
|
205
|
+
const rec = this.jobs.get(next);
|
|
206
|
+
if (!rec || rec.status !== "queued")
|
|
207
|
+
continue;
|
|
208
|
+
void this.runJob(rec);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async runJob(rec) {
|
|
212
|
+
this.runningCount++;
|
|
213
|
+
rec.status = "running";
|
|
214
|
+
rec.startedAt = Date.now();
|
|
215
|
+
const logPath = path.join(rec.jobDir, "job.log");
|
|
216
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
217
|
+
this.log({ event: "worker_started", agreement_id: rec.agreementId, agent: rec.agentType });
|
|
218
|
+
try {
|
|
219
|
+
const exitCode = await this.spawnAgent(rec, logStream);
|
|
220
|
+
rec.exitCode = exitCode;
|
|
221
|
+
if (exitCode !== 0) {
|
|
222
|
+
throw new Error(`agent exited with code ${exitCode}`);
|
|
223
|
+
}
|
|
224
|
+
// Collect output files and upload
|
|
225
|
+
const manifest = await this.collectDeliverables(rec, logStream);
|
|
226
|
+
rec.deliverableHash = manifest.root_hash;
|
|
227
|
+
rec.status = "completed";
|
|
228
|
+
rec.completedAt = Date.now();
|
|
229
|
+
this.log({
|
|
230
|
+
event: "worker_completed",
|
|
231
|
+
agreement_id: rec.agreementId,
|
|
232
|
+
root_hash: manifest.root_hash,
|
|
233
|
+
file_count: manifest.files.length,
|
|
234
|
+
duration_ms: rec.completedAt - rec.startedAt,
|
|
235
|
+
});
|
|
236
|
+
this.onJobCompleted?.(rec.agreementId, manifest.root_hash);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
const msg = String(err instanceof Error ? err.message : err);
|
|
240
|
+
rec.status = "failed";
|
|
241
|
+
rec.error = msg;
|
|
242
|
+
rec.completedAt = Date.now();
|
|
243
|
+
logStream.write(`\n[worker-executor] FAILED: ${msg}\n`);
|
|
244
|
+
this.log({ event: "worker_failed", agreement_id: rec.agreementId, error: msg });
|
|
245
|
+
this.onJobFailed?.(rec.agreementId, msg);
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
logStream.end();
|
|
249
|
+
rec.process = null;
|
|
250
|
+
if (rec.timeoutHandle) {
|
|
251
|
+
clearTimeout(rec.timeoutHandle);
|
|
252
|
+
rec.timeoutHandle = null;
|
|
253
|
+
}
|
|
254
|
+
this.runningCount--;
|
|
255
|
+
this.drainQueue();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
spawnAgent(rec, logStream) {
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
const { cmd, args } = this.buildCommand(rec);
|
|
261
|
+
const taskText = this.buildTask(rec.capability, rec.specHash, rec.agreementId);
|
|
262
|
+
logStream.write(`[worker-executor] Spawning: ${cmd} ${args.join(" ")}\n`);
|
|
263
|
+
logStream.write(`[worker-executor] CWD: ${rec.jobDir}\n`);
|
|
264
|
+
logStream.write(`[worker-executor] Task: ${taskText.slice(0, 200)}\n\n`);
|
|
265
|
+
const child = (0, child_process_1.spawn)(cmd, [...args, taskText], {
|
|
266
|
+
cwd: rec.jobDir,
|
|
267
|
+
env: {
|
|
268
|
+
...process.env,
|
|
269
|
+
// Do NOT pass ARC402_MACHINE_KEY to worker process — security boundary
|
|
270
|
+
ARC402_MACHINE_KEY: undefined,
|
|
271
|
+
// Job context so the agent knows its scope
|
|
272
|
+
ARC402_JOB_ID: rec.agreementId,
|
|
273
|
+
ARC402_WORKER_DIR: WORKER_DIR,
|
|
274
|
+
ARC402_JOB_DIR: rec.jobDir,
|
|
275
|
+
// Unset ANTHROPIC_API_KEY — let OAuth handle auth
|
|
276
|
+
ANTHROPIC_API_KEY: undefined,
|
|
277
|
+
},
|
|
278
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
279
|
+
});
|
|
280
|
+
rec.process = child;
|
|
281
|
+
if (child.pid)
|
|
282
|
+
rec.pid = child.pid;
|
|
283
|
+
child.stdout?.on("data", (chunk) => { logStream.write(chunk); });
|
|
284
|
+
child.stderr?.on("data", (chunk) => { logStream.write(chunk); });
|
|
285
|
+
// Job timeout
|
|
286
|
+
rec.timeoutHandle = setTimeout(() => {
|
|
287
|
+
logStream.write(`\n[worker-executor] TIMEOUT after ${this.jobTimeoutMs}ms\n`);
|
|
288
|
+
child.kill("SIGTERM");
|
|
289
|
+
setTimeout(() => { child.kill("SIGKILL"); }, 5000);
|
|
290
|
+
reject(new Error("job_timeout"));
|
|
291
|
+
}, this.jobTimeoutMs);
|
|
292
|
+
child.on("close", (code) => {
|
|
293
|
+
resolve(code ?? 1);
|
|
294
|
+
});
|
|
295
|
+
child.on("error", (err) => {
|
|
296
|
+
reject(new Error(`spawn_failed: ${err.message}`));
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
buildCommand(rec) {
|
|
301
|
+
switch (rec.agentType) {
|
|
302
|
+
case "openclaw":
|
|
303
|
+
// OpenClaw as the worker runtime — can spawn any ACP (Claude Code,
|
|
304
|
+
// Codex, Gemini, Pi, etc.) and orchestrate multi-agent workflows.
|
|
305
|
+
// This is the preferred runtime because it gives the worker full
|
|
306
|
+
// agent orchestration capability instead of being locked to one CLI.
|
|
307
|
+
return {
|
|
308
|
+
cmd: "openclaw",
|
|
309
|
+
args: ["run", "--workdir", rec.jobDir, "--"],
|
|
310
|
+
};
|
|
311
|
+
case "claude-code":
|
|
312
|
+
return {
|
|
313
|
+
cmd: "claude",
|
|
314
|
+
args: ["--permission-mode", "bypassPermissions", "--print"],
|
|
315
|
+
};
|
|
316
|
+
case "codex":
|
|
317
|
+
return {
|
|
318
|
+
cmd: "codex",
|
|
319
|
+
args: ["--print"],
|
|
320
|
+
};
|
|
321
|
+
case "shell":
|
|
322
|
+
return {
|
|
323
|
+
cmd: "/bin/sh",
|
|
324
|
+
args: ["-c"],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
buildTask(capability, specHash, agreementId) {
|
|
329
|
+
// ── Worker context injection ──────────────────────────────────────────
|
|
330
|
+
// The worker is a specialised agent with identity, expertise, and memory.
|
|
331
|
+
// All of this is injected BEFORE the task so the agent operates as a
|
|
332
|
+
// trained professional, not a blank slate.
|
|
333
|
+
const soul = readFileOrEmpty(path.join(WORKER_DIR, "SOUL.md"));
|
|
334
|
+
const identity = readFileOrEmpty(path.join(WORKER_DIR, "IDENTITY.md"));
|
|
335
|
+
const learnings = readFileOrEmpty(path.join(WORKER_DIR, "memory", "learnings.md"));
|
|
336
|
+
const knowledge = readDirMd(path.join(WORKER_DIR, "knowledge"), 50000);
|
|
337
|
+
const datasets = readDirMd(path.join(WORKER_DIR, "datasets"), 20000);
|
|
338
|
+
// Task from hire request (may have been written by enqueue())
|
|
339
|
+
const taskFile = path.join(JOBS_DIR, `agreement-${agreementId}`, "task.md");
|
|
340
|
+
const taskContent = readFileOrEmpty(taskFile);
|
|
341
|
+
const sections = [];
|
|
342
|
+
if (soul)
|
|
343
|
+
sections.push(`## Your Identity & Role\n${soul}`);
|
|
344
|
+
if (identity)
|
|
345
|
+
sections.push(`## Identity Card\n${identity}`);
|
|
346
|
+
if (learnings && learnings !== "# Accumulated Learnings\n\nNo learnings yet. Complete your first job to start building expertise.") {
|
|
347
|
+
sections.push(`## Your Accumulated Expertise\nThese are learnings from your previous jobs. Use them.\n\n${learnings}`);
|
|
348
|
+
}
|
|
349
|
+
if (knowledge)
|
|
350
|
+
sections.push(`## Domain Knowledge\nReference material for your specialisation.\n\n${knowledge}`);
|
|
351
|
+
if (datasets)
|
|
352
|
+
sections.push(`## Reference Examples\n${datasets}`);
|
|
353
|
+
sections.push(`## Current Task
|
|
354
|
+
Agreement ID: ${agreementId}
|
|
355
|
+
Capability: ${capability}
|
|
356
|
+
Spec Hash: ${specHash}
|
|
357
|
+
|
|
358
|
+
${taskContent || `Complete the work specified by the capability "${capability}".`}`);
|
|
359
|
+
sections.push(`## Output Instructions
|
|
360
|
+
Store all deliverable files in the current directory.
|
|
361
|
+
Write a deliverable.md summarizing your work and results.
|
|
362
|
+
Be thorough and professional. Your output will be hashed and delivered on-chain.`);
|
|
363
|
+
return sections.join("\n\n---\n\n");
|
|
364
|
+
}
|
|
365
|
+
async collectDeliverables(rec, logStream) {
|
|
366
|
+
logStream.write(`\n[worker-executor] Collecting deliverables from ${rec.jobDir}\n`);
|
|
367
|
+
// Exclude non-deliverable files
|
|
368
|
+
const excludes = ["task.md", "job.log"];
|
|
369
|
+
const manifest = this.delivery.storeDirectory(rec.agreementId, rec.jobDir, excludes);
|
|
370
|
+
logStream.write(`[worker-executor] Uploaded ${manifest.files.length} files, root_hash: ${manifest.root_hash}\n`);
|
|
371
|
+
return manifest;
|
|
372
|
+
}
|
|
373
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
374
|
+
toPublic(rec) {
|
|
375
|
+
const { process: _proc, timeoutHandle: _th, ...pub } = rec;
|
|
376
|
+
void _proc;
|
|
377
|
+
void _th;
|
|
378
|
+
return pub;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.WorkerExecutor = WorkerExecutor;
|
|
382
|
+
//# sourceMappingURL=worker-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-executor.js","sourceRoot":"","sources":["../../src/daemon/worker-executor.ts"],"names":[],"mappings":"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"}
|
package/dist/drain-v4.js
CHANGED
|
@@ -1,22 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
39
|
/**
|
|
2
40
|
* drain-v4.ts
|
|
3
41
|
* Drains ETH from v4 wallet (0xb4aF8760) to owner (0x7745772d) via WalletConnect.
|
|
4
42
|
* Steps: openContext → attest → executeSpend → closeContext
|
|
5
43
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
44
|
+
const ethers_1 = require("ethers");
|
|
45
|
+
const sign_client_1 = require("@walletconnect/sign-client");
|
|
46
|
+
const keyvaluestorage_1 = require("@walletconnect/keyvaluestorage");
|
|
47
|
+
const qr_render_js_1 = require("./ui/qr-render.js");
|
|
48
|
+
const path_1 = __importDefault(require("path"));
|
|
49
|
+
const os_1 = __importDefault(require("os"));
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
13
51
|
const V4_WALLET = "0xb4aF8760d349a6A4C8495Ae4da9089bC84994eE6";
|
|
14
52
|
const OWNER = "0x7745772d67Cd52c1F38706bF5550AdcD925c7c00";
|
|
15
53
|
const INTENT_ATTEST = "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460";
|
|
16
54
|
const CHAIN_ID = 8453;
|
|
17
55
|
const RPC = "https://base-mainnet.g.alchemy.com/v2/YIA2uRCsFI-j5pqH-aRzflrACSlV1Qrs";
|
|
18
56
|
// Leave 0.00005 ETH for gas
|
|
19
|
-
const DRAIN_AMOUNT = ethers.parseEther("0.00045");
|
|
57
|
+
const DRAIN_AMOUNT = ethers_1.ethers.parseEther("0.00045");
|
|
20
58
|
const WALLET_ABI = [
|
|
21
59
|
"function openContext(bytes32 contextId, string calldata taskType) external",
|
|
22
60
|
"function attest(bytes32 attestationId, string calldata action, string calldata reason, address recipient, uint256 amount, address token, uint256 expiresAt) external",
|
|
@@ -28,24 +66,24 @@ const ATTEST_ABI = [
|
|
|
28
66
|
"function attest(bytes32 attestationId, string calldata action, string calldata reason, address recipient, uint256 amount, address token, uint256 expiresAt) external",
|
|
29
67
|
];
|
|
30
68
|
async function main() {
|
|
31
|
-
const provider = new ethers.JsonRpcProvider(RPC);
|
|
69
|
+
const provider = new ethers_1.ethers.JsonRpcProvider(RPC);
|
|
32
70
|
const balance = await provider.getBalance(V4_WALLET);
|
|
33
|
-
console.log(`v4 balance: ${ethers.formatEther(balance)} ETH`);
|
|
71
|
+
console.log(`v4 balance: ${ethers_1.ethers.formatEther(balance)} ETH`);
|
|
34
72
|
if (balance < DRAIN_AMOUNT) {
|
|
35
73
|
console.error("Insufficient balance");
|
|
36
74
|
process.exit(1);
|
|
37
75
|
}
|
|
38
76
|
// Load config for machine key
|
|
39
|
-
const config = JSON.parse(fs.readFileSync(
|
|
40
|
-
const machineKey = new ethers.Wallet(config.privateKey, provider);
|
|
77
|
+
const config = JSON.parse(fs.readFileSync(path_1.default.join(os_1.default.homedir(), ".arc402/config.json"), "utf8"));
|
|
78
|
+
const machineKey = new ethers_1.ethers.Wallet(config.privateKey, provider);
|
|
41
79
|
console.log(`Machine key: ${machineKey.address}`);
|
|
42
80
|
// WalletConnect setup
|
|
43
81
|
const projectId = config.walletConnectProjectId;
|
|
44
|
-
const storagePath =
|
|
45
|
-
const client = await SignClient.init({
|
|
82
|
+
const storagePath = path_1.default.join(os_1.default.homedir(), ".arc402/wc-storage.json");
|
|
83
|
+
const client = await sign_client_1.SignClient.init({
|
|
46
84
|
projectId,
|
|
47
85
|
metadata: { name: "ARC-402 Drain v4", description: "Drain v4 wallet ETH to owner", url: "https://app.arc402.xyz", icons: [] },
|
|
48
|
-
storage: new KeyValueStorage({ database: storagePath }),
|
|
86
|
+
storage: new keyvaluestorage_1.KeyValueStorage({ database: storagePath }),
|
|
49
87
|
});
|
|
50
88
|
const { uri, approval } = await client.connect({
|
|
51
89
|
requiredNamespaces: {
|
|
@@ -57,16 +95,16 @@ async function main() {
|
|
|
57
95
|
},
|
|
58
96
|
});
|
|
59
97
|
console.log("\nScan this QR in MetaMask (make sure you're on Base):\n");
|
|
60
|
-
printQR(uri);
|
|
98
|
+
(0, qr_render_js_1.printQR)(uri);
|
|
61
99
|
console.log(`\nMetaMask deep link:\nmetamask://wc?uri=${encodeURIComponent(uri)}\n`);
|
|
62
100
|
console.log("Waiting for MetaMask approval...");
|
|
63
101
|
const session = await approval();
|
|
64
102
|
console.log("✓ MetaMask connected");
|
|
65
103
|
// Build transactions
|
|
66
|
-
const walletIface = new ethers.Interface(WALLET_ABI);
|
|
67
|
-
const attestIface = new ethers.Interface(ATTEST_ABI);
|
|
68
|
-
const contextId = ethers.keccak256(ethers.toUtf8Bytes(`drain-${Date.now()}`));
|
|
69
|
-
const attestationId = ethers.keccak256(ethers.toUtf8Bytes(`attest-${Date.now()}`));
|
|
104
|
+
const walletIface = new ethers_1.ethers.Interface(WALLET_ABI);
|
|
105
|
+
const attestIface = new ethers_1.ethers.Interface(ATTEST_ABI);
|
|
106
|
+
const contextId = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`drain-${Date.now()}`));
|
|
107
|
+
const attestationId = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`attest-${Date.now()}`));
|
|
70
108
|
const expiry = Math.floor(Date.now() / 1000) + 600; // 10 min
|
|
71
109
|
const account = session.namespaces.eip155.accounts[0].split(":")[2];
|
|
72
110
|
console.log(`Owner address: ${account}`);
|
|
@@ -88,7 +126,7 @@ async function main() {
|
|
|
88
126
|
}
|
|
89
127
|
// Step 1: close stale context via machine key if needed
|
|
90
128
|
console.log("\nStep 1: Checking context state...");
|
|
91
|
-
const walletContract = new ethers.Contract(V4_WALLET, WALLET_ABI, machineKey);
|
|
129
|
+
const walletContract = new ethers_1.ethers.Contract(V4_WALLET, WALLET_ABI, machineKey);
|
|
92
130
|
const isOpen = await walletContract.contextOpen();
|
|
93
131
|
if (isOpen) {
|
|
94
132
|
console.log(" Stale context found — closing it...");
|
|
@@ -99,16 +137,16 @@ async function main() {
|
|
|
99
137
|
}
|
|
100
138
|
// Step 2: owner opens context (MetaMask signs — so simulation sees it)
|
|
101
139
|
console.log("\nStep 2: Owner opens context via MetaMask...");
|
|
102
|
-
await sendTx(V4_WALLET, new ethers.Interface(WALLET_ABI).encodeFunctionData("openContext", [contextId, "drain"]), "Open context");
|
|
140
|
+
await sendTx(V4_WALLET, new ethers_1.ethers.Interface(WALLET_ABI).encodeFunctionData("openContext", [contextId, "drain"]), "Open context");
|
|
103
141
|
// Step 3: call attest() directly on wallet (onlyOwnerOrMachineKey — no executeContractCall needed)
|
|
104
|
-
const walletIface2 = new ethers.Interface(WALLET_ABI);
|
|
142
|
+
const walletIface2 = new ethers_1.ethers.Interface(WALLET_ABI);
|
|
105
143
|
await sendTx(V4_WALLET, walletIface2.encodeFunctionData("attest", [
|
|
106
144
|
attestationId,
|
|
107
145
|
"spend",
|
|
108
146
|
"drain v4 to owner",
|
|
109
147
|
OWNER,
|
|
110
148
|
DRAIN_AMOUNT,
|
|
111
|
-
ethers.ZeroAddress,
|
|
149
|
+
ethers_1.ethers.ZeroAddress,
|
|
112
150
|
expiry,
|
|
113
151
|
]), "Create spend attestation");
|
|
114
152
|
// Step 4: machine key executes spend
|
|
@@ -121,8 +159,8 @@ async function main() {
|
|
|
121
159
|
await closeTx.wait();
|
|
122
160
|
console.log(`✓ Context closed: ${closeTx.hash}`);
|
|
123
161
|
const newBalance = await provider.getBalance(V4_WALLET);
|
|
124
|
-
console.log(`\nv4 remaining balance: ${ethers.formatEther(newBalance)} ETH`);
|
|
125
|
-
console.log(`Done. ${ethers.formatEther(DRAIN_AMOUNT)} ETH sent to ${OWNER}`);
|
|
162
|
+
console.log(`\nv4 remaining balance: ${ethers_1.ethers.formatEther(newBalance)} ETH`);
|
|
163
|
+
console.log(`Done. ${ethers_1.ethers.formatEther(DRAIN_AMOUNT)} ETH sent to ${OWNER}`);
|
|
126
164
|
process.exit(0);
|
|
127
165
|
}
|
|
128
166
|
main().catch(e => { console.error(e); process.exit(1); });
|
package/dist/drain-v4.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drain-v4.js","sourceRoot":"","sources":["../src/drain-v4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"drain-v4.js","sourceRoot":"","sources":["../src/drain-v4.ts"],"names":[],"mappings":"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"}
|