safehands-pharos 1.0.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 (106) hide show
  1. package/.agents/skill/safehands/SKILL.md +169 -0
  2. package/LICENSE +21 -0
  3. package/README.md +382 -0
  4. package/contracts/RiskRegistry.json +149 -0
  5. package/contracts/RiskRegistry.sol +30 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +98 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/constants.d.ts +173 -0
  11. package/dist/lib/constants.d.ts.map +1 -0
  12. package/dist/lib/constants.js +151 -0
  13. package/dist/lib/constants.js.map +1 -0
  14. package/dist/lib/dodoApi.d.ts +57 -0
  15. package/dist/lib/dodoApi.d.ts.map +1 -0
  16. package/dist/lib/dodoApi.js +123 -0
  17. package/dist/lib/dodoApi.js.map +1 -0
  18. package/dist/lib/pharosClient.d.ts +58 -0
  19. package/dist/lib/pharosClient.d.ts.map +1 -0
  20. package/dist/lib/pharosClient.js +51 -0
  21. package/dist/lib/pharosClient.js.map +1 -0
  22. package/dist/lib/riskEngine.d.ts +27 -0
  23. package/dist/lib/riskEngine.d.ts.map +1 -0
  24. package/dist/lib/riskEngine.js +284 -0
  25. package/dist/lib/riskEngine.js.map +1 -0
  26. package/dist/lib/testRpc.d.ts +2 -0
  27. package/dist/lib/testRpc.d.ts.map +1 -0
  28. package/dist/lib/testRpc.js +30 -0
  29. package/dist/lib/testRpc.js.map +1 -0
  30. package/dist/lib/testTools.d.ts +2 -0
  31. package/dist/lib/testTools.d.ts.map +1 -0
  32. package/dist/lib/testTools.js +263 -0
  33. package/dist/lib/testTools.js.map +1 -0
  34. package/dist/scripts/checkDeploy.d.ts +2 -0
  35. package/dist/scripts/checkDeploy.d.ts.map +1 -0
  36. package/dist/scripts/checkDeploy.js +25 -0
  37. package/dist/scripts/checkDeploy.js.map +1 -0
  38. package/dist/scripts/deployRegistry.d.ts +2 -0
  39. package/dist/scripts/deployRegistry.d.ts.map +1 -0
  40. package/dist/scripts/deployRegistry.js +101 -0
  41. package/dist/scripts/deployRegistry.js.map +1 -0
  42. package/dist/scripts/testRegistry.d.ts +2 -0
  43. package/dist/scripts/testRegistry.d.ts.map +1 -0
  44. package/dist/scripts/testRegistry.js +44 -0
  45. package/dist/scripts/testRegistry.js.map +1 -0
  46. package/dist/tools/approveToken.d.ts +60 -0
  47. package/dist/tools/approveToken.d.ts.map +1 -0
  48. package/dist/tools/approveToken.js +59 -0
  49. package/dist/tools/approveToken.js.map +1 -0
  50. package/dist/tools/assessRisk.d.ts +67 -0
  51. package/dist/tools/assessRisk.d.ts.map +1 -0
  52. package/dist/tools/assessRisk.js +71 -0
  53. package/dist/tools/assessRisk.js.map +1 -0
  54. package/dist/tools/checkAllowance.d.ts +37 -0
  55. package/dist/tools/checkAllowance.d.ts.map +1 -0
  56. package/dist/tools/checkAllowance.js +43 -0
  57. package/dist/tools/checkAllowance.js.map +1 -0
  58. package/dist/tools/estimateGas.d.ts +70 -0
  59. package/dist/tools/estimateGas.d.ts.map +1 -0
  60. package/dist/tools/estimateGas.js +129 -0
  61. package/dist/tools/estimateGas.js.map +1 -0
  62. package/dist/tools/executeSwap.d.ts +94 -0
  63. package/dist/tools/executeSwap.d.ts.map +1 -0
  64. package/dist/tools/executeSwap.js +107 -0
  65. package/dist/tools/executeSwap.js.map +1 -0
  66. package/dist/tools/getExecutionHistory.d.ts +52 -0
  67. package/dist/tools/getExecutionHistory.d.ts.map +1 -0
  68. package/dist/tools/getExecutionHistory.js +94 -0
  69. package/dist/tools/getExecutionHistory.js.map +1 -0
  70. package/dist/tools/getGasPrice.d.ts +26 -0
  71. package/dist/tools/getGasPrice.d.ts.map +1 -0
  72. package/dist/tools/getGasPrice.js +52 -0
  73. package/dist/tools/getGasPrice.js.map +1 -0
  74. package/dist/tools/getPoolInfo.d.ts +88 -0
  75. package/dist/tools/getPoolInfo.d.ts.map +1 -0
  76. package/dist/tools/getPoolInfo.js +99 -0
  77. package/dist/tools/getPoolInfo.js.map +1 -0
  78. package/dist/tools/getTokenPrice.d.ts +28 -0
  79. package/dist/tools/getTokenPrice.d.ts.map +1 -0
  80. package/dist/tools/getTokenPrice.js +79 -0
  81. package/dist/tools/getTokenPrice.js.map +1 -0
  82. package/dist/tools/getTransactionStatus.d.ts +58 -0
  83. package/dist/tools/getTransactionStatus.d.ts.map +1 -0
  84. package/dist/tools/getTransactionStatus.js +68 -0
  85. package/dist/tools/getTransactionStatus.js.map +1 -0
  86. package/dist/tools/getWalletBalance.d.ts +40 -0
  87. package/dist/tools/getWalletBalance.d.ts.map +1 -0
  88. package/dist/tools/getWalletBalance.js +71 -0
  89. package/dist/tools/getWalletBalance.js.map +1 -0
  90. package/dist/tools/publishRiskScore.d.ts +74 -0
  91. package/dist/tools/publishRiskScore.d.ts.map +1 -0
  92. package/dist/tools/publishRiskScore.js +70 -0
  93. package/dist/tools/publishRiskScore.js.map +1 -0
  94. package/dist/tools/queryRiskRegistry.d.ts +49 -0
  95. package/dist/tools/queryRiskRegistry.d.ts.map +1 -0
  96. package/dist/tools/queryRiskRegistry.js +61 -0
  97. package/dist/tools/queryRiskRegistry.js.map +1 -0
  98. package/dist/tools/sendPayment.d.ts +70 -0
  99. package/dist/tools/sendPayment.d.ts.map +1 -0
  100. package/dist/tools/sendPayment.js +68 -0
  101. package/dist/tools/sendPayment.js.map +1 -0
  102. package/dist/tools/simulateTransaction.d.ts +82 -0
  103. package/dist/tools/simulateTransaction.d.ts.map +1 -0
  104. package/dist/tools/simulateTransaction.js +89 -0
  105. package/dist/tools/simulateTransaction.js.map +1 -0
  106. package/package.json +61 -0
