safehands-pharos 1.2.0 → 1.2.3

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 (175) hide show
  1. package/.env.example +26 -0
  2. package/README.md +311 -350
  3. package/contracts/RiskRegistry.json +75 -1
  4. package/contracts/RiskRegistry.sol +29 -1
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +91 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/demo.d.ts +2 -0
  10. package/dist/demo.d.ts.map +1 -0
  11. package/dist/demo.js +172 -0
  12. package/dist/demo.js.map +1 -0
  13. package/dist/index.js +181 -169
  14. package/dist/index.js.map +1 -1
  15. package/dist/init.d.ts +2 -0
  16. package/dist/init.d.ts.map +1 -0
  17. package/dist/init.js +66 -0
  18. package/dist/init.js.map +1 -0
  19. package/dist/lib/constants.d.ts +122 -7
  20. package/dist/lib/constants.d.ts.map +1 -1
  21. package/dist/lib/constants.js +139 -13
  22. package/dist/lib/constants.js.map +1 -1
  23. package/dist/lib/dodoApi.d.ts +14 -0
  24. package/dist/lib/dodoApi.d.ts.map +1 -1
  25. package/dist/lib/dodoApi.js +78 -22
  26. package/dist/lib/dodoApi.js.map +1 -1
  27. package/dist/lib/http.d.ts +15 -0
  28. package/dist/lib/http.d.ts.map +1 -0
  29. package/dist/lib/http.js +119 -0
  30. package/dist/lib/http.js.map +1 -0
  31. package/dist/lib/pharosClient.d.ts +4 -3
  32. package/dist/lib/pharosClient.d.ts.map +1 -1
  33. package/dist/lib/pharosClient.js +8 -5
  34. package/dist/lib/pharosClient.js.map +1 -1
  35. package/dist/lib/policy/actionPolicyEngine.d.ts +54 -0
  36. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -0
  37. package/dist/lib/policy/actionPolicyEngine.js +213 -0
  38. package/dist/lib/policy/actionPolicyEngine.js.map +1 -0
  39. package/dist/lib/signer/index.d.ts +25 -0
  40. package/dist/lib/signer/index.d.ts.map +1 -0
  41. package/dist/lib/signer/index.js +90 -0
  42. package/dist/lib/signer/index.js.map +1 -0
  43. package/dist/lib/testDodoLive.d.ts +2 -0
  44. package/dist/lib/testDodoLive.d.ts.map +1 -0
  45. package/dist/lib/testDodoLive.js +105 -0
  46. package/dist/lib/testDodoLive.js.map +1 -0
  47. package/dist/lib/testLiveSafehands.d.ts +2 -0
  48. package/dist/lib/testLiveSafehands.d.ts.map +1 -0
  49. package/dist/lib/testLiveSafehands.js +93 -0
  50. package/dist/lib/testLiveSafehands.js.map +1 -0
  51. package/dist/lib/testRpcLive.d.ts +2 -0
  52. package/dist/lib/testRpcLive.d.ts.map +1 -0
  53. package/dist/lib/testRpcLive.js +89 -0
  54. package/dist/lib/testRpcLive.js.map +1 -0
  55. package/dist/lib/testTools.js +363 -354
  56. package/dist/lib/testTools.js.map +1 -1
  57. package/dist/lib/testX402Live.d.ts +2 -0
  58. package/dist/lib/testX402Live.d.ts.map +1 -0
  59. package/dist/lib/testX402Live.js +160 -0
  60. package/dist/lib/testX402Live.js.map +1 -0
  61. package/dist/lib/toolResponse.d.ts +26 -0
  62. package/dist/lib/toolResponse.d.ts.map +1 -0
  63. package/dist/lib/toolResponse.js +54 -0
  64. package/dist/lib/toolResponse.js.map +1 -0
  65. package/dist/lib/wallet/index.d.ts +19 -0
  66. package/dist/lib/wallet/index.d.ts.map +1 -0
  67. package/dist/lib/wallet/index.js +71 -0
  68. package/dist/lib/wallet/index.js.map +1 -0
  69. package/dist/tools/approveToken.d.ts +19 -20
  70. package/dist/tools/approveToken.d.ts.map +1 -1
  71. package/dist/tools/approveToken.js +44 -21
  72. package/dist/tools/approveToken.js.map +1 -1
  73. package/dist/tools/assessRisk.d.ts +22 -9
  74. package/dist/tools/assessRisk.d.ts.map +1 -1
  75. package/dist/tools/assessRisk.js +32 -9
  76. package/dist/tools/assessRisk.js.map +1 -1
  77. package/dist/tools/checkAllowance.d.ts +6 -6
  78. package/dist/tools/checkTokenSecurity.d.ts +9 -16
  79. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  80. package/dist/tools/checkTokenSecurity.js +17 -22
  81. package/dist/tools/checkTokenSecurity.js.map +1 -1
  82. package/dist/tools/createAgentWallet.d.ts +27 -0
  83. package/dist/tools/createAgentWallet.d.ts.map +1 -0
  84. package/dist/tools/createAgentWallet.js +60 -0
  85. package/dist/tools/createAgentWallet.js.map +1 -0
  86. package/dist/tools/estimateGas.d.ts +31 -21
  87. package/dist/tools/estimateGas.d.ts.map +1 -1
  88. package/dist/tools/estimateGas.js +91 -95
  89. package/dist/tools/estimateGas.js.map +1 -1
  90. package/dist/tools/executeSwap.d.ts +13 -29
  91. package/dist/tools/executeSwap.d.ts.map +1 -1
  92. package/dist/tools/executeSwap.js +68 -46
  93. package/dist/tools/executeSwap.js.map +1 -1
  94. package/dist/tools/explainRisk.d.ts +30 -0
  95. package/dist/tools/explainRisk.d.ts.map +1 -0
  96. package/dist/tools/explainRisk.js +33 -0
  97. package/dist/tools/explainRisk.js.map +1 -0
  98. package/dist/tools/getAgentWallet.d.ts +22 -0
  99. package/dist/tools/getAgentWallet.d.ts.map +1 -0
  100. package/dist/tools/getAgentWallet.js +28 -0
  101. package/dist/tools/getAgentWallet.js.map +1 -0
  102. package/dist/tools/getAgentWalletBalance.d.ts +12 -0
  103. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -0
  104. package/dist/tools/getAgentWalletBalance.js +71 -0
  105. package/dist/tools/getAgentWalletBalance.js.map +1 -0
  106. package/dist/tools/getExecutionHistory.d.ts +4 -4
  107. package/dist/tools/getGasPrice.d.ts +26 -8
  108. package/dist/tools/getGasPrice.d.ts.map +1 -1
  109. package/dist/tools/getGasPrice.js +43 -35
  110. package/dist/tools/getGasPrice.js.map +1 -1
  111. package/dist/tools/getPoolInfo.d.ts +47 -59
  112. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  113. package/dist/tools/getPoolInfo.js +96 -57
  114. package/dist/tools/getPoolInfo.js.map +1 -1
  115. package/dist/tools/getTokenPrice.d.ts +95 -9
  116. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  117. package/dist/tools/getTokenPrice.js +95 -56
  118. package/dist/tools/getTokenPrice.js.map +1 -1
  119. package/dist/tools/getWalletBalance.d.ts +40 -11
  120. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  121. package/dist/tools/getWalletBalance.js +64 -47
  122. package/dist/tools/getWalletBalance.js.map +1 -1
  123. package/dist/tools/publishRiskScore.d.ts +12 -10
  124. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  125. package/dist/tools/publishRiskScore.js +33 -19
  126. package/dist/tools/publishRiskScore.js.map +1 -1
  127. package/dist/tools/queryRiskRegistry.d.ts +3 -3
  128. package/dist/tools/safehandsPreflightCheck.d.ts +78 -0
  129. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -0
  130. package/dist/tools/safehandsPreflightCheck.js +48 -0
  131. package/dist/tools/safehandsPreflightCheck.js.map +1 -0
  132. package/dist/tools/safehandsRiskReport.d.ts +82 -0
  133. package/dist/tools/safehandsRiskReport.d.ts.map +1 -0
  134. package/dist/tools/safehandsRiskReport.js +29 -0
  135. package/dist/tools/safehandsRiskReport.js.map +1 -0
  136. package/dist/tools/safehandsSafeExecute.d.ts +21 -0
  137. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -0
  138. package/dist/tools/safehandsSafeExecute.js +76 -0
  139. package/dist/tools/safehandsSafeExecute.js.map +1 -0
  140. package/dist/tools/safehandsWalletHealth.d.ts +15 -0
  141. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -0
  142. package/dist/tools/safehandsWalletHealth.js +104 -0
  143. package/dist/tools/safehandsWalletHealth.js.map +1 -0
  144. package/dist/tools/safehandsX402Preflight.d.ts +27 -0
  145. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -0
  146. package/dist/tools/safehandsX402Preflight.js +66 -0
  147. package/dist/tools/safehandsX402Preflight.js.map +1 -0
  148. package/dist/tools/sendPayment.d.ts +13 -35
  149. package/dist/tools/sendPayment.d.ts.map +1 -1
  150. package/dist/tools/sendPayment.js +53 -47
  151. package/dist/tools/sendPayment.js.map +1 -1
  152. package/dist/tools/simulateTransaction.d.ts +4 -4
  153. package/dist/tools/tokenRegistryStatus.d.ts +27 -0
  154. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -0
  155. package/dist/tools/tokenRegistryStatus.js +97 -0
  156. package/dist/tools/tokenRegistryStatus.js.map +1 -0
  157. package/dist/tools/x402PayAndFetch.d.ts +40 -16
  158. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  159. package/dist/tools/x402PayAndFetch.js +115 -47
  160. package/dist/tools/x402PayAndFetch.js.map +1 -1
  161. package/dist/x402Server.js +149 -115
  162. package/dist/x402Server.js.map +1 -1
  163. package/examples/pharos-skill-engine/SKILL.safehands.md +85 -0
  164. package/examples/pharos-skill-engine/assets/safehands/example-actions.json +49 -0
  165. package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +11 -0
  166. package/examples/pharos-skill-engine/references/safehands.md +345 -0
  167. package/examples/scenario-hack.ts +38 -0
  168. package/package.json +19 -5
  169. package/skill/SKILL.md +127 -0
  170. package/skill/assets/safehands/example-actions.json +49 -0
  171. package/skill/assets/safehands/policy-defaults.json +11 -0
  172. package/skill/references/safehands.md +345 -0
  173. package/.agents/skill/safehands/SKILL.md +0 -200
  174. package/.agents/skill/safehands/assets/networks.json +0 -24
  175. package/.agents/skill/safehands/assets/tokens.json +0 -60
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsSafeExecute.d.ts","sourceRoot":"","sources":["../../src/tools/safehandsSafeExecute.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO/F,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;EAKrC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAenF,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAmD/G"}
@@ -0,0 +1,76 @@
1
+ // ─── Tool: safehands_safe_execute ──────────────────────────────────────
2
+ // Guarded execution wrapper so AI agents cannot bypass preflight checks.
3
+ // ───────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { fail, ok, requireWriteToolsEnabled } from "../lib/toolResponse.js";
6
+ import { handleSafeHandsPreflightCheck } from "./safehandsPreflightCheck.js";
7
+ import { handleSendPayment } from "./sendPayment.js";
8
+ import { handleApproveToken } from "./approveToken.js";
9
+ import { handleExecuteSwap } from "./executeSwap.js";
10
+ import { handleX402PayAndFetch } from "./x402PayAndFetch.js";
11
+ export const safehandsSafeExecuteSchema = z.object({
12
+ path: z.enum(["safe_execute_send_payment", "safe_execute_approve_token", "safe_execute_swap", "safe_x402_pay_and_fetch"]),
13
+ execute: z.boolean().optional().default(false).describe("Must be true to execute. false returns dry-run guarded report only."),
14
+ confirmExecution: z.boolean().optional().default(false).describe("Additional explicit runtime confirmation."),
15
+ action: z.record(z.any()).describe("Underlying tool input object"),
16
+ });
17
+ function toPreflight(path, action) {
18
+ if (path === "safe_execute_send_payment") {
19
+ return { actionType: "send_payment", amount: String(action.amount || ""), amountUnit: "PHRS", recipient: String(action.toAddress || ""), recipientVerified: false, requiresSigner: true, signerAvailable: true };
20
+ }
21
+ if (path === "safe_execute_approve_token") {
22
+ return { actionType: "approve_token", approvalAmount: String(action.amount || ""), approvalToken: String(action.token || ""), approvalUnlimited: action.amount === "max", requiresSigner: true, signerAvailable: true };
23
+ }
24
+ if (path === "safe_execute_swap") {
25
+ return { actionType: "execute_swap", amount: String(action.amountIn || ""), tokenIn: String(action.tokenIn || ""), tokenOut: String(action.tokenOut || ""), requiresSigner: true, signerAvailable: true };
26
+ }
27
+ return { actionType: "x402_pay_and_fetch", url: String(action.url || ""), paymentAmountUsdc: String(action.maxPaymentUsdc || "0.001"), requiresSigner: true, signerAvailable: true };
28
+ }
29
+ export async function handleSafeHandsSafeExecute(raw) {
30
+ const input = safehandsSafeExecuteSchema.parse(raw);
31
+ const writeGuard = requireWriteToolsEnabled("safehands_safe_execute");
32
+ if (writeGuard)
33
+ return writeGuard;
34
+ const preflight = await handleSafeHandsPreflightCheck(toPreflight(input.path, input.action));
35
+ if (!preflight.success)
36
+ return preflight;
37
+ const report = preflight.data;
38
+ if (report.decision === "BLOCK") {
39
+ return ok({
40
+ executed: false,
41
+ blocked: true,
42
+ safetyReport: report,
43
+ executionResult: null,
44
+ source: "safehands_safe_execute",
45
+ });
46
+ }
47
+ if (report.decision !== "ALLOW") {
48
+ return fail(report.decision === "REQUIRE_CONFIRMATION" ? "CONFIRMATION_REQUIRED" : "POLICY_BLOCKED", `SafeHands did not execute because policy decision is ${report.decision}.`, false, "safehands_safe_execute");
49
+ }
50
+ if (!input.execute || !input.confirmExecution) {
51
+ return ok({
52
+ executed: false,
53
+ dryRun: true,
54
+ reason: "Set execute=true and confirmExecution=true to execute this allowed testnet action.",
55
+ safetyReport: report,
56
+ executionResult: null,
57
+ source: "safehands_safe_execute",
58
+ });
59
+ }
60
+ let executionResult;
61
+ if (input.path === "safe_execute_send_payment")
62
+ executionResult = await handleSendPayment(input.action);
63
+ else if (input.path === "safe_execute_approve_token")
64
+ executionResult = await handleApproveToken(input.action);
65
+ else if (input.path === "safe_execute_swap")
66
+ executionResult = await handleExecuteSwap(input.action);
67
+ else
68
+ executionResult = await handleX402PayAndFetch(input.action);
69
+ return ok({
70
+ executed: true,
71
+ safetyReport: report,
72
+ executionResult,
73
+ source: "safehands_safe_execute",
74
+ });
75
+ }
76
+ //# sourceMappingURL=safehandsSafeExecute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsSafeExecute.js","sourceRoot":"","sources":["../../src/tools/safehandsSafeExecute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import { type ToolResponse } from "../lib/toolResponse.js";
3
+ export declare const safehandsWalletHealthSchema: z.ZodObject<{
4
+ agentId: z.ZodOptional<z.ZodString>;
5
+ walletAddress: z.ZodOptional<z.ZodString>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ agentId?: string | undefined;
8
+ walletAddress?: string | undefined;
9
+ }, {
10
+ agentId?: string | undefined;
11
+ walletAddress?: string | undefined;
12
+ }>;
13
+ export type SafeHandsWalletHealthInput = z.input<typeof safehandsWalletHealthSchema>;
14
+ export declare function handleSafeHandsWalletHealth(raw: SafeHandsWalletHealthInput): Promise<ToolResponse<unknown>>;
15
+ //# sourceMappingURL=safehandsWalletHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsWalletHealth.d.ts","sourceRoot":"","sources":["../../src/tools/safehandsWalletHealth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI5F,eAAO,MAAM,2BAA2B;;;;;;;;;EAGtC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAErF,wBAAsB,2BAA2B,CAAC,GAAG,EAAE,0BAA0B,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CA4FjH"}
@@ -0,0 +1,104 @@
1
+ // ─── Tool: safehands_wallet_health ─────────────────────────────────────
2
+ // Checks whether an AI agent wallet is ready for guarded testnet actions.
3
+ // ───────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { formatEther, formatUnits } from "viem";
6
+ import { publicClient } from "../lib/pharosClient.js";
7
+ import { ERC20_ABI, USDC_ADDRESS, CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET, MAX_X402_PAYMENT_USDC } from "../lib/constants.js";
8
+ import { ok, classifyExternalError } from "../lib/toolResponse.js";
9
+ import { getSigner, isSignerFailure } from "../lib/signer/index.js";
10
+ import { walletStore } from "../lib/wallet/index.js";
11
+ export const safehandsWalletHealthSchema = z.object({
12
+ agentId: z.string().optional().describe("Managed testnet wallet agentId"),
13
+ walletAddress: z.string().optional().describe("Explicit wallet address for read-only health checks"),
14
+ });
15
+ export async function handleSafeHandsWalletHealth(raw) {
16
+ const input = safehandsWalletHealthSchema.parse(raw);
17
+ const managedWallet = input.agentId ? await walletStore.get(input.agentId) : null;
18
+ const signer = await getSigner(input.agentId);
19
+ const signerAvailable = !isSignerFailure(signer);
20
+ const address = signerAvailable ? signer.address : (input.walletAddress || managedWallet?.address);
21
+ const base = {
22
+ environment: PHAROS_ENVIRONMENT,
23
+ chainId: CHAIN_ID,
24
+ isMainnet: IS_MAINNET,
25
+ walletMode: process.env.WALLET_MODE || "none",
26
+ writeToolsEnabled: process.env.WRITE_TOOLS_ENABLED === "true",
27
+ signerAvailable,
28
+ signerMode: signerAvailable ? signer.mode : null,
29
+ signerError: signerAvailable ? null : signer.error,
30
+ managedWalletExists: Boolean(managedWallet),
31
+ address: address || null,
32
+ };
33
+ if (!address) {
34
+ return ok({
35
+ ...base,
36
+ status: "NOT_READY",
37
+ readiness: {
38
+ canReadBalances: false,
39
+ canPayGas: false,
40
+ canPayX402: false,
41
+ canExecuteWrites: false,
42
+ },
43
+ requiredActions: ["Create a managed testnet wallet or provide WALLET_MODE=env with a testnet PRIVATE_KEY."],
44
+ source: "safehands_wallet_health",
45
+ });
46
+ }
47
+ try {
48
+ const [phrsRaw, usdcRaw] = await Promise.all([
49
+ publicClient.getBalance({ address: address }),
50
+ publicClient.readContract({
51
+ address: USDC_ADDRESS,
52
+ abi: ERC20_ABI,
53
+ functionName: "balanceOf",
54
+ args: [address],
55
+ }),
56
+ ]);
57
+ const phrs = formatEther(phrsRaw);
58
+ const usdc = formatUnits(usdcRaw, 6);
59
+ const canPayGas = parseFloat(phrs) > 0.001;
60
+ const canPayX402 = parseFloat(usdc) >= Number(MAX_X402_PAYMENT_USDC);
61
+ const canExecuteWrites = signerAvailable && canPayGas && process.env.WRITE_TOOLS_ENABLED === "true";
62
+ return ok({
63
+ ...base,
64
+ status: canExecuteWrites ? "READY" : signerAvailable ? "DEGRADED" : "NOT_READY",
65
+ balances: {
66
+ PHRS: { value: phrs, unit: "PHRS", decimals: 18 },
67
+ USDC: { value: usdc, unit: "USDC", decimals: 6, tokenAddress: USDC_ADDRESS },
68
+ },
69
+ readiness: {
70
+ canReadBalances: true,
71
+ canPayGas,
72
+ canPayX402,
73
+ canExecuteWrites,
74
+ },
75
+ dailySpendStatus: {
76
+ implemented: false,
77
+ note: "Daily spend accounting is config-ready but not persisted in this MVP.",
78
+ },
79
+ requiredActions: [
80
+ ...(canPayGas ? [] : ["Fund wallet with testnet PHRS for gas."]),
81
+ ...(canPayX402 ? [] : [`Fund wallet with at least ${MAX_X402_PAYMENT_USDC} testnet USDC for x402 payments.`]),
82
+ ...(process.env.WRITE_TOOLS_ENABLED === "true" ? [] : ["Set WRITE_TOOLS_ENABLED=true only when intentionally executing trusted testnet actions."]),
83
+ ],
84
+ source: "safehands_wallet_health",
85
+ });
86
+ }
87
+ catch (err) {
88
+ const rpc = classifyExternalError("pharos_rpc", err);
89
+ return ok({
90
+ ...base,
91
+ status: "DEGRADED",
92
+ readiness: {
93
+ canReadBalances: false,
94
+ canPayGas: "unknown",
95
+ canPayX402: "unknown",
96
+ canExecuteWrites: false,
97
+ },
98
+ rpcError: rpc.error,
99
+ requiredActions: ["Retry RPC balance checks later or configure PHAROS_RPC_URL."],
100
+ source: "safehands_wallet_health",
101
+ });
102
+ }
103
+ }
104
+ //# sourceMappingURL=safehandsWalletHealth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsWalletHealth.js","sourceRoot":"","sources":["../../src/tools/safehandsWalletHealth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { type ToolResponse } from "../lib/toolResponse.js";
3
+ export declare const safehandsX402PreflightSchema: z.ZodObject<{
4
+ url: z.ZodString;
5
+ method: z.ZodDefault<z.ZodOptional<z.ZodEnum<["GET", "POST", "PUT", "DELETE"]>>>;
6
+ paymentAmountUsdc: z.ZodDefault<z.ZodOptional<z.ZodString>>;
7
+ paymentTokenAddress: z.ZodDefault<z.ZodOptional<z.ZodString>>;
8
+ agentId: z.ZodOptional<z.ZodString>;
9
+ probeEndpoint: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ url: string;
12
+ paymentAmountUsdc: string;
13
+ paymentTokenAddress: string;
14
+ method: "GET" | "POST" | "PUT" | "DELETE";
15
+ probeEndpoint: boolean;
16
+ agentId?: string | undefined;
17
+ }, {
18
+ url: string;
19
+ paymentAmountUsdc?: string | undefined;
20
+ paymentTokenAddress?: string | undefined;
21
+ method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
22
+ agentId?: string | undefined;
23
+ probeEndpoint?: boolean | undefined;
24
+ }>;
25
+ export type SafeHandsX402PreflightInput = z.input<typeof safehandsX402PreflightSchema>;
26
+ export declare function handleSafeHandsX402Preflight(raw: SafeHandsX402PreflightInput): Promise<ToolResponse<unknown>>;
27
+ //# sourceMappingURL=safehandsX402Preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsX402Preflight.d.ts","sourceRoot":"","sources":["../../src/tools/safehandsX402Preflight.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMrE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;EAOvC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEvF,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAqDnH"}
@@ -0,0 +1,66 @@
1
+ // ─── Tool: safehands_x402_preflight ────────────────────────────────────
2
+ // Checks whether an x402 paid resource is safe before payment signing.
3
+ // ───────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { ok, fail } from "../lib/toolResponse.js";
6
+ import { assertSafeFetchUrl, fetchWithTimeoutAndRetry } from "../lib/http.js";
7
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, MAX_X402_PAYMENT_USDC, X402_PAYMENT_TOKEN_ADDRESS } from "../lib/constants.js";
8
+ import { evaluateActionPolicy } from "../lib/policy/actionPolicyEngine.js";
9
+ import { getSigner, isSignerFailure } from "../lib/signer/index.js";
10
+ export const safehandsX402PreflightSchema = z.object({
11
+ url: z.string(),
12
+ method: z.enum(["GET", "POST", "PUT", "DELETE"]).optional().default("GET"),
13
+ paymentAmountUsdc: z.string().optional().default("0.001"),
14
+ paymentTokenAddress: z.string().optional().default(X402_PAYMENT_TOKEN_ADDRESS),
15
+ agentId: z.string().optional(),
16
+ probeEndpoint: z.boolean().optional().default(false),
17
+ });
18
+ export async function handleSafeHandsX402Preflight(raw) {
19
+ const input = safehandsX402PreflightSchema.parse(raw);
20
+ try {
21
+ await assertSafeFetchUrl(input.url);
22
+ }
23
+ catch (err) {
24
+ return fail("SSRF_BLOCKED", err instanceof Error ? err.message.replace(/^SSRF_BLOCKED:\s*/, "") : String(err), false, "safehands_x402_preflight");
25
+ }
26
+ let detectedStatus = null;
27
+ let paymentRequired = "unknown";
28
+ if (input.probeEndpoint) {
29
+ try {
30
+ const res = await fetchWithTimeoutAndRetry(input.url, { method: input.method, timeoutMs: 7_500, retries: 0 });
31
+ detectedStatus = res.status;
32
+ paymentRequired = res.status === 402;
33
+ }
34
+ catch {
35
+ paymentRequired = "unknown";
36
+ }
37
+ }
38
+ const signer = await getSigner(input.agentId, { purpose: "x402" });
39
+ const signerAvailable = !isSignerFailure(signer);
40
+ const policy = evaluateActionPolicy({
41
+ actionType: "x402_pay_and_fetch",
42
+ url: input.url,
43
+ paymentAmountUsdc: input.paymentAmountUsdc,
44
+ paymentTokenAddress: input.paymentTokenAddress,
45
+ signerAvailable,
46
+ requiresSigner: paymentRequired === true,
47
+ chainId: CHAIN_ID,
48
+ environment: PHAROS_ENVIRONMENT,
49
+ isMainnet: false,
50
+ });
51
+ return ok({
52
+ ...policy,
53
+ url: input.url,
54
+ method: input.method,
55
+ paymentAmountUsdc: input.paymentAmountUsdc,
56
+ maxPaymentUsdc: MAX_X402_PAYMENT_USDC,
57
+ paymentTokenAddress: input.paymentTokenAddress,
58
+ signerAvailable,
59
+ signerMode: signerAvailable ? signer.mode : null,
60
+ signerError: signerAvailable ? null : signer.error,
61
+ probe: { enabled: input.probeEndpoint, status: detectedStatus, paymentRequired },
62
+ testnetPayment: true,
63
+ source: "safehands_x402_preflight",
64
+ });
65
+ }
66
+ //# sourceMappingURL=safehandsX402Preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safehandsX402Preflight.js","sourceRoot":"","sources":["../../src/tools/safehandsX402Preflight.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,16 @@ export declare const sendPaymentSchema: z.ZodObject<{
3
3
  toAddress: z.ZodString;
