safehands-pharos 1.2.0 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +26 -0
- package/README.md +311 -350
- package/contracts/RiskRegistry.json +75 -1
- package/contracts/RiskRegistry.sol +29 -1
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +172 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.js +181 -169
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +66 -0
- package/dist/init.js.map +1 -0
- package/dist/lib/constants.d.ts +122 -7
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +139 -13
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +14 -0
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +78 -22
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/http.d.ts +15 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +119 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/pharosClient.d.ts +4 -3
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +8 -5
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +54 -0
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -0
- package/dist/lib/policy/actionPolicyEngine.js +213 -0
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -0
- package/dist/lib/signer/index.d.ts +25 -0
- package/dist/lib/signer/index.d.ts.map +1 -0
- package/dist/lib/signer/index.js +90 -0
- package/dist/lib/signer/index.js.map +1 -0
- package/dist/lib/testDodoLive.d.ts +2 -0
- package/dist/lib/testDodoLive.d.ts.map +1 -0
- package/dist/lib/testDodoLive.js +105 -0
- package/dist/lib/testDodoLive.js.map +1 -0
- package/dist/lib/testLiveSafehands.d.ts +2 -0
- package/dist/lib/testLiveSafehands.d.ts.map +1 -0
- package/dist/lib/testLiveSafehands.js +93 -0
- package/dist/lib/testLiveSafehands.js.map +1 -0
- package/dist/lib/testRpcLive.d.ts +2 -0
- package/dist/lib/testRpcLive.d.ts.map +1 -0
- package/dist/lib/testRpcLive.js +89 -0
- package/dist/lib/testRpcLive.js.map +1 -0
- package/dist/lib/testTools.js +363 -354
- package/dist/lib/testTools.js.map +1 -1
- package/dist/lib/testX402Live.d.ts +2 -0
- package/dist/lib/testX402Live.d.ts.map +1 -0
- package/dist/lib/testX402Live.js +160 -0
- package/dist/lib/testX402Live.js.map +1 -0
- package/dist/lib/toolResponse.d.ts +26 -0
- package/dist/lib/toolResponse.d.ts.map +1 -0
- package/dist/lib/toolResponse.js +54 -0
- package/dist/lib/toolResponse.js.map +1 -0
- package/dist/lib/wallet/index.d.ts +19 -0
- package/dist/lib/wallet/index.d.ts.map +1 -0
- package/dist/lib/wallet/index.js +71 -0
- package/dist/lib/wallet/index.js.map +1 -0
- package/dist/tools/approveToken.d.ts +19 -20
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +44 -21
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +22 -9
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +32 -9
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +6 -6
- package/dist/tools/checkTokenSecurity.d.ts +9 -16
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +17 -22
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +27 -0
- package/dist/tools/createAgentWallet.d.ts.map +1 -0
- package/dist/tools/createAgentWallet.js +60 -0
- package/dist/tools/createAgentWallet.js.map +1 -0
- package/dist/tools/estimateGas.d.ts +31 -21
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +91 -95
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +13 -29
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +68 -46
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +30 -0
- package/dist/tools/explainRisk.d.ts.map +1 -0
- package/dist/tools/explainRisk.js +33 -0
- package/dist/tools/explainRisk.js.map +1 -0
- package/dist/tools/getAgentWallet.d.ts +22 -0
- package/dist/tools/getAgentWallet.d.ts.map +1 -0
- package/dist/tools/getAgentWallet.js +28 -0
- package/dist/tools/getAgentWallet.js.map +1 -0
- package/dist/tools/getAgentWalletBalance.d.ts +12 -0
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -0
- package/dist/tools/getAgentWalletBalance.js +71 -0
- package/dist/tools/getAgentWalletBalance.js.map +1 -0
- package/dist/tools/getExecutionHistory.d.ts +4 -4
- package/dist/tools/getGasPrice.d.ts +26 -8
- package/dist/tools/getGasPrice.d.ts.map +1 -1
- package/dist/tools/getGasPrice.js +43 -35
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +47 -59
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +96 -57
- package/dist/tools/getPoolInfo.js.map +1 -1
- package/dist/tools/getTokenPrice.d.ts +95 -9
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +95 -56
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getWalletBalance.d.ts +40 -11
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +64 -47
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +12 -10
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +33 -19
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryRiskRegistry.d.ts +3 -3
- package/dist/tools/safehandsPreflightCheck.d.ts +78 -0
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -0
- package/dist/tools/safehandsPreflightCheck.js +48 -0
- package/dist/tools/safehandsPreflightCheck.js.map +1 -0
- package/dist/tools/safehandsRiskReport.d.ts +82 -0
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -0
- package/dist/tools/safehandsRiskReport.js +29 -0
- package/dist/tools/safehandsRiskReport.js.map +1 -0
- package/dist/tools/safehandsSafeExecute.d.ts +21 -0
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -0
- package/dist/tools/safehandsSafeExecute.js +76 -0
- package/dist/tools/safehandsSafeExecute.js.map +1 -0
- package/dist/tools/safehandsWalletHealth.d.ts +15 -0
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -0
- package/dist/tools/safehandsWalletHealth.js +104 -0
- package/dist/tools/safehandsWalletHealth.js.map +1 -0
- package/dist/tools/safehandsX402Preflight.d.ts +27 -0
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -0
- package/dist/tools/safehandsX402Preflight.js +66 -0
- package/dist/tools/safehandsX402Preflight.js.map +1 -0
- package/dist/tools/sendPayment.d.ts +13 -35
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +53 -47
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/simulateTransaction.d.ts +4 -4
- package/dist/tools/tokenRegistryStatus.d.ts +27 -0
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -0
- package/dist/tools/tokenRegistryStatus.js +97 -0
- package/dist/tools/tokenRegistryStatus.js.map +1 -0
- package/dist/tools/x402PayAndFetch.d.ts +40 -16
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +115 -47
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/x402Server.js +149 -115
- package/dist/x402Server.js.map +1 -1
- package/examples/pharos-skill-engine/SKILL.safehands.md +85 -0
- package/examples/pharos-skill-engine/assets/safehands/example-actions.json +49 -0
- package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +11 -0
- package/examples/pharos-skill-engine/references/safehands.md +345 -0
- package/examples/scenario-hack.ts +38 -0
- package/package.json +19 -5
- package/skill/SKILL.md +127 -0
- package/skill/assets/safehands/example-actions.json +49 -0
- package/skill/assets/safehands/policy-defaults.json +11 -0
- package/skill/references/safehands.md +345 -0
- package/.agents/skill/safehands/SKILL.md +0 -200
- package/.agents/skill/safehands/assets/networks.json +0 -24
- package/.agents/skill/safehands/assets/tokens.json +0 -60
|
@@ -1,49 +1,74 @@
|
|
|
1
1
|
// ─── Tool: get_pool_info ───────────────────────────────────────────────
|
|
2
|
-
// Fetches DODO liquidity
|
|
2
|
+
// Fetches DODO/FaroSwap route-derived liquidity info for a token pair on
|
|
3
|
+
// Pharos Atlantic Testnet. API key is optional: public mode is tried first
|
|
4
|
+
// when DODO_API_KEY is not configured.
|
|
3
5
|
// ────────────────────────────────────────────────────────────────────────
|
|
4
6
|
import { z } from "zod";
|
|
5
7
|
import { resolveTokenAddress } from "../lib/dodoApi.js";
|
|
6
|
-
import { DODO_API_BASE, DODO_API_KEY, CHAIN_ID } from "../lib/constants.js";
|
|
8
|
+
import { DODO_API_BASE, DODO_API_KEY, CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
|
|
9
|
+
import { fetchWithTimeoutAndRetry } from "../lib/http.js";
|
|
10
|
+
import { classifyExternalError, fail, ok } from "../lib/toolResponse.js";
|
|
7
11
|
export const getPoolInfoSchema = z.object({
|
|
8
12
|
tokenA: z.enum(["PHRS", "USDC", "USDT"]).describe("First token in the pair"),
|
|
9
13
|
tokenB: z.enum(["PHRS", "USDC", "USDT"]).describe("Second token in the pair"),
|
|
10
14
|
});
|
|
11
15
|
export const getPoolInfoTool = {
|
|
12
16
|
name: "get_pool_info",
|
|
13
|
-
description: "Fetch DODO liquidity
|
|
17
|
+
description: "Fetch DODO/FaroSwap route-derived liquidity info for a token pair on Pharos testnet. API key is optional; public mode is attempted first.",
|
|
14
18
|
inputSchema: getPoolInfoSchema,
|
|
15
19
|
};
|
|
20
|
+
function addOptionalApiKey(url) {
|
|
21
|
+
const key = DODO_API_KEY?.trim();
|
|
22
|
+
if (!key)
|
|
23
|
+
return false;
|
|
24
|
+
url.searchParams.set("apikey", key);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
function isAuthErrorStatus(status) {
|
|
28
|
+
return status === 401 || status === 403;
|
|
29
|
+
}
|
|
16
30
|
export async function handleGetPoolInfo(raw) {
|
|
17
31
|
const input = getPoolInfoSchema.parse(raw);
|
|
18
32
|
if (input.tokenA === input.tokenB) {
|
|
19
|
-
return
|
|
20
|
-
pair: `${input.tokenA}/${input.tokenB}`,
|
|
21
|
-
error: "Cannot query pool for identical tokens",
|
|
22
|
-
};
|
|
33
|
+
return fail("INVALID_PAIR", "Cannot query pool for identical tokens.", false, "get_pool_info");
|
|
23
34
|
}
|
|
24
|
-
const addrA = resolveTokenAddress(input.tokenA);
|
|
25
|
-
const addrB = resolveTokenAddress(input.tokenB);
|
|
26
|
-
// Try DODO pair list endpoint
|
|
27
|
-
const pairUrl = `${DODO_API_BASE}/route-service/v2/widget/getdodoroute` +
|
|
28
|
-
`?chainId=${CHAIN_ID}` +
|
|
29
|
-
`&fromTokenAddress=${addrA}` +
|
|
30
|
-
`&toTokenAddress=${addrB}` +
|
|
31
|
-
`&fromAmount=1000000000000000000` + // 1 token in wei (18 decimals)
|
|
32
|
-
`&userAddr=0x0000000000000000000000000000000000000001` +
|
|
33
|
-
`&slippage=3` +
|
|
34
|
-
`&source=dodoV2AndMixWasm` +
|
|
35
|
-
`&estimateGas=true` +
|
|
36
|
-
`&apikey=${DODO_API_KEY}`;
|
|
37
35
|
try {
|
|
38
|
-
const
|
|
36
|
+
const addrA = resolveTokenAddress(input.tokenA);
|
|
37
|
+
const addrB = resolveTokenAddress(input.tokenB);
|
|
38
|
+
const routeUrl = new URL(`${DODO_API_BASE}/route-service/v2/widget/getdodoroute`);
|
|
39
|
+
routeUrl.searchParams.set("chainId", String(CHAIN_ID));
|
|
40
|
+
routeUrl.searchParams.set("fromTokenAddress", addrA);
|
|
41
|
+
routeUrl.searchParams.set("toTokenAddress", addrB);
|
|
42
|
+
routeUrl.searchParams.set("fromAmount", "1000000000000000000");
|
|
43
|
+
routeUrl.searchParams.set("userAddr", "0x0000000000000000000000000000000000000001");
|
|
44
|
+
routeUrl.searchParams.set("slippage", "3");
|
|
45
|
+
routeUrl.searchParams.set("source", "dodoV2AndMixWasm");
|
|
46
|
+
routeUrl.searchParams.set("estimateGas", "true");
|
|
47
|
+
const routeUsedApiKey = addOptionalApiKey(routeUrl);
|
|
48
|
+
const routeResponse = await fetchWithTimeoutAndRetry(routeUrl, { timeoutMs: 10_000, retries: 2, retryDelayMs: 300 });
|
|
49
|
+
if (isAuthErrorStatus(routeResponse.status)) {
|
|
50
|
+
return fail("DODO_API_AUTH_REQUIRED", "DODO/FaroSwap route API rejected public mode. Configure DODO_API_KEY only if this endpoint requires authenticated access.", false, "dodo_api");
|
|
51
|
+
}
|
|
52
|
+
if (!routeResponse.ok) {
|
|
53
|
+
return fail("DODO_API_UNAVAILABLE", `DODO route API returned ${routeResponse.status} ${routeResponse.statusText}.`, true, "dodo_api");
|
|
54
|
+
}
|
|
39
55
|
const routeJson = (await routeResponse.json());
|
|
40
56
|
if (!routeJson.data || routeJson.status !== 200) {
|
|
41
|
-
|
|
57
|
+
const msg = (routeJson.message || "").toLowerCase();
|
|
58
|
+
if (msg.includes("api key") || msg.includes("apikey") || msg.includes("unauthorized") || msg.includes("forbidden")) {
|
|
59
|
+
return fail("DODO_API_AUTH_REQUIRED", "DODO/FaroSwap route API rejected public mode. Configure DODO_API_KEY only if this endpoint requires authenticated access.", false, "dodo_api");
|
|
60
|
+
}
|
|
61
|
+
return ok({
|
|
42
62
|
pair: `${input.tokenA}/${input.tokenB}`,
|
|
43
63
|
available: false,
|
|
44
|
-
message: "No active DODO
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
message: "No active DODO/FaroSwap route found for this pair on Pharos testnet.",
|
|
65
|
+
source: "DODO/FaroSwap public route API",
|
|
66
|
+
sourceStatus: "no_route_available",
|
|
67
|
+
publicMode: !routeUsedApiKey,
|
|
68
|
+
chainId: CHAIN_ID,
|
|
69
|
+
environment: PHAROS_ENVIRONMENT,
|
|
70
|
+
isMainnet: false,
|
|
71
|
+
});
|
|
47
72
|
}
|
|
48
73
|
const d = routeJson.data;
|
|
49
74
|
const resAmount = parseFloat(String(d.resAmount || "0"));
|
|
@@ -51,49 +76,63 @@ export async function handleGetPoolInfo(raw) {
|
|
|
51
76
|
const fee = parseFloat(String(d.baseFeeAmount || "0"));
|
|
52
77
|
const pricePerFrom = parseFloat(String(d.resPricePerFromToken || "0"));
|
|
53
78
|
const pricePerTo = parseFloat(String(d.resPricePerToToken || "0"));
|
|
54
|
-
// Also try the pools endpoint for liquidity data
|
|
55
79
|
let liquidityInfo = null;
|
|
80
|
+
let poolListStatus = "unavailable";
|
|
56
81
|
try {
|
|
57
|
-
const poolsUrl = `${DODO_API_BASE}/dodo-pair/list`
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const poolsResp = await
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
const poolsUrl = new URL(`${DODO_API_BASE}/dodo-pair/list`);
|
|
83
|
+
poolsUrl.searchParams.set("chainId", String(CHAIN_ID));
|
|
84
|
+
poolsUrl.searchParams.set("baseToken", addrA);
|
|
85
|
+
poolsUrl.searchParams.set("quoteToken", addrB);
|
|
86
|
+
addOptionalApiKey(poolsUrl);
|
|
87
|
+
const poolsResp = await fetchWithTimeoutAndRetry(poolsUrl, { timeoutMs: 10_000, retries: 1, retryDelayMs: 300 });
|
|
88
|
+
if (poolsResp.ok) {
|
|
89
|
+
const poolsJson = (await poolsResp.json());
|
|
90
|
+
if (poolsJson.data?.list && poolsJson.data.list.length > 0) {
|
|
91
|
+
const pool = poolsJson.data.list[0];
|
|
92
|
+
liquidityInfo = {
|
|
93
|
+
baseLiquidity: pool.baseLiquidity || "unknown",
|
|
94
|
+
quoteLiquidity: pool.quoteLiquidity || "unknown",
|
|
95
|
+
poolType: pool.type || "unknown",
|
|
96
|
+
};
|
|
97
|
+
poolListStatus = "ok";
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
poolListStatus = "empty";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if (isAuthErrorStatus(poolsResp.status)) {
|
|
104
|
+
poolListStatus = "auth_required";
|
|
71
105
|
}
|
|
72
106
|
}
|
|
73
107
|
catch {
|
|
74
|
-
|
|
108
|
+
poolListStatus = "unavailable";
|
|
75
109
|
}
|
|
76
|
-
return {
|
|
110
|
+
return ok({
|
|
77
111
|
pair: `${input.tokenA}/${input.tokenB}`,
|
|
78
112
|
available: true,
|
|
79
|
-
priceRatio: resAmount > 0 ?
|
|
80
|
-
priceImpact:
|
|
81
|
-
pricePerFromToken: pricePerFrom > 0 ? pricePerFrom.toFixed(6) :
|
|
82
|
-
pricePerToToken: pricePerTo > 0 ? pricePerTo.toFixed(6) :
|
|
83
|
-
fee: fee > 0 ? fee.toString() : "
|
|
84
|
-
liquidity: liquidityInfo
|
|
85
|
-
|
|
113
|
+
priceRatio: resAmount > 0 ? { value: resAmount.toString(), unit: input.tokenB, per: `1 ${input.tokenA}` } : null,
|
|
114
|
+
priceImpact: { value: priceImpact.toFixed(4), unit: "percent" },
|
|
115
|
+
pricePerFromToken: pricePerFrom > 0 ? { value: pricePerFrom.toFixed(6), unit: input.tokenB } : null,
|
|
116
|
+
pricePerToToken: pricePerTo > 0 ? { value: pricePerTo.toFixed(6), unit: input.tokenA } : null,
|
|
117
|
+
fee: fee > 0 ? { value: fee.toString(), unit: "raw" } : null,
|
|
118
|
+
liquidity: liquidityInfo,
|
|
119
|
+
poolListStatus,
|
|
120
|
+
source: "DODO/FaroSwap public route API",
|
|
121
|
+
sourceStatus: "ok",
|
|
122
|
+
publicMode: !routeUsedApiKey,
|
|
123
|
+
routeAvailable: true,
|
|
124
|
+
confidence: liquidityInfo ? "medium" : "low",
|
|
86
125
|
chainId: CHAIN_ID,
|
|
87
|
-
|
|
88
|
-
|
|
126
|
+
environment: PHAROS_ENVIRONMENT,
|
|
127
|
+
isMainnet: false,
|
|
128
|
+
});
|
|
89
129
|
}
|
|
90
130
|
catch (err) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
};
|
|
131
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
132
|
+
if (message.includes("INVALID_TOKEN_ADDRESS")) {
|
|
133
|
+
return fail("INVALID_TOKEN_ADDRESS", message, false, "get_pool_info");
|
|
134
|
+
}
|
|
135
|
+
return classifyExternalError("dodo_api", err);
|
|
97
136
|
}
|
|
98
137
|
}
|
|
99
138
|
//# sourceMappingURL=getPoolInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPoolInfo.js","sourceRoot":"","sources":["../../src/tools/getPoolInfo.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E
|
|
1
|
+
{"version":3,"file":"getPoolInfo.js","sourceRoot":"","sources":["../../src/tools/getPoolInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { z } from "zod";
|
|
|
2
2
|
export declare const getTokenPriceSchema: z.ZodObject<{
|
|
3
3
|
token: z.ZodEnum<["PHRS", "USDC", "USDT"]>;
|
|
4
4
|
}, "strip", z.ZodTypeAny, {
|
|
5
|
-
token: "PHRS" | "
|
|
5
|
+
token: "PHRS" | "USDC" | "USDT";
|
|
6
6
|
}, {
|
|
7
|
-
token: "PHRS" | "
|
|
7
|
+
token: "PHRS" | "USDC" | "USDT";
|
|
8
8
|
}>;
|
|
9
9
|
export type GetTokenPriceInput = z.input<typeof getTokenPriceSchema>;
|
|
10
10
|
export declare const getTokenPriceTool: {
|
|
@@ -13,16 +13,102 @@ export declare const getTokenPriceTool: {
|
|
|
13
13
|
inputSchema: z.ZodObject<{
|
|
14
14
|
token: z.ZodEnum<["PHRS", "USDC", "USDT"]>;
|
|
15
15
|
}, "strip", z.ZodTypeAny, {
|
|
16
|
-
token: "PHRS" | "
|
|
16
|
+
token: "PHRS" | "USDC" | "USDT";
|
|
17
17
|
}, {
|
|
18
|
-
token: "PHRS" | "
|
|
18
|
+
token: "PHRS" | "USDC" | "USDT";
|
|
19
19
|
}>;
|
|
20
20
|
};
|
|
21
|
-
export declare function handleGetTokenPrice(raw: GetTokenPriceInput): Promise<{
|
|
21
|
+
export declare function handleGetTokenPrice(raw: GetTokenPriceInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
|
|
22
22
|
token: string;
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
tokenRegistry: {
|
|
24
|
+
readonly symbol: "USDC";
|
|
25
|
+
readonly address: "0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8";
|
|
26
|
+
readonly decimals: 6;
|
|
27
|
+
readonly chainId: number;
|
|
28
|
+
readonly environment: string;
|
|
29
|
+
readonly isMainnet: false;
|
|
30
|
+
readonly isCanonical: true;
|
|
31
|
+
readonly isTestToken: true;
|
|
32
|
+
readonly purpose: "Pharos Skill Engine USDC — the USDC listed in the official pharos-skill-engine-0.1.0 assets/tokens.json for atlantic-testnet";
|
|
33
|
+
readonly docsSource: "pharos-skill-engine-0.1.0/assets/tokens.json";
|
|
34
|
+
readonly verificationStatus: "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE";
|
|
35
|
+
};
|
|
36
|
+
priceUsd: {
|
|
37
|
+
value: string;
|
|
38
|
+
unit: string;
|
|
39
|
+
};
|
|
40
|
+
priceInPHRS: {
|
|
41
|
+
value: string | null;
|
|
42
|
+
unit: string;
|
|
43
|
+
};
|
|
25
44
|
source: string;
|
|
26
|
-
|
|
27
|
-
|
|
45
|
+
sourceStatus: "ok" | "unavailable" | "no_route_available" | "auth_required";
|
|
46
|
+
routeAvailable: boolean;
|
|
47
|
+
publicMode: boolean;
|
|
48
|
+
confidence: string;
|
|
49
|
+
chainId: number;
|
|
50
|
+
environment: string;
|
|
51
|
+
isMainnet: boolean;
|
|
52
|
+
}> | import("../lib/toolResponse.js").ToolSuccess<{
|
|
53
|
+
token: string;
|
|
54
|
+
tokenRegistry: {
|
|
55
|
+
readonly symbol: "USDT";
|
|
56
|
+
readonly address: "0xE7E84B8B4f39C507499c40B4ac199B050e2882d5";
|
|
57
|
+
readonly decimals: 6;
|
|
58
|
+
readonly chainId: number;
|
|
59
|
+
readonly environment: string;
|
|
60
|
+
readonly isMainnet: false;
|
|
61
|
+
readonly isCanonical: true;
|
|
62
|
+
readonly isTestToken: true;
|
|
63
|
+
readonly purpose: "canonical Pharos Atlantic Testnet USDT (Tether USD)";
|
|
64
|
+
readonly docsSource: "https://docs.pharos.xyz/getting-started/token-registry";
|
|
65
|
+
readonly verificationStatus: "DOCS_VERIFIED";
|
|
66
|
+
};
|
|
67
|
+
priceUsd: {
|
|
68
|
+
value: string;
|
|
69
|
+
unit: string;
|
|
70
|
+
};
|
|
71
|
+
priceInPHRS: {
|
|
72
|
+
value: string | null;
|
|
73
|
+
unit: string;
|
|
74
|
+
};
|
|
75
|
+
source: string;
|
|
76
|
+
sourceStatus: string;
|
|
77
|
+
routeAvailable: boolean;
|
|
78
|
+
publicMode: boolean;
|
|
79
|
+
confidence: string;
|
|
80
|
+
chainId: number;
|
|
81
|
+
environment: string;
|
|
82
|
+
isMainnet: boolean;
|
|
83
|
+
}> | import("../lib/toolResponse.js").ToolSuccess<{
|
|
84
|
+
token: string;
|
|
85
|
+
tokenRegistry: {
|
|
86
|
+
readonly symbol: "PHRS";
|
|
87
|
+
readonly address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
|
|
88
|
+
readonly decimals: 18;
|
|
89
|
+
readonly chainId: number;
|
|
90
|
+
readonly environment: string;
|
|
91
|
+
readonly isMainnet: false;
|
|
92
|
+
readonly isCanonical: true;
|
|
93
|
+
readonly isTestToken: true;
|
|
94
|
+
readonly purpose: "native PHRS sentinel address for DODO route API";
|
|
95
|
+
readonly docsSource: "https://docs.pharos.xyz/";
|
|
96
|
+
};
|
|
97
|
+
priceUsd: {
|
|
98
|
+
value: string;
|
|
99
|
+
unit: string;
|
|
100
|
+
};
|
|
101
|
+
priceInPHRS: {
|
|
102
|
+
value: string;
|
|
103
|
+
unit: string;
|
|
104
|
+
};
|
|
105
|
+
source: string;
|
|
106
|
+
sourceStatus: "ok" | "unavailable" | "no_route_available" | "auth_required";
|
|
107
|
+
routeAvailable: boolean;
|
|
108
|
+
publicMode: boolean;
|
|
109
|
+
confidence: string;
|
|
110
|
+
chainId: number;
|
|
111
|
+
environment: string;
|
|
112
|
+
isMainnet: boolean;
|
|
113
|
+
}>>;
|
|
28
114
|
//# sourceMappingURL=getTokenPrice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTokenPrice.d.ts","sourceRoot":"","sources":["../../src/tools/getTokenPrice.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getTokenPrice.d.ts","sourceRoot":"","sources":["../../src/tools/getTokenPrice.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,eAAO,MAAM,iBAAiB;;;;;;;;;;CAK7B,CAAC;AAKF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+GhE"}
|
|
@@ -1,79 +1,118 @@
|
|
|
1
1
|
// ─── Tool: get_token_price ─────────────────────────────────────────────
|
|
2
|
-
// Fetches
|
|
3
|
-
// a known stablecoin pair.
|
|
2
|
+
// Fetches testnet token price from DODO/FaroSwap route quotes.
|
|
4
3
|
// ────────────────────────────────────────────────────────────────────────
|
|
5
4
|
import { z } from "zod";
|
|
6
5
|
import { getDodoRoute } from "../lib/dodoApi.js";
|
|
6
|
+
import { CHAIN_ID, PHAROS_ENVIRONMENT, TOKEN_REGISTRY } from "../lib/constants.js";
|
|
7
|
+
import { classifyExternalError, fail, ok } from "../lib/toolResponse.js";
|
|
7
8
|
export const getTokenPriceSchema = z.object({
|
|
8
9
|
token: z.enum(["PHRS", "USDC", "USDT"]).describe("Token to get price for"),
|
|
9
10
|
});
|
|
10
11
|
export const getTokenPriceTool = {
|
|
11
12
|
name: "get_token_price",
|
|
12
|
-
description: "Fetch real-time price of PHRS, USDC, or USDT on Pharos
|
|
13
|
+
description: "Fetch real-time testnet price of PHRS, USDC, or USDT on Pharos using DODO/FaroSwap liquidity quotes.",
|
|
13
14
|
inputSchema: getTokenPriceSchema,
|
|
14
15
|
};
|
|
15
16
|
// Read-only address for price quotes (never signs transactions)
|
|
16
17
|
const QUOTE_WALLET = "0x0000000000000000000000000000000000000001";
|
|
17
18
|
export async function handleGetTokenPrice(raw) {
|
|
18
19
|
const input = getTokenPriceSchema.parse(raw);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
20
|
+
try {
|
|
21
|
+
if (input.token === "USDC") {
|
|
22
|
+
const quote = await getDodoRoute({
|
|
23
|
+
fromToken: "USDC",
|
|
24
|
+
toToken: "PHRS",
|
|
25
|
+
amountHuman: "1",
|
|
26
|
+
walletAddress: QUOTE_WALLET,
|
|
27
|
+
});
|
|
28
|
+
return ok({
|
|
29
|
+
token: "USDC",
|
|
30
|
+
tokenRegistry: TOKEN_REGISTRY.USDC,
|
|
31
|
+
priceUsd: { value: "1.00", unit: "USD" },
|
|
32
|
+
priceInPHRS: {
|
|
33
|
+
value: quote.routeAvailable ? parseFloat(quote.amountOut).toFixed(6) : null,
|
|
34
|
+
unit: "PHRS",
|
|
35
|
+
},
|
|
36
|
+
source: "DODO Route API / FaroSwap liquidity on Pharos testnet",
|
|
37
|
+
sourceStatus: quote.sourceStatus,
|
|
38
|
+
routeAvailable: quote.routeAvailable,
|
|
39
|
+
publicMode: !quote.usedApiKey,
|
|
40
|
+
confidence: quote.routeAvailable ? "medium" : "low",
|
|
41
|
+
chainId: CHAIN_ID,
|
|
42
|
+
environment: PHAROS_ENVIRONMENT,
|
|
43
|
+
isMainnet: false,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (input.token === "USDT") {
|
|
47
|
+
const usdQuote = await getDodoRoute({
|
|
48
|
+
fromToken: "USDT",
|
|
49
|
+
toToken: "USDC",
|
|
50
|
+
amountHuman: "1",
|
|
51
|
+
walletAddress: QUOTE_WALLET,
|
|
52
|
+
});
|
|
53
|
+
const phrsQuote = await getDodoRoute({
|
|
54
|
+
fromToken: "USDT",
|
|
55
|
+
toToken: "PHRS",
|
|
56
|
+
amountHuman: "1",
|
|
57
|
+
walletAddress: QUOTE_WALLET,
|
|
58
|
+
});
|
|
59
|
+
return ok({
|
|
60
|
+
token: "USDT",
|
|
61
|
+
tokenRegistry: TOKEN_REGISTRY.USDT,
|
|
62
|
+
priceUsd: {
|
|
63
|
+
value: usdQuote.routeAvailable ? parseFloat(usdQuote.amountOut).toFixed(4) : "~1.00",
|
|
64
|
+
unit: "USD",
|
|
65
|
+
},
|
|
66
|
+
priceInPHRS: {
|
|
67
|
+
value: phrsQuote.routeAvailable ? parseFloat(phrsQuote.amountOut).toFixed(6) : null,
|
|
68
|
+
unit: "PHRS",
|
|
69
|
+
},
|
|
70
|
+
source: "DODO Route API / FaroSwap liquidity on Pharos testnet",
|
|
71
|
+
sourceStatus: usdQuote.routeAvailable && phrsQuote.routeAvailable ? "ok" : usdQuote.routeAvailable || phrsQuote.routeAvailable ? "partial" : "no_route_available",
|
|
72
|
+
routeAvailable: usdQuote.routeAvailable || phrsQuote.routeAvailable,
|
|
73
|
+
publicMode: !usdQuote.usedApiKey && !phrsQuote.usedApiKey,
|
|
74
|
+
confidence: usdQuote.routeAvailable && phrsQuote.routeAvailable ? "medium" : "low",
|
|
75
|
+
chainId: CHAIN_ID,
|
|
76
|
+
environment: PHAROS_ENVIRONMENT,
|
|
77
|
+
isMainnet: false,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const usdcQuote = await getDodoRoute({
|
|
81
|
+
fromToken: "PHRS",
|
|
41
82
|
toToken: "USDC",
|
|
42
83
|
amountHuman: "1",
|
|
43
84
|
walletAddress: QUOTE_WALLET,
|
|
44
85
|
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
86
|
+
if (!usdcQuote.routeAvailable) {
|
|
87
|
+
return fail("NO_ROUTE_AVAILABLE", "No PHRS -> USDC route is available for price discovery.", true, "dodo_api");
|
|
88
|
+
}
|
|
89
|
+
return ok({
|
|
90
|
+
token: "PHRS",
|
|
91
|
+
tokenRegistry: TOKEN_REGISTRY.PHRS,
|
|
92
|
+
priceUsd: { value: parseFloat(usdcQuote.amountOut).toFixed(4), unit: "USD" },
|
|
93
|
+
priceInPHRS: { value: "1.000000", unit: "PHRS" },
|
|
94
|
+
source: "DODO Route API / FaroSwap liquidity on Pharos testnet",
|
|
95
|
+
sourceStatus: usdcQuote.sourceStatus,
|
|
96
|
+
routeAvailable: true,
|
|
97
|
+
publicMode: !usdcQuote.usedApiKey,
|
|
98
|
+
confidence: "medium",
|
|
99
|
+
chainId: CHAIN_ID,
|
|
100
|
+
environment: PHAROS_ENVIRONMENT,
|
|
101
|
+
isMainnet: false,
|
|
50
102
|
});
|
|
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
103
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
priceInPHRS: "1.000000",
|
|
75
|
-
source: "DODO Route API (Pharos Atlantic)",
|
|
76
|
-
timestamp,
|
|
77
|
-
};
|
|
104
|
+
catch (err) {
|
|
105
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
106
|
+
if (message.includes("DODO_API_AUTH_REQUIRED")) {
|
|
107
|
+
return fail("DODO_API_AUTH_REQUIRED", "DODO/FaroSwap route API rejected public mode. Configure DODO_API_KEY only if this endpoint requires authenticated access.", false, "dodo_api");
|
|
108
|
+
}
|
|
109
|
+
if (message.includes("DODO_API_RATE_LIMITED")) {
|
|
110
|
+
return fail("DODO_API_RATE_LIMITED", message, true, "dodo_api");
|
|
111
|
+
}
|
|
112
|
+
if (message.includes("INVALID_TOKEN_ADDRESS")) {
|
|
113
|
+
return fail("INVALID_TOKEN_ADDRESS", message, false, "dodo_api");
|
|
114
|
+
}
|
|
115
|
+
return classifyExternalError("dodo_api", err);
|
|
116
|
+
}
|
|
78
117
|
}
|
|
79
118
|
//# sourceMappingURL=getTokenPrice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTokenPrice.js","sourceRoot":"","sources":["../../src/tools/getTokenPrice.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E
|
|
1
|
+
{"version":3,"file":"getTokenPrice.js","sourceRoot":"","sources":["../../src/tools/getTokenPrice.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,23 +18,52 @@ export declare const getWalletBalanceTool: {
|
|
|
18
18
|
walletAddress: string;
|
|
19
19
|
}>;
|
|
20
20
|
};
|
|
21
|
-
export declare function handleGetWalletBalance(raw: GetWalletBalanceInput): Promise<{
|
|
22
|
-
walletAddress: string
|
|
21
|
+
export declare function handleGetWalletBalance(raw: GetWalletBalanceInput): Promise<import("../lib/toolResponse.js").ToolFailure | import("../lib/toolResponse.js").ToolSuccess<{
|
|
22
|
+
walletAddress: `0x${string}`;
|
|
23
23
|
balances: {
|
|
24
24
|
PHRS: {
|
|
25
|
-
balance:
|
|
26
|
-
|
|
25
|
+
balance: {
|
|
26
|
+
value: string;
|
|
27
|
+
unit: string;
|
|
28
|
+
};
|
|
29
|
+
valueUsd: {
|
|
30
|
+
value: string;
|
|
31
|
+
unit: string;
|
|
32
|
+
};
|
|
27
33
|
};
|
|
28
34
|
USDC: {
|
|
29
|
-
balance:
|
|
30
|
-
|
|
35
|
+
balance: {
|
|
36
|
+
value: string;
|
|
37
|
+
unit: string;
|
|
38
|
+
};
|
|
39
|
+
valueUsd: {
|
|
40
|
+
value: string;
|
|
41
|
+
unit: string;
|
|
42
|
+
};
|
|
31
43
|
};
|
|
32
44
|
USDT: {
|
|
33
|
-
balance:
|
|
34
|
-
|
|
45
|
+
balance: {
|
|
46
|
+
value: string;
|
|
47
|
+
unit: string;
|
|
48
|
+
};
|
|
49
|
+
valueUsd: {
|
|
50
|
+
value: string;
|
|
51
|
+
unit: string;
|
|
52
|
+
};
|
|
35
53
|
};
|
|
36
54
|
};
|
|
37
|
-
totalUsd:
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
totalUsd: {
|
|
56
|
+
value: string;
|
|
57
|
+
unit: string;
|
|
58
|
+
};
|
|
59
|
+
phrsPrice: {
|
|
60
|
+
value: string;
|
|
61
|
+
unit: string;
|
|
62
|
+
} | null;
|
|
63
|
+
priceSourceStatus: string;
|
|
64
|
+
chainId: number;
|
|
65
|
+
environment: string;
|
|
66
|
+
isMainnet: boolean;
|
|
67
|
+
source: string;
|
|
68
|
+
}>>;
|
|
40
69
|
//# sourceMappingURL=getWalletBalance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getWalletBalance.d.ts","sourceRoot":"","sources":["../../src/tools/getWalletBalance.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"getWalletBalance.d.ts","sourceRoot":"","sources":["../../src/tools/getWalletBalance.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsEtE"}
|