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,79 @@
1
+ // ─── Tool: get_token_price ─────────────────────────────────────────────
2
+ // Fetches real-time token price from DODO API by quoting a swap against
3
+ // a known stablecoin pair.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { z } from "zod";
6
+ import { getDodoRoute } from "../lib/dodoApi.js";
7
+ export const getTokenPriceSchema = z.object({
8
+ token: z.enum(["PHRS", "USDC", "USDT"]).describe("Token to get price for"),
9
+ });
10
+ export const getTokenPriceTool = {
11
+ name: "get_token_price",
12
+ description: "Fetch real-time price of PHRS, USDC, or USDT on Pharos Atlantic Testnet using DODO liquidity quotes.",
13
+ inputSchema: getTokenPriceSchema,
14
+ };
15
+ // Read-only address for price quotes (never signs transactions)
16
+ const QUOTE_WALLET = "0x0000000000000000000000000000000000000001";
17
+ export async function handleGetTokenPrice(raw) {
18
+ const input = getTokenPriceSchema.parse(raw);
19
+ const timestamp = new Date().toISOString();
20
+ if (input.token === "USDC") {
21
+ // USDC is the quote stablecoin — price ~$1, get price in PHRS by quoting 1 USDC → PHRS
22
+ const quote = await getDodoRoute({
23
+ fromToken: "USDC",
24
+ toToken: "PHRS",
25
+ amountHuman: "1",
26
+ walletAddress: QUOTE_WALLET,
27
+ });
28
+ const priceInPHRS = quote.routeAvailable ? parseFloat(quote.amountOut) : 0;
29
+ return {
30
+ token: "USDC",
31
+ priceUsd: "1.00",
32
+ priceInPHRS: priceInPHRS > 0 ? priceInPHRS.toFixed(6) : "unavailable",
33
+ source: "DODO Route API (Pharos Atlantic)",
34
+ timestamp,
35
+ };
36
+ }
37
+ if (input.token === "USDT") {
38
+ // USDT — quote 1 USDT → USDC to get USD price, then 1 USDT → PHRS
39
+ const usdQuote = await getDodoRoute({
40
+ fromToken: "USDT",
41
+ toToken: "USDC",
42
+ amountHuman: "1",
43
+ walletAddress: QUOTE_WALLET,
44
+ });
45
+ const phrsQuote = await getDodoRoute({
46
+ fromToken: "USDT",
47
+ toToken: "PHRS",
48
+ amountHuman: "1",
49
+ walletAddress: QUOTE_WALLET,
50
+ });
51
+ const priceUsd = usdQuote.routeAvailable ? parseFloat(usdQuote.amountOut).toFixed(4) : "~1.00";
52
+ const priceInPHRS = phrsQuote.routeAvailable ? parseFloat(phrsQuote.amountOut).toFixed(6) : "unavailable";
53
+ return {
54
+ token: "USDT",
55
+ priceUsd,
56
+ priceInPHRS,
57
+ source: "DODO Route API (Pharos Atlantic)",
58
+ timestamp,
59
+ };
60
+ }
61
+ // PHRS — quote 1 PHRS → USDC for USD price
62
+ const usdcQuote = await getDodoRoute({
63
+ fromToken: "PHRS",
64
+ toToken: "USDC",
65
+ amountHuman: "1",
66
+ walletAddress: QUOTE_WALLET,
67
+ });
68
+ const priceUsd = usdcQuote.routeAvailable
69
+ ? parseFloat(usdcQuote.amountOut).toFixed(4)
70
+ : "unavailable";
71
+ return {
72
+ token: "PHRS",
73
+ priceUsd,
74
+ priceInPHRS: "1.000000",
75
+ source: "DODO Route API (Pharos Atlantic)",
76
+ timestamp,
77
+ };
78
+ }
79
+ //# sourceMappingURL=getTokenPrice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTokenPrice.js","sourceRoot":"","sources":["../../src/tools/getTokenPrice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ export declare const getTransactionStatusSchema: z.ZodObject<{
3
+ txHash: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ txHash: string;
6
+ }, {
7
+ txHash: string;
8
+ }>;
9
+ export type GetTransactionStatusInput = z.input<typeof getTransactionStatusSchema>;
10
+ export declare const getTransactionStatusTool: {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: z.ZodObject<{
14
+ txHash: z.ZodString;
15
+ }, "strip", z.ZodTypeAny, {
16
+ txHash: string;
17
+ }, {
18
+ txHash: string;
19
+ }>;
20
+ };
21
+ export declare function handleGetTransactionStatus(raw: GetTransactionStatusInput): Promise<{
22
+ txHash: string;
23
+ status: string;
24
+ blockNumber: string;
25
+ blockHash: `0x${string}`;
26
+ from: `0x${string}`;
27
+ to: `0x${string}` | null;
28
+ gasUsed: string;
29
+ effectiveGasPrice: string;
30
+ value: string;
31
+ explorerUrl: string;
32
+ error?: undefined;
33
+ } | {
34
+ txHash: string;
35
+ status: "pending";
36
+ blockNumber: null;
37
+ blockHash: null;
38
+ from: `0x${string}`;
39
+ to: `0x${string}` | null;
40
+ gasUsed: null;
41
+ effectiveGasPrice: null;
42
+ value: string;
43
+ explorerUrl: string;
44
+ error?: undefined;
45
+ } | {
46
+ txHash: string;
47
+ status: "not_found";
48
+ blockNumber: null;
49
+ blockHash: null;
50
+ from: null;
51
+ to: null;
52
+ gasUsed: null;
53
+ effectiveGasPrice: null;
54
+ value: null;
55
+ explorerUrl: string;
56
+ error: string;
57
+ }>;
58
+ //# sourceMappingURL=getTransactionStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTransactionStatus.d.ts","sourceRoot":"","sources":["../../src/tools/getTransactionStatus.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF,eAAO,MAAM,wBAAwB;;;;;;;;;;CAKpC,CAAC;AAEF,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqD9E"}
@@ -0,0 +1,68 @@
1
+ // ─── Tool: get_transaction_status ──────────────────────────────────────
2
+ // Checks on-chain transaction status by hash via viem.
3
+ // ────────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { publicClient, getExplorerUrl } from "../lib/pharosClient.js";
6
+ export const getTransactionStatusSchema = z.object({
7
+ txHash: z.string().describe("Transaction hash to look up"),
8
+ });
9
+ export const getTransactionStatusTool = {
10
+ name: "get_transaction_status",
11
+ description: "Check the on-chain status of a transaction by its hash. Returns status, block number, gas used, and explorer link.",
12
+ inputSchema: getTransactionStatusSchema,
13
+ };
14
+ export async function handleGetTransactionStatus(raw) {
15
+ const input = getTransactionStatusSchema.parse(raw);
16
+ const hash = input.txHash;
17
+ // Try to get the receipt first (only exists if tx is mined)
18
+ try {
19
+ const receipt = await publicClient.getTransactionReceipt({ hash });
20
+ const tx = await publicClient.getTransaction({ hash });
21
+ return {
22
+ txHash: input.txHash,
23
+ status: receipt.status === "success" ? "success" : "failed",
24
+ blockNumber: receipt.blockNumber.toString(),
25
+ blockHash: receipt.blockHash,
26
+ from: receipt.from,
27
+ to: receipt.to,
28
+ gasUsed: receipt.gasUsed.toString(),
29
+ effectiveGasPrice: receipt.effectiveGasPrice.toString(),
30
+ value: tx.value.toString(),
31
+ explorerUrl: getExplorerUrl(input.txHash),
32
+ };
33
+ }
34
+ catch {
35
+ // Receipt not found — check if the tx exists at all (pending)
36
+ try {
37
+ const tx = await publicClient.getTransaction({ hash });
38
+ return {
39
+ txHash: input.txHash,
40
+ status: "pending",
41
+ blockNumber: null,
42
+ blockHash: null,
43
+ from: tx.from,
44
+ to: tx.to,
45
+ gasUsed: null,
46
+ effectiveGasPrice: null,
47
+ value: tx.value.toString(),
48
+ explorerUrl: getExplorerUrl(input.txHash),
49
+ };
50
+ }
51
+ catch {
52
+ return {
53
+ txHash: input.txHash,
54
+ status: "not_found",
55
+ blockNumber: null,
56
+ blockHash: null,
57
+ from: null,
58
+ to: null,
59
+ gasUsed: null,
60
+ effectiveGasPrice: null,
61
+ value: null,
62
+ explorerUrl: getExplorerUrl(input.txHash),
63
+ error: "Transaction not found on chain",
64
+ };
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=getTransactionStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTransactionStatus.js","sourceRoot":"","sources":["../../src/tools/getTransactionStatus.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,uDAAuD;AACvD,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC3D,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,oHAAoH;IACtH,WAAW,EAAE,0BAA0B;CACxC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,GAA8B;IAC7E,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAuB,CAAC;IAE3C,4DAA4D;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAC3D,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE;YAC3C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YACnC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YACvD,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC1B,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;SAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,SAAkB;gBAC1B,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,IAAI;gBACvB,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC1B,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;aAC1C,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,WAAoB;gBAC5B,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,IAAI;gBACV,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,IAAI;gBACb,iBAAiB,EAAE,IAAI;gBACvB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;gBACzC,KAAK,EAAE,gCAAgC;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ export declare const getWalletBalanceSchema: z.ZodObject<{
3
+ walletAddress: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ walletAddress: string;
6
+ }, {
7
+ walletAddress: string;
8
+ }>;
9
+ export type GetWalletBalanceInput = z.input<typeof getWalletBalanceSchema>;
10
+ export declare const getWalletBalanceTool: {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: z.ZodObject<{
14
+ walletAddress: z.ZodString;
15
+ }, "strip", z.ZodTypeAny, {
16
+ walletAddress: string;
17
+ }, {
18
+ walletAddress: string;
19
+ }>;
20
+ };
21
+ export declare function handleGetWalletBalance(raw: GetWalletBalanceInput): Promise<{
22
+ walletAddress: string;
23
+ balances: {
24
+ PHRS: {
25
+ balance: string;
26
+ valueUsd: string;
27
+ };
28
+ USDC: {
29
+ balance: string;
30
+ valueUsd: string;
31
+ };
32
+ USDT: {
33
+ balance: string;
34
+ valueUsd: string;
35
+ };
36
+ };
37
+ totalUsd: string;
38
+ phrsPrice: string;
39
+ }>;
40
+ //# sourceMappingURL=getWalletBalance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getWalletBalance.d.ts","sourceRoot":"","sources":["../../src/tools/getWalletBalance.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,eAAO,MAAM,oBAAoB;;;;;;;;;;CAKhC,CAAC;AAIF,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB;;;;;;;;;;;;;;;;;;GAwDtE"}
@@ -0,0 +1,71 @@
1
+ // ─── Tool: get_wallet_balance ──────────────────────────────────────────
2
+ // Returns PHRS, USDC, USDT balances for a wallet using viem reads.
3
+ // ────────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { publicClient } from "../lib/pharosClient.js";
6
+ import { getDodoRoute } from "../lib/dodoApi.js";
7
+ import { USDC_ADDRESS, USDT_ADDRESS, ERC20_ABI } from "../lib/constants.js";
8
+ import { formatEther, formatUnits } from "viem";
9
+ export const getWalletBalanceSchema = z.object({
10
+ walletAddress: z.string().describe("Wallet address to check balances for"),
11
+ });
12
+ export const getWalletBalanceTool = {
13
+ name: "get_wallet_balance",
14
+ description: "Return PHRS (native), USDC, and USDT balances for a wallet on Pharos Atlantic Testnet, with total USD estimate.",
15
+ inputSchema: getWalletBalanceSchema,
16
+ };
17
+ const QUOTE_WALLET = "0x0000000000000000000000000000000000000001";
18
+ export async function handleGetWalletBalance(raw) {
19
+ const input = getWalletBalanceSchema.parse(raw);
20
+ const addr = input.walletAddress;
21
+ // Fetch all three balances in parallel
22
+ const [phrsBalanceWei, usdcBalanceRaw, usdtBalanceRaw] = await Promise.all([
23
+ publicClient.getBalance({ address: addr }),
24
+ publicClient.readContract({
25
+ address: USDC_ADDRESS,
26
+ abi: ERC20_ABI,
27
+ functionName: "balanceOf",
28
+ args: [addr],
29
+ }),
30
+ publicClient.readContract({
31
+ address: USDT_ADDRESS,
32
+ abi: ERC20_ABI,
33
+ functionName: "balanceOf",
34
+ args: [addr],
35
+ }),
36
+ ]);
37
+ const phrsBalance = formatEther(phrsBalanceWei);
38
+ const usdcBalance = formatUnits(usdcBalanceRaw, 6);
39
+ const usdtBalance = formatUnits(usdtBalanceRaw, 6);
40
+ // Get PHRS price in USD for total calculation
41
+ let phrsUsd = 0;
42
+ try {
43
+ const quote = await getDodoRoute({
44
+ fromToken: "PHRS",
45
+ toToken: "USDC",
46
+ amountHuman: "1",
47
+ walletAddress: QUOTE_WALLET,
48
+ });
49
+ if (quote.routeAvailable) {
50
+ phrsUsd = parseFloat(quote.amountOut);
51
+ }
52
+ }
53
+ catch {
54
+ // Price unavailable, leave at 0
55
+ }
56
+ const phrsValueUsd = parseFloat(phrsBalance) * phrsUsd;
57
+ const usdcValueUsd = parseFloat(usdcBalance); // 1:1 stablecoin
58
+ const usdtValueUsd = parseFloat(usdtBalance); // 1:1 stablecoin
59
+ const totalUsd = (phrsValueUsd + usdcValueUsd + usdtValueUsd).toFixed(4);
60
+ return {
61
+ walletAddress: input.walletAddress,
62
+ balances: {
63
+ PHRS: { balance: phrsBalance, valueUsd: phrsValueUsd.toFixed(4) },
64
+ USDC: { balance: usdcBalance, valueUsd: usdcValueUsd.toFixed(4) },
65
+ USDT: { balance: usdtBalance, valueUsd: usdtValueUsd.toFixed(4) },
66
+ },
67
+ totalUsd,
68
+ phrsPrice: phrsUsd > 0 ? phrsUsd.toFixed(4) : "unavailable",
69
+ };
70
+ }
71
+ //# sourceMappingURL=getWalletBalance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getWalletBalance.js","sourceRoot":"","sources":["../../src/tools/getWalletBalance.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,mEAAmE;AACnE,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAEhD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CAC3E,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,iHAAiH;IACnH,WAAW,EAAE,sBAAsB;CACpC,CAAC;AAEF,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAA0B;IACrE,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,aAA8B,CAAC;IAElD,uCAAuC;IACvC,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzE,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1C,YAAY,CAAC,YAAY,CAAC;YACxB,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,IAAI,CAAC;SACb,CAAoB;QACrB,YAAY,CAAC,YAAY,CAAC;YACxB,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,IAAI,CAAC;SACb,CAAoB;KACtB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAEnD,8CAA8C;IAC9C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YAC/B,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,GAAG;YAChB,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IACvD,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB;IAC/D,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB;IAC/D,MAAM,QAAQ,GAAG,CAAC,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzE,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,QAAQ,EAAE;YACR,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACjE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACjE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAClE;QACD,QAAQ;QACR,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ export declare const publishRiskScoreSchema: z.ZodObject<{
3
+ action: z.ZodEnum<["swap", "transfer"]>;
4
+ tokenIn: z.ZodOptional<z.ZodString>;
5
+ tokenOut: z.ZodOptional<z.ZodString>;
6
+ amount: z.ZodString;
7
+ toAddress: z.ZodOptional<z.ZodString>;
8
+ walletAddress: z.ZodString;
9
+ privateKey: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ amount: string;
12
+ privateKey: string;
13
+ action: "transfer" | "swap";
14
+ walletAddress: string;
15
+ tokenIn?: string | undefined;
16
+ tokenOut?: string | undefined;
17
+ toAddress?: string | undefined;
18
+ }, {
19
+ amount: string;
20
+ privateKey: string;
21
+ action: "transfer" | "swap";
22
+ walletAddress: string;
23
+ tokenIn?: string | undefined;
24
+ tokenOut?: string | undefined;
25
+ toAddress?: string | undefined;
26
+ }>;
27
+ export type PublishRiskScoreInput = z.input<typeof publishRiskScoreSchema>;
28
+ export declare const publishRiskScoreTool: {
29
+ name: string;
30
+ description: string;
31
+ inputSchema: z.ZodObject<{
32
+ action: z.ZodEnum<["swap", "transfer"]>;
33
+ tokenIn: z.ZodOptional<z.ZodString>;
34
+ tokenOut: z.ZodOptional<z.ZodString>;
35
+ amount: z.ZodString;
36
+ toAddress: z.ZodOptional<z.ZodString>;
37
+ walletAddress: z.ZodString;
38
+ privateKey: z.ZodString;
39
+ }, "strip", z.ZodTypeAny, {
40
+ amount: string;
41
+ privateKey: string;
42
+ action: "transfer" | "swap";
43
+ walletAddress: string;
44
+ tokenIn?: string | undefined;
45
+ tokenOut?: string | undefined;
46
+ toAddress?: string | undefined;
47
+ }, {
48
+ amount: string;
49
+ privateKey: string;
50
+ action: "transfer" | "swap";
51
+ walletAddress: string;
52
+ tokenIn?: string | undefined;
53
+ tokenOut?: string | undefined;
54
+ toAddress?: string | undefined;
55
+ }>;
56
+ };
57
+ export declare function handlePublishRiskScore(raw: PublishRiskScoreInput): Promise<{
58
+ success: boolean;
59
+ assessment: import("../lib/riskEngine.js").RiskAssessment;
60
+ onChain: {
61
+ txHash: `0x${string}`;
62
+ explorerUrl: string;
63
+ contractAddress: "0x71fc28ed3a31016b42f18764889cd911f22b67b8";
64
+ gasUsed: string;
65
+ blockNumber: string;
66
+ };
67
+ error?: undefined;
68
+ } | {
69
+ success: boolean;
70
+ assessment: import("../lib/riskEngine.js").RiskAssessment;
71
+ onChain: null;
72
+ error: string;
73
+ }>;
74
+ //# sourceMappingURL=publishRiskScore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishRiskScore.d.ts","sourceRoot":"","sources":["../../src/tools/publishRiskScore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;EAQjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMhC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB;;;;;;;;;;;;;;;;GAkDtE"}
@@ -0,0 +1,70 @@
1
+ // ─── Tool: publish_risk_score ──────────────────────────────────────────
2
+ // Publishes a risk assessment result to the on-chain RiskRegistry.
3
+ // ────────────────────────────────────────────────────────────────────────
4
+ import { z } from "zod";
5
+ import { publicClient, createPharosWalletClient, getExplorerUrl } from "../lib/pharosClient.js";
6
+ import { RISK_REGISTRY_ADDRESS, RISK_REGISTRY_ABI } from "../lib/constants.js";
7
+ import { assessRisk } from "../lib/riskEngine.js";
8
+ export const publishRiskScoreSchema = z.object({
9
+ action: z.enum(["swap", "transfer"]).describe("Type of on-chain action to assess"),
10
+ tokenIn: z.string().optional(),
11
+ tokenOut: z.string().optional(),
12
+ amount: z.string().describe("Human-readable amount"),
13
+ toAddress: z.string().optional().describe("Recipient address (for transfers)"),
14
+ walletAddress: z.string().describe("Wallet being assessed"),
15
+ privateKey: z.string().describe("Private key to sign the publish transaction"),
16
+ });
17
+ export const publishRiskScoreTool = {
18
+ name: "publish_risk_score",
19
+ description: "Run a risk assessment and publish the result to the on-chain RiskRegistry. " +
20
+ "Other agents can then query this wallet's risk score without re-running the assessment.",
21
+ inputSchema: publishRiskScoreSchema,
22
+ };
23
+ export async function handlePublishRiskScore(raw) {
24
+ const input = publishRiskScoreSchema.parse(raw);
25
+ // 1. Run risk assessment
26
+ const assessment = await assessRisk({
27
+ action: input.action,
28
+ tokenIn: input.tokenIn,
29
+ tokenOut: input.tokenOut,
30
+ amount: input.amount,
31
+ toAddress: input.toAddress,
32
+ walletAddress: input.walletAddress,
33
+ });
34
+ // 2. Publish to on-chain registry
35
+ try {
36
+ const wallet = createPharosWalletClient(input.privateKey);
37
+ const txHash = await wallet.writeContract({
38
+ address: RISK_REGISTRY_ADDRESS,
39
+ abi: RISK_REGISTRY_ABI,
40
+ functionName: "publish",
41
+ args: [
42
+ input.walletAddress,
43
+ BigInt(assessment.riskScore),
44
+ assessment.riskLevel,
45
+ assessment.recommendation,
46
+ ],
47
+ });
48
+ const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
49
+ return {
50
+ success: true,
51
+ assessment,
52
+ onChain: {
53
+ txHash,
54
+ explorerUrl: getExplorerUrl(txHash),
55
+ contractAddress: RISK_REGISTRY_ADDRESS,
56
+ gasUsed: receipt.gasUsed.toString(),
57
+ blockNumber: receipt.blockNumber.toString(),
58
+ },
59
+ };
60
+ }
61
+ catch (err) {
62
+ return {
63
+ success: false,
64
+ assessment,
65
+ onChain: null,
66
+ error: `Failed to publish to registry: ${err.message}`,
67
+ };
68
+ }
69
+ }
70
+ //# sourceMappingURL=publishRiskScore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishRiskScore.js","sourceRoot":"","sources":["../../src/tools/publishRiskScore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ export declare const queryRiskRegistrySchema: z.ZodObject<{
3
+ walletAddress: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ walletAddress: string;
6
+ }, {
7
+ walletAddress: string;
8
+ }>;
9
+ export type QueryRiskRegistryInput = z.input<typeof queryRiskRegistrySchema>;
10
+ export declare const queryRiskRegistryTool: {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: z.ZodObject<{
14
+ walletAddress: z.ZodString;
15
+ }, "strip", z.ZodTypeAny, {
16
+ walletAddress: string;
17
+ }, {
18
+ walletAddress: string;
19
+ }>;
20
+ };
21
+ export declare function handleQueryRiskRegistry(raw: QueryRiskRegistryInput): Promise<{
22
+ walletAddress: string;
23
+ found: boolean;
24
+ record: null;
25
+ registryContract: "0x71fc28ed3a31016b42f18764889cd911f22b67b8";
26
+ message: string;
27
+ error?: undefined;
28
+ } | {
29
+ walletAddress: string;
30
+ found: boolean;
31
+ record: {
32
+ score: number;
33
+ riskLevel: string;
34
+ recommendation: string;
35
+ timestamp: string;
36
+ assessedBy: `0x${string}`;
37
+ };
38
+ registryContract: "0x71fc28ed3a31016b42f18764889cd911f22b67b8";
39
+ message?: undefined;
40
+ error?: undefined;
41
+ } | {
42
+ walletAddress: string;
43
+ found: boolean;
44
+ record: null;
45
+ registryContract: "0x71fc28ed3a31016b42f18764889cd911f22b67b8";
46
+ error: string;
47
+ message?: undefined;
48
+ }>;
49
+ //# sourceMappingURL=queryRiskRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryRiskRegistry.d.ts","sourceRoot":"","sources":["../../src/tools/queryRiskRegistry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,uBAAuB;;;;;;EAElC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE7E,eAAO,MAAM,qBAAqB;;;;;;;;;;CAMjC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDxE"}
@@ -0,0 +1,61 @@
1
+ // ─── Tool: query_risk_registry ─────────────────────────────────────────
2
+ // Queries the on-chain RiskRegistry for a wallet's published risk score.
3
+ // Read-only — no private key needed.
4
+ // ────────────────────────────────────────────────────────────────────────
5
+ import { z } from "zod";
6
+ import { publicClient } from "../lib/pharosClient.js";
7
+ import { RISK_REGISTRY_ADDRESS, RISK_REGISTRY_ABI } from "../lib/constants.js";
8
+ export const queryRiskRegistrySchema = z.object({
9
+ walletAddress: z.string().describe("Wallet address to query risk score for"),
10
+ });
11
+ export const queryRiskRegistryTool = {
12
+ name: "query_risk_registry",
13
+ description: "Query the on-chain RiskRegistry for a wallet's published risk score. " +
14
+ "Read-only, no private key needed. Returns score, level, recommendation, timestamp, and assessor.",
15
+ inputSchema: queryRiskRegistrySchema,
16
+ };
17
+ export async function handleQueryRiskRegistry(raw) {
18
+ const input = queryRiskRegistrySchema.parse(raw);
19
+ try {
20
+ const result = (await publicClient.readContract({
21
+ address: RISK_REGISTRY_ADDRESS,
22
+ abi: RISK_REGISTRY_ABI,
23
+ functionName: "query",
24
+ args: [input.walletAddress],
25
+ }));
26
+ const score = Number(result.score);
27
+ const timestamp = Number(result.timestamp);
28
+ // Check if record exists (timestamp will be 0 if never published)
29
+ if (timestamp === 0) {
30
+ return {
31
+ walletAddress: input.walletAddress,
32
+ found: false,
33
+ record: null,
34
+ registryContract: RISK_REGISTRY_ADDRESS,
35
+ message: "No risk score published for this wallet",
36
+ };
37
+ }
38
+ return {
39
+ walletAddress: input.walletAddress,
40
+ found: true,
41
+ record: {
42
+ score,
43
+ riskLevel: result.riskLevel,
44
+ recommendation: result.recommendation,
45
+ timestamp: new Date(timestamp * 1000).toISOString(),
46
+ assessedBy: result.assessedBy,
47
+ },
48
+ registryContract: RISK_REGISTRY_ADDRESS,
49
+ };
50
+ }
51
+ catch (err) {
52
+ return {
53
+ walletAddress: input.walletAddress,
54
+ found: false,
55
+ record: null,
56
+ registryContract: RISK_REGISTRY_ADDRESS,
57
+ error: `Failed to query registry: ${err.message}`,
58
+ };
59
+ }
60
+ }
61
+ //# sourceMappingURL=queryRiskRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryRiskRegistry.js","sourceRoot":"","sources":["../../src/tools/queryRiskRegistry.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,qCAAqC;AACrC,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CAC7E,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,uEAAuE;QACvE,kGAAkG;IACpG,WAAW,EAAE,uBAAuB;CACrC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAA2B;IACvE,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;YAC9C,OAAO,EAAE,qBAAqB;YAC9B,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,OAAO;YACrB,IAAI,EAAE,CAAC,KAAK,CAAC,aAA8B,CAAC;SAC7C,CAAC,CAMD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3C,kEAAkE;QAClE,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO;gBACL,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI;gBACZ,gBAAgB,EAAE,qBAAqB;gBACvC,OAAO,EAAE,yCAAyC;aACnD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,IAAI;YACX,MAAM,EAAE;gBACN,KAAK;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gBACnD,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;YACD,gBAAgB,EAAE,qBAAqB;SACxC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI;YACZ,gBAAgB,EAAE,qBAAqB;YACvC,KAAK,EAAE,6BAA8B,GAAa,CAAC,OAAO,EAAE;SAC7D,CAAC;IACJ,CAAC;AACH,CAAC"}