4
4
  amount: z.ZodString;
5
5
  memo: z.ZodOptional<z.ZodString>;
6
+ agentId: z.ZodOptional<z.ZodString>;
6
7
  }, "strip", z.ZodTypeAny, {
7
8
  amount: string;
8
9
  toAddress: string;
10
+ agentId?: string | undefined;
9
11
  memo?: string | undefined;
10
12
  }, {
11
13
  amount: string;
12
14
  toAddress: string;
15
+ agentId?: string | undefined;
13
16
  memo?: string | undefined;
14
17
  }>;
15
18
  export type SendPaymentInput = z.input<typeof sendPaymentSchema>;
@@ -20,62 +23,37 @@ export declare const sendPaymentTool: {
20
23
  toAddress: z.ZodString;
21
24
  amount: z.ZodString;
22
25
  memo: z.ZodOptional<z.ZodString>;
26
+ agentId: z.ZodOptional<z.ZodString>;
23
27
  }, "strip", z.ZodTypeAny, {
24
28
  amount: string;
25
29
  toAddress: string;
30
+ agentId?: string | undefined;
26
31
  memo?: string | undefined;
27
32
  }, {
28
33
  amount: string;
29
34
  toAddress: string;
35
+ agentId?: string | undefined;
30
36
  memo?: string | undefined;
31
37
  }>;
