safehands-pharos 1.2.6 → 1.4.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/.env.example +64 -26
- package/README.md +333 -445
- package/dist/cli.d.ts +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +124 -98
- package/dist/cli.js.map +1 -1
- package/dist/demo.d.ts +1 -1
- package/dist/demo.js +171 -171
- package/dist/index.d.ts +2 -2
- package/dist/index.js +138 -87
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.js +65 -65
- package/dist/lib/auditLog.d.ts +9 -0
- package/dist/lib/auditLog.d.ts.map +1 -0
- package/dist/lib/auditLog.js +30 -0
- package/dist/lib/auditLog.js.map +1 -0
- package/dist/lib/constants.d.ts +291 -291
- package/dist/lib/constants.js +292 -292
- package/dist/lib/dodoApi.d.ts +78 -70
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +196 -178
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/http.d.ts +14 -14
- package/dist/lib/http.js +118 -118
- package/dist/lib/pharosClient.d.ts +58 -58
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +63 -53
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
- package/dist/lib/policy/actionPolicyEngine.js +212 -212
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
- package/dist/lib/riskEngine.d.ts +26 -26
- package/dist/lib/riskEngine.js +283 -283
- package/dist/lib/signer/index.d.ts +24 -24
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +88 -89
- package/dist/lib/signer/index.js.map +1 -1
- package/dist/lib/spendAccumulator.d.ts +10 -0
- package/dist/lib/spendAccumulator.d.ts.map +1 -0
- package/dist/lib/spendAccumulator.js +54 -0
- package/dist/lib/spendAccumulator.js.map +1 -0
- package/dist/lib/testDodoLive.d.ts +1 -1
- package/dist/lib/testDodoLive.js +104 -104
- package/dist/lib/testLiveSafehands.d.ts +1 -1
- package/dist/lib/testLiveSafehands.js +92 -92
- package/dist/lib/testRpc.d.ts +1 -1
- package/dist/lib/testRpc.js +29 -29
- package/dist/lib/testRpcLive.d.ts +1 -1
- package/dist/lib/testRpcLive.js +88 -88
- package/dist/lib/testTools.d.ts +1 -1
- package/dist/lib/testTools.js +397 -397
- package/dist/lib/testX402Live.d.ts +1 -1
- package/dist/lib/testX402Live.js +159 -159
- package/dist/lib/toolResponse.d.ts +25 -25
- package/dist/lib/toolResponse.js +53 -53
- package/dist/lib/wallet/index.d.ts +37 -18
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +128 -70
- package/dist/lib/wallet/index.js.map +1 -1
- package/dist/scripts/checkDeploy.d.ts +1 -1
- package/dist/scripts/checkDeploy.js +24 -24
- package/dist/scripts/deployRegistry.d.ts +1 -1
- package/dist/scripts/deployRegistry.js +100 -100
- package/dist/scripts/testRegistry.d.ts +1 -1
- package/dist/scripts/testRegistry.js +43 -43
- package/dist/tools/approveToken.d.ts +45 -46
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +85 -83
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +79 -79
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +104 -93
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +43 -36
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +56 -42
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +46 -46
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +95 -88
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +26 -26
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +58 -59
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +79 -79
- package/dist/tools/estimateGas.js +124 -124
- package/dist/tools/executeSwap.d.ts +61 -59
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +141 -129
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +29 -29
- package/dist/tools/explainRisk.js +32 -32
- package/dist/tools/getAgentWallet.d.ts +21 -21
- package/dist/tools/getAgentWallet.js +27 -27
- package/dist/tools/getAgentWalletBalance.d.ts +11 -11
- package/dist/tools/getAgentWalletBalance.js +70 -70
- package/dist/tools/getExecutionHistory.d.ts +49 -51
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +154 -93
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +43 -43
- package/dist/tools/getGasPrice.js +59 -59
- package/dist/tools/getPoolInfo.d.ts +75 -75
- package/dist/tools/getPoolInfo.js +137 -137
- package/dist/tools/getTokenPrice.d.ts +113 -113
- package/dist/tools/getTokenPrice.js +117 -117
- package/dist/tools/getTransactionStatus.d.ts +43 -57
- package/dist/tools/getTransactionStatus.d.ts.map +1 -1
- package/dist/tools/getTransactionStatus.js +59 -67
- package/dist/tools/getTransactionStatus.js.map +1 -1
- package/dist/tools/getWalletBalance.d.ts +68 -68
- package/dist/tools/getWalletBalance.js +87 -87
- package/dist/tools/publishRiskScore.d.ts +63 -63
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +88 -85
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryRiskRegistry.d.ts +38 -48
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +55 -60
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
- package/dist/tools/safehandsPreflightCheck.js +47 -47
- package/dist/tools/safehandsRiskReport.d.ts +81 -81
- package/dist/tools/safehandsRiskReport.js +28 -28
- package/dist/tools/safehandsSafeExecute.d.ts +20 -20
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +81 -75
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +14 -14
- package/dist/tools/safehandsWalletHealth.js +103 -103
- package/dist/tools/safehandsX402Preflight.d.ts +26 -26
- package/dist/tools/safehandsX402Preflight.js +65 -65
- package/dist/tools/sendPayment.d.ts +57 -58
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +117 -108
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/simulateTransaction.d.ts +60 -81
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +83 -88
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +26 -26
- package/dist/tools/tokenRegistryStatus.js +96 -96
- package/dist/tools/x402PayAndFetch.d.ts +81 -81
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +152 -149
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.js +252 -252
- package/examples/dashboard/index.html +337 -0
- package/package.json +83 -82
- package/skill/SKILL.md +133 -133
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
// ─── Live SafeHands CLI Verification ───────────────────────────────────
|
|
2
|
-
// Runs real CLI safety checks without broadcasting transactions.
|
|
3
|
-
// All checks are read-only or dry-run preflight checks.
|
|
4
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
-
import { spawnSync } from "node:child_process";
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
import { existsSync } from "node:fs";
|
|
8
|
-
const results = [];
|
|
9
|
-
function runCli(args) {
|
|
10
|
-
const entry = join(process.cwd(), "dist", "index.js");
|
|
11
|
-
if (!existsSync(entry)) {
|
|
12
|
-
console.error("❌ dist/index.js not found. Run: npm run build");
|
|
13
|
-
process.exit(1);
|
|
14
|
-
}
|
|
15
|
-
const result = spawnSync(process.execPath, [entry, ...args], {
|
|
16
|
-
cwd: process.cwd(),
|
|
17
|
-
env: { ...process.env, WALLET_MODE: "none", WRITE_TOOLS_ENABLED: "false", PRIVATE_KEY: "" },
|
|
18
|
-
encoding: "utf8",
|
|
19
|
-
timeout: 30_000,
|
|
20
|
-
});
|
|
21
|
-
return { exitCode: result.status ?? 1, stdout: result.stdout || "", stderr: result.stderr || "" };
|
|
22
|
-
}
|
|
23
|
-
function parseJson(stdout) {
|
|
24
|
-
try {
|
|
25
|
-
return JSON.parse(stdout.trim());
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function check(name, args, expected, validator) {
|
|
32
|
-
const { stdout } = runCli(args);
|
|
33
|
-
const json = parseJson(stdout);
|
|
34
|
-
const passed = json !== null && validator(json);
|
|
35
|
-
const actual = json !== null
|
|
36
|
-
? (json.success ? `success: ${JSON.stringify(json.data).slice(0, 120)}` : `error: ${json.error?.code}`)
|
|
37
|
-
: `invalid JSON: ${stdout.slice(0, 100)}`;
|
|
38
|
-
results.push({ name, status: passed ? "PASS" : "FAIL", expected, actual });
|
|
39
|
-
}
|
|
40
|
-
console.log("═══════════════════════════════════════════════════════════");
|
|
41
|
-
console.log(" SafeHands — Live CLI Verification (read-only)");
|
|
42
|
-
console.log("═══════════════════════════════════════════════════════════");
|
|
43
|
-
console.log("");
|
|
44
|
-
// 1. Wallet health — no wallet configured
|
|
45
|
-
check("wallet_health_no_wallet", ["skill", "safehands_wallet_health", "--input-json", "{}"], "valid JSON with status NOT_READY or DEGRADED", (json) => json.success && ["NOT_READY", "DEGRADED"].includes(json.data?.status));
|
|
46
|
-
// 2. Token registry — Pharos Skill Engine USDC (DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE)
|
|
47
|
-
check("token_registry_skill_engine_usdc", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8" })], "SKILL_ENGINE_CANONICAL_TOKEN with DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE", (json) => json.success && json.data?.status === "SKILL_ENGINE_CANONICAL_TOKEN" && json.data?.verificationStatus === "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE");
|
|
48
|
-
// 3. Token registry — Circle USDC (ALTERNATE_SOURCE_TOKEN)
|
|
49
|
-
check("token_registry_circle_usdc", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B" })], "ALTERNATE_SOURCE_TOKEN with CIRCLE_REFERENCED_USDC", (json) => json.success && json.data?.status === "ALTERNATE_SOURCE_TOKEN" && json.data?.verificationStatus === "CIRCLE_REFERENCED_USDC");
|
|
50
|
-
// 4. Token registry — USDT (DOCS_VERIFIED)
|
|
51
|
-
check("token_registry_usdt_docs_verified", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5" })], "CANONICAL_TESTNET_TOKEN with DOCS_VERIFIED", (json) => json.success && json.data?.status === "CANONICAL_TESTNET_TOKEN" && json.data?.verificationStatus === "DOCS_VERIFIED");
|
|
52
|
-
// 5. Preflight — unlimited approval → BLOCK
|
|
53
|
-
check("preflight_block_unlimited_approval", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
54
|
-
actionType: "approve_token",
|
|
55
|
-
chainId: 688689,
|
|
56
|
-
tokenAddress: "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8",
|
|
57
|
-
targetAddress: "0x0000000000000000000000000000000000000001",
|
|
58
|
-
amount: "unlimited",
|
|
59
|
-
approvalAmount: "max",
|
|
60
|
-
})], "decision=BLOCK", (json) => json.success && json.data?.decision === "BLOCK");
|
|
61
|
-
// 6. Preflight — mainnet action → BLOCK
|
|
62
|
-
check("preflight_block_mainnet", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
63
|
-
actionType: "send_payment",
|
|
64
|
-
chainId: 1,
|
|
65
|
-
isMainnet: true,
|
|
66
|
-
targetAddress: "0x0000000000000000000000000000000000000001",
|
|
67
|
-
amount: "0.001",
|
|
68
|
-
})], "decision=BLOCK", (json) => json.success && json.data?.decision === "BLOCK");
|
|
69
|
-
// 7. Preflight — safe testnet action → ALLOW or WARN (not BLOCK)
|
|
70
|
-
check("preflight_allow_testnet", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
71
|
-
actionType: "send_payment",
|
|
72
|
-
chainId: 688689,
|
|
73
|
-
isMainnet: false,
|
|
74
|
-
amount: "0.001",
|
|
75
|
-
recipient: "0x000000000000000000000000000000000000dEaD",
|
|
76
|
-
})], "decision=ALLOW or WARN (not BLOCK)", (json) => json.success && json.data?.decision !== "BLOCK");
|
|
77
|
-
// Print results
|
|
78
|
-
console.log(`\n${"#".padStart(2)} ${"Status".padEnd(8)} ${"Check".padEnd(42)} Expected`);
|
|
79
|
-
console.log("─".repeat(100));
|
|
80
|
-
for (const [i, r] of results.entries()) {
|
|
81
|
-
const icon = r.status === "PASS" ? "✅" : "❌";
|
|
82
|
-
console.log(`${String(i + 1).padStart(2)} ${icon} ${r.status.padEnd(5)} ${r.name.padEnd(42)} ${r.expected}`);
|
|
83
|
-
}
|
|
84
|
-
const failed = results.filter(r => r.status === "FAIL");
|
|
85
|
-
console.log("─".repeat(100));
|
|
86
|
-
console.log(`${results.length - failed.length}/${results.length} live CLI checks passed.`);
|
|
87
|
-
if (failed.length > 0) {
|
|
88
|
-
console.error("\nFailed checks:");
|
|
89
|
-
for (const f of failed)
|
|
90
|
-
console.error(` - ${f.name}: got ${f.actual}`);
|
|
91
|
-
process.exit(1);
|
|
92
|
-
}
|
|
1
|
+
// ─── Live SafeHands CLI Verification ───────────────────────────────────
|
|
2
|
+
// Runs real CLI safety checks without broadcasting transactions.
|
|
3
|
+
// All checks are read-only or dry-run preflight checks.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
const results = [];
|
|
9
|
+
function runCli(args) {
|
|
10
|
+
const entry = join(process.cwd(), "dist", "index.js");
|
|
11
|
+
if (!existsSync(entry)) {
|
|
12
|
+
console.error("❌ dist/index.js not found. Run: npm run build");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const result = spawnSync(process.execPath, [entry, ...args], {
|
|
16
|
+
cwd: process.cwd(),
|
|
17
|
+
env: { ...process.env, WALLET_MODE: "none", WRITE_TOOLS_ENABLED: "false", PRIVATE_KEY: "" },
|
|
18
|
+
encoding: "utf8",
|
|
19
|
+
timeout: 30_000,
|
|
20
|
+
});
|
|
21
|
+
return { exitCode: result.status ?? 1, stdout: result.stdout || "", stderr: result.stderr || "" };
|
|
22
|
+
}
|
|
23
|
+
function parseJson(stdout) {
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(stdout.trim());
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function check(name, args, expected, validator) {
|
|
32
|
+
const { stdout } = runCli(args);
|
|
33
|
+
const json = parseJson(stdout);
|
|
34
|
+
const passed = json !== null && validator(json);
|
|
35
|
+
const actual = json !== null
|
|
36
|
+
? (json.success ? `success: ${JSON.stringify(json.data).slice(0, 120)}` : `error: ${json.error?.code}`)
|
|
37
|
+
: `invalid JSON: ${stdout.slice(0, 100)}`;
|
|
38
|
+
results.push({ name, status: passed ? "PASS" : "FAIL", expected, actual });
|
|
39
|
+
}
|
|
40
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
41
|
+
console.log(" SafeHands — Live CLI Verification (read-only)");
|
|
42
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
43
|
+
console.log("");
|
|
44
|
+
// 1. Wallet health — no wallet configured
|
|
45
|
+
check("wallet_health_no_wallet", ["skill", "safehands_wallet_health", "--input-json", "{}"], "valid JSON with status NOT_READY or DEGRADED", (json) => json.success && ["NOT_READY", "DEGRADED"].includes(json.data?.status));
|
|
46
|
+
// 2. Token registry — Pharos Skill Engine USDC (DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE)
|
|
47
|
+
check("token_registry_skill_engine_usdc", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8" })], "SKILL_ENGINE_CANONICAL_TOKEN with DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE", (json) => json.success && json.data?.status === "SKILL_ENGINE_CANONICAL_TOKEN" && json.data?.verificationStatus === "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE");
|
|
48
|
+
// 3. Token registry — Circle USDC (ALTERNATE_SOURCE_TOKEN)
|
|
49
|
+
check("token_registry_circle_usdc", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B" })], "ALTERNATE_SOURCE_TOKEN with CIRCLE_REFERENCED_USDC", (json) => json.success && json.data?.status === "ALTERNATE_SOURCE_TOKEN" && json.data?.verificationStatus === "CIRCLE_REFERENCED_USDC");
|
|
50
|
+
// 4. Token registry — USDT (DOCS_VERIFIED)
|
|
51
|
+
check("token_registry_usdt_docs_verified", ["skill", "token_registry_status", "--input-json", JSON.stringify({ tokenAddress: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5" })], "CANONICAL_TESTNET_TOKEN with DOCS_VERIFIED", (json) => json.success && json.data?.status === "CANONICAL_TESTNET_TOKEN" && json.data?.verificationStatus === "DOCS_VERIFIED");
|
|
52
|
+
// 5. Preflight — unlimited approval → BLOCK
|
|
53
|
+
check("preflight_block_unlimited_approval", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
54
|
+
actionType: "approve_token",
|
|
55
|
+
chainId: 688689,
|
|
56
|
+
tokenAddress: "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8",
|
|
57
|
+
targetAddress: "0x0000000000000000000000000000000000000001",
|
|
58
|
+
amount: "unlimited",
|
|
59
|
+
approvalAmount: "max",
|
|
60
|
+
})], "decision=BLOCK", (json) => json.success && json.data?.decision === "BLOCK");
|
|
61
|
+
// 6. Preflight — mainnet action → BLOCK
|
|
62
|
+
check("preflight_block_mainnet", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
63
|
+
actionType: "send_payment",
|
|
64
|
+
chainId: 1,
|
|
65
|
+
isMainnet: true,
|
|
66
|
+
targetAddress: "0x0000000000000000000000000000000000000001",
|
|
67
|
+
amount: "0.001",
|
|
68
|
+
})], "decision=BLOCK", (json) => json.success && json.data?.decision === "BLOCK");
|
|
69
|
+
// 7. Preflight — safe testnet action → ALLOW or WARN (not BLOCK)
|
|
70
|
+
check("preflight_allow_testnet", ["skill", "safehands_preflight_check", "--input-json", JSON.stringify({
|
|
71
|
+
actionType: "send_payment",
|
|
72
|
+
chainId: 688689,
|
|
73
|
+
isMainnet: false,
|
|
74
|
+
amount: "0.001",
|
|
75
|
+
recipient: "0x000000000000000000000000000000000000dEaD",
|
|
76
|
+
})], "decision=ALLOW or WARN (not BLOCK)", (json) => json.success && json.data?.decision !== "BLOCK");
|
|
77
|
+
// Print results
|
|
78
|
+
console.log(`\n${"#".padStart(2)} ${"Status".padEnd(8)} ${"Check".padEnd(42)} Expected`);
|
|
79
|
+
console.log("─".repeat(100));
|
|
80
|
+
for (const [i, r] of results.entries()) {
|
|
81
|
+
const icon = r.status === "PASS" ? "✅" : "❌";
|
|
82
|
+
console.log(`${String(i + 1).padStart(2)} ${icon} ${r.status.padEnd(5)} ${r.name.padEnd(42)} ${r.expected}`);
|
|
83
|
+
}
|
|
84
|
+
const failed = results.filter(r => r.status === "FAIL");
|
|
85
|
+
console.log("─".repeat(100));
|
|
86
|
+
console.log(`${results.length - failed.length}/${results.length} live CLI checks passed.`);
|
|
87
|
+
if (failed.length > 0) {
|
|
88
|
+
console.error("\nFailed checks:");
|
|
89
|
+
for (const f of failed)
|
|
90
|
+
console.error(` - ${f.name}: got ${f.actual}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
93
|
//# sourceMappingURL=testLiveSafehands.js.map
|
package/dist/lib/testRpc.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=testRpc.d.ts.map
|
package/dist/lib/testRpc.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
// ─── RPC Connection Test ───────────────────────────────────────────────
|
|
2
|
-
// Quick smoke test: connects to Pharos Atlantic Testnet and verifies
|
|
3
|
-
// the chain ID matches 688689.
|
|
4
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
-
import { publicClient } from "./pharosClient.js";
|
|
6
|
-
import { CHAIN_ID } from "./constants.js";
|
|
7
|
-
async function main() {
|
|
8
|
-
console.log("🔌 Connecting to Pharos Atlantic Testnet...");
|
|
9
|
-
console.log(` RPC: https://atlantic.dplabs-internal.com/`);
|
|
10
|
-
try {
|
|
11
|
-
const chainId = await publicClient.getChainId();
|
|
12
|
-
console.log(` Chain ID returned: ${chainId}`);
|
|
13
|
-
if (chainId === CHAIN_ID) {
|
|
14
|
-
console.log(`✅ SUCCESS — Chain ID matches expected ${CHAIN_ID}`);
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
console.error(`❌ MISMATCH — Expected ${CHAIN_ID}, got ${chainId}`);
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
|
-
const blockNumber = await publicClient.getBlockNumber();
|
|
21
|
-
console.log(` Latest block: ${blockNumber}`);
|
|
22
|
-
console.log("\n🎉 Pharos RPC connection verified.");
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
console.error("❌ RPC connection failed:", error);
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
main();
|
|
1
|
+
// ─── RPC Connection Test ───────────────────────────────────────────────
|
|
2
|
+
// Quick smoke test: connects to Pharos Atlantic Testnet and verifies
|
|
3
|
+
// the chain ID matches 688689.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { publicClient } from "./pharosClient.js";
|
|
6
|
+
import { CHAIN_ID } from "./constants.js";
|
|
7
|
+
async function main() {
|
|
8
|
+
console.log("🔌 Connecting to Pharos Atlantic Testnet...");
|
|
9
|
+
console.log(` RPC: https://atlantic.dplabs-internal.com/`);
|
|
10
|
+
try {
|
|
11
|
+
const chainId = await publicClient.getChainId();
|
|
12
|
+
console.log(` Chain ID returned: ${chainId}`);
|
|
13
|
+
if (chainId === CHAIN_ID) {
|
|
14
|
+
console.log(`✅ SUCCESS — Chain ID matches expected ${CHAIN_ID}`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`❌ MISMATCH — Expected ${CHAIN_ID}, got ${chainId}`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const blockNumber = await publicClient.getBlockNumber();
|
|
21
|
+
console.log(` Latest block: ${blockNumber}`);
|
|
22
|
+
console.log("\n🎉 Pharos RPC connection verified.");
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error("❌ RPC connection failed:", error);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
main();
|
|
30
30
|
//# sourceMappingURL=testRpc.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=testRpcLive.d.ts.map
|
package/dist/lib/testRpcLive.js
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
// ─── Live RPC Verification ─────────────────────────────────────────────
|
|
2
|
-
// Real read-only test against Pharos Atlantic Testnet.
|
|
3
|
-
// Does NOT require a private key. Wallet balance check requires WALLET_ADDRESS.
|
|
4
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
-
import { publicClient } from "./pharosClient.js";
|
|
6
|
-
import { CHAIN_ID, RPC_URL, PHAROS_ENVIRONMENT } from "./constants.js";
|
|
7
|
-
import { formatEther, isAddress } from "viem";
|
|
8
|
-
async function main() {
|
|
9
|
-
const result = {
|
|
10
|
-
rpcReachable: false,
|
|
11
|
-
chainId: null,
|
|
12
|
-
chainIdMatch: false,
|
|
13
|
-
latestBlock: null,
|
|
14
|
-
walletBalance: null,
|
|
15
|
-
walletBalanceCheck: "SKIPPED_NO_WALLET_ADDRESS",
|
|
16
|
-
status: "FAIL",
|
|
17
|
-
rpcUrl: RPC_URL,
|
|
18
|
-
environment: PHAROS_ENVIRONMENT,
|
|
19
|
-
expectedChainId: CHAIN_ID,
|
|
20
|
-
errors: [],
|
|
21
|
-
};
|
|
22
|
-
console.log("═══════════════════════════════════════════════════════════");
|
|
23
|
-
console.log(" SafeHands — Live RPC Verification (read-only)");
|
|
24
|
-
console.log("═══════════════════════════════════════════════════════════");
|
|
25
|
-
console.log(` RPC URL: ${RPC_URL}`);
|
|
26
|
-
console.log(` Environment: ${PHAROS_ENVIRONMENT}`);
|
|
27
|
-
console.log(` Expected ID: ${CHAIN_ID}`);
|
|
28
|
-
console.log("");
|
|
29
|
-
// 1. Chain ID
|
|
30
|
-
try {
|
|
31
|
-
const chainId = await publicClient.getChainId();
|
|
32
|
-
result.rpcReachable = true;
|
|
33
|
-
result.chainId = chainId;
|
|
34
|
-
result.chainIdMatch = chainId === CHAIN_ID;
|
|
35
|
-
console.log(` RPC reachable: ✅ yes`);
|
|
36
|
-
console.log(` Chain ID: ${chainId} ${result.chainIdMatch ? "✅ match" : "❌ MISMATCH"}`);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
result.errors.push(`RPC connect: ${err.message || String(err)}`);
|
|
40
|
-
console.log(` RPC reachable: ❌ no`);
|
|
41
|
-
console.log(` Error: ${err.message || String(err)}`);
|
|
42
|
-
result.status = "SKIPPED_NETWORK";
|
|
43
|
-
console.log(`\n Status: ${result.status}`);
|
|
44
|
-
console.log(JSON.stringify(result, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
|
|
45
|
-
process.exit(0);
|
|
46
|
-
}
|
|
47
|
-
// 2. Latest block
|
|
48
|
-
try {
|
|
49
|
-
const blockNumber = await publicClient.getBlockNumber();
|
|
50
|
-
result.latestBlock = blockNumber;
|
|
51
|
-
console.log(` Latest block: ${blockNumber}`);
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
result.errors.push(`Block number: ${err.message || String(err)}`);
|
|
55
|
-
console.log(` Latest block: ❌ failed (${err.message})`);
|
|
56
|
-
}
|
|
57
|
-
// 3. Wallet balance
|
|
58
|
-
const walletAddress = process.env.WALLET_ADDRESS;
|
|
59
|
-
if (walletAddress && isAddress(walletAddress)) {
|
|
60
|
-
try {
|
|
61
|
-
const balance = await publicClient.getBalance({ address: walletAddress });
|
|
62
|
-
result.walletBalance = formatEther(balance);
|
|
63
|
-
result.walletBalanceCheck = "PASS";
|
|
64
|
-
console.log(` Wallet: ${walletAddress}`);
|
|
65
|
-
console.log(` Balance: ${result.walletBalance} PHRS ✅`);
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
result.walletBalanceCheck = "FAIL";
|
|
69
|
-
result.errors.push(`Balance: ${err.message || String(err)}`);
|
|
70
|
-
console.log(` Balance check: ❌ failed (${err.message})`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
console.log(` Wallet check: SKIPPED_NO_WALLET_ADDRESS`);
|
|
75
|
-
}
|
|
76
|
-
// Final status
|
|
77
|
-
result.status = result.rpcReachable && result.chainIdMatch && result.latestBlock !== null ? "PASS" : "FAIL";
|
|
78
|
-
console.log("");
|
|
79
|
-
console.log(` Status: ${result.status}`);
|
|
80
|
-
console.log("═══════════════════════════════════════════════════════════");
|
|
81
|
-
console.log(JSON.stringify(result, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
|
|
82
|
-
if (result.status === "FAIL")
|
|
83
|
-
process.exit(1);
|
|
84
|
-
}
|
|
85
|
-
main().catch((err) => {
|
|
86
|
-
console.error("❌ Unexpected error:", err);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
});
|
|
1
|
+
// ─── Live RPC Verification ─────────────────────────────────────────────
|
|
2
|
+
// Real read-only test against Pharos Atlantic Testnet.
|
|
3
|
+
// Does NOT require a private key. Wallet balance check requires WALLET_ADDRESS.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { publicClient } from "./pharosClient.js";
|
|
6
|
+
import { CHAIN_ID, RPC_URL, PHAROS_ENVIRONMENT } from "./constants.js";
|
|
7
|
+
import { formatEther, isAddress } from "viem";
|
|
8
|
+
async function main() {
|
|
9
|
+
const result = {
|
|
10
|
+
rpcReachable: false,
|
|
11
|
+
chainId: null,
|
|
12
|
+
chainIdMatch: false,
|
|
13
|
+
latestBlock: null,
|
|
14
|
+
walletBalance: null,
|
|
15
|
+
walletBalanceCheck: "SKIPPED_NO_WALLET_ADDRESS",
|
|
16
|
+
status: "FAIL",
|
|
17
|
+
rpcUrl: RPC_URL,
|
|
18
|
+
environment: PHAROS_ENVIRONMENT,
|
|
19
|
+
expectedChainId: CHAIN_ID,
|
|
20
|
+
errors: [],
|
|
21
|
+
};
|
|
22
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
23
|
+
console.log(" SafeHands — Live RPC Verification (read-only)");
|
|
24
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
25
|
+
console.log(` RPC URL: ${RPC_URL}`);
|
|
26
|
+
console.log(` Environment: ${PHAROS_ENVIRONMENT}`);
|
|
27
|
+
console.log(` Expected ID: ${CHAIN_ID}`);
|
|
28
|
+
console.log("");
|
|
29
|
+
// 1. Chain ID
|
|
30
|
+
try {
|
|
31
|
+
const chainId = await publicClient.getChainId();
|
|
32
|
+
result.rpcReachable = true;
|
|
33
|
+
result.chainId = chainId;
|
|
34
|
+
result.chainIdMatch = chainId === CHAIN_ID;
|
|
35
|
+
console.log(` RPC reachable: ✅ yes`);
|
|
36
|
+
console.log(` Chain ID: ${chainId} ${result.chainIdMatch ? "✅ match" : "❌ MISMATCH"}`);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
result.errors.push(`RPC connect: ${err.message || String(err)}`);
|
|
40
|
+
console.log(` RPC reachable: ❌ no`);
|
|
41
|
+
console.log(` Error: ${err.message || String(err)}`);
|
|
42
|
+
result.status = "SKIPPED_NETWORK";
|
|
43
|
+
console.log(`\n Status: ${result.status}`);
|
|
44
|
+
console.log(JSON.stringify(result, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
|
|
45
|
+
process.exit(0);
|
|
46
|
+
}
|
|
47
|
+
// 2. Latest block
|
|
48
|
+
try {
|
|
49
|
+
const blockNumber = await publicClient.getBlockNumber();
|
|
50
|
+
result.latestBlock = blockNumber;
|
|
51
|
+
console.log(` Latest block: ${blockNumber}`);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
result.errors.push(`Block number: ${err.message || String(err)}`);
|
|
55
|
+
console.log(` Latest block: ❌ failed (${err.message})`);
|
|
56
|
+
}
|
|
57
|
+
// 3. Wallet balance
|
|
58
|
+
const walletAddress = process.env.WALLET_ADDRESS;
|
|
59
|
+
if (walletAddress && isAddress(walletAddress)) {
|
|
60
|
+
try {
|
|
61
|
+
const balance = await publicClient.getBalance({ address: walletAddress });
|
|
62
|
+
result.walletBalance = formatEther(balance);
|
|
63
|
+
result.walletBalanceCheck = "PASS";
|
|
64
|
+
console.log(` Wallet: ${walletAddress}`);
|
|
65
|
+
console.log(` Balance: ${result.walletBalance} PHRS ✅`);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
result.walletBalanceCheck = "FAIL";
|
|
69
|
+
result.errors.push(`Balance: ${err.message || String(err)}`);
|
|
70
|
+
console.log(` Balance check: ❌ failed (${err.message})`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(` Wallet check: SKIPPED_NO_WALLET_ADDRESS`);
|
|
75
|
+
}
|
|
76
|
+
// Final status
|
|
77
|
+
result.status = result.rpcReachable && result.chainIdMatch && result.latestBlock !== null ? "PASS" : "FAIL";
|
|
78
|
+
console.log("");
|
|
79
|
+
console.log(` Status: ${result.status}`);
|
|
80
|
+
console.log("═══════════════════════════════════════════════════════════");
|
|
81
|
+
console.log(JSON.stringify(result, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
|
|
82
|
+
if (result.status === "FAIL")
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
main().catch((err) => {
|
|
86
|
+
console.error("❌ Unexpected error:", err);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
});
|
|
89
89
|
//# sourceMappingURL=testRpcLive.js.map
|
package/dist/lib/testTools.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=testTools.d.ts.map
|