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
@@ -2,12 +2,16 @@
2
2
  // Approves ERC-20 token spending for DODO swap router.
3
3
  // ────────────────────────────────────────────────────────────────────────
4
4
  import { z } from "zod";
5
- import { publicClient, createPharosWalletClient, getExplorerUrl } from "../lib/pharosClient.js";
6
- import { DODO_APPROVE_ADDRESS, USDC_ADDRESS, USDT_ADDRESS, ERC20_ABI } from "../lib/constants.js";
5
+ import { publicClient, createPharosWalletClientFromAccount, getExplorerUrl } from "../lib/pharosClient.js";
6
+ import { DODO_APPROVE_ADDRESS, USDC_ADDRESS, USDT_ADDRESS, ERC20_ABI, MAX_APPROVAL_AMOUNT_USDC, CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
7
7
  import { resolveTokenDecimals, toWei } from "../lib/dodoApi.js";
8
+ import { fail, ok, requireWriteToolsEnabled, classifyExternalError } from "../lib/toolResponse.js";
9
+ import { getSigner, isSignerFailure } from "../lib/signer/index.js";
10
+ import { evaluateActionPolicy } from "../lib/policy/actionPolicyEngine.js";
8
11
  export const approveTokenSchema = z.object({
9
12
  token: z.enum(["USDC", "USDT"]).describe("ERC-20 token to approve"),
10
13
  amount: z.string().describe("Human-readable amount to approve, or 'max' for unlimited"),
14
+ agentId: z.string().optional().describe("Managed testnet wallet agentId when WALLET_MODE=managed-testnet"),
11
15
  });
12
16
  export const approveTokenTool = {
13
17
  name: "approve_token",
@@ -15,18 +19,42 @@ export const approveTokenTool = {
15
19
  inputSchema: approveTokenSchema,
16
20
  };
17
21
  export async function handleApproveToken(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("approve_token");
23
+ if (writeGuard)
24
+ return writeGuard;
22
25
  const input = approveTokenSchema.parse(raw);
26
+ const signer = await getSigner(input.agentId);
27
+ if (isSignerFailure(signer)) {
28
+ return fail(signer.error.code, signer.error.message, false, "approve_token");
29
+ }
30
+ const policy = evaluateActionPolicy({
31
+ actionType: "approve_token",
32
+ approvalAmount: input.amount,
33
+ approvalToken: input.token,
34
+ approvalUnlimited: input.amount === "max",
35
+ spender: DODO_APPROVE_ADDRESS,
36
+ spenderVerified: true,
37
+ chainId: CHAIN_ID,
38
+ environment: PHAROS_ENVIRONMENT,
39
+ isMainnet: false,
40
+ signerAvailable: true,
41
+ requiresSigner: true,
42
+ allowUnlimitedApproval: process.env.ALLOW_UNLIMITED_APPROVAL === "true",
43
+ });
44
+ if (policy.decision === "BLOCK") {
45
+ const code = input.amount === "max" ? "UNLIMITED_APPROVAL_BLOCKED" : "POLICY_BLOCKED";
46
+ return fail(code, policy.reasons.join(" ") || "Approval blocked by SafeHands policy.", false, "approve_token");
47
+ }
48
+ if (input.amount !== "max" && Number(input.amount) > Number(MAX_APPROVAL_AMOUNT_USDC)) {
49
+ return fail("APPROVAL_LIMIT_EXCEEDED", `Approval amount exceeds configured testnet limit (${MAX_APPROVAL_AMOUNT_USDC}).`, false, "approve_token");
50
+ }
23
51
  const tokenAddress = input.token === "USDC" ? USDC_ADDRESS : USDT_ADDRESS;
24
52
  const decimals = resolveTokenDecimals(input.token);
25
53
  const approveAmount = input.amount === "max"
26
- ? 2n ** 256n - 1n // type(uint256).max
54
+ ? 2n ** 256n - 1n
27
55
  : BigInt(toWei(input.amount, decimals));
28
56
  try {
29
- const wallet = createPharosWalletClient(privateKey);
57
+ const wallet = createPharosWalletClientFromAccount(signer.account);
30
58
  const txHash = await wallet.writeContract({
31
59
  address: tokenAddress,
32
60
  abi: ERC20_ABI,
@@ -34,28 +62,23 @@ export async function handleApproveToken(raw) {
34
62
  args: [DODO_APPROVE_ADDRESS, approveAmount],
35
63
  });
36
64
  const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
37
- return {
38
- success: receipt.status === "success",
65
+ return ok({
66
+ txSuccess: receipt.status === "success",
39
67
  txHash,
40
68
  explorerUrl: getExplorerUrl(txHash),
41
69
  token: input.token,
42
70
  tokenAddress,
43
71
  approvedAmount: input.amount === "max" ? "unlimited" : input.amount,
44
72
  spender: DODO_APPROVE_ADDRESS,
73
+ signerMode: signer.mode,
74
+ walletAddress: signer.address,
45
75
  gasUsed: receipt.gasUsed.toString(),
46
- };
76
+ policy,
77
+ source: "approve_token",
78
+ });
47
79
  }
48
80
  catch (err) {
49
- return {
50
- success: false,
51
- txHash: null,
52
- explorerUrl: null,
53
- token: input.token,
54
- tokenAddress,
55
- approvedAmount: null,
56
- spender: DODO_APPROVE_ADDRESS,
57
- error: `Approval failed: ${err.message}`,
58
- };
81
+ return classifyExternalError("pharos_rpc", err);
59
82
  }
60
83
  }
61
84
  //# sourceMappingURL=approveToken.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"approveToken.js","sourceRoot":"","sources":["../../src/tools/approveToken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approveToken.js","sourceRoot":"","sources":["../../src/tools/approveToken.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,uDAAuD;AACvD,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,mCAAmC,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,wBAAwB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC1J,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IACvF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;CAC3G,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,uGAAuG;IACzG,WAAW,EAAE,kBAAkB;CAChC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAsB;IAC7D,MAAM,UAAU,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAC7D,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,UAAU,EAAE,eAAe;QAC3B,cAAc,EAAE,KAAK,CAAC,MAAM;QAC5B,aAAa,EAAE,KAAK,CAAC,KAAK;QAC1B,iBAAiB,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK;QACzC,OAAO,EAAE,oBAAoB;QAC7B,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,kBAAkB;QAC/B,SAAS,EAAE,KAAK;QAChB,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,IAAI;QACpB,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM;KACxE,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACtF,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,uCAAuC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACjH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC,yBAAyB,EAAE,qDAAqD,wBAAwB,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACpJ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,aAAa,GACjB,KAAK,CAAC,MAAM,KAAK,KAAK;QACpB,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,EAAE;QACjB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mCAAmC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACxC,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC;SAC5C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/E,OAAO,EAAE,CAAC;YACR,SAAS,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS;YACvC,MAAM;YACN,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC;YACnC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY;YACZ,cAAc,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;YACnE,OAAO,EAAE,oBAAoB;YAC7B,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YACnC,MAAM;YACN,MAAM,EAAE,eAAe;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,qBAAqB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -7,23 +7,29 @@ export declare const assessRiskSchema: z.ZodObject<{
7
7
  amount: z.ZodString;
8
8
  toAddress: z.ZodOptional<z.ZodString>;
9
9
  walletAddress: z.ZodString;
10
+ agentId: z.ZodOptional<z.ZodString>;
11
+ autoPublish: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
10
12
  privateKey: z.ZodOptional<z.ZodString>;
11
13
  }, "strip", z.ZodTypeAny, {
12
14
  amount: string;
13
- action: "transfer" | "swap";
14
15
  walletAddress: string;
15
- privateKey?: string | undefined;
16
+ action: "transfer" | "swap";
17
+ autoPublish: boolean;
16
18
  tokenIn?: string | undefined;
17
19
  tokenOut?: string | undefined;
20
+ privateKey?: string | undefined;
21
+ agentId?: string | undefined;
18
22
  toAddress?: string | undefined;
19
23
  }, {
20
24
  amount: string;
21
- action: "transfer" | "swap";
22
25
  walletAddress: string;
23
- privateKey?: string | undefined;
26
+ action: "transfer" | "swap";
24
27
  tokenIn?: string | undefined;
25
28
  tokenOut?: string | undefined;
29
+ privateKey?: string | undefined;
30
+ agentId?: string | undefined;
26
31
  toAddress?: string | undefined;
32
+ autoPublish?: boolean | undefined;
27
33
  }>;
28
34
  export type AssessRiskInput = z.input<typeof assessRiskSchema>;
29
35
  export interface AssessRiskResult extends RiskAssessment {
@@ -32,6 +38,7 @@ export interface AssessRiskResult extends RiskAssessment {
32
38
  txHash?: string;
33
39
  explorerUrl?: string;
34
40
  error?: string;
41
+ signerMode?: string;
35
42
  };
36
43
  }
37
44
  export declare const assessRiskTool: {
@@ -44,24 +51,30 @@ export declare const assessRiskTool: {
44
51
  amount: z.ZodString;
45
52
  toAddress: z.ZodOptional<z.ZodString>;
46
53
  walletAddress: z.ZodString;
54
+ agentId: z.ZodOptional<z.ZodString>;
55
+ autoPublish: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
47
56
  privateKey: z.ZodOptional<z.ZodString>;
48
57
  }, "strip", z.ZodTypeAny, {
49
58
  amount: string;
50
- action: "transfer" | "swap";
51
59
  walletAddress: string;
52
- privateKey?: string | undefined;
60
+ action: "transfer" | "swap";
61
+ autoPublish: boolean;
53
62
  tokenIn?: string | undefined;
54
63
  tokenOut?: string | undefined;
64
+ privateKey?: string | undefined;
65
+ agentId?: string | undefined;
55
66
  toAddress?: string | undefined;
56
67
  }, {
57
68
  amount: string;
58
- action: "transfer" | "swap";
59
69
  walletAddress: string;
60
- privateKey?: string | undefined;
70
+ action: "transfer" | "swap";
61
71
  tokenIn?: string | undefined;
62
72
  tokenOut?: string | undefined;
73
+ privateKey?: string | undefined;
74
+ agentId?: string | undefined;
63
75
  toAddress?: string | undefined;
76
+ autoPublish?: boolean | undefined;
64
77
  }>;
65
78
  };
66
- export declare function handleAssessRisk(input: AssessRiskInput): Promise<AssessRiskResult>;
79
+ export declare function handleAssessRisk(raw: AssessRiskInput): Promise<AssessRiskResult>;
67
80
  //# sourceMappingURL=assessRisk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assessRisk.d.ts","sourceRoot":"","sources":["../../src/tools/assessRisk.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIvE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;EAU3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,eAAe,CAAC,EAAE;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM1B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoDxF"}
1
+ {"version":3,"file":"assessRisk.d.ts","sourceRoot":"","sources":["../../src/tools/assessRisk.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMvE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,eAAe,CAAC,EAAE;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM1B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyEtF"}
@@ -1,11 +1,13 @@
1
1
  // ─── Tool: assess_risk ─────────────────────────────────────────────────
2
- // Core risk assessment tool. When privateKey is provided, auto-publishes
3
- // the result to the on-chain RiskRegistry.
2
+ // Core risk assessment tool. Optional on-chain publishing uses SignerProvider
3
+ // and never accepts or returns raw private keys.
4
4
  // ────────────────────────────────────────────────────────────────────────
5
5
  import { z } from "zod";
6
6
  import { assessRisk } from "../lib/riskEngine.js";
7
- import { createPharosWalletClient, publicClient, getExplorerUrl } from "../lib/pharosClient.js";
7
+ import { createPharosWalletClientFromAccount, publicClient, getExplorerUrl } from "../lib/pharosClient.js";
8
8
  import { RISK_REGISTRY_ADDRESS, RISK_REGISTRY_ABI } from "../lib/constants.js";
9
+ import { getSigner, isSignerFailure } from "../lib/signer/index.js";
10
+ import { requireWriteToolsEnabled } from "../lib/toolResponse.js";
9
11
  export const assessRiskSchema = z.object({
10
12
  action: z.enum(["swap", "transfer"]),
11
13
  tokenIn: z.string().optional(),
@@ -13,15 +15,18 @@ export const assessRiskSchema = z.object({
13
15
  amount: z.string(),
14
16
  toAddress: z.string().optional(),
15
17
  walletAddress: z.string(),
16
- privateKey: z.string().optional().describe("If provided, auto-publishes the risk score to the on-chain RiskRegistry"),
18
+ agentId: z.string().optional().describe("Managed testnet wallet agentId for optional registry publishing"),
19
+ autoPublish: z.boolean().optional().default(false).describe("If true, publish to RiskRegistry through SignerProvider when write tools are enabled"),
20
+ privateKey: z.string().optional().describe("Deprecated and ignored. Use SignerProvider via WALLET_MODE/agentId instead."),
17
21
  });
18
22
  export const assessRiskTool = {
19
23
  name: "assess_risk",
20
24
  description: "Evaluate risk of a planned on-chain action (swap or transfer). Returns 0-100 risk score with 5-dimension breakdown. " +
21
- "Optionally auto-publishes to on-chain RiskRegistry when privateKey is provided.",
25
+ "Optional RiskRegistry publishing uses SignerProvider when autoPublish=true.",
22
26
  inputSchema: assessRiskSchema,
23
27
  };
24
- export async function handleAssessRisk(input) {
28
+ export async function handleAssessRisk(raw) {
29
+ const input = assessRiskSchema.parse(raw);
25
30
  if (input.action === "swap" && (!input.tokenIn || !input.tokenOut)) {
26
31
  throw new Error("Swap action requires both tokenIn and tokenOut");
27
32
  }
@@ -37,10 +42,27 @@ export async function handleAssessRisk(input) {
37
42
  walletAddress: input.walletAddress,
38
43
  });
39
44
  const result = { ...assessment };
40
- // Auto-publish to on-chain registry if privateKey is provided
41
- if (input.privateKey) {
45
+ const wantsPublish = input.autoPublish || Boolean(input.privateKey);
46
+ if (wantsPublish) {
47
+ if (input.privateKey) {
48
+ result.registryPublish = {
49
+ published: false,
50
+ error: "Direct privateKey input is deprecated and ignored. Use WALLET_MODE=managed-testnet with agentId or WALLET_MODE=env through SignerProvider.",
51
+ };
52
+ return result;
53
+ }
54
+ const writeGuard = requireWriteToolsEnabled("assess_risk_auto_publish");
55
+ if (writeGuard) {
56
+ result.registryPublish = { published: false, error: `${writeGuard.error.code}: ${writeGuard.error.message}` };
57
+ return result;
58
+ }
59
+ const signer = await getSigner(input.agentId);
60
+ if (isSignerFailure(signer)) {
61
+ result.registryPublish = { published: false, error: `${signer.error.code}: ${signer.error.message}` };
62
+ return result;
63
+ }
42
64
  try {
43
- const wallet = createPharosWalletClient(input.privateKey);
65
+ const wallet = createPharosWalletClientFromAccount(signer.account);
44
66
  const txHash = await wallet.writeContract({
45
67
  address: RISK_REGISTRY_ADDRESS,
46
68
  abi: RISK_REGISTRY_ABI,
@@ -57,6 +79,7 @@ export async function handleAssessRisk(input) {
57
79
  published: true,
58
80
  txHash,
59
81
  explorerUrl: getExplorerUrl(txHash),
82
+ signerMode: signer.mode,
60
83
  };
61
84
  }
62
85
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"assessRisk.js","sourceRoot":"","sources":["../../src/tools/assessRisk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assessRisk.js","sourceRoot":"","sources":["../../src/tools/assessRisk.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,11 @@ export declare const checkAllowanceSchema: z.ZodObject<{
3
3
  walletAddress: z.ZodString;
4
4
  token: z.ZodEnum<["USDC", "USDT"]>;
5
5
  }, "strip", z.ZodTypeAny, {
6
+ token: "USDC" | "USDT";
6
7
  walletAddress: string;
7
- token: "USDT" | "USDC";
8
8
  }, {
9
+ token: "USDC" | "USDT";
9
10
  walletAddress: string;
10
- token: "USDT" | "USDC";
11
11
  }>;
12
12
  export type CheckAllowanceInput = z.input<typeof checkAllowanceSchema>;
13
13
  export declare const checkAllowanceTool: {
@@ -17,16 +17,16 @@ export declare const checkAllowanceTool: {
17
17
  walletAddress: z.ZodString;
18
18
  token: z.ZodEnum<["USDC", "USDT"]>;
19
19
  }, "strip", z.ZodTypeAny, {
20
+ token: "USDC" | "USDT";
20
21
  walletAddress: string;
21
- token: "USDT" | "USDC";
22
22
  }, {
23
+ token: "USDC" | "USDT";
23
24
  walletAddress: string;
24
- token: "USDT" | "USDC";
25
25
  }>;
26
26
  };
27
27
  export declare function handleCheckAllowance(raw: CheckAllowanceInput): Promise<{
28
- token: "USDT" | "USDC";
29
- tokenAddress: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5" | "0xcfC8330f4BCAB529c625D12781b1C19466A9Fc8B";
28
+ token: "USDC" | "USDT";
29
+ tokenAddress: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5" | "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8";
30
30
  walletAddress: string;
31
31
  spender: "0x4Cf317b8918FbE8A890c01eDAb7d548555Ac2cE9";
32
32
  allowance: string;
@@ -3,8 +3,8 @@ export declare const checkTokenSecuritySchema: z.ZodObject<{
3
3
  tokenAddress: z.ZodString;
4
4
  chainId: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
5
  }, "strip", z.ZodTypeAny, {
6
- chainId: number;
7
6
  tokenAddress: string;
7
+ chainId: number;
8
8
  }, {
9
9
  tokenAddress: string;
10
10
  chainId?: number | undefined;
@@ -17,25 +17,18 @@ export declare const checkTokenSecurityTool: {
17
17
  tokenAddress: z.ZodString;
18
18
  chainId: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
19
19
  }, "strip", z.ZodTypeAny, {
20
- chainId: number;
21
20
  tokenAddress: string;
21
+ chainId: number;
22
22
  }, {
23
23
  tokenAddress: string;
24
24
  chainId?: number | undefined;
25
25
  }>;
26
26
  };
27
- export declare function handleCheckTokenSecurity(raw: CheckTokenSecurityInput): Promise<{
28
- success: boolean;
29
- error: any;
27
+ export declare function handleCheckTokenSecurity(raw: CheckTokenSecurityInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
30
28
  chainId: number;
31
- tokenAddress: string;
32
- securityProfile?: undefined;
33
- flags?: undefined;
34
- timestamp?: undefined;
35
- } | {
36
- success: boolean;
37
- chainId: number;
38
- tokenAddress: string;
29
+ environment: string;
30
+ isMainnet: boolean;
31
+ tokenAddress: `0x${string}`;
39
32
  securityProfile: {
40
33
  safetyScore: number;
41
34
  isHoneypot: boolean;
@@ -48,7 +41,7 @@ export declare function handleCheckTokenSecurity(raw: CheckTokenSecurityInput):
48
41
  creatorAddress: any;
49
42
  };
50
43
  flags: string[];
51
- timestamp: string;
52
- error?: undefined;
53
- }>;
44
+ source: string;
45
+ sourceStatus: string;
46
+ }>>;
54
47
  //# sourceMappingURL=checkTokenSecurity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkTokenSecurity.d.ts","sourceRoot":"","sources":["../../src/tools/checkTokenSecurity.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;EAGnC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAKlC,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;GAwF1E"}
1
+ {"version":3,"file":"checkTokenSecurity.d.ts","sourceRoot":"","sources":["../../src/tools/checkTokenSecurity.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,wBAAwB;;;;;;;;;EAGnC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAKlC,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;IAqF1E"}
@@ -2,9 +2,13 @@
2
2
  // Fetches token security intelligence from GoPlus Security API.
3
3
  // ────────────────────────────────────────────────────────────────────────
4
4
  import { z } from "zod";
5
+ import { isAddress } from "viem";
6
+ import { CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
7
+ import { fetchWithTimeoutAndRetry } from "../lib/http.js";
8
+ import { classifyExternalError, fail, ok } from "../lib/toolResponse.js";
5
9
  export const checkTokenSecuritySchema = z.object({
6
10
  tokenAddress: z.string(),
7
- chainId: z.number().optional().default(688689), // Defaults to Pharos Atlantic Testnet
11
+ chainId: z.number().optional().default(CHAIN_ID),
8
12
  });
9
13
  export const checkTokenSecurityTool = {
10
14
  name: "check_token_security",
@@ -15,31 +19,25 @@ export async function handleCheckTokenSecurity(raw) {
15
19
  const input = checkTokenSecuritySchema.parse(raw);
16
20
  const address = input.tokenAddress.toLowerCase().trim();
17
21
  const chainId = input.chainId;
22
+ if (!isAddress(address)) {
23
+ return fail("INVALID_TOKEN_ADDRESS", `Invalid token address: ${input.tokenAddress}`, false, "check_token_security");
24
+ }
18
25
  const url = `https://api.gopluslabs.io/api/v1/token_security/${chainId}?contract_addresses=${address}`;
19
26
  try {
20
- const res = await fetch(url);
27
+ const res = await fetchWithTimeoutAndRetry(url, { timeoutMs: 10_000, retries: 2, retryDelayMs: 300 });
21
28
  if (!res.ok) {
22
29
  throw new Error(`GoPlus API returned status ${res.status}`);
23
30
  }
24
31
  const data = (await res.json());
25
32
  if (data.code !== 1 || !data.result || !data.result[address]) {
26
- // Return a standard response when token data is not found or unsupported
27
- return {
28
- success: false,
29
- error: data.message || "Token security data not available for this contract on specified chain.",
30
- chainId,
31
- tokenAddress: address,
32
- };
33
+ return fail("TOKEN_SECURITY_DATA_UNAVAILABLE", data.message || "Token security data is not available for this contract on the specified chain.", true, "goplus_api");
33
34
  }
34
35
  const details = data.result[address];
35
- // Map security metrics to a human-readable format
36
36
  const isHoneypot = details.is_honeypot === "1";
37
37
  const buyTax = parseFloat(details.buy_tax || "0") * 100;
38
38
  const sellTax = parseFloat(details.sell_tax || "0") * 100;
39
39
  const isMintable = details.is_mintable === "1";
40
40
  const transferPausable = details.transfer_pausable === "1";
41
- const ownerModifiable = details.slippage_modifiable === "1" || details.is_proxy === "1";
42
- // Simple risk evaluation
43
41
  let riskScore = 0;
44
42
  const flags = [];
45
43
  if (isHoneypot) {
@@ -63,9 +61,10 @@ export async function handleCheckTokenSecurity(raw) {
63
61
  flags.push("Trading/transfers can be paused by owner");
64
62
  }
65
63
  const safetyScore = Math.max(0, 100 - riskScore);
66
- return {
67
- success: true,
64
+ return ok({
68
65
  chainId,
66
+ environment: chainId === CHAIN_ID ? PHAROS_ENVIRONMENT : "custom-chain",
67
+ isMainnet: false,
69
68
  tokenAddress: address,
70
69
  securityProfile: {
71
70
  safetyScore,
@@ -79,16 +78,12 @@ export async function handleCheckTokenSecurity(raw) {
79
78
  creatorAddress: details.creator_address || "0x0000000000000000000000000000000000000000",
80
79
  },
81
80
  flags,
82
- timestamp: new Date().toISOString(),
83
- };
81
+ source: "goplus_api",
82
+ sourceStatus: "ok",
83
+ });
84
84
  }
85
85
  catch (err) {
86
- return {
87
- success: false,
88
- chainId,
89
- tokenAddress: address,
90
- error: `Failed to query GoPlus Security API: ${err.message}`,
91
- };
86
+ return classifyExternalError("goplus_api", err);
92
87
  }
93
88
  }
94
89
  //# sourceMappingURL=checkTokenSecurity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkTokenSecurity.js","sourceRoot":"","sources":["../../src/tools/checkTokenSecurity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkTokenSecurity.js","sourceRoot":"","sources":["../../src/tools/checkTokenSecurity.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 createAgentWalletSchema: z.ZodObject<{
4
+ agentId: z.ZodString;
5
+ overwrite: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ agentId: string;
8
+ overwrite: boolean;
9
+ }, {
10
+ agentId: string;
11
+ overwrite?: boolean | undefined;
12
+ }>;
13
+ export type CreateAgentWalletParams = z.infer<typeof createAgentWalletSchema>;
14
+ interface CreateAgentWalletData {
15
+ agentId: string;
16
+ address: string;
17
+ environment: string;
18
+ chainId: number;
19
+ isMainnet: boolean;
20
+ isTestnet: boolean;
21
+ createdAt: string;
22
+ warning: string;
23
+ instructions: string;
24
+ }
25
+ export declare function handleCreateAgentWallet(params: CreateAgentWalletParams): Promise<ToolResponse<CreateAgentWalletData>>;
26
+ export {};
27
+ //# sourceMappingURL=createAgentWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAgentWallet.d.ts","sourceRoot":"","sources":["../../src/tools/createAgentWallet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAIrE,eAAO,MAAM,uBAAuB;;;;;;;;;EAWlC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAsD9C"}
@@ -0,0 +1,60 @@
1
+ // ─── create_agent_wallet ────────────────────────────────────────────────
2
+ // Creates a new managed testnet agent wallet.
3
+ // Private key is obfuscated before storage, never returned in response.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { z } from "zod";
6
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
7
+ import { ok, fail } from "../lib/toolResponse.js";
8
+ import { walletStore, obfuscateKey, usesPersistentWalletStore } from "../lib/wallet/index.js";
9
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET } from "../lib/constants.js";
10
+ export const createAgentWalletSchema = z.object({
11
+ agentId: z
12
+ .string()
13
+ .min(1)
14
+ .max(64)
15
+ .describe("Unique identifier for this agent wallet (e.g. 'trading-agent-1')"),
16
+ overwrite: z
17
+ .boolean()
18
+ .optional()
19
+ .default(false)
20
+ .describe("If true, overwrite existing wallet for this agentId"),
21
+ });
22
+ export async function handleCreateAgentWallet(params) {
23
+ const { agentId, overwrite } = params;
24
+ // Check if wallet already exists
25
+ const existing = await walletStore.get(agentId);
26
+ if (existing && !overwrite) {
27
+ return fail("WALLET_ALREADY_EXISTS", `A wallet for agentId '${agentId}' already exists. Use overwrite:true to replace it, or use get_agent_wallet to retrieve it.`, false, "wallet_store");
28
+ }
29
+ if (usesPersistentWalletStore() && !process.env.WALLET_ENCRYPTION_KEY) {
30
+ return fail("WALLET_ENCRYPTION_KEY_REQUIRED", "WALLET_ENCRYPTION_KEY is required when WALLET_STORE_PATH is used. Use in-memory store for local tests or provide a testnet-only encryption key.", false, "wallet_store");
31
+ }
32
+ // Generate new wallet
33
+ const privateKey = generatePrivateKey();
34
+ const account = privateKeyToAccount(privateKey);
35
+ // Obfuscate key before storage
36
+ const encryptionKey = process.env.WALLET_ENCRYPTION_KEY || "safehands-testnet-default-key";
37
+ const encryptedKey = obfuscateKey(privateKey, encryptionKey);
38
+ // Store wallet
39
+ await walletStore.set(agentId, {
40
+ agentId,
41
+ address: account.address,
42
+ encryptedKey,
43
+ environment: "atlantic-testnet",
44
+ chainId: 688689,
45
+ isMainnet: false,
46
+ createdAt: new Date().toISOString(),
47
+ });
48
+ return ok({
49
+ agentId,
50
+ address: account.address,
51
+ environment: PHAROS_ENVIRONMENT,
52
+ chainId: CHAIN_ID,
53
+ isMainnet: IS_MAINNET,
54
+ isTestnet: true,
55
+ createdAt: new Date().toISOString(),
56
+ warning: "This is a TESTNET wallet only. Never use for mainnet funds. Private key is stored locally and obfuscated — not production-grade encryption.",
57
+ instructions: `Fund this wallet with testnet PHRS from https://testnet.pharosnetwork.xyz/ before executing write operations. Set WRITE_TOOLS_ENABLED=true to enable transactions.`,
58
+ });
59
+ }
60
+ //# sourceMappingURL=createAgentWallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createAgentWallet.js","sourceRoot":"","sources":["../../src/tools/createAgentWallet.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8CAA8C;AAC9C,wEAAwE;AACxE,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAqB,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,CAAC,kEAAkE,CAAC;IAC/E,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,qDAAqD,CAAC;CACnE,CAAC,CAAC;AAgBH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA+B;IAE/B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAEtC,iCAAiC;IACjC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CACT,uBAAuB,EACvB,yBAAyB,OAAO,6FAA6F,EAC7H,KAAK,EACL,cAAc,CACf,CAAC;IACJ,CAAC;IAED,IAAI,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtE,OAAO,IAAI,CACT,gCAAgC,EAChC,iJAAiJ,EACjJ,KAAK,EACL,cAAc,CACf,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhD,+BAA+B;IAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,+BAA+B,CAAC;IAC3F,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE7D,eAAe;IACf,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE;QAC7B,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY;QACZ,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;QACR,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EACL,6IAA6I;QAC/I,YAAY,EAAE,oKAAoK;KACnL,CAAC,CAAC;AACL,CAAC"}