32
38
  };
33
- export declare function handleSendPayment(raw: SendPaymentInput): Promise<{
34
- success: boolean;
35
- validation: {
36
- addressValid: boolean;
37
- balanceSufficient: boolean;
38
- warnings: string[];
39
- };
40
- error: string;
41
- riskAssessment?: undefined;
42
- txHash?: undefined;
43
- explorerUrl?: undefined;
44
- amountSent?: undefined;
45
- gasUsed?: undefined;
46
- } | {
47
- success: boolean;
48
- validation: {
49
- addressValid: boolean;
50
- balanceSufficient: boolean;
51
- warnings: string[];
52
- };
53
- riskAssessment: {
54
- riskScore: number;
55
- wasBlocked: boolean;
56
- blockReason: string;
57
- };
58
- error: string;
59
- txHash?: undefined;
60
- explorerUrl?: undefined;
61
- amountSent?: undefined;
62
- gasUsed?: undefined;
63
- } | {
64
- success: boolean;
39
+ export declare function handleSendPayment(raw: SendPaymentInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
40
+ txSuccess: boolean;
65
41
  txHash: `0x${string}`;
66
42
  explorerUrl: string;
67
43
  amountSent: string;
44
+ signerMode: import("../lib/signer/index.js").SignerMode;
45
+ walletAddress: `0x${string}`;
68
46
  gasUsed: string;
69
47
  validation: {
70
48
  addressValid: boolean;
71
49
  balanceSufficient: boolean;
72
50
  warnings: string[];
73
51
  };
52
+ policy: import("../lib/policy/actionPolicyEngine.js").ActionPolicyResult;
74
53
  riskAssessment: {
75
54
  riskScore: number;
76
55
  wasBlocked: boolean;
77
- blockReason?: undefined;
78
56
  };
79
- error?: undefined;
80
- }>;
57
+ source: string;
58
+ }>>;
81
59
  //# sourceMappingURL=sendPayment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendPayment.d.ts","sourceRoot":"","sources":["../../src/tools/sendPayment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;CAI3B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4F5D"}
