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 +1 @@
1
- {"version":3,"file":"dodoApi.js","sourceRoot":"","sources":["../../src/lib/dodoApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dodoApi.js","sourceRoot":"","sources":["../../src/lib/dodoApi.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,kEAAkE;AAClE,2BAA2B;AAC3B,2EAA2E;AAE3E,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAkCrD,0EAA0E;AAE1E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAsB,CAAC;IACpD,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,EAAE,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,CAAC,gCAAgC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,MAAc,EAAE,QAAgB;IACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,QAAyB,EAAE,QAAgB;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;IAC5B,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,CAAC;IAChC,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,0EAA0E;AAE1E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAMvC;IACC,MAAM,aAAa,GAAG,YAAY,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,qBAAqB,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAErD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,aAAa,GAAG,mBAAmB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAChD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,qEAAqE;IACrE,yEAAyE;IACzE,qBAAqB;IACrB,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,GAAG,EAAE;QACnD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,GAAG;KAClB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mEAAmE,EAAE,CACtK,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IAE1D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnI,MAAM,IAAI,KAAK,CACb,8DAA8D,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mEAAmE,EAAE,CACtK,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS,EAAE,GAAG;YACd,YAAY,EAAE,GAAG;YACjB,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,IAAI;YACd,EAAE,EAAE,EAAE;YACN,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,KAAK;YACrB,YAAY,EAAE,oBAAoB;YAClC,UAAU;YACV,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IACpB,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC;QAC5C,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QACnD,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACtB,QAAQ,EAAE,CAAC,CAAC,IAAI;QAChB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,cAAc,EAAE,CAAC,CAAC,iBAAiB;QACnC,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,IAAI;QAClB,UAAU;QACV,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAMlC;IACC,IAAI,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE7C,kFAAkF;QAClF,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YACjE,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC3F,IAAI,aAAa,CAAC,cAAc;gBAAE,OAAO,aAAa,CAAC;QACzD,CAAC;QAED,oFAAoF;QACpF,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC7F,IAAI,aAAa,CAAC,cAAc;gBAAE,OAAO,aAAa,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare class HttpError extends Error {
2
+ readonly status?: number | undefined;
3
+ readonly statusText?: string | undefined;
4
+ constructor(message: string, status?: number | undefined, statusText?: string | undefined);
5
+ }
6
+ export interface FetchWithRetryOptions extends RequestInit {
7
+ timeoutMs?: number;
8
+ retries?: number;
9
+ retryDelayMs?: number;
10
+ }
11
+ export declare function fetchWithTimeoutAndRetry(url: string | URL, options?: FetchWithRetryOptions): Promise<Response>;
12
+ export declare function redactSensitive(value: unknown): unknown;
13
+ export declare function isBlockedIp(ip: string): boolean;
14
+ export declare function assertSafeFetchUrl(rawUrl: string): Promise<void>;
15
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAKA,qBAAa,SAAU,SAAQ,KAAK;aAGhB,MAAM,CAAC,EAAE,MAAM;aACf,UAAU,CAAC,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAUD,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,QAAQ,CAAC,CA8BnB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIvD;AAeD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CA4B/C;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BtE"}
@@ -0,0 +1,119 @@
1
+ // ─── Safe HTTP Helpers ─────────────────────────────────────────────────
2
+ import dns from "node:dns/promises";
3
+ import net from "node:net";
4
+ export class HttpError extends Error {
5
+ status;
6
+ statusText;
7
+ constructor(message, status, statusText) {
8
+ super(message);
9
+ this.status = status;
10
+ this.statusText = statusText;
11
+ this.name = "HttpError";
12
+ }
13
+ }
14
+ function sleep(ms) {
15
+ return new Promise((resolve) => setTimeout(resolve, ms));
16
+ }
17
+ function isRetryableStatus(status) {
18
+ return status === 408 || status === 425 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504;
19
+ }
20
+ export async function fetchWithTimeoutAndRetry(url, options = {}) {
21
+ const { timeoutMs = 10_000, retries = 2, retryDelayMs = 250, ...requestInit } = options;
22
+ let lastError;
23
+ for (let attempt = 0; attempt <= retries; attempt++) {
24
+ const controller = new AbortController();
25
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
26
+ try {
27
+ const response = await fetch(url, {
28
+ ...requestInit,
29
+ signal: requestInit.signal ?? controller.signal,
30
+ });
31
+ if (!isRetryableStatus(response.status) || attempt === retries) {
32
+ return response;
33
+ }
34
+ lastError = new HttpError(`HTTP ${response.status} ${response.statusText}`, response.status, response.statusText);
35
+ }
36
+ catch (err) {
37
+ lastError = err;
38
+ if (attempt === retries)
39
+ throw err;
40
+ }
41
+ finally {
42
+ clearTimeout(timeout);
43
+ }
44
+ await sleep(retryDelayMs * (attempt + 1));
45
+ }
46
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
47
+ }
48
+ export function redactSensitive(value) {
49
+ if (typeof value !== "string")
50
+ return value;
51
+ if (value.length <= 10)
52
+ return "[REDACTED]";
53
+ return `${value.slice(0, 6)}...[REDACTED]`;
54
+ }
55
+ function ipv4ToNumber(ip) {
56
+ if (net.isIP(ip) !== 4)
57
+ return null;
58
+ return ip.split(".").reduce((acc, octet) => (acc << 8) + Number(octet), 0) >>> 0;
59
+ }
60
+ function ipv4InCidr(ip, cidrBase, prefix) {
61
+ const ipNum = ipv4ToNumber(ip);
62
+ const baseNum = ipv4ToNumber(cidrBase);
63
+ if (ipNum === null || baseNum === null)
64
+ return false;
65
+ const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
66
+ return (ipNum & mask) === (baseNum & mask);
67
+ }
68
+ export function isBlockedIp(ip) {
69
+ const version = net.isIP(ip);
70
+ if (version === 4) {
71
+ return (ipv4InCidr(ip, "0.0.0.0", 8) ||
72
+ ipv4InCidr(ip, "10.0.0.0", 8) ||
73
+ ipv4InCidr(ip, "127.0.0.0", 8) ||
74
+ ipv4InCidr(ip, "169.254.0.0", 16) ||
75
+ ipv4InCidr(ip, "172.16.0.0", 12) ||
76
+ ipv4InCidr(ip, "192.168.0.0", 16));
77
+ }
78
+ if (version === 6) {
79
+ const normalized = ip.toLowerCase();
80
+ return (normalized === "::1" ||
81
+ normalized.startsWith("fc") ||
82
+ normalized.startsWith("fd") ||
83
+ normalized.startsWith("fe80:") ||
84
+ normalized === "::" ||
85
+ normalized.startsWith("::ffff:127.") ||
86
+ normalized.startsWith("::ffff:10.") ||
87
+ normalized.startsWith("::ffff:192.168."));
88
+ }
89
+ return false;
90
+ }
91
+ export async function assertSafeFetchUrl(rawUrl) {
92
+ let parsed;
93
+ try {
94
+ parsed = new URL(rawUrl);
95
+ }
96
+ catch {
97
+ throw new Error("Invalid URL");
98
+ }
99
+ if (!["http:", "https:"].includes(parsed.protocol)) {
100
+ throw new Error("Only HTTP and HTTPS URLs are allowed");
101
+ }
102
+ const allowLocal = process.env.ALLOW_LOCAL_X402_FETCH === "true";
103
+ if (allowLocal)
104
+ return;
105
+ const host = parsed.hostname.toLowerCase();
106
+ if (host === "localhost" || host.endsWith(".localhost")) {
107
+ throw new Error("SSRF_BLOCKED: localhost is not allowed");
108
+ }
109
+ if (net.isIP(host) && isBlockedIp(host)) {
110
+ throw new Error(`SSRF_BLOCKED: blocked IP range (${host})`);
111
+ }
112
+ const lookupResults = await dns.lookup(host, { all: true });
113
+ for (const result of lookupResults) {
114
+ if (isBlockedIp(result.address)) {
115
+ throw new Error(`SSRF_BLOCKED: hostname resolves to blocked IP range (${result.address})`);
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,8 @@ export declare const pharosAtlantic: {
17
17
  erc6492Verifier?: import("viem").ChainContract | undefined;
18
18
  } | undefined;
19
19
  ensTlds?: readonly string[] | undefined;
20
- id: 688689;
21
- name: "Pharos Atlantic Testnet";
20
+ id: number;
21
+ name: `Pharos ${string}`;
22
22
  nativeCurrency: {
23
23
  readonly name: "PHRS";
24
24
  readonly symbol: "PHRS";
@@ -27,7 +27,7 @@ export declare const pharosAtlantic: {
27
27
  experimental_preconfirmationTime?: number | undefined | undefined;
28
28
  rpcUrls: {
29
29
  readonly default: {
30
- readonly http: readonly ["https://atlantic.dplabs-internal.com/"];
30
+ readonly http: readonly [string];
31
31
  };
32
32
  };
33
33
  sourceId?: number | undefined | undefined;
@@ -54,5 +54,6 @@ export declare const publicClient: PublicClient<Transport, Chain>;
54
54
  * Private key is passed per-request and NEVER stored.
55
55
  */
56
56
  export declare function createPharosWalletClient(privateKey: `0x${string}`): WalletClient<Transport, Chain, Account>;
57
+ export declare function createPharosWalletClientFromAccount(account: Account): WalletClient<Transport, Chain, Account>;
57
58
  export declare function getExplorerUrl(txHash: string): string;
58
59
  //# sourceMappingURL=pharosClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pharosClient.d.ts","sourceRoot":"","sources":["../../src/lib/pharosClient.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,MAAM,CAAC;AAMd,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBzB,CAAC;AAIH,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAGtD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,KAAK,MAAM,EAAE,GACxB,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAOzC;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD"}
1
+ {"version":3,"file":"pharosClient.d.ts","sourceRoot":"","sources":["../../src/lib/pharosClient.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,MAAM,CAAC;AAMd,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBzB,CAAC;AAIH,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAGtD,CAAC;AAIH;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,KAAK,MAAM,EAAE,GACxB,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAGzC;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,OAAO,GACf,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAMzC;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -3,11 +3,11 @@
3
3
  // ────────────────────────────────────────────────────────────────────────
4
4
  import { createPublicClient, createWalletClient, http, defineChain, } from "viem";
5
5
  import { privateKeyToAccount } from "viem/accounts";
6
- import { RPC_URL, CHAIN_ID, EXPLORER_BASE } from "./constants.js";
6
+ import { RPC_URL, CHAIN_ID, EXPLORER_BASE, PHAROS_ENVIRONMENT, IS_MAINNET } from "./constants.js";
7
7
  // ─── Chain Definition ──────────────────────────────────────────────────
8
8
  export const pharosAtlantic = defineChain({
9
9
  id: CHAIN_ID,
10
- name: "Pharos Atlantic Testnet",
10
+ name: `Pharos ${PHAROS_ENVIRONMENT}`,
11
11
  nativeCurrency: {
12
12
  name: "PHRS",
13
13
  symbol: "PHRS",
@@ -24,12 +24,12 @@ export const pharosAtlantic = defineChain({
24
24
  url: EXPLORER_BASE.replace("/tx/", ""),
25
25
  },
26
26
  },
27
- testnet: true,
27
+ testnet: !IS_MAINNET,
28
28
  });
29
29
  // ─── Public Client (read-only) ─────────────────────────────────────────
30
30
  export const publicClient = createPublicClient({
31
31
  chain: pharosAtlantic,
32
- transport: http(RPC_URL),
32
+ transport: http(RPC_URL, { timeout: 10_000, retryCount: 2, retryDelay: 250 }),
33
33
  });
34
34
  // ─── Wallet Client Factory ─────────────────────────────────────────────
35
35
  /**
@@ -38,10 +38,13 @@ export const publicClient = createPublicClient({
38
38
  */
39
39
  export function createPharosWalletClient(privateKey) {
40
40
  const account = privateKeyToAccount(privateKey);
41
+ return createPharosWalletClientFromAccount(account);
42
+ }
43
+ export function createPharosWalletClientFromAccount(account) {
41
44
  return createWalletClient({
42
45
  account,
43
46
  chain: pharosAtlantic,
44
- transport: http(RPC_URL),
47
+ transport: http(RPC_URL, { timeout: 10_000, retryCount: 2, retryDelay: 250 }),
45
48
  });
46
49
  }
47
50
  // ─── Utility: Explorer Link ────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"pharosClient.js","sourceRoot":"","sources":["../../src/lib/pharosClient.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAE3E,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,EACJ,WAAW,GAMZ,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAElE,0EAA0E;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;IACxC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,yBAAyB;IAC/B,cAAc,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB;KACF;IACD,cAAc,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,YAAY;YAClB,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACvC;KACF;IACD,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEH,0EAA0E;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAmC,kBAAkB,CAAC;IAC7E,KAAK,EAAE,cAAc;IACrB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;CACzB,CAAC,CAAC;AAEH,0EAA0E;AAE1E;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAyB;IAEzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;KACzB,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"pharosClient.js","sourceRoot":"","sources":["../../src/lib/pharosClient.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAE3E,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,EACJ,WAAW,GAMZ,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAElG,0EAA0E;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;IACxC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,UAAU,kBAAkB,EAAE;IACpC,cAAc,EAAE;QACd,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB;KACF;IACD,cAAc,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,YAAY;YAClB,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACvC;KACF;IACD,OAAO,EAAE,CAAC,UAAU;CACrB,CAAC,CAAC;AAEH,0EAA0E;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAmC,kBAAkB,CAAC;IAC7E,KAAK,EAAE,cAAc;IACrB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;CAC9E,CAAC,CAAC;AAEH,0EAA0E;AAE1E;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAyB;IAEzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,mCAAmC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,OAAgB;IAEhB,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;KAC9E,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,54 @@
1
+ export type SafeHandsActionType = "send_payment" | "approve_token" | "execute_swap" | "x402_pay_and_fetch" | "publish_risk_score" | "custom_contract_call";
2
+ export type PolicyDecision = "ALLOW" | "WARN" | "BLOCK" | "REQUIRE_CONFIRMATION" | "REQUIRE_FUNDING" | "REQUIRE_TOKEN_REVIEW";
3
+ export type PolicyRiskLevel = "LOW" | "MEDIUM" | "HIGH" | "CRITICAL" | "UNKNOWN";
4
+ export interface PolicyCheck {
5
+ name: string;
6
+ status: "pass" | "warn" | "fail" | "unknown";
7
+ message: string;
8
+ }
9
+ export interface ActionPolicyInput {
10
+ actionType: SafeHandsActionType;
11
+ environment?: string;
12
+ chainId?: number;
13
+ isMainnet?: boolean;
14
+ amount?: string;
15
+ amountUnit?: "PHRS" | "USDC" | "USD" | "TOKEN";
16
+ token?: string;
17
+ tokenAddress?: string;
18
+ tokenIn?: string;
19
+ tokenOut?: string;
20
+ recipient?: string;
21
+ spender?: string;
22
+ approvalAmount?: string;
23
+ approvalToken?: string;
24
+ approvalUnlimited?: boolean;
25
+ url?: string;
26
+ paymentAmountUsdc?: string;
27
+ paymentTokenAddress?: string;
28
+ walletAddress?: string;
29
+ walletBalancePhs?: string;
30
+ signerAvailable?: boolean;
31
+ tokenSecurityStatus?: "ok" | "unavailable" | "unknown";
32
+ tokenRegistryStatus?: string;
33
+ recipientVerified?: boolean;
34
+ spenderVerified?: boolean;
35
+ allowUnlimitedApproval?: boolean;
36
+ writeToolsEnabled?: boolean;
37
+ requiresSigner?: boolean;
38
+ }
39
+ export interface ActionPolicyResult {
40
+ decision: PolicyDecision;
41
+ riskLevel: PolicyRiskLevel;
42
+ safeToExecute: boolean;
43
+ reasons: string[];
44
+ requiredActions: string[];
45
+ checks: PolicyCheck[];
46
+ environment: string;
47
+ chainId: number;
48
+ isMainnet: boolean;
49
+ }
50
+ export declare function isUnlimitedApprovalAmount(value: string | undefined): boolean;
51
+ export declare function evaluateActionPolicy(input: ActionPolicyInput): ActionPolicyResult;
52
+ export declare function explainPolicyResult(result: ActionPolicyResult): string;
53
+ export declare function parseTokenAmountToUnits(amount: string, decimals?: number): bigint | null;
54
+ //# sourceMappingURL=actionPolicyEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionPolicyEngine.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,eAAe,GACf,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,MAAM,GACN,OAAO,GACP,sBAAsB,GACtB,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,IAAI,GAAG,aAAa,GAAG,SAAS,CAAC;IACvD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,eAAe,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAuBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAS5E;AAsCD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CA4HjF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAQtE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,GAAG,IAAI,CAMnF"}
@@ -0,0 +1,213 @@
1
+ // ─── SafeHands Action Policy Engine ───────────────────────────────────
2
+ // Reusable transaction safety firewall for AI agent actions on Pharos.
3
+ // It is intentionally deterministic and testnet-only.
4
+ // ───────────────────────────────────────────────────────────────────────
5
+ import { isAddress, parseUnits } from "viem";
6
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET, MAX_APPROVAL_AMOUNT_USDC, MAX_TX_AMOUNT_PHRS, MAX_X402_PAYMENT_USDC, USDC_ADDRESS, TEST_USDC_ADDRESS, } from "../constants.js";
7
+ function numeric(value) {
8
+ if (!value)
9
+ return null;
10
+ const n = Number(value);
11
+ return Number.isFinite(n) ? n : null;
12
+ }
13
+ function pushCheck(checks, name, status, message, reasons, requiredActions, reason, action) {
14
+ checks.push({ name, status, message });
15
+ if (status === "fail" && reasons && reason)
16
+ reasons.push(reason);
17
+ if ((status === "fail" || status === "warn") && requiredActions && action)
18
+ requiredActions.push(action);
19
+ }
20
+ export function isUnlimitedApprovalAmount(value) {
21
+ if (!value)
22
+ return false;
23
+ const normalized = value.trim().toLowerCase();
24
+ if (["max", "unlimited", "infinite", "uint256_max"].includes(normalized))
25
+ return true;
26
+ try {
27
+ return BigInt(normalized) >= 2n ** 255n;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ function isSuspiciousUrl(rawUrl) {
34
+ if (!rawUrl)
35
+ return false;
36
+ if (process.env.ALLOW_LOCAL_X402_FETCH === "true")
37
+ return false;
38
+ try {
39
+ const parsed = new URL(rawUrl);
40
+ const host = parsed.hostname.toLowerCase();
41
+ if (!["http:", "https:"].includes(parsed.protocol))
42
+ return true;
43
+ if (host === "localhost" || host.endsWith(".localhost"))
44
+ return true;
45
+ if (host === "127.0.0.1" || host.startsWith("127.") || host === "0.0.0.0")
46
+ return true;
47
+ if (host.startsWith("10.") || host.startsWith("192.168."))
48
+ return true;
49
+ if (/^172\.(1[6-9]|2\d|3[0-1])\./.test(host))
50
+ return true;
51
+ if (host === "[::1]" || host === "::1")
52
+ return true;
53
+ return false;
54
+ }
55
+ catch {
56
+ return true;
57
+ }
58
+ }
59
+ function classifyRisk(checks) {
60
+ const fails = checks.filter((c) => c.status === "fail").length;
61
+ const warns = checks.filter((c) => c.status === "warn").length;
62
+ const unknowns = checks.filter((c) => c.status === "unknown").length;
63
+ if (fails >= 3)
64
+ return "CRITICAL";
65
+ if (fails > 0)
66
+ return "HIGH";
67
+ if (warns >= 2)
68
+ return "MEDIUM";
69
+ if (warns > 0 || unknowns > 0)
70
+ return "MEDIUM";
71
+ return "LOW";
72
+ }
73
+ function defaultDecision(riskLevel, checks) {
74
+ if (checks.some((c) => c.status === "fail"))
75
+ return "BLOCK";
76
+ if (riskLevel === "MEDIUM")
77
+ return "REQUIRE_CONFIRMATION";
78
+ if (riskLevel === "UNKNOWN")
79
+ return "REQUIRE_TOKEN_REVIEW";
80
+ return "ALLOW";
81
+ }
82
+ export function evaluateActionPolicy(input) {
83
+ const environment = input.environment || PHAROS_ENVIRONMENT;
84
+ const chainId = input.chainId ?? CHAIN_ID;
85
+ const isMainnet = input.isMainnet ?? IS_MAINNET;
86
+ const checks = [];
87
+ const reasons = [];
88
+ const requiredActions = [];
89
+ if (isMainnet) {
90
+ pushCheck(checks, "mainnet_guard", "fail", "Mainnet actions are blocked by SafeHands.", reasons, requiredActions, "Mainnet actions are not supported.", "Switch to Pharos Atlantic Testnet.");
91
+ }
92
+ else {
93
+ pushCheck(checks, "mainnet_guard", "pass", "Action is not targeting mainnet.");
94
+ }
95
+ if (chainId !== CHAIN_ID) {
96
+ pushCheck(checks, "chain_id", "fail", `Expected chain ID ${CHAIN_ID}, received ${chainId}.`, reasons, requiredActions, "Chain ID mismatch.", "Switch wallet/RPC to Pharos Atlantic Testnet.");
97
+ }
98
+ else {
99
+ pushCheck(checks, "chain_id", "pass", `Chain ID is Pharos Atlantic Testnet (${CHAIN_ID}).`);
100
+ }
101
+ if (environment !== PHAROS_ENVIRONMENT) {
102
+ pushCheck(checks, "environment", "warn", `Expected ${PHAROS_ENVIRONMENT}, received ${environment}.`, reasons, requiredActions, undefined, "Verify the runtime environment before execution.");
103
+ }
104
+ else {
105
+ pushCheck(checks, "environment", "pass", `Environment is ${PHAROS_ENVIRONMENT}.`);
106
+ }
107
+ if (input.requiresSigner && !input.signerAvailable) {
108
+ pushCheck(checks, "signer", "fail", "No signer is available for this write/payment action.", reasons, requiredActions, "No signer available.", "Configure WALLET_MODE=managed-testnet, X402_SIGNER_PRIVATE_KEY, or PRIVATE_KEY for testnet only.");
109
+ }
110
+ if (input.actionType === "send_payment") {
111
+ const amount = numeric(input.amount);
112
+ if (amount !== null && amount > Number(MAX_TX_AMOUNT_PHRS)) {
113
+ pushCheck(checks, "payment_limit", "fail", `Payment ${amount} PHRS exceeds limit ${MAX_TX_AMOUNT_PHRS} PHRS.`, reasons, requiredActions, "Payment exceeds configured PHRS limit.", "Reduce amount or increase MAX_TX_AMOUNT_PHRS consciously for testnet.");
114
+ }
115
+ else {
116
+ pushCheck(checks, "payment_limit", "pass", `Payment is within ${MAX_TX_AMOUNT_PHRS} PHRS limit.`);
117
+ }
118
+ if (input.recipient && !isAddress(input.recipient)) {
119
+ pushCheck(checks, "recipient_address", "fail", "Recipient address is invalid.", reasons, requiredActions, "Invalid recipient address.", "Provide a valid EVM address.");
120
+ }
121
+ else if (input.recipientVerified === false) {
122
+ pushCheck(checks, "recipient_reputation", "warn", "Recipient is unverified.", reasons, requiredActions, undefined, "Verify recipient before sending funds.");
123
+ }
124
+ }
125
+ if (input.actionType === "approve_token") {
126
+ const unlimited = input.approvalUnlimited || isUnlimitedApprovalAmount(input.approvalAmount);
127
+ if (unlimited && input.allowUnlimitedApproval !== true) {
128
+ pushCheck(checks, "approval_amount", "fail", "Unlimited approval is blocked by default.", reasons, requiredActions, "Unlimited approval requested.", "Use a limited approval amount.");
129
+ }
130
+ else {
131
+ const approvalAmount = numeric(input.approvalAmount);
132
+ if (approvalAmount !== null && approvalAmount > Number(MAX_APPROVAL_AMOUNT_USDC)) {
133
+ pushCheck(checks, "approval_limit", "fail", `Approval ${approvalAmount} exceeds limit ${MAX_APPROVAL_AMOUNT_USDC}.`, reasons, requiredActions, "Approval exceeds configured limit.", "Reduce approval or increase MAX_APPROVAL_AMOUNT_USDC consciously for testnet.");
134
+ }
135
+ else {
136
+ pushCheck(checks, "approval_limit", "pass", `Approval is within ${MAX_APPROVAL_AMOUNT_USDC} USDC-equivalent limit.`);
137
+ }
138
+ }
139
+ if (input.spender && !isAddress(input.spender)) {
140
+ pushCheck(checks, "spender_address", "fail", "Spender address is invalid.", reasons, requiredActions, "Invalid spender address.", "Provide a valid spender address.");
141
+ }
142
+ else if (input.spenderVerified === false) {
143
+ pushCheck(checks, "spender_reputation", "warn", "Spender is unverified.", reasons, requiredActions, undefined, "Verify spender contract before approving.");
144
+ }
145
+ }
146
+ if (input.actionType === "execute_swap") {
147
+ const amount = numeric(input.amount);
148
+ if (amount !== null && amount > Number(MAX_TX_AMOUNT_PHRS) && (input.tokenIn || "").toUpperCase() === "PHRS") {
149
+ pushCheck(checks, "swap_amount_limit", "fail", `Swap ${amount} PHRS exceeds limit ${MAX_TX_AMOUNT_PHRS} PHRS.`, reasons, requiredActions, "Swap exceeds configured PHRS limit.", "Reduce amount or increase MAX_TX_AMOUNT_PHRS consciously for testnet.");
150
+ }
151
+ }
152
+ if (input.actionType === "x402_pay_and_fetch") {
153
+ if (isSuspiciousUrl(input.url)) {
154
+ pushCheck(checks, "x402_url", "fail", "x402 URL is SSRF-sensitive or invalid.", reasons, requiredActions, "SSRF-sensitive x402 URL blocked.", "Use a public HTTPS/HTTP endpoint or set ALLOW_LOCAL_X402_FETCH only for local tests.");
155
+ }
156
+ else {
157
+ pushCheck(checks, "x402_url", "pass", "x402 URL passed static SSRF checks.");
158
+ }
159
+ const payment = numeric(input.paymentAmountUsdc);
160
+ if (payment !== null && payment > Number(MAX_X402_PAYMENT_USDC)) {
161
+ pushCheck(checks, "x402_payment_limit", "fail", `x402 payment ${payment} USDC exceeds limit ${MAX_X402_PAYMENT_USDC} USDC.`, reasons, requiredActions, "x402 payment exceeds configured limit.", "Reduce payment amount or increase MAX_X402_PAYMENT_USDC consciously for testnet.");
162
+ }
163
+ else {
164
+ pushCheck(checks, "x402_payment_limit", "pass", `x402 payment is within ${MAX_X402_PAYMENT_USDC} USDC limit.`);
165
+ }
166
+ if (input.paymentTokenAddress && input.paymentTokenAddress.toLowerCase() !== USDC_ADDRESS.toLowerCase()) {
167
+ const status = input.paymentTokenAddress.toLowerCase() === TEST_USDC_ADDRESS.toLowerCase() ? "warn" : "fail";
168
+ pushCheck(checks, "x402_payment_token", status, `Payment token ${input.paymentTokenAddress} is not canonical Circle USDC ${USDC_ADDRESS}.`, reasons, requiredActions, status === "fail" ? "x402 payment token is not canonical USDC." : undefined, "Use docs-verified Pharos testnet USDC or label the token as project-configured.");
169
+ }
170
+ }
171
+ const tokenStatus = input.tokenRegistryStatus;
172
+ if (tokenStatus === "CUSTOM_NON_REGISTRY" || tokenStatus === "UNKNOWN") {
173
+ pushCheck(checks, "token_registry", "warn", `Token registry status is ${tokenStatus}.`, reasons, requiredActions, undefined, "Review token contract before execution.");
174
+ }
175
+ if (input.tokenSecurityStatus === "unavailable" || input.tokenSecurityStatus === "unknown") {
176
+ pushCheck(checks, "token_security_provider", "warn", "Token security provider is unavailable or unknown.", reasons, requiredActions, undefined, "Proceed only after manual token review.");
177
+ }
178
+ const riskLevel = classifyRisk(checks);
179
+ let decision = defaultDecision(riskLevel, checks);
180
+ if (checks.some((c) => c.name.includes("funding") && c.status === "fail"))
181
+ decision = "REQUIRE_FUNDING";
182
+ if (checks.some((c) => c.name.includes("token") && c.status === "unknown"))
183
+ decision = "REQUIRE_TOKEN_REVIEW";
184
+ return {
185
+ decision,
186
+ riskLevel,
187
+ safeToExecute: decision === "ALLOW",
188
+ reasons: [...new Set(reasons)],
189
+ requiredActions: [...new Set(requiredActions)],
190
+ checks,
191
+ environment,
192
+ chainId,
193
+ isMainnet,
194
+ };
195
+ }
196
+ export function explainPolicyResult(result) {
197
+ if (result.decision === "ALLOW") {
198
+ return "This action was allowed because it targets Pharos Atlantic Testnet, passed policy checks, and stayed within configured safety limits.";
199
+ }
200
+ const reasonText = result.reasons.length > 0 ? result.reasons.join(" ") : "one or more safety checks failed or require review.";
201
+ const actionText = result.requiredActions.length > 0 ? ` SafeHands recommends: ${result.requiredActions.join(" ")}` : "";
202
+ const verb = result.decision === "BLOCK" ? "blocked" : result.decision.toLowerCase().replaceAll("_", " ");
203
+ return `This action was ${verb} because ${reasonText}${actionText}`;
204
+ }
205
+ export function parseTokenAmountToUnits(amount, decimals = 6) {
206
+ try {
207
+ return parseUnits(amount, decimals);
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
213
+ //# sourceMappingURL=actionPolicyEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionPolicyEngine.js","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Account } from "viem";
2
+ export type SignerMode = "none" | "env" | "managed-testnet" | "external-signer" | "x402-env";
3
+ export type SignerPurpose = "write" | "x402";
4
+ export interface SignerResult {
5
+ account: Account;
6
+ address: `0x${string}`;
7
+ mode: SignerMode;
8
+ }
9
+ export interface SignerFailure {
10
+ error: {
11
+ code: string;
12
+ message: string;
13
+ };
14
+ }
15
+ export type GetSignerResult = SignerResult | SignerFailure;
16
+ export declare function isSignerFailure(r: GetSignerResult): r is SignerFailure;
17
+ /**
18
+ * Get a signer for write/payment operations.
19
+ * Priority for x402: managed wallet > X402_SIGNER_PRIVATE_KEY > PRIVATE_KEY fallback.
20
+ * Priority for writes: managed wallet > PRIVATE_KEY fallback.
21
+ */
22
+ export declare function getSigner(agentId?: string, options?: {
23
+ purpose?: SignerPurpose;
24
+ }): Promise<GetSignerResult>;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/signer/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC7F,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,aAAa,CAAC;AAE3D,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,IAAI,aAAa,CAEtE;AAsDD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,aAAa,CAAA;CAAO,GACxC,OAAO,CAAC,eAAe,CAAC,CA0B1B"}