@ironwallet/mcp-server 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +17 -11
  2. package/dist/api/rates.d.ts +62 -0
  3. package/dist/api/rates.js +198 -0
  4. package/dist/api/rates.js.map +1 -0
  5. package/dist/api/swap.d.ts +1 -1
  6. package/dist/api/swap.js +1 -1
  7. package/dist/config.d.ts +16 -12
  8. package/dist/config.js +48 -31
  9. package/dist/config.js.map +1 -1
  10. package/dist/consent/copy.d.ts +18 -0
  11. package/dist/consent/copy.js +27 -0
  12. package/dist/consent/copy.js.map +1 -0
  13. package/dist/consent/store.d.ts +23 -0
  14. package/dist/consent/store.js +63 -0
  15. package/dist/consent/store.js.map +1 -0
  16. package/dist/device-fingerprint.d.ts +18 -0
  17. package/dist/device-fingerprint.js +81 -0
  18. package/dist/device-fingerprint.js.map +1 -0
  19. package/dist/generated/env-config.js +3 -1
  20. package/dist/generated/env-config.js.map +1 -1
  21. package/dist/generated/env-profile.d.ts +4 -0
  22. package/dist/keystore/store.js +3 -7
  23. package/dist/keystore/store.js.map +1 -1
  24. package/dist/keystore/types.d.ts +8 -3
  25. package/dist/local-secrets.d.ts +2 -2
  26. package/dist/local-secrets.js +5 -9
  27. package/dist/local-secrets.js.map +1 -1
  28. package/dist/networks.d.ts +5 -0
  29. package/dist/networks.js +21 -0
  30. package/dist/networks.js.map +1 -0
  31. package/dist/policy.d.ts +33 -3
  32. package/dist/policy.js +121 -32
  33. package/dist/policy.js.map +1 -1
  34. package/dist/restrict-private-file.d.ts +9 -0
  35. package/dist/restrict-private-file.js +53 -0
  36. package/dist/restrict-private-file.js.map +1 -0
  37. package/dist/server.js +3 -2
  38. package/dist/server.js.map +1 -1
  39. package/dist/tools/definitions.d.ts +40 -0
  40. package/dist/tools/definitions.js +256 -0
  41. package/dist/tools/definitions.js.map +1 -0
  42. package/dist/tools/helpers.d.ts +0 -3
  43. package/dist/tools/helpers.js +0 -3
  44. package/dist/tools/helpers.js.map +1 -1
  45. package/dist/tools/index.d.ts +1 -0
  46. package/dist/tools/index.js +1 -0
  47. package/dist/tools/index.js.map +1 -1
  48. package/dist/tools/swap.d.ts +1 -1
  49. package/dist/tools/swap.js +12 -76
  50. package/dist/tools/swap.js.map +1 -1
  51. package/dist/tools/transfer.d.ts +1 -1
  52. package/dist/tools/transfer.js +13 -54
  53. package/dist/tools/transfer.js.map +1 -1
  54. package/dist/tools/wallets.d.ts +1 -1
  55. package/dist/tools/wallets.js +110 -47
  56. package/dist/tools/wallets.js.map +1 -1
  57. package/dist/wallet/derive.d.ts +1 -1
  58. package/dist/wallet/derive.js +1 -1
  59. package/dist/web/manager.js +64 -3
  60. package/dist/web/manager.js.map +1 -1
  61. package/package.json +30 -5
  62. package/server.json +23 -0
  63. package/tools.json +632 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Canonical MCP consent copy (English). Chat, create_wallets, and the local
