safehands-pharos 1.2.0 → 1.2.4

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
@@ -1,5 +1,7 @@
1
1
  // ─── SafeHands x402 Server ──────────────────────────────────────────────
2
- // Exposes SafeHands risk assessment endpoints protected by x402 paywalls.
2
+ // Exposes SafeHands risk endpoints. /supported and /health are free and do
3
+ // not require user private keys. Paid routes are gated only when receiver +
4
+ // facilitator signer config is present.
3
5
  // ────────────────────────────────────────────────────────────────────────
4
6
  import express from "express";
5
7
  import { join } from "path";
@@ -15,8 +17,8 @@ import { paymentMiddleware, x402ResourceServer } from "@x402/express";
15
17
  import { handleAssessRisk } from "./tools/assessRisk.js";
16
18
  import { handleCheckTokenSecurity } from "./tools/checkTokenSecurity.js";
17
19
  import { handleSimulateTransaction } from "./tools/simulateTransaction.js";
18
- import { USDC_ADDRESS } from "./lib/constants.js";
19
- // Load Environment Variables
20
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, RPC_URL, X402_PAYMENT_TOKEN_ADDRESS } from "./lib/constants.js";
21
+ import { fail, ok } from "./lib/toolResponse.js";
20
22
  function loadEnv() {
21
23
  try {
22
24
  const f = readFileSync(join(process.cwd(), ".env"), "utf-8");
@@ -27,129 +29,173 @@ function loadEnv() {
27
29
  const i = t.indexOf("=");
28
30
  if (i === -1)
29
31
  continue;
30
- process.env[t.slice(0, i).trim()] = t.slice(i + 1).trim();
32
+ const key = t.slice(0, i).trim();
33
+ if (process.env[key] === undefined)
34
+ process.env[key] = t.slice(i + 1).trim();
31
35
  }
32
36
  }
33
- catch (e) { }
37
+ catch { }
34
38
  }
35
39
  loadEnv();
36
- const PK = process.env.PRIVATE_KEY;
37
- const WALLET = process.env.WALLET_ADDRESS;
38
- if (!PK || !WALLET) {
39
- console.error("❌ PRIVATE_KEY and WALLET_ADDRESS environment variables must be configured in .env");
40
- process.exit(1);
41
- }
42
- const payToAddress = WALLET;
43
- const port = parseInt(process.env.X402_PORT || "4021", 10);
44
- const rpcUrl = "https://atlantic.dplabs-internal.com/";
45
- const usdcAddress = USDC_ADDRESS;
46
- // === Define Pharos Testnet ===
40
+ const receiverAddress = (process.env.X402_PAY_TO || process.env.WALLET_ADDRESS || "");
41
+ const facilitatorPrivateKey = process.env.X402_FACILITATOR_PRIVATE_KEY || "";
42
+ const port = parseInt(process.env.X402_SERVER_PORT || process.env.X402_PORT || "4021", 10);
43
+ const rpcUrl = process.env.PHAROS_RPC_URL || RPC_URL;
44
+ const usdcAddress = X402_PAYMENT_TOKEN_ADDRESS;
45
+ const priceUsdc = process.env.X402_PRICE_USDC || "0.001";
46
+ const isPaidConfigured = Boolean(receiverAddress && facilitatorPrivateKey);
47
47
  const pharos = defineChain({
48
- id: 688_689,
49
- name: "Pharos Atlantic",
48
+ id: CHAIN_ID,
49
+ name: `Pharos ${PHAROS_ENVIRONMENT}`,
50
50
  nativeCurrency: { name: "PHRS", symbol: "PHRS", decimals: 18 },
51
51
  rpcUrls: { default: { http: [rpcUrl] } },
52
52
  testnet: true,
53
53
  });
