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