1
+ {"version":3,"file":"sendPayment.d.ts","sourceRoot":"","sources":["../../src/tools/sendPayment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAI3B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;IAkG5D"}
@@ -1,13 +1,17 @@
1
1
  // ─── Tool: send_payment ────────────────────────────────────────────────
2
2
  import { z } from "zod";
3
- import { publicClient, createPharosWalletClient, getExplorerUrl } from "../lib/pharosClient.js";
3
+ import { publicClient, createPharosWalletClientFromAccount, getExplorerUrl } from "../lib/pharosClient.js";
4
4
  import { isAddress, parseEther, formatEther } from "viem";
5
5
  import { assessRisk } from "../lib/riskEngine.js";
6
- import { MAX_BALANCE_USAGE_PCT, RISK_BLOCK_THRESHOLD } from "../lib/constants.js";
6
+ import { fail, ok, requireWriteToolsEnabled, classifyExternalError } from "../lib/toolResponse.js";
7
+ import { MAX_BALANCE_USAGE_PCT, RISK_BLOCK_THRESHOLD, MAX_TX_AMOUNT_PHRS, CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
8
+ import { getSigner, isSignerFailure } from "../lib/signer/index.js";
9
+ import { evaluateActionPolicy } from "../lib/policy/actionPolicyEngine.js";
7
10
  export const sendPaymentSchema = z.object({
8
11
  toAddress: z.string(),
9
12
  amount: z.string(),
10
13
  memo: z.string().optional(),
14
+ agentId: z.string().optional().describe("Managed testnet wallet agentId when WALLET_MODE=managed-testnet"),
11
15
  });
12
16
  export const sendPaymentTool = {
13
17
  name: "send_payment",
@@ -15,89 +19,91 @@ export const sendPaymentTool = {
15
19
  inputSchema: sendPaymentSchema,
16
20
  };
17
21
  export async function handleSendPayment(raw) {
18
- const privateKey = process.env.PRIVATE_KEY;
19
- const walletAddress = process.env.WALLET_ADDRESS;
20
- if (!privateKey || !walletAddress)
21
- throw new Error("Missing PRIVATE_KEY or WALLET_ADDRESS in environment variables.");
22
+ const writeGuard = requireWriteToolsEnabled("send_payment");
23
+ if (writeGuard)
24
+ return writeGuard;
22
25
  const input = sendPaymentSchema.parse(raw);
26
+ const signer = await getSigner(input.agentId);
27
+ if (isSignerFailure(signer)) {
28
+ return fail(signer.error.code, signer.error.message, false, "send_payment");
29
+ }
30
+ const walletAddress = signer.address;
31
+ const policy = evaluateActionPolicy({
32
+ actionType: "send_payment",
33
+ amount: input.amount,
34
+ amountUnit: "PHRS",
35
+ recipient: input.toAddress,
36
+ recipientVerified: false,
37
+ chainId: CHAIN_ID,
38
+ environment: PHAROS_ENVIRONMENT,
39
+ isMainnet: false,
40
+ signerAvailable: true,
41
+ requiresSigner: true,
42
+ });
43
+ if (policy.decision === "BLOCK") {
44
+ return fail("POLICY_BLOCKED", policy.reasons.join(" ") || "Payment blocked by SafeHands policy.", false, "send_payment");
45
+ }
46
+ if (Number(input.amount) > Number(MAX_TX_AMOUNT_PHRS)) {
47
+ return fail("TX_LIMIT_EXCEEDED", `Payment amount exceeds configured testnet limit (${MAX_TX_AMOUNT_PHRS} PHRS).`, false, "send_payment");
48
+ }
23
49
  const warnings = [];
24
50
  const validation = { addressValid: false, balanceSufficient: false, warnings };
25
- // Address validation
26
51
  if (!isAddress(input.toAddress)) {
27
- return { success: false, validation: { ...validation, addressValid: false }, error: "Invalid recipient address" };
52
+ return fail("INVALID_WALLET_ADDRESS", "Invalid recipient address", false, "send_payment");
28
53
  }
29
54
  validation.addressValid = true;
30
55
  if (input.toAddress === "0x0000000000000000000000000000000000000000") {
31
- return { success: false, validation, error: "Cannot send to zero address" };
56
+ return fail("ZERO_ADDRESS_BLOCKED", "Cannot send to zero address", false, "send_payment");
32
57
  }
33
58
  if (input.toAddress.toLowerCase() === walletAddress.toLowerCase()) {
34
59
  warnings.push("Sending to own address");
35
60
  }
36
- // Balance check
37
61
  const amountWei = parseEther(input.amount);
38
62
  const balance = await publicClient.getBalance({ address: walletAddress });
39
63
  const gasEstimate = parseEther("0.01");
40
64
  if (balance < amountWei + gasEstimate) {
41
- return {
42
- success: false,
43
- validation: { ...validation, balanceSufficient: false, warnings: [...warnings, "Insufficient balance"] },
44
- error: `Insufficient balance: have ${formatEther(balance)} PHRS, need ${input.amount} + gas`,
45
- };
65
+ return fail("INSUFFICIENT_TESTNET_BALANCE", `Insufficient balance: have ${formatEther(balance)} PHRS, need ${input.amount} + gas`, false, "send_payment");
46
66
  }
47
67
  validation.balanceSufficient = true;
48
68
  const usagePct = Number((amountWei * 100n) / balance);
49
69
  if (usagePct > MAX_BALANCE_USAGE_PCT) {
50
70
  warnings.push(`Using ${usagePct}% of wallet balance — high exposure`);
51
71
  }
52
- // Risk assessment
53
- let riskScore = 0;
54
- if (true) {
55
- const risk = await assessRisk({
56
- action: "transfer",
57
- amount: input.amount,
58
- toAddress: input.toAddress,
59
- walletAddress: walletAddress,
60
- });
61
- riskScore = risk.riskScore;
62
- if (riskScore > RISK_BLOCK_THRESHOLD) {
63
- return {
64
- success: false,
65
- validation: {
66
- addressValid: true,
67
- balanceSufficient: true,
68
- warnings,
69
- },
70
- riskAssessment: {
71
- riskScore,
72
- wasBlocked: true,
73
- blockReason: risk.suggestion,
74
- },
75
- error: `Payment blocked — risk score ${riskScore}/100: ${risk.suggestion}`,
76
- };
77
- }
72
+ const risk = await assessRisk({
73
+ action: "transfer",
74
+ amount: input.amount,
75
+ toAddress: input.toAddress,
76
+ walletAddress,
77
+ });
78
+ if (risk.riskScore > RISK_BLOCK_THRESHOLD) {
79
+ return fail("POLICY_BLOCKED", `Payment blocked — risk score ${risk.riskScore}/100: ${risk.suggestion}`, false, "send_payment");
78
80
  }
79
81
  try {
80
- const wallet = createPharosWalletClient(privateKey);
82
+ const wallet = createPharosWalletClientFromAccount(signer.account);
81
83
  const txHash = await wallet.sendTransaction({
82
84
  to: input.toAddress,
83
85
  value: amountWei,
84
86
  });
85
87
  const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
86
- return {
87
- success: receipt.status === "success",
88
+ return ok({
89
+ txSuccess: receipt.status === "success",
88
90
  txHash,
89
91
  explorerUrl: getExplorerUrl(txHash),
90
92
  amountSent: input.amount,
93
+ signerMode: signer.mode,
94
+ walletAddress,
91
95
  gasUsed: receipt.gasUsed.toString(),
92
96
  validation,
97
+ policy,
93
98
  riskAssessment: {
94
- riskScore,
99
+ riskScore: risk.riskScore,
95
100
  wasBlocked: false,
96
101
  },
97
- };
102
+ source: "send_payment",
103
+ });
98
104
  }
99
105
  catch (err) {
100
- return { success: false, validation, error: `Payment failed: ${err.message}` };
106
+ return classifyExternalError("pharos_rpc", err);
101
107
  }
102
108
  }
103
109
  //# sourceMappingURL=sendPayment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sendPayment.js","sourceRoot":"","sources":["../../src/tools/sendPayment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sendPayment.js","sourceRoot":"","sources":["../../src/tools/sendPayment.ts"],"names":[],"mappings":"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"}
@@ -8,15 +8,15 @@ export declare const simulateTransactionSchema: z.ZodObject<{
8
8
  walletAddress: z.ZodString;
9
9
  }, "strip", z.ZodTypeAny, {
10
10
  amount: string;
11
- action: "transfer" | "swap";
12
11
  walletAddress: string;
12
+ action: "transfer" | "swap";
13
13
  tokenIn?: string | undefined;
14
14
  tokenOut?: string | undefined;
15
15
  toAddress?: string | undefined;
16
16
  }, {
17
17
  amount: string;
18
- action: "transfer" | "swap";
19
18
  walletAddress: string;
19
+ action: "transfer" | "swap";
20
20
  tokenIn?: string | undefined;
21
21
  tokenOut?: string | undefined;
22
22
  toAddress?: string | undefined;
@@ -34,15 +34,15 @@ export declare const simulateTransactionTool: {
34
34
  walletAddress: z.ZodString;
35
35
  }, "strip", z.ZodTypeAny, {
36
36
  amount: string;
37
- action: "transfer" | "swap";
38
37
  walletAddress: string;
38
+ action: "transfer" | "swap";
39
39
  tokenIn?: string | undefined;
40
40
  tokenOut?: string | undefined;
41
41
  toAddress?: string | undefined;
42
42
  }, {
43
43
  amount: string;
44
- action: "transfer" | "swap";
45
44
  walletAddress: string;
45
+ action: "transfer" | "swap";
46
46
  tokenIn?: string | undefined;
47
47
  tokenOut?: string | undefined;
48
48
  toAddress?: string | undefined;