54
- // === Create Facilitator EVM Client ===
55
- const account = privateKeyToAccount(PK);
56
- const walletClient = createWalletClient({
57
- account,
58
- chain: pharos,
59
- transport: http(undefined, { timeout: 30_000 }),
60
- }).extend(publicActions);
61
- const evmSigner = toFacilitatorEvmSigner({
62
- address: account.address,
63
- getCode: (args) => walletClient.getCode(args),
64
- readContract: (args) => walletClient.readContract({ ...args, args: args.args || [] }),
65
- verifyTypedData: (args) => walletClient.verifyTypedData(args),
66
- writeContract: (args) => walletClient.writeContract({ ...args, args: args.args || [] }),
67
- sendTransaction: (args) => walletClient.sendTransaction(args),
68
- waitForTransactionReceipt: (args) => walletClient.waitForTransactionReceipt(args),
54
+ const app = express();
55
+ app.disable("x-powered-by");
56
+ app.use((req, res, next) => {
57
+ req.setTimeout(15_000);
58
+ res.setHeader("X-Content-Type-Options", "nosniff");
59
+ res.setHeader("Referrer-Policy", "no-referrer");
60
+ next();
69
61
  });
70
- // === Initialize Facilitator ===
71
- const facilitator = new x402Facilitator();
72
- facilitator.register("eip155:688689", new FacilitatorExactEvmScheme(evmSigner, {}));
73
- // === Initialize Resource Server ===
74
- const facilitatorClient = new HTTPFacilitatorClient({ url: `http://localhost:${port}` });
75
- const resourceServer = new x402ResourceServer(facilitatorClient);
76
- const evmScheme = new ServerExactEvmScheme();
77
- evmScheme.registerMoneyParser(async (amount, network) => {
78
- if (network === "eip155:688689") {
79
- return {
80
- amount: Math.round(amount * 1e6).toString(), // Convert to USDC integer units
81
- asset: usdcAddress,
82
- extra: {
83
- token: "USDC",
84
- name: "USDC",
85
- version: "2",
86
- },
87
- };
62
+ app.use(express.json({ limit: "64kb" }));
63
+ const rateLimitWindowMs = 60_000;
64
+ const rateLimitMax = 120;
65
+ const rateLimitBuckets = new Map();
66
+ app.use((req, res, next) => {
67
+ const key = req.ip || "unknown";
68
+ const now = Date.now();
69
+ const bucket = rateLimitBuckets.get(key);
70
+ if (!bucket || bucket.resetAt <= now) {
71
+ rateLimitBuckets.set(key, { count: 1, resetAt: now + rateLimitWindowMs });
72
+ return next();
88
73
  }
89
- return null;
74
+ bucket.count += 1;
75
+ if (bucket.count > rateLimitMax) {
76
+ return res.status(429).json(fail("RATE_LIMITED", "Too many requests", true, "x402_server"));
77
+ }
78
+ return next();
90
79
  });
91
- resourceServer.register("eip155:688689", evmScheme);
92
- // === Express Server setup ===
93
- const app = express();
94
- app.use(express.json());
95
- // --- Facilitator endpoints ---
80
+ let facilitator = null;
81
+ let resourceServer = null;
82
+ if (isPaidConfigured) {
83
+ const account = privateKeyToAccount(facilitatorPrivateKey);
84
+ const walletClient = createWalletClient({
85
+ account,
86
+ chain: pharos,
87
+ transport: http(undefined, { timeout: 30_000 }),
88
+ }).extend(publicActions);
89
+ const evmSigner = toFacilitatorEvmSigner({
90
+ address: account.address,
91
+ getCode: (args) => walletClient.getCode(args),
92
+ readContract: (args) => walletClient.readContract({ ...args, args: args.args || [] }),
93
+ verifyTypedData: (args) => walletClient.verifyTypedData(args),
94
+ writeContract: (args) => walletClient.writeContract({ ...args, args: args.args || [] }),
95
+ sendTransaction: (args) => walletClient.sendTransaction(args),
96
+ waitForTransactionReceipt: (args) => walletClient.waitForTransactionReceipt(args),
97
+ });
98
+ facilitator = new x402Facilitator();
99
+ facilitator.register(`eip155:${CHAIN_ID}`, new FacilitatorExactEvmScheme(evmSigner, {}));
100
+ const facilitatorClient = new HTTPFacilitatorClient({ url: `http://localhost:${port}` });
101
+ resourceServer = new x402ResourceServer(facilitatorClient);
102
+ const evmScheme = new ServerExactEvmScheme();
103
+ evmScheme.registerMoneyParser(async (amount, network) => {
104
+ if (network === `eip155:${CHAIN_ID}`) {
105
+ return {
106
+ amount: Math.round(amount * 1e6).toString(),
107
+ asset: usdcAddress,
108
+ extra: { token: "USDC", name: "USDC", version: "2" },
109
+ };
110
+ }
111
+ return null;
112
+ });
113
+ resourceServer.register(`eip155:${CHAIN_ID}`, evmScheme);
114
+ }
96
115
  app.post("/verify", async (req, res) => {
116
+ if (!facilitator) {
117
+ return res.status(503).json(fail("X402_SERVER_RECEIVER_CONFIG_MISSING", "x402 facilitator is not configured. Set X402_PAY_TO/WALLET_ADDRESS and X402_FACILITATOR_PRIVATE_KEY for paid endpoints. Client PRIVATE_KEY is not used for server receiver config.", false, "x402_server"));
118
+ }
97
119
  try {
98
120
  const { paymentPayload, paymentRequirements } = req.body;
99
121
  const result = await facilitator.verify(paymentPayload, paymentRequirements);
100
122
  res.json(result);
101
123
  }
102
124
  catch (e) {
103
- res.status(500).json({ error: e.message });
125
+ res.status(500).json(fail("X402_PAYMENT_FAILED", e.message, true, "x402_server"));
104
126
  }
105
127
  });
106
128
  app.post("/settle", async (req, res) => {
129
+ if (!facilitator) {
130
+ return res.status(503).json(fail("X402_SERVER_RECEIVER_CONFIG_MISSING", "x402 facilitator is not configured. Set X402_PAY_TO/WALLET_ADDRESS and X402_FACILITATOR_PRIVATE_KEY for paid endpoints. Client PRIVATE_KEY is not used for server receiver config.", false, "x402_server"));
131
+ }
107
132
  try {
108
133
  const { paymentPayload, paymentRequirements } = req.body;
109
134
  const result = await facilitator.settle(paymentPayload, paymentRequirements);
110
135
  res.json(result);
111
136
  }
112
137
  catch (e) {
113
- res.status(500).json({ error: e.message });
138
+ res.status(500).json(fail("X402_PAYMENT_FAILED", e.message, true, "x402_server"));
114
139
  }
115
140
  });
116
- app.get("/supported", (req, res) => {
117
- res.json(facilitator.getSupported());
141
+ app.get("/supported", (_req, res) => {
142
+ if (facilitator)
143
+ return res.json(facilitator.getSupported());
144
+ return res.json(ok({
145
+ configured: false,
146
+ network: `eip155:${CHAIN_ID}`,
147
+ scheme: "exact",
148
+ asset: usdcAddress,
149
+ priceUsdc,
150
+ freeEndpoints: ["GET /supported", "GET /health"],
151
+ paidEndpoints: ["GET /assess-risk", "GET /check-token-security", "GET /simulate-transaction"],
152
+ configError: {
153
+ code: "X402_SERVER_RECEIVER_CONFIG_MISSING",
154
+ message: "Paid endpoints require receiver/payTo plus facilitator signer config. Free endpoints remain available.",
155
+ },
156
+ }));
118
157
  });
119
- // --- x402 Paid Middleware gating ---
120
- app.use(paymentMiddleware({
121
- "GET /assess-risk": {
122
- accepts: {
123
- scheme: "exact",
124
- price: "0.001", // USDC amount: $0.001
125
- network: "eip155:688689",
126
- payTo: payToAddress,
158
+ app.get("/health", (_req, res) => {
159
+ res.json(ok({
160
+ status: "ok",
161
+ service: "SafeHands x402 Resource Server",
162
+ network: `Pharos ${PHAROS_ENVIRONMENT} (Chain ID ${CHAIN_ID})`,
163
+ environment: PHAROS_ENVIRONMENT,
164
+ isMainnet: false,
165
+ receiverConfigured: Boolean(receiverAddress),
166
+ paidEndpointsConfigured: isPaidConfigured,
167
+ receiver: receiverAddress || null,
168
+ asset: usdcAddress,
169
+ freeEndpoints: ["/supported", "/health"],
170
+ }));
171
+ });
172
+ function paidConfigError(req, res, next) {
173
+ if (isPaidConfigured)
174
+ return next();
175
+ return res.status(503).json(fail("X402_SERVER_RECEIVER_CONFIG_MISSING", "Paid endpoint receiver/payTo or facilitator signer config is missing. Free endpoints do not require a client signer/private key.", false, "x402_server"));
176
+ }
177
+ if (isPaidConfigured && resourceServer) {
178
+ app.use(paymentMiddleware({
179
+ "GET /assess-risk": {
180
+ accepts: { scheme: "exact", price: priceUsdc, network: `eip155:${CHAIN_ID}`, payTo: receiverAddress },
181
+ description: `Assess transaction risk (USDC ${priceUsdc})`,
182
+ mimeType: "application/json",
127
183
  },
128
- description: "Assess transaction risk (USDC 0.001)",
129
- mimeType: "application/json",
130
- },
131
- "GET /check-token-security": {
132
- accepts: {
133
- scheme: "exact",
134
- price: "0.001", // USDC amount: $0.001
135
- network: "eip155:688689",
136
- payTo: payToAddress,
184
+ "GET /check-token-security": {
185
+ accepts: { scheme: "exact", price: priceUsdc, network: `eip155:${CHAIN_ID}`, payTo: receiverAddress },
186
+ description: `Verify contract token security profile (USDC ${priceUsdc})`,
187
+ mimeType: "application/json",
137
188
  },
138
- description: "Verify contract token security profile (USDC 0.001)",
139
- mimeType: "application/json",
140
- },
141
- "GET /simulate-transaction": {
142
- accepts: {
143
- scheme: "exact",
144
- price: "0.001", // USDC amount: $0.001
145
- network: "eip155:688689",
146
- payTo: payToAddress,
189
+ "GET /simulate-transaction": {
190
+ accepts: { scheme: "exact", price: priceUsdc, network: `eip155:${CHAIN_ID}`, payTo: receiverAddress },
191
+ description: `Simulate EVM execution trace before broadcasting (USDC ${priceUsdc})`,
192
+ mimeType: "application/json",
147
193
  },
148
- description: "Simulate EVM execution trace before broadcasting (USDC 0.001)",
149
- mimeType: "application/json",
150
- },
151
- }, resourceServer));
152
- // --- Paid Business Logic ---
194
+ }, resourceServer));
195
+ }
196
+ else {
197
+ app.use(["/assess-risk", "/check-token-security", "/simulate-transaction"], paidConfigError);
198
+ }
153
199
  app.get("/assess-risk", async (req, res) => {
154
200
  try {
155
201
  const { action, tokenIn, tokenOut, amount, toAddress, walletAddress } = req.query;
@@ -164,21 +210,18 @@ app.get("/assess-risk", async (req, res) => {
164
210
  res.json(result);
165
211
  }
166
212
  catch (e) {
167
- res.status(400).json({ error: e.message });
213
+ res.status(400).json(fail("BAD_REQUEST", e.message, false, "x402_server"));
168
214
  }
169
215
  });
170
216
  app.get("/check-token-security", async (req, res) => {
171
217
  try {
172
218
  const { tokenAddress, chainId } = req.query;
173
- const cid = chainId ? parseInt(chainId, 10) : 688689;
174
- const result = await handleCheckTokenSecurity({
175
- tokenAddress: tokenAddress,
176
- chainId: cid,
177
- });
219
+ const cid = chainId ? parseInt(chainId, 10) : CHAIN_ID;
220
+ const result = await handleCheckTokenSecurity({ tokenAddress: tokenAddress, chainId: cid });
178
221
  res.json(result);
179
222
  }
180
223
  catch (e) {
181
- res.status(400).json({ error: e.message });
224
+ res.status(400).json(fail("BAD_REQUEST", e.message, false, "x402_server"));
182
225
  }
183
226
  });
184
227
  app.get("/simulate-transaction", async (req, res) => {
@@ -195,25 +238,16 @@ app.get("/simulate-transaction", async (req, res) => {
195
238
  res.json(result);
196
239
  }
197
240
  catch (e) {
198
- res.status(400).json({ error: e.message });
241
+ res.status(400).json(fail("BAD_REQUEST", e.message, false, "x402_server"));
199
242
  }
200
243
  });
201
- // --- Free endpoints ---
202
- app.get("/health", (req, res) => {
203
- res.json({
204
- status: "ok",
205
- service: "SafeHands x402 Resource Server",
206
- network: "Pharos Atlantic Testnet (Chain ID 688689)",
207
- receiver: payToAddress,
208
- asset: usdcAddress,
209
- });
210
- });
211
- // Start Server
212
244
  app.listen(port, () => {
213
245
  console.log(`✅ SafeHands x402 Server listening on http://localhost:${port}`);
214
- console.log(`📡 Network: eip155:688689 (Pharos Atlantic Testnet)`);
215
- console.log(`💰 Paid Recipient Address: ${payToAddress}`);
216
- console.log(`🪙 USDC Contract Address: ${usdcAddress}`);
217
- console.log(`🚪 Gated APIs: /assess-risk, /check-token-security, /simulate-transaction`);
246
+ console.log(`📡 Network: eip155:${CHAIN_ID} (Pharos ${PHAROS_ENVIRONMENT})`);
247
+ console.log(`💰 Paid endpoints configured: ${isPaidConfigured ? "yes" : "no"}`);
248
+ if (receiverAddress)
249
+ console.log(`💰 Paid recipient address: ${receiverAddress}`);
250
+ console.log(`🪙 x402 payment token: ${usdcAddress}`);
251
+ console.log(`🆓 Free APIs: /supported, /health`);
218
252
  });
219
253
  //# sourceMappingURL=x402Server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x402Server.js","sourceRoot":"","sources":["../src/x402Server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"x402Server.js","sourceRoot":"","sources":["../src/x402Server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: safehands-guard
3
+ version: 1.0.0
4
+ description: Transaction Safety Firewall / Guardrail Skill for Pharos Skill Engine on Pharos Atlantic Testnet.
5
+ author: SZtch
6
+ chain: pharos-atlantic-testnet
7
+ tags: [pharos, skill-engine, guardrail, transaction-safety, x402, risk, ai-agent]
8
+ ---
9
+
10
+ # SafeHands Guard
11
+
12
+ SafeHands Guard is a **Transaction Safety Firewall / Guardrail Skill** for Pharos Skill Engine. It checks whether an AI agent action, token approval, x402 payment, swap, wallet action, or token interaction is safe before execution on Pharos Atlantic Testnet.
13
+
14
+ Use this skill when the user wants to check whether an AI agent action, transaction, token approval, x402 payment, swap, wallet action, or token interaction is safe before execution on Pharos Atlantic Testnet.
15
+
16
+ SafeHands complements Pharos Skill Engine. It is not a replacement for Pharos Skill Engine and should not be used as a generic Web3 toolbox.
17
+
18
+ ```text
19
+ User intent
20
+ → SafeHands preflight
21
+ → ALLOW / WARN / BLOCK / REQUIRE_CONFIRMATION
22
+ → Pharos Skill Engine or MCP execution
23
+ → SafeHands risk report
24
+ ```
25
+
26
+ ## When to use this skill
27
+
28
+ Use SafeHands when:
29
+
30
+ - The user or agent is about to send PHRS, approve tokens, swap assets, call a custom contract, publish risk data, or pay an x402 endpoint.
31
+ - The user asks if a token address is canonical, custom, non-registry, unknown, or invalid.
32
+ - The user asks why an action was blocked, warned, or requires confirmation.
33
+ - The agent needs a wallet readiness check before an on-chain or x402 action.
34
+
35
+ ## When not to use this skill
36
+
37
+ Do not use SafeHands as the primary execution engine for generic Web3 tasks. If the user only wants to deploy a contract, write Solidity, or perform a normal Pharos Skill Engine tutorial flow, use the appropriate Pharos Skill Engine capability first and add SafeHands only as the preflight guardrail.
38
+
39
+ ## Pharos Atlantic Testnet context
40
+
41
+ | Field | Value |
42
+ |---|---|
43
+ | Environment | `atlantic-testnet` |
44
+ | Chain ID | `688689` |
45
+ | Mainnet | `false` |
46
+ | Default write tools | disabled |
47
+ | Safety posture | testnet-only guardrail |
48
+
49
+ ## Capability Index
50
+
51
+ | User wants to... | Capability | Reference |
52
+ |---|---|---|
53
+ | Check whether an on-chain action is safe before execution | SafeHands Preflight Check | references/safehands.md#safehands-preflight-check |
54
+ | Check whether an x402 paid endpoint is safe to pay | SafeHands x402 Preflight | references/safehands.md#safehands-x402-preflight |
55
+ | Check whether an agent wallet is ready to act | SafeHands Wallet Health | references/safehands.md#safehands-wallet-health |
56
+ | Check whether a token address is canonical or custom | Token Registry Status | references/safehands.md#token-registry-status |
57
+ | Explain why an action was blocked or warned | Explain Risk | references/safehands.md#explain-risk |
58
+ | Generate a human-readable safety report | SafeHands Risk Report | references/safehands.md#safehands-risk-report |
59
+
60
+ ## Natural language examples
61
+
62
+ - "Check if this token approval is safe before execution."
63
+ - "Run SafeHands preflight before paying this x402 endpoint."
64
+ - "Explain why this action was blocked."
65
+ - "Check whether this token is canonical on Pharos Atlantic Testnet."
66
+ - "Tell me if this wallet is ready for x402 payment."
67
+
68
+ ## Agent behavior guidelines
69
+
70
+ 1. Always run `safehands_preflight_check` before any write action.
71
+ 2. If `decision` is `BLOCK`, do not execute the action.
72
+ 3. If `decision` is `WARN`, explain the risk and ask for user confirmation.
73
+ 4. If `decision` is `REQUIRE_CONFIRMATION`, ask for explicit user approval.
74
+ 5. If `decision` is `REQUIRE_FUNDING`, ask the user to fund the testnet wallet before continuing.
75
+ 6. If `decision` is `REQUIRE_TOKEN_REVIEW`, ask the user to verify the exact token contract.
76
+ 7. If `decision` is `ALLOW`, the action may continue through Pharos Skill Engine or MCP execution.
77
+ 8. Never silently replace a user-provided token address.
78
+ 9. Never request or reveal private keys in the conversation.
79
+ 10. Treat SafeHands output as a safety decision, not a guarantee that external contracts are audited.
80
+
81
+ ## Safety disclaimer
82
+
83
+ SafeHands is built for Pharos Atlantic Testnet hackathon workflows. It is not audited for mainnet production use. Write tools are disabled by default and require explicit configuration. Managed wallet storage is testnet-grade only.
84
+
85
+ For command templates, parameters, output parsing, and error handling, see [`references/safehands.md`](references/safehands.md).
@@ -0,0 +1,49 @@
1
+ {
2
+ "safeApproval": {
3
+ "actionType": "approve_token",
4
+ "chainId": 688689,
5
+ "isMainnet": false,
6
+ "tokenAddress": "0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B",
7
+ "spender": "0x000000000000000000000000000000000000dEaD",
8
+ "approvalAmount": "1"
9
+ },
10
+ "blockedUnlimitedApproval": {
11
+ "actionType": "approve_token",
12
+ "chainId": 688689,
13
+ "isMainnet": false,
14
+ "tokenAddress": "0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B",
15
+ "spender": "0x000000000000000000000000000000000000dEaD",
16
+ "approvalAmount": "max"
17
+ },
18
+ "x402FreeEndpoint": {
19
+ "url": "https://example.com/health",
20
+ "paymentAmountUsdc": "0",
21
+ "probeEndpoint": false
22
+ },
23
+ "x402PaidEndpoint": {
24
+ "url": "https://example.com/assess-risk",
25
+ "paymentAmountUsdc": "0.001",
26
+ "probeEndpoint": false
27
+ },
28
+ "mainnetBlockedAction": {
29
+ "actionType": "send_payment",
30
+ "chainId": 1,
31
+ "isMainnet": true,
32
+ "recipient": "0x000000000000000000000000000000000000dEaD",
33
+ "amount": "0.001"
34
+ },
35
+ "chainIdMismatch": {
36
+ "actionType": "send_payment",
37
+ "chainId": 688688,
38
+ "isMainnet": false,
39
+ "recipient": "0x000000000000000000000000000000000000dEaD",
40
+ "amount": "0.001"
41
+ },
42
+ "customTokenWarning": {
43
+ "actionType": "execute_swap",
44
+ "chainId": 688689,
45
+ "isMainnet": false,
46
+ "tokenAddress": "0x000000000000000000000000000000000000dEaD",
47
+ "amount": "1"
48
+ }
49
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "environment": "atlantic-testnet",
3
+ "chainId": 688689,
4
+ "isMainnet": false,
5
+ "writeToolsEnabledByDefault": false,
6
+ "allowUnlimitedApprovalByDefault": false,
7
+ "maxTxAmountPHRS": "0.1",
8
+ "maxX402PaymentUSDC": "0.01",
9
+ "maxApprovalAmountUSDC": "10",
10
+ "maxDailySpendUSD": "10"
11
+ }