safehands-pharos 1.3.0 → 1.4.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.
- package/.env.example +64 -26
- package/README.md +333 -445
- package/dist/cli.d.ts +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +124 -98
- package/dist/cli.js.map +1 -1
- package/dist/demo.d.ts +1 -1
- package/dist/demo.js +171 -171
- package/dist/index.d.ts +2 -2
- package/dist/index.js +138 -85
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.js +65 -65
- package/dist/lib/auditLog.d.ts +9 -0
- package/dist/lib/auditLog.d.ts.map +1 -0
- package/dist/lib/auditLog.js +30 -0
- package/dist/lib/auditLog.js.map +1 -0
- package/dist/lib/constants.d.ts +291 -291
- package/dist/lib/constants.js +292 -292
- package/dist/lib/dodoApi.d.ts +78 -70
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +196 -178
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/http.d.ts +14 -14
- package/dist/lib/http.js +118 -118
- package/dist/lib/pharosClient.d.ts +58 -58
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +63 -53
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
- package/dist/lib/policy/actionPolicyEngine.js +212 -212
- package/dist/lib/riskEngine.d.ts +26 -26
- package/dist/lib/riskEngine.js +283 -283
- package/dist/lib/signer/index.d.ts +24 -24
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +88 -89
- package/dist/lib/signer/index.js.map +1 -1
- package/dist/lib/spendAccumulator.d.ts +10 -0
- package/dist/lib/spendAccumulator.d.ts.map +1 -0
- package/dist/lib/spendAccumulator.js +54 -0
- package/dist/lib/spendAccumulator.js.map +1 -0
- package/dist/lib/testDodoLive.d.ts +1 -1
- package/dist/lib/testDodoLive.js +104 -104
- package/dist/lib/testLiveSafehands.d.ts +1 -1
- package/dist/lib/testLiveSafehands.js +92 -92
- package/dist/lib/testRpc.d.ts +1 -1
- package/dist/lib/testRpc.js +29 -29
- package/dist/lib/testRpcLive.d.ts +1 -1
- package/dist/lib/testRpcLive.js +88 -88
- package/dist/lib/testTools.d.ts +1 -1
- package/dist/lib/testTools.js +397 -397
- package/dist/lib/testX402Live.d.ts +1 -1
- package/dist/lib/testX402Live.js +159 -159
- package/dist/lib/toolResponse.d.ts +25 -25
- package/dist/lib/toolResponse.js +53 -53
- package/dist/lib/wallet/index.d.ts +37 -18
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +128 -70
- package/dist/lib/wallet/index.js.map +1 -1
- package/dist/scripts/checkDeploy.d.ts +1 -1
- package/dist/scripts/checkDeploy.js +24 -24
- package/dist/scripts/deployRegistry.d.ts +1 -1
- package/dist/scripts/deployRegistry.js +100 -100
- package/dist/scripts/testRegistry.d.ts +1 -1
- package/dist/scripts/testRegistry.js +43 -43
- package/dist/tools/approveToken.d.ts +45 -46
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +85 -83
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +79 -79
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +104 -93
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +43 -36
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +56 -42
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +46 -46
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +95 -88
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +26 -26
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +58 -59
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +79 -79
- package/dist/tools/estimateGas.js +124 -124
- package/dist/tools/executeSwap.d.ts +61 -59
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +141 -129
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +29 -29
- package/dist/tools/explainRisk.js +32 -32
- package/dist/tools/getAgentWallet.d.ts +21 -21
- package/dist/tools/getAgentWallet.js +27 -27
- package/dist/tools/getAgentWalletBalance.d.ts +11 -11
- package/dist/tools/getAgentWalletBalance.js +70 -70
- package/dist/tools/getExecutionHistory.d.ts +49 -51
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +154 -93
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +43 -43
- package/dist/tools/getGasPrice.js +59 -59
- package/dist/tools/getPoolInfo.d.ts +75 -75
- package/dist/tools/getPoolInfo.js +137 -137
- package/dist/tools/getTokenPrice.d.ts +113 -113
- package/dist/tools/getTokenPrice.js +117 -117
- package/dist/tools/getTransactionStatus.d.ts +43 -57
- package/dist/tools/getTransactionStatus.d.ts.map +1 -1
- package/dist/tools/getTransactionStatus.js +59 -67
- package/dist/tools/getTransactionStatus.js.map +1 -1
- package/dist/tools/getWalletBalance.d.ts +68 -68
- package/dist/tools/getWalletBalance.js +87 -87
- package/dist/tools/publishRiskScore.d.ts +63 -63
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +88 -85
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryRiskRegistry.d.ts +38 -48
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +55 -60
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
- package/dist/tools/safehandsPreflightCheck.js +47 -47
- package/dist/tools/safehandsRiskReport.d.ts +81 -81
- package/dist/tools/safehandsRiskReport.js +28 -28
- package/dist/tools/safehandsSafeExecute.d.ts +20 -20
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +81 -75
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +14 -14
- package/dist/tools/safehandsWalletHealth.js +103 -103
- package/dist/tools/safehandsX402Preflight.d.ts +26 -26
- package/dist/tools/safehandsX402Preflight.js +65 -65
- package/dist/tools/sendPayment.d.ts +57 -58
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +117 -108
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/simulateTransaction.d.ts +60 -81
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +83 -88
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +26 -26
- package/dist/tools/tokenRegistryStatus.js +96 -96
- package/dist/tools/x402PayAndFetch.d.ts +81 -81
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +152 -149
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.js +252 -252
- package/examples/dashboard/index.html +337 -0
- package/package.json +83 -84
- package/.agents/skill/safehands/SKILL.md +0 -212
- package/.agents/skill/safehands/assets/networks.json +0 -24
- package/.agents/skill/safehands/assets/tokens.json +0 -66
- package/.agents/wallets.json +0 -20
- package/docs/reports/OFFICIAL_DOCS_ALIGNMENT_REPORT.md +0 -137
- package/docs/reports/final_audit_report.md +0 -307
- package/docs/reports/live_verification_report.md +0 -147
- package/docs/reports/pharos_skill_engine_alignment_report.md +0 -85
package/dist/lib/http.js
CHANGED
|
@@ -1,119 +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
|
-
}
|
|
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
119
|
//# sourceMappingURL=http.js.map
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { type PublicClient, type WalletClient, type Transport, type Chain, type Account } from "viem";
|
|
2
|
-
export declare const pharosAtlantic: {
|
|
3
|
-
blockExplorers: {
|
|
4
|
-
readonly default: {
|
|
5
|
-
readonly name: "PharosScan";
|
|
6
|
-
readonly url: string;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
blockTime?: number | undefined | undefined;
|
|
10
|
-
contracts?: {
|
|
11
|
-
[x: string]: import("viem").ChainContract | {
|
|
12
|
-
[sourceId: number]: import("viem").ChainContract | undefined;
|
|
13
|
-
} | undefined;
|
|
14
|
-
ensRegistry?: import("viem").ChainContract | undefined;
|
|
15
|
-
ensUniversalResolver?: import("viem").ChainContract | undefined;
|
|
16
|
-
multicall3?: import("viem").ChainContract | undefined;
|
|
17
|
-
erc6492Verifier?: import("viem").ChainContract | undefined;
|
|
18
|
-
} | undefined;
|
|
19
|
-
ensTlds?: readonly string[] | undefined;
|
|
20
|
-
id: number;
|
|
21
|
-
name: `Pharos ${string}`;
|
|
22
|
-
nativeCurrency: {
|
|
23
|
-
readonly name: "PHRS";
|
|
24
|
-
readonly symbol: "PHRS";
|
|
25
|
-
readonly decimals: 18;
|
|
26
|
-
};
|
|
27
|
-
experimental_preconfirmationTime?: number | undefined | undefined;
|
|
28
|
-
rpcUrls: {
|
|
29
|
-
readonly default: {
|
|
30
|
-
readonly http: readonly [string];
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
sourceId?: number | undefined | undefined;
|
|
34
|
-
testnet: true;
|
|
35
|
-
custom?: Record<string, unknown> | undefined;
|
|
36
|
-
extendSchema?: Record<string, unknown> | undefined;
|
|
37
|
-
fees?: import("viem").ChainFees<undefined> | undefined;
|
|
38
|
-
formatters?: undefined;
|
|
39
|
-
prepareTransactionRequest?: ((args: import("viem").PrepareTransactionRequestParameters, options: {
|
|
40
|
-
client: import("viem").Client;
|
|
41
|
-
phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
|
|
42
|
-
}) => Promise<import("viem").PrepareTransactionRequestParameters>) | [fn: ((args: import("viem").PrepareTransactionRequestParameters, options: {
|
|
43
|
-
client: import("viem").Client;
|
|
44
|
-
phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
|
|
45
|
-
}) => Promise<import("viem").PrepareTransactionRequestParameters>) | undefined, options: {
|
|
46
|
-
runAt: readonly ("beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters")[];
|
|
47
|
-
}] | undefined;
|
|
48
|
-
serializers?: import("viem").ChainSerializers<undefined, import("viem").TransactionSerializable> | undefined;
|
|
49
|
-
verifyHash?: ((client: import("viem").Client, parameters: import("viem").VerifyHashActionParameters) => Promise<import("viem").VerifyHashActionReturnType>) | undefined;
|
|
50
|
-
};
|
|
51
|
-
export declare const publicClient: PublicClient<Transport, Chain>;
|
|
52
|
-
/**
|
|
53
|
-
* Creates a wallet client for signing and sending transactions.
|
|
54
|
-
* Private key is passed per-request and NEVER stored.
|
|
55
|
-
*/
|
|
56
|
-
export declare function createPharosWalletClient(privateKey: `0x${string}`): WalletClient<Transport, Chain, Account>;
|
|
57
|
-
export declare function createPharosWalletClientFromAccount(account: Account): WalletClient<Transport, Chain, Account>;
|
|
58
|
-
export declare function getExplorerUrl(txHash: string): string;
|
|
1
|
+
import { type PublicClient, type WalletClient, type Transport, type Chain, type Account } from "viem";
|
|
2
|
+
export declare const pharosAtlantic: {
|
|
3
|
+
blockExplorers: {
|
|
4
|
+
readonly default: {
|
|
5
|
+
readonly name: "PharosScan";
|
|
6
|
+
readonly url: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
blockTime?: number | undefined | undefined;
|
|
10
|
+
contracts?: {
|
|
11
|
+
[x: string]: import("viem").ChainContract | {
|
|
12
|
+
[sourceId: number]: import("viem").ChainContract | undefined;
|
|
13
|
+
} | undefined;
|
|
14
|
+
ensRegistry?: import("viem").ChainContract | undefined;
|
|
15
|
+
ensUniversalResolver?: import("viem").ChainContract | undefined;
|
|
16
|
+
multicall3?: import("viem").ChainContract | undefined;
|
|
17
|
+
erc6492Verifier?: import("viem").ChainContract | undefined;
|
|
18
|
+
} | undefined;
|
|
19
|
+
ensTlds?: readonly string[] | undefined;
|
|
20
|
+
id: number;
|
|
21
|
+
name: `Pharos ${string}`;
|
|
22
|
+
nativeCurrency: {
|
|
23
|
+
readonly name: "PHRS";
|
|
24
|
+
readonly symbol: "PHRS";
|
|
25
|
+
readonly decimals: 18;
|
|
26
|
+
};
|
|
27
|
+
experimental_preconfirmationTime?: number | undefined | undefined;
|
|
28
|
+
rpcUrls: {
|
|
29
|
+
readonly default: {
|
|
30
|
+
readonly http: readonly [string];
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
sourceId?: number | undefined | undefined;
|
|
34
|
+
testnet: true;
|
|
35
|
+
custom?: Record<string, unknown> | undefined;
|
|
36
|
+
extendSchema?: Record<string, unknown> | undefined;
|
|
37
|
+
fees?: import("viem").ChainFees<undefined> | undefined;
|
|
38
|
+
formatters?: undefined;
|
|
39
|
+
prepareTransactionRequest?: ((args: import("viem").PrepareTransactionRequestParameters, options: {
|
|
40
|
+
client: import("viem").Client;
|
|
41
|
+
phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
|
|
42
|
+
}) => Promise<import("viem").PrepareTransactionRequestParameters>) | [fn: ((args: import("viem").PrepareTransactionRequestParameters, options: {
|
|
43
|
+
client: import("viem").Client;
|
|
44
|
+
phase: "beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters";
|
|
45
|
+
}) => Promise<import("viem").PrepareTransactionRequestParameters>) | undefined, options: {
|
|
46
|
+
runAt: readonly ("beforeFillTransaction" | "beforeFillParameters" | "afterFillParameters")[];
|
|
47
|
+
}] | undefined;
|
|
48
|
+
serializers?: import("viem").ChainSerializers<undefined, import("viem").TransactionSerializable> | undefined;
|
|
49
|
+
verifyHash?: ((client: import("viem").Client, parameters: import("viem").VerifyHashActionParameters) => Promise<import("viem").VerifyHashActionReturnType>) | undefined;
|
|
50
|
+
};
|
|
51
|
+
export declare const publicClient: PublicClient<Transport, Chain>;
|
|
52
|
+
/**
|
|
53
|
+
* Creates a wallet client for signing and sending transactions.
|
|
54
|
+
* Private key is passed per-request and NEVER stored.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createPharosWalletClient(privateKey: `0x${string}`): WalletClient<Transport, Chain, Account>;
|
|
57
|
+
export declare function createPharosWalletClientFromAccount(account: Account): WalletClient<Transport, Chain, Account>;
|
|
58
|
+
export declare function getExplorerUrl(txHash: string): string;
|
|
59
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,
|
|
1
|
+
{"version":3,"file":"pharosClient.d.ts","sourceRoot":"","sources":["../../src/lib/pharosClient.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,MAAM,CAAC;AAkBd,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
|
@@ -1,54 +1,64 @@
|
|
|
1
|
-
// ─── Pharos Chain Client ───────────────────────────────────────────────
|
|
2
|
-
// viem publicClient & walletClient factory for Pharos Atlantic Testnet.
|
|
3
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
4
|
-
import { createPublicClient, createWalletClient, http, defineChain, } from "viem";
|
|
5
|
-
import { privateKeyToAccount } from "viem/accounts";
|
|
6
|
-
import { RPC_URL, CHAIN_ID, EXPLORER_BASE, PHAROS_ENVIRONMENT, IS_MAINNET } from "./constants.js";
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
1
|
+
// ─── Pharos Chain Client ───────────────────────────────────────────────
|
|
2
|
+
// viem publicClient & walletClient factory for Pharos Atlantic Testnet.
|
|
3
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
4
|
+
import { createPublicClient, createWalletClient, http, fallback, defineChain, } from "viem";
|
|
5
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
6
|
+
import { RPC_URL, CHAIN_ID, EXPLORER_BASE, PHAROS_ENVIRONMENT, IS_MAINNET } from "./constants.js";
|
|
7
|
+
// Support multiple comma-separated RPC URLs for failover.
|
|
8
|
+
// PHAROS_RPC_URLS takes priority; falls back to single PHAROS_RPC_URL.
|
|
9
|
+
const RPC_URLS = (process.env.PHAROS_RPC_URLS || RPC_URL)
|
|
10
|
+
.split(",")
|
|
11
|
+
.map((s) => s.trim())
|
|
12
|
+
.filter(Boolean);
|
|
13
|
+
function buildTransport() {
|
|
14
|
+
const transports = RPC_URLS.map((url) => http(url, { timeout: 10_000, retryCount: 1, retryDelay: 250 }));
|
|
15
|
+
return transports.length > 1 ? fallback(transports) : transports[0];
|
|
16
|
+
}
|
|
17
|
+
// ─── Chain Definition ──────────────────────────────────────────────────
|
|
18
|
+
export const pharosAtlantic = defineChain({
|
|
19
|
+
id: CHAIN_ID,
|
|
20
|
+
name: `Pharos ${PHAROS_ENVIRONMENT}`,
|
|
21
|
+
nativeCurrency: {
|
|
22
|
+
name: "PHRS",
|
|
23
|
+
symbol: "PHRS",
|
|
24
|
+
decimals: 18,
|
|
25
|
+
},
|
|
26
|
+
rpcUrls: {
|
|
27
|
+
default: {
|
|
28
|
+
http: [RPC_URL],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
blockExplorers: {
|
|
32
|
+
default: {
|
|
33
|
+
name: "PharosScan",
|
|
34
|
+
url: EXPLORER_BASE.replace("/tx/", ""),
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
testnet: !IS_MAINNET,
|
|
38
|
+
});
|
|
39
|
+
// ─── Public Client (read-only) ─────────────────────────────────────────
|
|
40
|
+
export const publicClient = createPublicClient({
|
|
41
|
+
chain: pharosAtlantic,
|
|
42
|
+
transport: buildTransport(),
|
|
43
|
+
});
|
|
44
|
+
// ─── Wallet Client Factory ─────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Creates a wallet client for signing and sending transactions.
|
|
47
|
+
* Private key is passed per-request and NEVER stored.
|
|
48
|
+
*/
|
|
49
|
+
export function createPharosWalletClient(privateKey) {
|
|
50
|
+
const account = privateKeyToAccount(privateKey);
|
|
51
|
+
return createPharosWalletClientFromAccount(account);
|
|
52
|
+
}
|
|
53
|
+
export function createPharosWalletClientFromAccount(account) {
|
|
54
|
+
return createWalletClient({
|
|
55
|
+
account,
|
|
56
|
+
chain: pharosAtlantic,
|
|
57
|
+
transport: buildTransport(),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// ─── Utility: Explorer Link ────────────────────────────────────────────
|
|
61
|
+
export function getExplorerUrl(txHash) {
|
|
62
|
+
return `${EXPLORER_BASE}${txHash}`;
|
|
63
|
+
}
|
|
54
64
|
//# sourceMappingURL=pharosClient.js.map
|
|
@@ -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,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,
|
|
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,QAAQ,EACR,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,0DAA0D;AAC1D,uEAAuE;AACvE,MAAM,QAAQ,GAAa,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC;KAChE,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzG,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,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,cAAc,EAAE;CAC5B,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,cAAc,EAAE;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -1,54 +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;
|
|
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
54
|
//# sourceMappingURL=actionPolicyEngine.d.ts.map
|