3
+ * manager must show this text. Bump CONSENT_VERSION when the wording changes.
4
+ */
5
+ export const CONSENT_VERSION = "v1";
6
+ export const CONSENT_TITLE = "Before connecting an AI agent to your wallet";
7
+ export const CONSENT_LEAD = "Connecting MCP lets the AI agent view balances, transfer assets, and swap on behalf of this wallet.";
8
+ export const CONSENT_BULLETS = [
9
+ "By default the agent can send funds and swap without extra confirmation on each operation.",
10
+ "Use a dedicated wallet with a small balance, not your main or savings wallet.",
11
+ "The recovery phrase stays encrypted on this device. Loss or compromise means permanent loss of access to the funds.",
12
+ "IronWallet is not responsible for the AI agent's actions, misconfiguration, or loss of funds from using this feature.",
13
+ "You can ask the agent to set limits in chat (read-only, a per-transaction USD limit, a transfer recipient allow-list).",
14
+ ];
15
+ export const CONSENT_CHECKBOX = "I understand the risks and want to continue";
16
+ export const CONSENT_CHAT_INSTRUCTION = "Show this text in full in chat. Do not shorten it. After the user explicitly confirms, call accept_mcp_consent with accepted=true, or open the wallet manager so they can accept there.";
17
+ export function consentDocument() {
18
+ return {
19
+ version: CONSENT_VERSION,
20
+ title: CONSENT_TITLE,
21
+ lead: CONSENT_LEAD,
22
+ bullets: CONSENT_BULLETS,
23
+ checkbox: CONSENT_CHECKBOX,
24
+ instruction: CONSENT_CHAT_INSTRUCTION,
25
+ };
26
+ }
27
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/consent/copy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAE5E,MAAM,CAAC,MAAM,YAAY,GACvB,qGAAqG,CAAC;AAExG,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,4FAA4F;IAC5F,+EAA+E;IAC/E,qHAAqH;IACrH,uHAAuH;IACvH,wHAAwH;CAChH,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,6CAA6C,CAAC;AAE9E,MAAM,CAAC,MAAM,wBAAwB,GACnC,yLAAyL,CAAC;AAE5L,MAAM,UAAU,eAAe;IAQ7B,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,wBAAwB;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Durable MCP consent next to the keystore. Written by accept_mcp_consent (chat)
3
+ * or the local manager. create / import stay blocked until the current version
4
+ * is accepted.
5
+ */
6
+ import { consentDocument } from "./copy.js";
7
+ export declare const CONSENT_FILE = "mcp-consent.json";
8
+ export type ConsentChannel = "chat" | "manager";
9
+ export interface ConsentRecord {
10
+ version: string;
11
+ acceptedAt: string;
12
+ channel: ConsentChannel;
13
+ }
14
+ export declare function consentFilePath(dir?: string): string;
15
+ export declare function readConsent(dir?: string): ConsentRecord | undefined;
16
+ export declare function hasCurrentConsent(dir?: string): boolean;
17
+ export declare function recordConsent(channel: ConsentChannel, dir?: string): ConsentRecord;
18
+ /** Payload for agents when create/import is blocked. */
19
+ export declare function consentRequiredPayload(): {
20
+ needs_consent: true;
21
+ accept: "accept_mcp_consent";
22
+ consent: ReturnType<typeof consentDocument>;
23
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Durable MCP consent next to the keystore. Written by accept_mcp_consent (chat)
3
+ * or the local manager. create / import stay blocked until the current version
4
+ * is accepted.
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { resolveKeystoreDir } from "../local-secrets.js";
9
+ import { restrictPrivateFile } from "../restrict-private-file.js";
10
+ import { CONSENT_VERSION, consentDocument } from "./copy.js";
11
+ export const CONSENT_FILE = "mcp-consent.json";
12
+ export function consentFilePath(dir = resolveKeystoreDir()) {
13
+ return join(dir, CONSENT_FILE);
14
+ }
15
+ export function readConsent(dir) {
16
+ const path = consentFilePath(dir);
17
+ if (!existsSync(path))
18
+ return undefined;
19
+ try {
20
+ const raw = JSON.parse(readFileSync(path, "utf8"));
21
+ if (typeof raw.version !== "string" || !raw.version.trim())
22
+ return undefined;
23
+ if (typeof raw.acceptedAt !== "string" || !raw.acceptedAt.trim())
24
+ return undefined;
25
+ if (raw.channel !== "chat" && raw.channel !== "manager")
26
+ return undefined;
27
+ return {
28
+ version: raw.version.trim(),
29
+ acceptedAt: raw.acceptedAt,
30
+ channel: raw.channel,
31
+ };
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ export function hasCurrentConsent(dir) {
38
+ const record = readConsent(dir);
39
+ return record?.version === CONSENT_VERSION;
40
+ }
41
+ export function recordConsent(channel, dir) {
42
+ const root = dir ?? resolveKeystoreDir();
43
+ if (!existsSync(root))
44
+ mkdirSync(root, { recursive: true });
45
+ const record = {
46
+ version: CONSENT_VERSION,
47
+ acceptedAt: new Date().toISOString(),
48
+ channel,
49
+ };
50
+ const path = consentFilePath(root);
51
+ writeFileSync(path, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
52
+ restrictPrivateFile(path);
53
+ return record;
54
+ }
55
+ /** Payload for agents when create/import is blocked. */
56
+ export function consentRequiredPayload() {
57
+ return {
58
+ needs_consent: true,
59
+ accept: "accept_mcp_consent",
60
+ consent: consentDocument(),
61
+ };
62
+ }
63
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/consent/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAU/C,MAAM,UAAU,eAAe,CAAC,MAAc,kBAAkB,EAAE;IAChE,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA2B,CAAC;QAC7E,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAC7E,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QACnF,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,MAAM,EAAE,OAAO,KAAK,eAAe,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAuB,EAAE,GAAY;IACjE,MAAM,IAAI,GAAG,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,OAAO;KACR,CAAC;IACF,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,sBAAsB;IAKpC,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,eAAe,EAAE;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stable machine fingerprint for `X-Device-Fingerprint`.
3
+ *
4
+ * Hashes the OS install id (Linux machine-id, Windows MachineGuid,
5
+ * macOS IOPlatformUUID) plus platform. If that id is missing, hashes the
6
+ * local `device-id` UUID instead. Hostname, username, and arch are never
7
+ * included. Computed in memory only — not written under ~/.ironwallet-mcp/.
8
+ */
9
+ export declare const FINGERPRINT_VERSION = "v1";
10
+ export declare function parseWindowsMachineGuid(regOutput: string): string | undefined;
11
+ export declare function parseMacPlatformUuid(ioregOutput: string): string | undefined;
12
+ export declare function parseLinuxMachineId(raw: string): string | undefined;
13
+ export declare function formatDeviceFingerprint(parts: {
14
+ osMachineId?: string;
15
+ platform: string;
16
+ fallbackId?: string;
17
+ }): string;
18
+ export declare function resolveDeviceFingerprint(fallbackId?: string): string;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Stable machine fingerprint for `X-Device-Fingerprint`.
3
+ *
4
+ * Hashes the OS install id (Linux machine-id, Windows MachineGuid,
5
+ * macOS IOPlatformUUID) plus platform. If that id is missing, hashes the
6
+ * local `device-id` UUID instead. Hostname, username, and arch are never
7
+ * included. Computed in memory only — not written under ~/.ironwallet-mcp/.
8
+ */
9
+ import { execFileSync } from "node:child_process";
10
+ import { createHash } from "node:crypto";
11
+ import { readFileSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ export const FINGERPRINT_VERSION = "v1";
14
+ export function parseWindowsMachineGuid(regOutput) {
15
+ const match = /MachineGuid\s+REG_SZ\s+([0-9a-fA-F-]{36})/.exec(regOutput);
16
+ return match?.[1]?.toLowerCase();
17
+ }
18
+ export function parseMacPlatformUuid(ioregOutput) {
19
+ const match = /"IOPlatformUUID"\s*=\s*"([0-9a-fA-F-]{36})"/.exec(ioregOutput);
20
+ return match?.[1]?.toLowerCase();
21
+ }
22
+ export function parseLinuxMachineId(raw) {
23
+ const id = raw.trim().toLowerCase().replace(/[^0-9a-f]/g, "");
24
+ return id.length >= 16 ? id : undefined;
25
+ }
26
+ export function formatDeviceFingerprint(parts) {
27
+ const machineId = parts.osMachineId?.trim() ?? "";
28
+ const fallbackId = parts.fallbackId?.trim() ?? "";
29
+ const identity = machineId || (fallbackId ? `fallback:${fallbackId}` : "");
30
+ const material = ["ironwallet-mcp", FINGERPRINT_VERSION, identity, parts.platform].join("|");
31
+ const digest = createHash("sha256").update(material).digest("hex");
32
+ return `${FINGERPRINT_VERSION}:${digest}`;
33
+ }
34
+ function readOsMachineId(platform = process.platform) {
35
+ try {
36
+ if (platform === "linux") {
37
+ for (const path of ["/etc/machine-id", "/var/lib/dbus/machine-id"]) {
38
+ try {
39
+ const id = parseLinuxMachineId(readFileSync(path, "utf8"));
40
+ if (id)
41
+ return id;
42
+ }
43
+ catch {
44
+ // try the next path
45
+ }
46
+ }
47
+ return undefined;
48
+ }
49
+ if (platform === "win32") {
50
+ const root = process.env.SystemRoot || process.env.WINDIR || "C:\\Windows";
51
+ const output = execFileSync(join(root, "System32", "reg.exe"), [
52
+ "query",
53
+ "HKLM\\SOFTWARE\\Microsoft\\Cryptography",
54
+ "/v",
55
+ "MachineGuid",
56
+ "/reg:64",
57
+ ], { windowsHide: true, stdio: ["ignore", "pipe", "pipe"], encoding: "utf8" });
58
+ return parseWindowsMachineGuid(output);
59
+ }
60
+ if (platform === "darwin") {
61
+ const output = execFileSync("ioreg", ["-rd1", "-c", "IOPlatformExpertDevice"], { stdio: ["ignore", "pipe", "pipe"], encoding: "utf8" });
62
+ return parseMacPlatformUuid(output);
63
+ }
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ return undefined;
69
+ }
70
+ let cached;
71
+ export function resolveDeviceFingerprint(fallbackId) {
72
+ if (cached)
73
+ return cached;
74
+ cached = formatDeviceFingerprint({
75
+ osMachineId: readOsMachineId(),
76
+ platform: process.platform,
77
+ fallbackId,
78
+ });
79
+ return cached;
80
+ }
81
+ //# sourceMappingURL=device-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-fingerprint.js","sourceRoot":"","sources":["../src/device-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export const BAKED_ENV = {
18
18
  "solanaRpcUrl": "https://api.mainnet-beta.solana.com",
19
19
  "tonApiUrl": "https://toncenter.com/api/v2",
20
20
  "xrpRpcUrl": "https://xrplcluster.com",
21
- "bitcoinTestnet": false
21
+ "bitcoinTestnet": false,
22
+ "ratesApiUrl": "https://rates.iwio.app",
23
+ "staticResourcesUrl": "https://resources.iwio.app/Ironwallet"
22
24
  };
23
25
  //# sourceMappingURL=env-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-config.js","sourceRoot":"","sources":["../../src/generated/env-config.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,SAAS,EAAE,uBAAuB;IAClC,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE;QACZ,UAAU,EAAE,qCAAqC;QACjD,KAAK,EAAE,gCAAgC;QACvC,SAAS,EAAE,wCAAwC;QACnD,MAAM,EAAE,iCAAiC;QACzC,UAAU,EAAE,yCAAyC;QACrD,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,8CAA8C;KAC5D;IACD,YAAY,EAAE,yBAAyB;IACvC,eAAe,EAAE,8BAA8B;IAC/C,gBAAgB,EAAE,+BAA+B;IACjD,YAAY,EAAE,0CAA0C;IACxD,cAAc,EAAE,qCAAqC;IACrD,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE,yBAAyB;IACtC,gBAAgB,EAAE,KAAK;CACf,CAAC"}
1
+ {"version":3,"file":"env-config.js","sourceRoot":"","sources":["../../src/generated/env-config.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,SAAS,EAAE,uBAAuB;IAClC,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,kBAAkB;IAClC,YAAY,EAAE;QACZ,UAAU,EAAE,qCAAqC;QACjD,KAAK,EAAE,gCAAgC;QACvC,SAAS,EAAE,wCAAwC;QACnD,MAAM,EAAE,iCAAiC;QACzC,UAAU,EAAE,yCAAyC;QACrD,UAAU,EAAE,qCAAqC;QACjD,WAAW,EAAE,8CAA8C;KAC5D;IACD,YAAY,EAAE,yBAAyB;IACvC,eAAe,EAAE,8BAA8B;IAC/C,gBAAgB,EAAE,+BAA+B;IACjD,YAAY,EAAE,0CAA0C;IACxD,cAAc,EAAE,qCAAqC;IACrD,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE,yBAAyB;IACtC,gBAAgB,EAAE,KAAK;IACvB,aAAa,EAAE,wBAAwB;IACvC,oBAAoB,EAAE,uCAAuC;CACrD,CAAC"}
@@ -3,6 +3,10 @@ export interface BakedEnvProfile {
3
3
  authUrl: string;
4
4
  relayUrl: string;
5
5
  swapProxyUrl: string;
6
+ /** Rates API host (`/api/v1/rate/*`). Optional until configurations ships it. */
7
+ ratesApiUrl?: string;
8
+ /** Static resources base for asset catalogs (`/assets/main/blockchains/...`). */
9
+ staticResourcesUrl?: string;
6
10
  evmRpcUrls: Record<string, string>;
7
11
  tronApiUrl: string;
8
12
  bitcoinApiUrl: string;
@@ -4,9 +4,10 @@
4
4
  * signing; they are never returned to callers of these functions except the
5
5
  * local browser wallet manager.
6
6
  */
7
- import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync, } from "node:fs";
7
+ import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { getConfig } from "../config.js";
10
+ import { restrictPrivateFile } from "../restrict-private-file.js";
10
11
  import { encryptSecret, decryptSecret } from "./crypto.js";
11
12
  import { deriveAddresses, newMnemonic, isValidMnemonic, } from "../wallet/derive.js";
12
13
  import { logDebug, logError, logInfo } from "../log.js";
@@ -41,12 +42,7 @@ function saveKeystore(ks) {
41
42
  ensureDir();
42
43
  const path = keystorePath();
43
44
  writeFileSync(path, JSON.stringify(ks, null, 2), { mode: 0o600 });
44
- try {
45
- chmodSync(path, 0o600);
46
- }
47
- catch {
48
- // best effort on platforms without POSIX perms
49
- }
45
+ restrictPrivateFile(path);
50
46
  logInfo("keystore.save", {
51
47
  path,
52
48
  walletCount: ks.wallets.length,
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/keystore/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/keystore/store.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,16 @@ export interface WalletPolicy {
4
4
  enabled: boolean;
5
5
  /** If true, send_transfer and execute_swap are rejected. */
6
6
  readOnly?: boolean;
7
- /** Max amount per send_transfer or execute_swap (decimal string, asset units). */
8
- maxPerTx?: string;
7
+ /**
8
+ * Max USD value per send_transfer or execute_swap (decimal string, e.g. "50").
9
+ * Converted at the moment of the operation via the rates backend; if the rate
10
+ * is unavailable the operation is rejected (fail closed).
11
+ */
12
+ maxPerTxUsd?: string;
9
13
  /**
10
14
  * Allowed transfer destinations. Empty/undefined = no whitelist.
11
- * When set, execute_swap is rejected (swap routers are not on this list).
15
+ * Applies to send_transfer only; execute_swap is exempt because the bought
16
+ * asset is always paid out to the wallet's own keystore address.
12
17
  */
13
18
  allowedRecipients?: string[];
14
19
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Machine-local secrets and install identity. Generated on first use and stored
3
- * under the keystore directory (0600). Not written to User env, mcp.json, or
3
+ * under the keystore directory (owner-only). Not written to User env, mcp.json, or
4
4
  * the plugin dashboard.
5
5
  *
6
6
  * Env vars still win when set to a real value. Unexpanded `${VAR}` placeholders
@@ -8,7 +8,7 @@
8
8
  */
9
9
  export declare function resolveKeystoreDir(): string;
10
10
  export declare function isUnsetSecret(value: string | undefined): boolean;
11
- /** x-api-key for Relay / Swap Proxy. UUID, stable per machine directory. */
11
+ /** x-api-key for relay and swap APIs. UUID, stable per machine directory. */
12
12
  export declare function resolveRelayApiKey(): string;
13
13
  /** Keystore wrapping secret. Not the recovery phrase. */
14
14
  export declare function resolveKeystorePassphrase(): string;
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * Machine-local secrets and install identity. Generated on first use and stored
3
- * under the keystore directory (0600). Not written to User env, mcp.json, or
3
+ * under the keystore directory (owner-only). Not written to User env, mcp.json, or
4
4
  * the plugin dashboard.
5
5
  *
6
6
  * Env vars still win when set to a real value. Unexpanded `${VAR}` placeholders
7
7
  * (Claude Code when the shell var is missing) are treated as unset.
8
8
  */
9
- import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
10
  import { join } from "node:path";
11
11
  import { randomBytes, randomUUID } from "node:crypto";
12
+ import { restrictPrivateFile } from "./restrict-private-file.js";
12
13
  const RELAY_KEY_FILE = "relay-api-key";
13
14
  const PASSPHRASE_FILE = "keystore-passphrase";
14
15
  const DEVICE_ID_FILE = "device-id";
@@ -41,15 +42,10 @@ function readOrCreate(filename, generate) {
41
42
  }
42
43
  const value = generate();
43
44
  writeFileSync(path, `${value}\n`, { mode: 0o600 });
44
- try {
45
- chmodSync(path, 0o600);
46
- }
47
- catch {
48
- // best effort on platforms without POSIX perms
49
- }
45
+ restrictPrivateFile(path);
50
46
  return value;
51
47
  }
52
- /** x-api-key for Relay / Swap Proxy. UUID, stable per machine directory. */
48
+ /** x-api-key for relay and swap APIs. UUID, stable per machine directory. */
53
49
  export function resolveRelayApiKey() {
54
50
  const fromEnv = process.env.IW_RELAY_API_KEY;
55
51
  if (!isUnsetSecret(fromEnv))
@@ -1 +1 @@
1
- {"version":3,"file":"local-secrets.js","sourceRoot":"","sources":["../src/local-secrets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-secrets.js","sourceRoot":"","sources":["../src/local-secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Canonical network identifiers used across the server. No baked env. */
2
+ export declare const EVM_NETWORKS: readonly ["ethereum", "bsc", "polygon", "base", "arbitrum", "optimism", "avalanche"];
3
+ export declare const NON_EVM_NETWORKS: readonly ["tron", "bitcoin", "litecoin", "doge", "solana", "ton", "xrp"];
4
+ export declare const ALL_NETWORKS: readonly ["ethereum", "bsc", "polygon", "base", "arbitrum", "optimism", "avalanche", "tron", "bitcoin", "litecoin", "doge", "solana", "ton", "xrp"];
5
+ export type NetworkId = (typeof ALL_NETWORKS)[number];
@@ -0,0 +1,21 @@
1
+ /** Canonical network identifiers used across the server. No baked env. */
2
+ export const EVM_NETWORKS = [
3
+ "ethereum",
4
+ "bsc",
5
+ "polygon",
6
+ "base",
7
+ "arbitrum",
8
+ "optimism",
9
+ "avalanche",
10
+ ];
11
+ export const NON_EVM_NETWORKS = [
12
+ "tron",
13
+ "bitcoin",
14
+ "litecoin",
15
+ "doge",
16
+ "solana",
17
+ "ton",
18
+ "xrp",
19
+ ];
20
+ export const ALL_NETWORKS = [...EVM_NETWORKS, ...NON_EVM_NETWORKS];
21
+ //# sourceMappingURL=networks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.js","sourceRoot":"","sources":["../src/networks.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU;IACV,KAAK;IACL,SAAS;IACT,MAAM;IACN,UAAU;IACV,UAAU;IACV,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,QAAQ;IACR,KAAK;IACL,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,gBAAgB,CAAU,CAAC"}
package/dist/policy.d.ts CHANGED
@@ -1,24 +1,54 @@
1
1
  /**
2
2
  * Optional per-wallet spending policy. Disabled by default (sends autonomously).
3
3
  * When `policy.enabled` is set, both `send_transfer` and `execute_swap` check it
4
- * before signing.
4
+ * before signing. `maxPerTxUsd` converts the amount via the rates backend at the
5
+ * moment of the operation and fails closed when no rate is available.
5
6
  */
6
7
  import type { WalletEntry, WalletPolicy } from "./keystore/types.js";
7
8
  import type { NetworkId } from "./config.js";
8
9
  export interface PolicyCheck {
9
10
  kind: "transfer" | "swap";
10
11
  network: NetworkId;
11
- /** Decimal string in asset units. Required to enforce `maxPerTx`. */
12
- amount?: string;
13
12
  /** Transfer destination. Ignored for swaps. */
14
13
  toAddress?: string;
15
14
  }
15
+ export interface UsdLimitCheck {
16
+ kind: "transfer" | "swap";
17
+ network: NetworkId;
18
+ /** Decimal string in asset units (final amount that will be signed). */
19
+ amount: string;
20
+ /** Asset symbol, used for catalog fallback matching and messages. */
21
+ symbol?: string;
22
+ /** Token contract. Omit for the native coin. */
23
+ tokenAddress?: string;
24
+ correlationId?: string;
25
+ }
16
26
  /**
17
27
  * Compare two non-negative decimal strings without floating point.
18
28
  * Returns < 0 if a < b, 0 if equal, > 0 if a > b.
19
29
  */
20
30
  export declare function compareDecimalAmount(a: string, b: string): number;
31
+ /** Render a float (e.g. a JSON rate) as a plain decimal string, no exponent. */
32
+ export declare function numberToDecimalString(n: number): string;
33
+ /** Multiply two non-negative decimal strings exactly (BigInt, no float). */
34
+ export declare function multiplyDecimalAmounts(a: string, b: string): string;
21
35
  /** Always-present policy for `list_wallets` (`enabled: false` when unset). */
22
36
  export declare function listWalletPolicy(policy: WalletPolicy | undefined): WalletPolicy;
23
37
  /** Throws with a clear message if the operation violates the wallet policy. */
24
38
  export declare function enforcePolicy(entry: WalletEntry, check: PolicyCheck): void;
39
+ /** Pure part of the USD check: amount × rate vs limit. Throws on violation. */
40
+ export declare function assertUsdWithinLimit(opts: {
41
+ wallet: string;
42
+ kind: "transfer" | "swap";
43
+ amount: string;
44
+ rate: number;
45
+ maxPerTxUsd: string;
46
+ assetLabel: string;
47
+ }): {
48
+ usdValue: string;
49
+ };
50
+ /**
51
+ * Enforce `maxPerTxUsd` right before signing. Fail closed: if the limit is set
52
+ * and the USD rate cannot be resolved, the operation is rejected.
53
+ */
54
+ export declare function enforceUsdLimit(entry: WalletEntry, check: UsdLimitCheck): Promise<void>;