safehands-pharos 1.3.0 → 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.
Files changed (159) hide show
  1. package/.env.example +64 -26
  2. package/README.md +333 -445
  3. package/dist/cli.d.ts +5 -5
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +124 -98
  6. package/dist/cli.js.map +1 -1
  7. package/dist/demo.d.ts +1 -1
  8. package/dist/demo.js +171 -171
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +138 -85
  11. package/dist/index.js.map +1 -1
  12. package/dist/init.d.ts +1 -1
  13. package/dist/init.js +65 -65
  14. package/dist/lib/auditLog.d.ts +9 -0
  15. package/dist/lib/auditLog.d.ts.map +1 -0
  16. package/dist/lib/auditLog.js +30 -0
  17. package/dist/lib/auditLog.js.map +1 -0
  18. package/dist/lib/constants.d.ts +291 -291
  19. package/dist/lib/constants.js +292 -292
  20. package/dist/lib/dodoApi.d.ts +78 -70
  21. package/dist/lib/dodoApi.d.ts.map +1 -1
  22. package/dist/lib/dodoApi.js +196 -178
  23. package/dist/lib/dodoApi.js.map +1 -1
  24. package/dist/lib/http.d.ts +14 -14
  25. package/dist/lib/http.js +118 -118
  26. package/dist/lib/pharosClient.d.ts +58 -58
  27. package/dist/lib/pharosClient.d.ts.map +1 -1
  28. package/dist/lib/pharosClient.js +63 -53
  29. package/dist/lib/pharosClient.js.map +1 -1
  30. package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
  31. package/dist/lib/policy/actionPolicyEngine.js +212 -212
  32. package/dist/lib/riskEngine.d.ts +26 -26
  33. package/dist/lib/riskEngine.js +283 -283
  34. package/dist/lib/signer/index.d.ts +24 -24
  35. package/dist/lib/signer/index.d.ts.map +1 -1
  36. package/dist/lib/signer/index.js +88 -89
  37. package/dist/lib/signer/index.js.map +1 -1
  38. package/dist/lib/spendAccumulator.d.ts +10 -0
  39. package/dist/lib/spendAccumulator.d.ts.map +1 -0
  40. package/dist/lib/spendAccumulator.js +54 -0
  41. package/dist/lib/spendAccumulator.js.map +1 -0
  42. package/dist/lib/testDodoLive.d.ts +1 -1
  43. package/dist/lib/testDodoLive.js +104 -104
  44. package/dist/lib/testLiveSafehands.d.ts +1 -1
  45. package/dist/lib/testLiveSafehands.js +92 -92
  46. package/dist/lib/testRpc.d.ts +1 -1
  47. package/dist/lib/testRpc.js +29 -29
  48. package/dist/lib/testRpcLive.d.ts +1 -1
  49. package/dist/lib/testRpcLive.js +88 -88
  50. package/dist/lib/testTools.d.ts +1 -1
  51. package/dist/lib/testTools.js +397 -397
  52. package/dist/lib/testX402Live.d.ts +1 -1
  53. package/dist/lib/testX402Live.js +159 -159
  54. package/dist/lib/toolResponse.d.ts +25 -25
  55. package/dist/lib/toolResponse.js +53 -53
  56. package/dist/lib/wallet/index.d.ts +37 -18
  57. package/dist/lib/wallet/index.d.ts.map +1 -1
  58. package/dist/lib/wallet/index.js +128 -70
  59. package/dist/lib/wallet/index.js.map +1 -1
  60. package/dist/scripts/checkDeploy.d.ts +1 -1
  61. package/dist/scripts/checkDeploy.js +24 -24
  62. package/dist/scripts/deployRegistry.d.ts +1 -1
  63. package/dist/scripts/deployRegistry.js +100 -100
  64. package/dist/scripts/testRegistry.d.ts +1 -1
  65. package/dist/scripts/testRegistry.js +43 -43
  66. package/dist/tools/approveToken.d.ts +45 -46
  67. package/dist/tools/approveToken.d.ts.map +1 -1
  68. package/dist/tools/approveToken.js +85 -83
  69. package/dist/tools/approveToken.js.map +1 -1
  70. package/dist/tools/assessRisk.d.ts +79 -79
  71. package/dist/tools/assessRisk.d.ts.map +1 -1
  72. package/dist/tools/assessRisk.js +104 -93
  73. package/dist/tools/assessRisk.js.map +1 -1
  74. package/dist/tools/checkAllowance.d.ts +43 -36
  75. package/dist/tools/checkAllowance.d.ts.map +1 -1
  76. package/dist/tools/checkAllowance.js +56 -42
  77. package/dist/tools/checkAllowance.js.map +1 -1
  78. package/dist/tools/checkTokenSecurity.d.ts +46 -46
  79. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  80. package/dist/tools/checkTokenSecurity.js +95 -88
  81. package/dist/tools/checkTokenSecurity.js.map +1 -1
  82. package/dist/tools/createAgentWallet.d.ts +26 -26
  83. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  84. package/dist/tools/createAgentWallet.js +58 -59
  85. package/dist/tools/createAgentWallet.js.map +1 -1
  86. package/dist/tools/estimateGas.d.ts +79 -79
  87. package/dist/tools/estimateGas.js +124 -124
  88. package/dist/tools/executeSwap.d.ts +61 -59
  89. package/dist/tools/executeSwap.d.ts.map +1 -1
  90. package/dist/tools/executeSwap.js +141 -129
  91. package/dist/tools/executeSwap.js.map +1 -1
  92. package/dist/tools/explainRisk.d.ts +29 -29
  93. package/dist/tools/explainRisk.js +32 -32
  94. package/dist/tools/getAgentWallet.d.ts +21 -21
  95. package/dist/tools/getAgentWallet.js +27 -27
  96. package/dist/tools/getAgentWalletBalance.d.ts +11 -11
  97. package/dist/tools/getAgentWalletBalance.js +70 -70
  98. package/dist/tools/getExecutionHistory.d.ts +49 -51
  99. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  100. package/dist/tools/getExecutionHistory.js +154 -93
  101. package/dist/tools/getExecutionHistory.js.map +1 -1
  102. package/dist/tools/getGasPrice.d.ts +43 -43
  103. package/dist/tools/getGasPrice.js +59 -59
  104. package/dist/tools/getPoolInfo.d.ts +75 -75
  105. package/dist/tools/getPoolInfo.js +137 -137
  106. package/dist/tools/getTokenPrice.d.ts +113 -113
  107. package/dist/tools/getTokenPrice.js +117 -117
  108. package/dist/tools/getTransactionStatus.d.ts +43 -57
  109. package/dist/tools/getTransactionStatus.d.ts.map +1 -1
  110. package/dist/tools/getTransactionStatus.js +59 -67
  111. package/dist/tools/getTransactionStatus.js.map +1 -1
  112. package/dist/tools/getWalletBalance.d.ts +68 -68
  113. package/dist/tools/getWalletBalance.js +87 -87
  114. package/dist/tools/publishRiskScore.d.ts +63 -63
  115. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  116. package/dist/tools/publishRiskScore.js +88 -85
  117. package/dist/tools/publishRiskScore.js.map +1 -1
  118. package/dist/tools/queryRiskRegistry.d.ts +38 -48
  119. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  120. package/dist/tools/queryRiskRegistry.js +55 -60
  121. package/dist/tools/queryRiskRegistry.js.map +1 -1
  122. package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
  123. package/dist/tools/safehandsPreflightCheck.js +47 -47
  124. package/dist/tools/safehandsRiskReport.d.ts +81 -81
  125. package/dist/tools/safehandsRiskReport.js +28 -28
  126. package/dist/tools/safehandsSafeExecute.d.ts +20 -20
  127. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  128. package/dist/tools/safehandsSafeExecute.js +81 -75
  129. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  130. package/dist/tools/safehandsWalletHealth.d.ts +14 -14
  131. package/dist/tools/safehandsWalletHealth.js +103 -103
  132. package/dist/tools/safehandsX402Preflight.d.ts +26 -26
  133. package/dist/tools/safehandsX402Preflight.js +65 -65
  134. package/dist/tools/sendPayment.d.ts +57 -58
  135. package/dist/tools/sendPayment.d.ts.map +1 -1
  136. package/dist/tools/sendPayment.js +117 -108
  137. package/dist/tools/sendPayment.js.map +1 -1
  138. package/dist/tools/simulateTransaction.d.ts +60 -81
  139. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  140. package/dist/tools/simulateTransaction.js +83 -88
  141. package/dist/tools/simulateTransaction.js.map +1 -1
  142. package/dist/tools/tokenRegistryStatus.d.ts +26 -26
  143. package/dist/tools/tokenRegistryStatus.js +96 -96
  144. package/dist/tools/x402PayAndFetch.d.ts +81 -81
  145. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  146. package/dist/tools/x402PayAndFetch.js +152 -149
  147. package/dist/tools/x402PayAndFetch.js.map +1 -1
  148. package/dist/x402Server.d.ts +1 -1
  149. package/dist/x402Server.js +252 -252
  150. package/examples/dashboard/index.html +337 -0
  151. package/package.json +83 -84
  152. package/.agents/skill/safehands/SKILL.md +0 -212
  153. package/.agents/skill/safehands/assets/networks.json +0 -24
  154. package/.agents/skill/safehands/assets/tokens.json +0 -66
  155. package/.agents/wallets.json +0 -20
  156. package/docs/reports/OFFICIAL_DOCS_ALIGNMENT_REPORT.md +0 -137
  157. package/docs/reports/final_audit_report.md +0 -307
  158. package/docs/reports/live_verification_report.md +0 -147
  159. package/docs/reports/pharos_skill_engine_alignment_report.md +0 -85
@@ -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
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=testRpc.d.ts.map
@@ -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
@@ -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
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=testTools.d.ts.map