@@ -0,0 +1,57 @@
1
+ export interface DodoRouteResponse {
2
+ status: number;
3
+ data: {
4
+ resAmount: string | number;
5
+ priceImpact: string | number;
6
+ targetDecimals: number;
7
+ targetApproveAddr: string;
8
+ to: string;
9
+ data: string;
10
+ value: string | number;
11
+ gasLimit: string | number;
12
+ } | null;
13
+ }
14
+ export interface DodoQuote {
15
+ amountOut: string;
16
+ amountOutWei: string;
17
+ priceImpact: number;
18
+ gasLimit: string;
19
+ value: string;
20
+ calldata: string;
21
+ to: string;
22
+ approveAddress: string;
23
+ routeAvailable: boolean;
24
+ rawResponse: DodoRouteResponse;
25
+ }
26
+ /**
27
+ * Resolves a token symbol (e.g. "PHRS") or address to its on-chain address.
28
+ */
29
+ export declare function resolveTokenAddress(token: string): `0x${string}`;
30
+ /**
31
+ * Resolves the decimal count for a token symbol or address.
32
+ */
33
+ export declare function resolveTokenDecimals(token: string): number;
34
+ /**
35
+ * Converts a human-readable amount to wei string.
36
+ */
37
+ export declare function toWei(amount: string, decimals: number): string;
38
+ /**
39
+ * Converts a wei string to human-readable amount.
40
+ * Also handles the case where the API returns a decimal string directly.
41
+ */
42
+ export declare function fromWei(weiInput: string | number, decimals: number): string;
43
+ /**
44
+ * Fetches a swap route from the DODO aggregation API.
45
+ */
46
+ export declare function getDodoRoute(params: {
47
+ fromToken: string;
48
+ toToken: string;
49
+ amountHuman: string;
50
+ walletAddress: string;
51
+ slippage?: number;
52
+ }): Promise<DodoQuote>;
53
+ /**
54
+ * Checks whether a token is the native PHRS token.
55
+ */
56
+ export declare function isNativeToken(token: string): boolean;
57
+ //# sourceMappingURL=dodoApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dodoApi.d.ts","sourceRoot":"","sources":["../../src/lib/dodoApi.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;KAC3B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAKhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa3E;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,SAAS,CAAC,CA2DrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIpD"}
@@ -0,0 +1,123 @@
1
+ // ─── DODO Route API Client ─────────────────────────────────────────────
2
+ // Fetches swap routes from DODO's aggregation API for FaroSwap on
3
+ // Pharos Atlantic Testnet.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { DODO_API_BASE, DODO_API_KEY, DODO_DEFAULT_SLIPPAGE, DODO_ROUTE_ENDPOINT, CHAIN_ID, TOKEN_MAP, TOKEN_DECIMALS, PHRS_ADDRESS, } from "./constants.js";
6
+ // ─── Helpers ───────────────────────────────────────────────────────────
7
+ /**
8
+ * Resolves a token symbol (e.g. "PHRS") or address to its on-chain address.
9
+ */
10
+ export function resolveTokenAddress(token) {
11
+ const upper = token.toUpperCase();
12
+ if (TOKEN_MAP[upper])
13
+ return TOKEN_MAP[upper];
14
+ if (token.startsWith("0x") && token.length === 42)
15
+ return token;
16
+ throw new Error(`Unknown token: ${token}`);
17
+ }
18
+ /**
19
+ * Resolves the decimal count for a token symbol or address.
20
+ */
21
+ export function resolveTokenDecimals(token) {
22
+ const upper = token.toUpperCase();
23
+ if (TOKEN_DECIMALS[upper] !== undefined)
24
+ return TOKEN_DECIMALS[upper];
25
+ const lower = token.toLowerCase();
26
+ if (TOKEN_DECIMALS[lower] !== undefined)
27
+ return TOKEN_DECIMALS[lower];
28
+ return 18; // default fallback
29
+ }
30
+ /**
31
+ * Converts a human-readable amount to wei string.
32
+ */
33
+ export function toWei(amount, decimals) {
34
+ const [whole, frac = ""] = amount.split(".");
35
+ const paddedFrac = frac.padEnd(decimals, "0").slice(0, decimals);
36
+ return BigInt(whole + paddedFrac).toString();
37
+ }
38
+ /**
39
+ * Converts a wei string to human-readable amount.
40
+ * Also handles the case where the API returns a decimal string directly.
41
+ */
42
+ export function fromWei(weiInput, decimals) {
43
+ const weiStr = String(weiInput);
44
+ // If the string already contains a decimal point, it's already human-readable
45
+ if (weiStr.includes(".")) {
46
+ return weiStr;
47
+ }
48
+ const wei = BigInt(weiStr);
49
+ const divisor = BigInt(10 ** decimals);
50
+ const whole = wei / divisor;
51
+ const remainder = wei % divisor;
52
+ if (remainder === 0n)
53
+ return whole.toString();
54
+ const fracStr = remainder.toString().padStart(decimals, "0").replace(/0+$/, "");
55
+ return `${whole}.${fracStr}`;
56
+ }
57
+ // ─── DODO Route Fetch ──────────────────────────────────────────────────
58
+ /**
59
+ * Fetches a swap route from the DODO aggregation API.
60
+ */
61
+ export async function getDodoRoute(params) {
62
+ const fromAddress = resolveTokenAddress(params.fromToken);
63
+ const toAddress = resolveTokenAddress(params.toToken);
64
+ const fromDecimals = resolveTokenDecimals(params.fromToken);
65
+ const toDecimals = resolveTokenDecimals(params.toToken);
66
+ const amountInWei = toWei(params.amountHuman, fromDecimals);
67
+ const slippage = params.slippage ?? DODO_DEFAULT_SLIPPAGE;
68
+ const deadline = Math.floor(Date.now() / 1000) + 600;
69
+ const url = `${DODO_API_BASE}${DODO_ROUTE_ENDPOINT}` +
70
+ `?chainId=${CHAIN_ID}` +
71
+ `&fromTokenAddress=${fromAddress}` +
72
+ `&toTokenAddress=${toAddress}` +
73
+ `&fromAmount=${amountInWei}` +
74
+ `&userAddr=${params.walletAddress}` +
75
+ `&slippage=${slippage}` +
76
+ `&source=dodoV2AndMixWasm` +
77
+ `&estimateGas=true` +
78
+ `&apikey=${DODO_API_KEY}` +
79
+ `&deadLine=${deadline}`;
80
+ const response = await fetch(url);
81
+ if (!response.ok) {
82
+ throw new Error(`DODO API error: ${response.status} ${response.statusText}`);
83
+ }
84
+ const json = (await response.json());
85
+ if (!json.data || json.status !== 200) {
86
+ return {
87
+ amountOut: "0",
88
+ amountOutWei: "0",
89
+ priceImpact: 100,
90
+ gasLimit: "0",
91
+ value: "0",
92
+ calldata: "0x",
93
+ to: "",
94
+ approveAddress: "",
95
+ routeAvailable: false,
96
+ rawResponse: json,
97
+ };
98
+ }
99
+ const d = json.data;
100
+ const resAmountStr = String(d.resAmount);
101
+ return {
102
+ amountOut: fromWei(resAmountStr, toDecimals),
103
+ amountOutWei: resAmountStr,
104
+ priceImpact: parseFloat(String(d.priceImpact)) || 0,
105
+ gasLimit: String(d.gasLimit),
106
+ value: String(d.value),
107
+ calldata: d.data,
108
+ to: d.to,
109
+ approveAddress: d.targetApproveAddr,
110
+ routeAvailable: true,
111
+ rawResponse: json,
112
+ };
113
+ }
114
+ /**
115
+ * Checks whether a token is the native PHRS token.
116
+ */
117
+ export function isNativeToken(token) {
118
+ const upper = token.toUpperCase();
119
+ if (upper === "PHRS")
120
+ return true;
121
+ return token.toLowerCase() === PHRS_ADDRESS.toLowerCase();
122
+ }
123
+ //# sourceMappingURL=dodoApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dodoApi.js","sourceRoot":"","sources":["../../src/lib/dodoApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type PublicClient, type WalletClient, type Transport, type Chain, type Account } from "viem";
2
+ export declare const pharosAtlantic: {
3
+ blockExplorers: {
4
+ readonly default: {
5
+ readonly name: "PharosScan";
6
+ readonly url: string;
7
+ };
8
+ };
9
+ blockTime?: number | undefined | undefined;
10
+ contracts?: {
11
+ [x: string]: import("viem").ChainContract | {
12
+ [sourceId: number]: import("viem").ChainContract | undefined;
13
+ } | undefined;
14
+ ensRegistry?: import("viem").ChainContract | undefined;
15
+ ensUniversalResolver?: import("viem").ChainContract | undefined;
16
+ multicall3?: import("viem").ChainContract | undefined;
17
+ erc6492Verifier?: import("viem").ChainContract | undefined;
18
+ } | undefined;
19
+ ensTlds?: readonly string[] | undefined;
20
+ id: 688689;
21
+ name: "Pharos Atlantic Testnet";
22
+ nativeCurrency: {
23
+ readonly name: "PHRS";
24
+ readonly symbol: "PHRS";
25
+ readonly decimals: 18;
26
+ };
27
+ experimental_preconfirmationTime?: number | undefined | undefined;
28
+ rpcUrls: {
29
+ readonly default: {
30
+ readonly http: readonly ["https://atlantic.dplabs-internal.com/"];
31
+ };
32
+ };
33
+ sourceId?: number | undefined | undefined;
34
+ testnet: true;
35
+ custom?: Record<string, unknown> | undefined;
36
+ extendSchema?: Record<string, unknown> | undefined;
37
+ fees?: import("viem").ChainFees<undefined> | undefined;
38
+ formatters?: undefined;
39
+ prepareTransactionRequest?: ((args: import("viem").PrepareTransactionRequestParameters, options: {
40
+ client: import("viem").Client;
41
+ phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
42
+ }) => Promise<import("viem").PrepareTransactionRequestParameters>) | [fn: ((args: import("viem").PrepareTransactionRequestParameters, options: {
43
+ client: import("viem").Client;
44
+ phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
45
+ }) => Promise<import("viem").PrepareTransactionRequestParameters>) | undefined, options: {
46
+ runAt: readonly ("beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters")[];
47
+ }] | undefined;
48
+ serializers?: import("viem").ChainSerializers<undefined, import("viem").TransactionSerializable> | undefined;
49
+ verifyHash?: ((client: import("viem").Client, parameters: import("viem").VerifyHashActionParameters) => Promise<import("viem").VerifyHashActionReturnType>) | undefined;
50
+ };
51
+ export declare const publicClient: PublicClient<Transport, Chain>;
52
+ /**
53
+ * Creates a wallet client for signing and sending transactions.
54
+ * Private key is passed per-request and NEVER stored.
55
+ */
56
+ export declare function createPharosWalletClient(privateKey: `0x${string}`): WalletClient<Transport, Chain, Account>;
57
+ export declare function getExplorerUrl(txHash: string): string;
58
+ //# sourceMappingURL=pharosClient.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,51 @@
1
+ // ─── Pharos Chain Client ───────────────────────────────────────────────
2
+ // viem publicClient & walletClient factory for Pharos Atlantic Testnet.
3
+ // ────────────────────────────────────────────────────────────────────────
4
+ import { createPublicClient, createWalletClient, http, defineChain, } from "viem";
5
+ import { privateKeyToAccount } from "viem/accounts";
6
+ import { RPC_URL, CHAIN_ID, EXPLORER_BASE } from "./constants.js";
7
+ // ─── Chain Definition ──────────────────────────────────────────────────
8
+ export const pharosAtlantic = defineChain({
9
+ id: CHAIN_ID,
10
+ name: "Pharos Atlantic Testnet",
11
+ nativeCurrency: {
12
+ name: "PHRS",
13
+ symbol: "PHRS",
14
+ decimals: 18,
15
+ },
16
+ rpcUrls: {
17
+ default: {
18
+ http: [RPC_URL],
19
+ },
20
+ },
21
+ blockExplorers: {
22
+ default: {
23
+ name: "PharosScan",
24
+ url: EXPLORER_BASE.replace("/tx/", ""),
25
+ },
26
+ },
27
+ testnet: true,
28
+ });
29
+ // ─── Public Client (read-only) ─────────────────────────────────────────
30
+ export const publicClient = createPublicClient({
31
+ chain: pharosAtlantic,
32
+ transport: http(RPC_URL),
33
+ });
34
+ // ─── Wallet Client Factory ─────────────────────────────────────────────
35
+ /**
36
+ * Creates a wallet client for signing and sending transactions.
37
+ * Private key is passed per-request and NEVER stored.
38
+ */
39
+ export function createPharosWalletClient(privateKey) {
40
+ const account = privateKeyToAccount(privateKey);
41
+ return createWalletClient({
42
+ account,
43
+ chain: pharosAtlantic,
44
+ transport: http(RPC_URL),
45
+ });
46
+ }
47
+ // ─── Utility: Explorer Link ────────────────────────────────────────────
48
+ export function getExplorerUrl(txHash) {
49
+ return `${EXPLORER_BASE}${txHash}`;
50
+ }
51
+ //# sourceMappingURL=pharosClient.js.map
@@ -0,0 +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"}
@@ -0,0 +1,27 @@
1
+ export interface RiskBreakdown {
2
+ liquidityRisk: number;
3
+ slippageRisk: number;
4
+ counterpartyRisk: number;
5
+ balanceRisk: number;
6
+ marketConditionRisk: number;
7
+ }
8
+ export type RiskLevel = "low" | "medium" | "high" | "critical";
9
+ export type RiskRecommendation = "proceed" | "caution" | "block";
10
+ export interface RiskAssessment {
11
+ riskScore: number;
12
+ riskLevel: RiskLevel;
13
+ recommendation: RiskRecommendation;
14
+ breakdown: RiskBreakdown;
15
+ reasons: string[];
16
+ suggestion: string;
17
+ }
18
+ export interface RiskInput {
19
+ action: "swap" | "transfer";
20
+ tokenIn?: string;
21
+ tokenOut?: string;
22
+ amount: string;
23
+ toAddress?: string;
24
+ walletAddress: string;
25
+ }
26
+ export declare function assessRisk(input: RiskInput): Promise<RiskAssessment>;
27
+ //# sourceMappingURL=riskEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"riskEngine.d.ts","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AA2QD,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAgD1E"}
@@ -0,0 +1,284 @@
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
+ }
284
+ //# sourceMappingURL=riskEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"riskEngine.js","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=testRpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testRpc.d.ts","sourceRoot":"","sources":["../../src/lib/testRpc.ts"],"names":[],"mappings":""}