safehands-pharos 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +174 -63
  2. package/dist/cli.d.ts +5 -5
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +126 -124
  5. package/dist/cli.js.map +1 -1
  6. package/dist/demo.d.ts +1 -1
  7. package/dist/demo.js +171 -171
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +73 -65
  11. package/dist/index.js.map +1 -1
  12. package/dist/init.d.ts +1 -1
  13. package/dist/init.js +65 -65
  14. package/dist/lib/constants.d.ts +303 -291
  15. package/dist/lib/constants.d.ts.map +1 -1
  16. package/dist/lib/constants.js +302 -292
  17. package/dist/lib/constants.js.map +1 -1
  18. package/dist/lib/dodoApi.d.ts +78 -78
  19. package/dist/lib/dodoApi.js +196 -196
  20. package/dist/lib/envLoader.d.ts +2 -0
  21. package/dist/lib/envLoader.d.ts.map +1 -0
  22. package/dist/lib/envLoader.js +44 -0
  23. package/dist/lib/envLoader.js.map +1 -0
  24. package/dist/lib/http.d.ts +14 -14
  25. package/dist/lib/http.js +118 -118
  26. package/dist/lib/pharosClient.d.ts +58 -58
  27. package/dist/lib/pharosClient.js +63 -63
  28. package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
  29. package/dist/lib/policy/actionPolicyEngine.js +212 -212
  30. package/dist/lib/riskEngine.d.ts +26 -26
  31. package/dist/lib/riskEngine.d.ts.map +1 -1
  32. package/dist/lib/riskEngine.js +288 -283
  33. package/dist/lib/riskEngine.js.map +1 -1
  34. package/dist/lib/signer/index.d.ts +24 -24
  35. package/dist/lib/signer/index.js +88 -88
  36. package/dist/lib/testDodoLive.d.ts +1 -1
  37. package/dist/lib/testDodoLive.js +104 -104
  38. package/dist/lib/testLiveSafehands.d.ts +1 -1
  39. package/dist/lib/testLiveSafehands.js +92 -92
  40. package/dist/lib/testRpcLive.d.ts +1 -1
  41. package/dist/lib/testRpcLive.js +88 -88
  42. package/dist/lib/testTools.js +397 -398
  43. package/dist/lib/testX402Live.d.ts +1 -1
  44. package/dist/lib/testX402Live.js +159 -159
  45. package/dist/lib/toolResponse.d.ts +25 -25
  46. package/dist/lib/toolResponse.js +53 -53
  47. package/dist/lib/wallet/index.d.ts +37 -37
  48. package/dist/lib/wallet/index.js +128 -128
  49. package/dist/scripts/checkDeploy.d.ts +1 -1
  50. package/dist/scripts/checkDeploy.js +24 -24
  51. package/dist/scripts/deployRegistry.d.ts +1 -1
  52. package/dist/scripts/deployRegistry.js +100 -100
  53. package/dist/scripts/testRegistry.d.ts +1 -1
  54. package/dist/scripts/testRegistry.js +43 -43
  55. package/dist/tools/approveToken.d.ts +45 -45
  56. package/dist/tools/approveToken.js +85 -85
  57. package/dist/tools/assessRisk.d.ts +79 -79
  58. package/dist/tools/assessRisk.js +104 -104
  59. package/dist/tools/checkAllowance.d.ts +43 -43
  60. package/dist/tools/checkAllowance.js +56 -56
  61. package/dist/tools/checkTokenSecurity.d.ts +46 -46
  62. package/dist/tools/checkTokenSecurity.js +95 -95
  63. package/dist/tools/createAgentWallet.d.ts +28 -26
  64. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  65. package/dist/tools/createAgentWallet.js +82 -58
  66. package/dist/tools/createAgentWallet.js.map +1 -1
  67. package/dist/tools/estimateGas.d.ts +79 -79
  68. package/dist/tools/estimateGas.js +124 -124
  69. package/dist/tools/executeSwap.d.ts +61 -61
  70. package/dist/tools/executeSwap.js +141 -141
  71. package/dist/tools/explainRisk.d.ts +29 -29
  72. package/dist/tools/explainRisk.js +32 -32
  73. package/dist/tools/getAgentWallet.d.ts +21 -21
  74. package/dist/tools/getAgentWallet.js +27 -27
  75. package/dist/tools/getAgentWalletBalance.d.ts +11 -11
  76. package/dist/tools/getAgentWalletBalance.js +70 -70
  77. package/dist/tools/getExecutionHistory.d.ts +49 -49
  78. package/dist/tools/getExecutionHistory.js +154 -154
  79. package/dist/tools/getGasPrice.d.ts +43 -43
  80. package/dist/tools/getGasPrice.js +59 -59
  81. package/dist/tools/getPoolInfo.d.ts +75 -75
  82. package/dist/tools/getPoolInfo.js +137 -137
  83. package/dist/tools/getTokenPrice.d.ts +113 -113
  84. package/dist/tools/getTokenPrice.js +117 -117
  85. package/dist/tools/getTransactionStatus.d.ts +43 -43
  86. package/dist/tools/getTransactionStatus.js +59 -59
  87. package/dist/tools/getWalletBalance.d.ts +68 -68
  88. package/dist/tools/getWalletBalance.js +87 -87
  89. package/dist/tools/publishRiskScore.d.ts +63 -63
  90. package/dist/tools/publishRiskScore.js +88 -88
  91. package/dist/tools/queryRiskRegistry.d.ts +38 -38
  92. package/dist/tools/queryRiskRegistry.js +55 -55
  93. package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
  94. package/dist/tools/safehandsPreflightCheck.js +47 -47
  95. package/dist/tools/safehandsRiskReport.d.ts +81 -81
  96. package/dist/tools/safehandsRiskReport.js +28 -28
  97. package/dist/tools/safehandsSafeExecute.d.ts +20 -20
  98. package/dist/tools/safehandsSafeExecute.js +81 -81
  99. package/dist/tools/safehandsWalletHealth.d.ts +14 -14
  100. package/dist/tools/safehandsWalletHealth.js +103 -103
  101. package/dist/tools/safehandsX402Preflight.d.ts +26 -26
  102. package/dist/tools/safehandsX402Preflight.js +65 -65
  103. package/dist/tools/sendPayment.d.ts +57 -57
  104. package/dist/tools/sendPayment.js +117 -117
  105. package/dist/tools/simulateTransaction.d.ts +60 -60
  106. package/dist/tools/simulateTransaction.js +83 -83
  107. package/dist/tools/tokenRegistryStatus.d.ts +26 -26
  108. package/dist/tools/tokenRegistryStatus.js +96 -96
  109. package/dist/tools/x402PayAndFetch.d.ts +81 -81
  110. package/dist/tools/x402PayAndFetch.js +152 -152
  111. package/dist/x402Server.d.ts +1 -1
  112. package/dist/x402Server.js +300 -252
  113. package/dist/x402Server.js.map +1 -1
  114. package/package.json +6 -16
  115. package/examples/dashboard/index.html +0 -337
  116. package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
  117. package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
  118. package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
  119. package/examples/pharos-skill-engine/references/safehands.md +0 -345
  120. package/examples/scenario-hack.ts +0 -38
  121. package/skill/SKILL.md +0 -133
  122. package/skill/assets/safehands/example-actions.json +0 -49
  123. package/skill/assets/safehands/policy-defaults.json +0 -11
  124. package/skill/references/safehands.md +0 -345
@@ -1,284 +1,289 @@
1
- // ─── Risk Scoring Engine ───────────────────────────────────────────────
2
- // 5-dimension risk assessment engine for SafeHands.
3
- // Weights: liquidity 25%, slippage 25%, counterparty 20%,
4
- // balance 15%, market conditions 15%
5
- // ────────────────────────────────────────────────────────────────────────
6
- import { publicClient } from "./pharosClient.js";
7
- import { getDodoRoute, isNativeToken, resolveTokenAddress, resolveTokenDecimals, toWei, } from "./dodoApi.js";
8
- import { RISK_WEIGHTS, RISK_BLOCK_THRESHOLD, MAX_SLIPPAGE_PCT, MAX_BALANCE_USAGE_PCT, ERC20_ABI, } from "./constants.js";
9
- import { formatEther, isAddress, parseEther } from "viem";
10
- // ─── Helpers ───────────────────────────────────────────────────────────
11
- function clamp(value, min = 0, max = 100) {
12
- return Math.max(min, Math.min(max, value));
13
- }
14
- function computeRiskLevel(score) {
15
- if (score <= 30)
16
- return "low";
17
- if (score <= 60)
18
- return "medium";
19
- if (score <= 80)
20
- return "high";
21
- return "critical";
22
- }
23
- function computeRecommendation(score) {
24
- if (score <= 30)
25
- return "proceed";
26
- if (score <= RISK_BLOCK_THRESHOLD)
27
- return "caution";
28
- return "block";
29
- }
30
- function weightedAverage(breakdown) {
31
- const w = RISK_WEIGHTS;
32
- return Math.round(breakdown.liquidityRisk * w.liquidityRisk +
33
- breakdown.slippageRisk * w.slippageRisk +
34
- breakdown.counterpartyRisk * w.counterpartyRisk +
35
- breakdown.balanceRisk * w.balanceRisk +
36
- breakdown.marketConditionRisk * w.marketConditionRisk);
37
- }
38
- // ─── Individual Risk Scorers ───────────────────────────────────────────
39
- async function scoreLiquidity(input) {
40
- const reasons = [];
41
- if (input.action !== "swap")
42
- return { score: 0, reasons };
43
- try {
44
- const quote = await getDodoRoute({
45
- fromToken: input.tokenIn,
46
- toToken: input.tokenOut,
47
- amountHuman: input.amount,
48
- walletAddress: input.walletAddress,
49
- });
50
- if (!quote.routeAvailable) {
51
- reasons.push("No swap route available — liquidity may be exhausted");
52
- return { score: 100, reasons };
53
- }
54
- const impact = Math.abs(quote.priceImpact);
55
- if (impact > 5) {
56
- reasons.push(`High price impact: ${impact.toFixed(2)}%`);
57
- return { score: clamp(80 + impact), reasons };
58
- }
59
- if (impact > 2) {
60
- reasons.push(`Moderate price impact: ${impact.toFixed(2)}%`);
61
- return { score: clamp(40 + impact * 10), reasons };
62
- }
63
- reasons.push(`Price impact acceptable: ${impact.toFixed(2)}%`);
64
- return { score: clamp(impact * 15), reasons };
65
- }
66
- catch (err) {
67
- reasons.push(`Failed to fetch liquidity data: ${err.message}`);
68
- return { score: 70, reasons };
69
- }
70
- }
71
- async function scoreSlippage(input) {
72
- const reasons = [];
73
- if (input.action !== "swap")
74
- return { score: 0, reasons };
75
- try {
76
- const quote = await getDodoRoute({
77
- fromToken: input.tokenIn,
78
- toToken: input.tokenOut,
79
- amountHuman: input.amount,
80
- walletAddress: input.walletAddress,
81
- });
82
- if (!quote.routeAvailable) {
83
- reasons.push("Cannot estimate slippage — no route");
84
- return { score: 90, reasons };
85
- }
86
- const impact = Math.abs(quote.priceImpact);
87
- if (impact > MAX_SLIPPAGE_PCT) {
88
- reasons.push(`Slippage exceeds max ${MAX_SLIPPAGE_PCT}%: estimated ${impact.toFixed(2)}%`);
89
- return { score: clamp(80 + (impact - MAX_SLIPPAGE_PCT) * 5), reasons };
90
- }
91
- reasons.push(`Estimated slippage: ${impact.toFixed(2)}%`);
92
- return { score: clamp(impact * 16), reasons };
93
- }
94
- catch {
95
- reasons.push("Slippage estimation failed");
96
- return { score: 60, reasons };
97
- }
98
- }
99
- async function scoreCounterparty(input) {
100
- const reasons = [];
101
- if (input.action === "swap") {
102
- // For swaps, counterparty is the DODO protocol — trusted
103
- reasons.push("Swap routed through DODO protocol (known)");
104
- return { score: 5, reasons };
105
- }
106
- // For transfers, check the recipient address
107
- const to = input.toAddress;
108
- if (!to) {
109
- reasons.push("No recipient address provided");
110
- return { score: 100, reasons };
111
- }
112
- if (!isAddress(to)) {
113
- reasons.push("Invalid EVM address format");
114
- return { score: 100, reasons };
115
- }
116
- // Zero address check
117
- if (to === "0x0000000000000000000000000000000000000000") {
118
- reasons.push("Sending to zero address — tokens will be burned");
119
- return { score: 95, reasons };
120
- }
121
- // Self-send check
122
- if (to.toLowerCase() === input.walletAddress.toLowerCase()) {
123
- reasons.push("Sending to own address — likely unintended");
124
- return { score: 50, reasons };
125
- }
126
- // Check if address has code (is a contract)
127
- try {
128
- const code = await publicClient.getCode({ address: to });
129
- if (code && code !== "0x") {
130
- reasons.push("Recipient is a contract address — verify intent");
131
- return { score: 40, reasons };
132
- }
133
- }
134
- catch {
135
- // RPC error, non-critical
136
- }
137
- // Check if address has any transaction history (has balance)
138
- try {
139
- const balance = await publicClient.getBalance({ address: to });
140
- if (balance === 0n) {
141
- reasons.push("Recipient has zero balance — new or unused address");
142
- return { score: 30, reasons };
143
- }
144
- }
145
- catch {
146
- // Non-critical
147
- }
148
- reasons.push("Recipient address looks valid");
149
- return { score: 10, reasons };
150
- }
151
- async function scoreBalance(input) {
152
- const reasons = [];
153
- try {
154
- const walletAddr = input.walletAddress;
155
- if (input.action === "transfer" || (input.action === "swap" && isNativeToken(input.tokenIn || "PHRS"))) {
156
- // Check native PHRS balance
157
- const balance = await publicClient.getBalance({ address: walletAddr });
158
- const amountWei = parseEther(input.amount);
159
- const gasBuffer = parseEther("0.01"); // ~0.01 PHRS for gas
160
- if (balance < amountWei + gasBuffer) {
161
- const balanceHuman = formatEther(balance);
162
- reasons.push(`Insufficient PHRS balance: have ${balanceHuman}, need ${input.amount} + gas`);
163
- return { score: 100, reasons };
164
- }
165
- const usagePct = Number((amountWei * 100n) / balance);
166
- if (usagePct > MAX_BALANCE_USAGE_PCT) {
167
- reasons.push(`Using ${usagePct}% of wallet balance — high exposure`);
168
- return { score: clamp(60 + (usagePct - MAX_BALANCE_USAGE_PCT)), reasons };
169
- }
170
- reasons.push(`Balance sufficient, using ${usagePct}% of wallet`);
171
- return { score: clamp(usagePct / 3), reasons };
172
- }
173
- // ERC-20 token balance check
174
- if (input.tokenIn) {
175
- const tokenAddress = resolveTokenAddress(input.tokenIn);
176
- const decimals = resolveTokenDecimals(input.tokenIn);
177
- const amountWei = BigInt(toWei(input.amount, decimals));
178
- const balance = (await publicClient.readContract({
179
- address: tokenAddress,
180
- abi: ERC20_ABI,
181
- functionName: "balanceOf",
182
- args: [walletAddr],
183
- }));
184
- if (balance < amountWei) {
185
- reasons.push(`Insufficient ${input.tokenIn} balance`);
186
- return { score: 100, reasons };
187
- }
188
- // Also check gas balance
189
- const ethBalance = await publicClient.getBalance({ address: walletAddr });
190
- if (ethBalance < parseEther("0.005")) {
191
- reasons.push("Very low PHRS balance for gas fees");
192
- return { score: 80, reasons };
193
- }
194
- reasons.push("Token and gas balance sufficient");
195
- return { score: 5, reasons };
196
- }
197
- return { score: 0, reasons: ["Balance check skipped"] };
198
- }
199
- catch (err) {
200
- reasons.push(`Balance check failed: ${err.message}`);
201
- return { score: 50, reasons };
202
- }
203
- }
204
- async function scoreMarketCondition(_input) {
205
- const reasons = [];
206
- try {
207
- // Check recent block production rate as a proxy for chain health
208
- const latestBlock = await publicClient.getBlock({ blockTag: "latest" });
209
- const prevBlock = await publicClient.getBlock({
210
- blockNumber: latestBlock.number - 10n,
211
- });
212
- const timeDiff = Number(latestBlock.timestamp - prevBlock.timestamp);
213
- const avgBlockTime = timeDiff / 10;
214
- if (avgBlockTime > 30) {
215
- reasons.push(`Slow block production: ~${avgBlockTime.toFixed(1)}s/block chain may be congested`);
216
- return { score: 60, reasons };
217
- }
218
- if (avgBlockTime > 15) {
219
- reasons.push(`Slightly elevated block times: ~${avgBlockTime.toFixed(1)}s/block`);
220
- return { score: 30, reasons };
221
- }
222
- // Check gas price
223
- const gasPrice = await publicClient.getGasPrice();
224
- const gasPriceGwei = Number(gasPrice) / 1e9;
225
- if (gasPriceGwei > 100) {
226
- reasons.push(`High gas price: ${gasPriceGwei.toFixed(1)} Gwei`);
227
- return { score: 50, reasons };
228
- }
229
- reasons.push(`Chain healthy: ~${avgBlockTime.toFixed(1)}s/block, ${gasPriceGwei.toFixed(1)} Gwei gas`);
230
- return { score: 5, reasons };
231
- }
232
- catch {
233
- reasons.push("Could not assess market conditions");
234
- return { score: 20, reasons };
235
- }
236
- }
237
- // ─── Main Risk Assessment ──────────────────────────────────────────────
238
- export async function assessRisk(input) {
239
- const [liquidity, slippage, counterparty, balance, market] = await Promise.all([
240
- scoreLiquidity(input),
241
- scoreSlippage(input),
242
- scoreCounterparty(input),
243
- scoreBalance(input),
244
- scoreMarketCondition(input),
245
- ]);
246
- const breakdown = {
247
- liquidityRisk: liquidity.score,
248
- slippageRisk: slippage.score,
249
- counterpartyRisk: counterparty.score,
250
- balanceRisk: balance.score,
251
- marketConditionRisk: market.score,
252
- };
253
- const riskScore = clamp(weightedAverage(breakdown));
254
- const riskLevel = computeRiskLevel(riskScore);
255
- const recommendation = computeRecommendation(riskScore);
256
- const reasons = [
257
- ...liquidity.reasons,
258
- ...slippage.reasons,
259
- ...counterparty.reasons,
260
- ...balance.reasons,
261
- ...market.reasons,
262
- ];
263
- let suggestion;
264
- if (recommendation === "proceed") {
265
- suggestion = "Risk is within acceptable range. Proceed with the transaction.";
266
- }
267
- else if (recommendation === "caution") {
268
- suggestion =
269
- "Moderate risk detected. Review the risk breakdown carefully before proceeding. Consider reducing the amount or adjusting parameters.";
270
- }
271
- else {
272
- suggestion =
273
- "High risk detected — execution blocked for safety. Review the reasons and adjust your transaction parameters significantly before retrying.";
274
- }
275
- return {
276
- riskScore,
277
- riskLevel,
278
- recommendation,
279
- breakdown,
280
- reasons,
281
- suggestion,
282
- };
283
- }
1
+ // ─── Risk Scoring Engine ───────────────────────────────────────────────
2
+ // 5-dimension risk assessment engine for SafeHands.
3
+ // Weights: liquidity 25%, slippage 25%, counterparty 20%,
4
+ // balance 15%, market conditions 15%
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import { publicClient } from "./pharosClient.js";
7
+ import { getDodoRoute, isNativeToken, resolveTokenAddress, resolveTokenDecimals, toWei, } from "./dodoApi.js";
8
+ import { RISK_WEIGHTS, RISK_BLOCK_THRESHOLD, MAX_SLIPPAGE_PCT, MAX_BALANCE_USAGE_PCT, ERC20_ABI, } from "./constants.js";
9
+ import { formatEther, isAddress, parseEther } from "viem";
10
+ // ─── Helpers ───────────────────────────────────────────────────────────
11
+ function clamp(value, min = 0, max = 100) {
12
+ return Math.max(min, Math.min(max, value));
13
+ }
14
+ function computeRiskLevel(score) {
15
+ if (score <= 30)
16
+ return "low";
17
+ if (score <= 60)
18
+ return "medium";
19
+ if (score <= 80)
20
+ return "high";
21
+ return "critical";
22
+ }
23
+ function computeRecommendation(score) {
24
+ if (score <= 30)
25
+ return "proceed";
26
+ if (score <= RISK_BLOCK_THRESHOLD)
27
+ return "caution";
28
+ return "block";
29
+ }
30
+ function weightedAverage(breakdown) {
31
+ const w = RISK_WEIGHTS;
32
+ return Math.round(breakdown.liquidityRisk * w.liquidityRisk +
33
+ breakdown.slippageRisk * w.slippageRisk +
34
+ breakdown.counterpartyRisk * w.counterpartyRisk +
35
+ breakdown.balanceRisk * w.balanceRisk +
36
+ breakdown.marketConditionRisk * w.marketConditionRisk);
37
+ }
38
+ // ─── Individual Risk Scorers ───────────────────────────────────────────
39
+ /**
40
+ * Pre-fetches the DODO route quote once for swap actions.
41
+ * Both scoreLiquidity and scoreSlippage use this cached result.
42
+ */
43
+ async function fetchSwapQuote(input) {
44
+ if (input.action !== "swap")
45
+ return null;
46
+ try {
47
+ return await getDodoRoute({
48
+ fromToken: input.tokenIn,
49
+ toToken: input.tokenOut,
50
+ amountHuman: input.amount,
51
+ walletAddress: input.walletAddress,
52
+ });
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ function scoreLiquidity(input, quote) {
59
+ const reasons = [];
60
+ if (input.action !== "swap")
61
+ return { score: 0, reasons };
62
+ if (!quote) {
63
+ reasons.push("Failed to fetch liquidity data");
64
+ return { score: 70, reasons };
65
+ }
66
+ if (!quote.routeAvailable) {
67
+ reasons.push("No swap route available — liquidity may be exhausted");
68
+ return { score: 100, reasons };
69
+ }
70
+ const impact = Math.abs(quote.priceImpact);
71
+ if (impact > 5) {
72
+ reasons.push(`High price impact: ${impact.toFixed(2)}%`);
73
+ return { score: clamp(80 + impact), reasons };
74
+ }
75
+ if (impact > 2) {
76
+ reasons.push(`Moderate price impact: ${impact.toFixed(2)}%`);
77
+ return { score: clamp(40 + impact * 10), reasons };
78
+ }
79
+ reasons.push(`Price impact acceptable: ${impact.toFixed(2)}%`);
80
+ return { score: clamp(impact * 15), reasons };
81
+ }
82
+ function scoreSlippage(input, quote) {
83
+ const reasons = [];
84
+ if (input.action !== "swap")
85
+ return { score: 0, reasons };
86
+ if (!quote) {
87
+ reasons.push("Slippage estimation failed");
88
+ return { score: 60, reasons };
89
+ }
90
+ if (!quote.routeAvailable) {
91
+ reasons.push("Cannot estimate slippage — no route");
92
+ return { score: 90, reasons };
93
+ }
94
+ const impact = Math.abs(quote.priceImpact);
95
+ if (impact > MAX_SLIPPAGE_PCT) {
96
+ reasons.push(`Slippage exceeds max ${MAX_SLIPPAGE_PCT}%: estimated ${impact.toFixed(2)}%`);
97
+ return { score: clamp(80 + (impact - MAX_SLIPPAGE_PCT) * 5), reasons };
98
+ }
99
+ reasons.push(`Estimated slippage: ${impact.toFixed(2)}%`);
100
+ return { score: clamp(impact * 16), reasons };
101
+ }
102
+ async function scoreCounterparty(input) {
103
+ const reasons = [];
104
+ if (input.action === "swap") {
105
+ // For swaps, counterparty is the DODO protocol — trusted
106
+ reasons.push("Swap routed through DODO protocol (known)");
107
+ return { score: 5, reasons };
108
+ }
109
+ // For transfers, check the recipient address
110
+ const to = input.toAddress;
111
+ if (!to) {
112
+ reasons.push("No recipient address provided");
113
+ return { score: 100, reasons };
114
+ }
115
+ if (!isAddress(to)) {
116
+ reasons.push("Invalid EVM address format");
117
+ return { score: 100, reasons };
118
+ }
119
+ // Zero address check
120
+ if (to === "0x0000000000000000000000000000000000000000") {
121
+ reasons.push("Sending to zero address — tokens will be burned");
122
+ return { score: 95, reasons };
123
+ }
124
+ // Self-send check
125
+ if (to.toLowerCase() === input.walletAddress.toLowerCase()) {
126
+ reasons.push("Sending to own address likely unintended");
127
+ return { score: 50, reasons };
128
+ }
129
+ // Check if address has code (is a contract)
130
+ try {
131
+ const code = await publicClient.getCode({ address: to });
132
+ if (code && code !== "0x") {
133
+ reasons.push("Recipient is a contract address — verify intent");
134
+ return { score: 40, reasons };
135
+ }
136
+ }
137
+ catch {
138
+ // RPC error, non-critical
139
+ }
140
+ // Check if address has any transaction history (has balance)
141
+ try {
142
+ const balance = await publicClient.getBalance({ address: to });
143
+ if (balance === 0n) {
144
+ reasons.push("Recipient has zero balance — new or unused address");
145
+ return { score: 30, reasons };
146
+ }
147
+ }
148
+ catch {
149
+ // Non-critical
150
+ }
151
+ reasons.push("Recipient address looks valid");
152
+ return { score: 10, reasons };
153
+ }
154
+ async function scoreBalance(input) {
155
+ const reasons = [];
156
+ try {
157
+ const walletAddr = input.walletAddress;
158
+ if (input.action === "transfer" || (input.action === "swap" && isNativeToken(input.tokenIn || "PHRS"))) {
159
+ // Check native PHRS balance
160
+ const balance = await publicClient.getBalance({ address: walletAddr });
161
+ const amountWei = parseEther(input.amount);
162
+ const gasBuffer = parseEther("0.01"); // ~0.01 PHRS for gas
163
+ if (balance < amountWei + gasBuffer) {
164
+ const balanceHuman = formatEther(balance);
165
+ reasons.push(`Insufficient PHRS balance: have ${balanceHuman}, need ${input.amount} + gas`);
166
+ return { score: 100, reasons };
167
+ }
168
+ const usagePct = Number((amountWei * 100n) / balance);
169
+ if (usagePct > MAX_BALANCE_USAGE_PCT) {
170
+ reasons.push(`Using ${usagePct}% of wallet balance — high exposure`);
171
+ return { score: clamp(60 + (usagePct - MAX_BALANCE_USAGE_PCT)), reasons };
172
+ }
173
+ reasons.push(`Balance sufficient, using ${usagePct}% of wallet`);
174
+ return { score: clamp(usagePct / 3), reasons };
175
+ }
176
+ // ERC-20 token balance check
177
+ if (input.tokenIn) {
178
+ const tokenAddress = resolveTokenAddress(input.tokenIn);
179
+ const decimals = resolveTokenDecimals(input.tokenIn);
180
+ const amountWei = BigInt(toWei(input.amount, decimals));
181
+ const balance = (await publicClient.readContract({
182
+ address: tokenAddress,
183
+ abi: ERC20_ABI,
184
+ functionName: "balanceOf",
185
+ args: [walletAddr],
186
+ }));
187
+ if (balance < amountWei) {
188
+ reasons.push(`Insufficient ${input.tokenIn} balance`);
189
+ return { score: 100, reasons };
190
+ }
191
+ // Also check gas balance
192
+ const ethBalance = await publicClient.getBalance({ address: walletAddr });
193
+ if (ethBalance < parseEther("0.005")) {
194
+ reasons.push("Very low PHRS balance for gas fees");
195
+ return { score: 80, reasons };
196
+ }
197
+ reasons.push("Token and gas balance sufficient");
198
+ return { score: 5, reasons };
199
+ }
200
+ return { score: 0, reasons: ["Balance check skipped"] };
201
+ }
202
+ catch (err) {
203
+ reasons.push(`Balance check failed: ${err.message}`);
204
+ return { score: 50, reasons };
205
+ }
206
+ }
207
+ async function scoreMarketCondition(_input) {
208
+ const reasons = [];
209
+ try {
210
+ // Check recent block production rate as a proxy for chain health
211
+ const latestBlock = await publicClient.getBlock({ blockTag: "latest" });
212
+ const prevBlock = await publicClient.getBlock({
213
+ blockNumber: latestBlock.number - 10n,
214
+ });
215
+ const timeDiff = Number(latestBlock.timestamp - prevBlock.timestamp);
216
+ const avgBlockTime = timeDiff / 10;
217
+ if (avgBlockTime > 30) {
218
+ reasons.push(`Slow block production: ~${avgBlockTime.toFixed(1)}s/block chain may be congested`);
219
+ return { score: 60, reasons };
220
+ }
221
+ if (avgBlockTime > 15) {
222
+ reasons.push(`Slightly elevated block times: ~${avgBlockTime.toFixed(1)}s/block`);
223
+ return { score: 30, reasons };
224
+ }
225
+ // Check gas price
226
+ const gasPrice = await publicClient.getGasPrice();
227
+ const gasPriceGwei = Number(gasPrice) / 1e9;
228
+ if (gasPriceGwei > 100) {
229
+ reasons.push(`High gas price: ${gasPriceGwei.toFixed(1)} Gwei`);
230
+ return { score: 50, reasons };
231
+ }
232
+ reasons.push(`Chain healthy: ~${avgBlockTime.toFixed(1)}s/block, ${gasPriceGwei.toFixed(1)} Gwei gas`);
233
+ return { score: 5, reasons };
234
+ }
235
+ catch {
236
+ reasons.push("Could not assess market conditions");
237
+ return { score: 20, reasons };
238
+ }
239
+ }
240
+ // ─── Main Risk Assessment ──────────────────────────────────────────────
241
+ export async function assessRisk(input) {
242
+ // Fetch DODO route once and share between liquidity + slippage scorers
243
+ const swapQuote = await fetchSwapQuote(input);
244
+ const [counterparty, balance, market] = await Promise.all([
245
+ scoreCounterparty(input),
246
+ scoreBalance(input),
247
+ scoreMarketCondition(input),
248
+ ]);
249
+ const liquidity = scoreLiquidity(input, swapQuote);
250
+ const slippage = scoreSlippage(input, swapQuote);
251
+ const breakdown = {
252
+ liquidityRisk: liquidity.score,
253
+ slippageRisk: slippage.score,
254
+ counterpartyRisk: counterparty.score,
255
+ balanceRisk: balance.score,
256
+ marketConditionRisk: market.score,
257
+ };
258
+ const riskScore = clamp(weightedAverage(breakdown));
259
+ const riskLevel = computeRiskLevel(riskScore);
260
+ const recommendation = computeRecommendation(riskScore);
261
+ const reasons = [
262
+ ...liquidity.reasons,
263
+ ...slippage.reasons,
264
+ ...counterparty.reasons,
265
+ ...balance.reasons,
266
+ ...market.reasons,
267
+ ];
268
+ let suggestion;
269
+ if (recommendation === "proceed") {
270
+ suggestion = "Risk is within acceptable range. Proceed with the transaction.";
271
+ }
272
+ else if (recommendation === "caution") {
273
+ suggestion =
274
+ "Moderate risk detected. Review the risk breakdown carefully before proceeding. Consider reducing the amount or adjusting parameters.";
275
+ }
276
+ else {
277
+ suggestion =
278
+ "High risk detected — execution blocked for safety. Review the reasons and adjust your transaction parameters significantly before retrying.";
279
+ }
280
+ return {
281
+ riskScore,
282
+ riskLevel,
283
+ recommendation,
284
+ breakdown,
285
+ reasons,
286
+ suggestion,
287
+ };
288
+ }
284
289
  //# sourceMappingURL=riskEngine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"riskEngine.js","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"riskEngine.js","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"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"}