@ironwallet/mcp-server 1.1.0 → 1.2.1
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/README.md +11 -4
- package/dist/api/balances.d.ts +1 -0
- package/dist/api/balances.js +1 -1
- package/dist/api/balances.js.map +1 -1
- package/dist/api/history/index.d.ts +49 -0
- package/dist/api/history/index.js +209 -0
- package/dist/api/history/index.js.map +1 -0
- package/dist/api/history/merge.d.ts +63 -0
- package/dist/api/history/merge.js +208 -0
- package/dist/api/history/merge.js.map +1 -0
- package/dist/api/history/normalize.d.ts +37 -0
- package/dist/api/history/normalize.js +149 -0
- package/dist/api/history/normalize.js.map +1 -0
- package/dist/api/history/pace.d.ts +21 -0
- package/dist/api/history/pace.js +40 -0
- package/dist/api/history/pace.js.map +1 -0
- package/dist/api/history/providers/blockcypher.d.ts +24 -0
- package/dist/api/history/providers/blockcypher.js +70 -0
- package/dist/api/history/providers/blockcypher.js.map +1 -0
- package/dist/api/history/providers/esplora.d.ts +41 -0
- package/dist/api/history/providers/esplora.js +100 -0
- package/dist/api/history/providers/esplora.js.map +1 -0
- package/dist/api/history/providers/etherscan.d.ts +36 -0
- package/dist/api/history/providers/etherscan.js +118 -0
- package/dist/api/history/providers/etherscan.js.map +1 -0
- package/dist/api/history/providers/nodereal.d.ts +27 -0
- package/dist/api/history/providers/nodereal.js +93 -0
- package/dist/api/history/providers/nodereal.js.map +1 -0
- package/dist/api/history/providers/solana.d.ts +47 -0
- package/dist/api/history/providers/solana.js +211 -0
- package/dist/api/history/providers/solana.js.map +1 -0
- package/dist/api/history/providers/ton-shared.d.ts +18 -0
- package/dist/api/history/providers/ton-shared.js +38 -0
- package/dist/api/history/providers/ton-shared.js.map +1 -0
- package/dist/api/history/providers/tonapi.d.ts +52 -0
- package/dist/api/history/providers/tonapi.js +183 -0
- package/dist/api/history/providers/tonapi.js.map +1 -0
- package/dist/api/history/providers/toncenter.d.ts +55 -0
- package/dist/api/history/providers/toncenter.js +191 -0
- package/dist/api/history/providers/toncenter.js.map +1 -0
- package/dist/api/history/providers/trongrid.d.ts +48 -0
- package/dist/api/history/providers/trongrid.js +144 -0
- package/dist/api/history/providers/trongrid.js.map +1 -0
- package/dist/api/history/providers/tronscan.d.ts +55 -0
- package/dist/api/history/providers/tronscan.js +153 -0
- package/dist/api/history/providers/tronscan.js.map +1 -0
- package/dist/api/history/providers/xrp.d.ts +39 -0
- package/dist/api/history/providers/xrp.js +150 -0
- package/dist/api/history/providers/xrp.js.map +1 -0
- package/dist/api/history/types.d.ts +112 -0
- package/dist/api/history/types.js +27 -0
- package/dist/api/history/types.js.map +1 -0
- package/dist/api/swap.d.ts +2 -0
- package/dist/api/swap.js +24 -10
- package/dist/api/swap.js.map +1 -1
- package/dist/config.d.ts +12 -3
- package/dist/config.js +83 -7
- package/dist/config.js.map +1 -1
- package/dist/consent/copy.d.ts +2 -2
- package/dist/consent/copy.js +2 -1
- package/dist/consent/copy.js.map +1 -1
- package/dist/generated/env-config.js +96 -1
- package/dist/generated/env-config.js.map +1 -1
- package/dist/generated/env-profile.d.ts +7 -0
- package/dist/keystore/store.js +33 -4
- package/dist/keystore/store.js.map +1 -1
- package/dist/local-secrets.d.ts +23 -1
- package/dist/local-secrets.js +36 -2
- package/dist/local-secrets.js.map +1 -1
- package/dist/networks.d.ts +3 -0
- package/dist/networks.js +20 -0
- package/dist/networks.js.map +1 -1
- package/dist/npm-registry.d.ts +45 -0
- package/dist/npm-registry.js +175 -0
- package/dist/npm-registry.js.map +1 -0
- package/dist/policy.d.ts +31 -0
- package/dist/policy.js +95 -0
- package/dist/policy.js.map +1 -1
- package/dist/qr/deposit-qr.d.ts +21 -1
- package/dist/qr/deposit-qr.js +100 -21
- package/dist/qr/deposit-qr.js.map +1 -1
- package/dist/qr/font.js +3 -0
- package/dist/qr/font.js.map +1 -1
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/definitions.d.ts +23 -1
- package/dist/tools/definitions.js +87 -29
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/helpers.d.ts +10 -0
- package/dist/tools/helpers.js +26 -0
- package/dist/tools/helpers.js.map +1 -1
- package/dist/tools/history.d.ts +7 -0
- package/dist/tools/history.js +70 -0
- package/dist/tools/history.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/runtime.d.ts +8 -0
- package/dist/tools/runtime.js +110 -0
- package/dist/tools/runtime.js.map +1 -0
- package/dist/tools/swap.d.ts +9 -1
- package/dist/tools/swap.js +41 -7
- package/dist/tools/swap.js.map +1 -1
- package/dist/tools/transfer.d.ts +1 -1
- package/dist/tools/transfer.js +5 -2
- package/dist/tools/transfer.js.map +1 -1
- package/dist/tools/wallets.js +31 -13
- package/dist/tools/wallets.js.map +1 -1
- package/dist/web/manager.d.ts +6 -0
- package/dist/web/manager.js +149 -8
- package/dist/web/manager.js.map +1 -1
- package/package.json +2 -2
- package/server.json +19 -3
- package/tools.json +99 -20
package/dist/tools/swap.js
CHANGED
|
@@ -3,11 +3,26 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { assertServerWritable, canSwap, parseNetworkId } from "../config.js";
|
|
5
5
|
import { getBalance } from "../api/balances.js";
|
|
6
|
-
import { assetKey, createSwap, estimateSwap, executeSwap, getSwapStatus, listSwapAssetsFrom, listSwapAssetsTo, listSwapNetworks, resolveSwapAsset, } from "../api/swap.js";
|
|
6
|
+
import { assetKey, createSwap, estimateSwap, executeSwap, getSwapStatus, listSwapAssetsFrom, listSwapAssetsTo, listSwapNetworks, resolveSwapAsset, SwapError, } from "../api/swap.js";
|
|
7
7
|
import { signSwapTransactions } from "../signing/swap.js";
|
|
8
8
|
import { enforcePolicy, enforceUsdLimit } from "../policy.js";
|
|
9
9
|
import { logInfo } from "../log.js";
|
|
10
10
|
import { mcpToolConfig, toolDefinition, } from "./definitions.js";
|
|
11
|
+
import { isZeroAmount, requirePositiveAmount } from "./helpers.js";
|
|
12
|
+
/** SWP code for "Swap order with operationId '…' not found". */
|
|
13
|
+
export const SWAP_ORDER_NOT_FOUND = 10999;
|
|
14
|
+
/**
|
|
15
|
+
* Replace the raw 10999 with guidance. The usual causes are an id copied from
|
|
16
|
+
* estimate_swap (a quote, not an order) or an execute_swap that failed before
|
|
17
|
+
* the order was created; neither means the swap service is broken.
|
|
18
|
+
*/
|
|
19
|
+
export function swapOrderNotFoundMessage(operationId) {
|
|
20
|
+
return (`No swap order with operationId "${operationId}". ` +
|
|
21
|
+
"Only execute_swap creates an order that get_swap_status can poll; " +
|
|
22
|
+
"estimate_swap is a quote and has no status. " +
|
|
23
|
+
"If this id came from execute_swap, the order was not created — check " +
|
|
24
|
+
"get_balance / get_transaction_history before deciding whether to swap again.");
|
|
25
|
+
}
|
|
11
26
|
async function enrichAssets(items, addresses) {
|
|
12
27
|
return Promise.all(items.map(async (asset) => {
|
|
13
28
|
const net = parseNetworkId(asset.network);
|
|
@@ -75,11 +90,17 @@ function requireBuyAddress(addresses, network) {
|
|
|
75
90
|
}
|
|
76
91
|
/** Shared prep for estimate_swap / execute_swap (session, maxMode, sides). */
|
|
77
92
|
async function prepareSwapSides(helpers, opts) {
|
|
93
|
+
// Validate before the session so a bad amount fails fast, without a login.
|
|
94
|
+
// With maxMode a zero amount is a placeholder for "use the balance" (that is
|
|
95
|
+
// what the backend did before amounts were validated); keep accepting it.
|
|
96
|
+
let sellAmount;
|
|
97
|
+
if (opts.amount !== undefined && !(opts.maxMode && isZeroAmount(opts.amount))) {
|
|
98
|
+
sellAmount = requirePositiveAmount(opts.amount);
|
|
99
|
+
}
|
|
78
100
|
const { entry, mnemonic, token } = await helpers.session(opts.wallet, opts.correlationId);
|
|
79
101
|
const sell = requireSellAddress(entry.addresses, opts.from.network);
|
|
80
102
|
const buy = requireBuyAddress(entry.addresses, opts.to.network);
|
|
81
103
|
const useMax = Boolean(opts.maxMode);
|
|
82
|
-
let sellAmount = opts.amount;
|
|
83
104
|
if (useMax && !sellAmount) {
|
|
84
105
|
const bal = await getBalance(sell.networkId, sell.address, opts.from.address ?? undefined);
|
|
85
106
|
sellAmount = bal.formatted;
|
|
@@ -172,9 +193,11 @@ export function registerSwapTools(server, helpers) {
|
|
|
172
193
|
to: prep.toSide,
|
|
173
194
|
maxMode: prep.useMax,
|
|
174
195
|
}, { correlationId });
|
|
196
|
+
// Deliberately no operationId here: the quote id is not a swap order
|
|
197
|
+
// and get_swap_status answers 10999 "not found" for it. Only
|
|
198
|
+
// execute_swap returns an id that can be polled.
|
|
175
199
|
return ok({
|
|
176
200
|
correlationId,
|
|
177
|
-
operationId: est.operationId,
|
|
178
201
|
provider: est.provider,
|
|
179
202
|
amountFrom: est.from.amount ?? prep.sellAmount,
|
|
180
203
|
amountTo: est.to.amount,
|
|
@@ -184,7 +207,7 @@ export function registerSwapTools(server, helpers) {
|
|
|
184
207
|
details: est.details,
|
|
185
208
|
from: est.from,
|
|
186
209
|
to: est.to,
|
|
187
|
-
note: "Quote may expire. Call execute_swap to create+sign+broadcast (it performs a fresh estimate).",
|
|
210
|
+
note: "Quote only — nothing was created or sent, and there is no operationId to poll. Quote may expire. Call execute_swap to create+sign+broadcast (it performs a fresh estimate and returns the operationId for get_swap_status).",
|
|
188
211
|
});
|
|
189
212
|
}));
|
|
190
213
|
server.registerTool("execute_swap", mcpToolConfig(toolDefinition("execute_swap")), async ({ wallet, from, to, amount, maxMode }) => withToolLog("execute_swap", { wallet, from, to, amount, maxMode }, async ({ correlationId, started }) => {
|
|
@@ -271,9 +294,20 @@ export function registerSwapTools(server, helpers) {
|
|
|
271
294
|
}));
|
|
272
295
|
server.registerTool("get_swap_status", mcpToolConfig(toolDefinition("get_swap_status")), async ({ wallet, operationId }) => withToolLog("get_swap_status", { wallet, operationId }, async ({ correlationId }) => {
|
|
273
296
|
const { token } = await session(wallet, correlationId);
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
297
|
+
let status;
|
|
298
|
+
try {
|
|
299
|
+
status = await getSwapStatus(token, operationId, {
|
|
300
|
+
correlationId,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
if (e instanceof SwapError && e.code === SWAP_ORDER_NOT_FOUND) {
|
|
305
|
+
throw new Error(swapOrderNotFoundMessage(operationId), {
|
|
306
|
+
cause: e,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
throw e;
|
|
310
|
+
}
|
|
277
311
|
return ok({ correlationId, ...status });
|
|
278
312
|
}));
|
|
279
313
|
}
|
package/dist/tools/swap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/transfer.d.ts
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* MCP tools for balance reads and transfer relay (estimate → sign → forward).
|
|
3
3
|
*/
|
|
4
4
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
import type
|
|
5
|
+
import { type ToolHelpers } from "./helpers.js";
|
|
6
6
|
export declare function registerTransferTools(server: McpServer, helpers: ToolHelpers): void;
|
package/dist/tools/transfer.js
CHANGED
|
@@ -11,6 +11,7 @@ import { tonPublicKeyHex } from "../signing/ton.js";
|
|
|
11
11
|
import { enforcePolicy, enforceUsdLimit } from "../policy.js";
|
|
12
12
|
import { logInfo, logWarn } from "../log.js";
|
|
13
13
|
import { mcpToolConfig, toolDefinition } from "./definitions.js";
|
|
14
|
+
import { requirePositiveAmount } from "./helpers.js";
|
|
14
15
|
/**
|
|
15
16
|
* Estimate a transfer and, if the amount + fee would exceed the balance, reduce
|
|
16
17
|
* the amount to `balance - fee` and re-estimate. Fees for native coins are paid
|
|
@@ -127,10 +128,11 @@ export function registerTransferTools(server, helpers) {
|
|
|
127
128
|
const result = await getBalance(network, address, tokenAddress);
|
|
128
129
|
return ok({ ...result, correlationId });
|
|
129
130
|
}));
|
|
130
|
-
server.registerTool("estimate_transfer", mcpToolConfig(toolDefinition("estimate_transfer")), async ({ wallet, network, to, amount, tokenAddress, memo }) => withToolLog("estimate_transfer", { wallet, network, to, amount, tokenAddress, hasMemo: Boolean(memo) }, async ({ correlationId }) => {
|
|
131
|
+
server.registerTool("estimate_transfer", mcpToolConfig(toolDefinition("estimate_transfer")), async ({ wallet, network, to, amount: rawAmount, tokenAddress, memo }) => withToolLog("estimate_transfer", { wallet, network, to, amount: rawAmount, tokenAddress, hasMemo: Boolean(memo) }, async ({ correlationId }) => {
|
|
131
132
|
if (!canSend(network)) {
|
|
132
133
|
throw new Error(`Sending on "${network}" is not supported.`);
|
|
133
134
|
}
|
|
135
|
+
const amount = requirePositiveAmount(rawAmount);
|
|
134
136
|
const { entry, mnemonic, token } = await session(wallet, correlationId);
|
|
135
137
|
const address = entry.addresses[network];
|
|
136
138
|
const fromPublicKey = network === "ton" ? tonPublicKeyHex(mnemonic) : undefined;
|
|
@@ -151,11 +153,12 @@ export function registerTransferTools(server, helpers) {
|
|
|
151
153
|
correlationId,
|
|
152
154
|
});
|
|
153
155
|
}));
|
|
154
|
-
server.registerTool("send_transfer", mcpToolConfig(toolDefinition("send_transfer")), async ({ wallet, network, to, amount, tokenAddress, memo }) => withToolLog("send_transfer", { wallet, network, to, amount, tokenAddress, hasMemo: Boolean(memo) }, async ({ correlationId, started }) => {
|
|
156
|
+
server.registerTool("send_transfer", mcpToolConfig(toolDefinition("send_transfer")), async ({ wallet, network, to, amount: rawAmount, tokenAddress, memo }) => withToolLog("send_transfer", { wallet, network, to, amount: rawAmount, tokenAddress, hasMemo: Boolean(memo) }, async ({ correlationId, started }) => {
|
|
155
157
|
assertServerWritable("send");
|
|
156
158
|
if (!canSend(network)) {
|
|
157
159
|
throw new Error(`Sending on "${network}" is not supported.`);
|
|
158
160
|
}
|
|
161
|
+
const amount = requirePositiveAmount(rawAmount);
|
|
159
162
|
const { entry, mnemonic, token } = await session(wallet, correlationId);
|
|
160
163
|
const address = entry.addresses[network];
|
|
161
164
|
logInfo("tool.send_transfer.session", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/tools/transfer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAuB,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/tools/transfer.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/wallets.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { createWallets, loadKeystore, resolveEntry, setPolicy } from "../keystore/store.js";
|
|
5
5
|
import { requirePassphrase } from "../passphrase.js";
|
|
6
|
-
import { depositPayload, depositQrUrl, renderDepositQrPng, selectDepositTargets, } from "../qr/deposit-qr.js";
|
|
6
|
+
import { depositCaption, depositLabel, depositPayload, depositQrUrl, renderDepositQrPng, selectDepositTargets, } from "../qr/deposit-qr.js";
|
|
7
7
|
import { ensureManager } from "../web/manager.js";
|
|
8
|
-
import { compareDecimalAmount, listWalletPolicy } from "../policy.js";
|
|
8
|
+
import { compareDecimalAmount, diffWalletPolicy, listWalletPolicy } from "../policy.js";
|
|
9
9
|
import { logInfo, logWarn } from "../log.js";
|
|
10
10
|
import { consentRequiredPayload, hasCurrentConsent, recordConsent } from "../consent/store.js";
|
|
11
11
|
import { mcpToolConfig, toolDefinition } from "./definitions.js";
|
|
@@ -125,14 +125,29 @@ export function registerWalletTools(server, helpers) {
|
|
|
125
125
|
...(recipients.length > 0 ? { allowedRecipients: recipients } : {}),
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
|
+
const diff = diffWalletPolicy(previous, policy);
|
|
128
129
|
setPolicy(entry.name, policy);
|
|
129
130
|
logInfo("tool.set_wallet_policy.ok", {
|
|
130
131
|
correlationId,
|
|
131
132
|
wallet: entry.name,
|
|
132
133
|
previous,
|
|
133
134
|
policy,
|
|
135
|
+
changes: diff.changes,
|
|
136
|
+
removedRestrictions: diff.removedRestrictions,
|
|
134
137
|
});
|
|
135
|
-
|
|
138
|
+
if (diff.warnings.length > 0) {
|
|
139
|
+
logWarn("tool.set_wallet_policy.weakened", {
|
|
140
|
+
correlationId,
|
|
141
|
+
wallet: entry.name,
|
|
142
|
+
removedRestrictions: diff.removedRestrictions,
|
|
143
|
+
warnings: diff.warnings,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Warnings go first so hosts that surface only `note` still show them.
|
|
147
|
+
const notes = [...diff.warnings];
|
|
148
|
+
if (diff.unchanged) {
|
|
149
|
+
notes.push("Policy unchanged: the new policy equals the previous one.");
|
|
150
|
+
}
|
|
136
151
|
if (policy.enabled && policy.allowedRecipients?.length) {
|
|
137
152
|
notes.push("The recipient allow-list applies to send_transfer.");
|
|
138
153
|
}
|
|
@@ -147,6 +162,11 @@ export function registerWalletTools(server, helpers) {
|
|
|
147
162
|
wallet: entry.name,
|
|
148
163
|
previous_policy: previous,
|
|
149
164
|
policy: listWalletPolicy(policy),
|
|
165
|
+
...(diff.unchanged ? {} : { changes: diff.changes }),
|
|
166
|
+
...(diff.removedRestrictions.length > 0
|
|
167
|
+
? { removed_restrictions: diff.removedRestrictions }
|
|
168
|
+
: {}),
|
|
169
|
+
...(diff.warnings.length > 0 ? { warnings: diff.warnings } : {}),
|
|
150
170
|
...(notes.length > 0 ? { note: notes.join(" ") } : {}),
|
|
151
171
|
});
|
|
152
172
|
}));
|
|
@@ -166,9 +186,11 @@ export function registerWalletTools(server, helpers) {
|
|
|
166
186
|
const qrs = [];
|
|
167
187
|
for (const t of targets) {
|
|
168
188
|
const payload = depositPayload(t.network, t.address);
|
|
169
|
-
const png = await renderDepositQrPng(t.address, payload);
|
|
189
|
+
const png = await renderDepositQrPng(t.address, payload, depositCaption(t));
|
|
170
190
|
qrs.push({
|
|
171
191
|
network: t.network,
|
|
192
|
+
label: depositLabel(t),
|
|
193
|
+
...(t.sharedWith?.length ? { sharedWith: t.sharedWith } : {}),
|
|
172
194
|
address: t.address,
|
|
173
195
|
payload,
|
|
174
196
|
png,
|
|
@@ -183,15 +205,11 @@ export function registerWalletTools(server, helpers) {
|
|
|
183
205
|
return ok({
|
|
184
206
|
correlationId,
|
|
185
207
|
wallet: entry.name,
|
|
186
|
-
qrs: qrs.map(({
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
})),
|
|
192
|
-
note: managerUrl
|
|
193
|
-
? "Show the PNG in chat if the host renders it. If the user cannot see the QR, open qr_url (local-only, 15 minutes) and give the address."
|
|
194
|
-
: "Show the PNG in chat if the host renders it. If the user cannot see the QR, call open_wallet_manager and use the QR button next to the address.",
|
|
208
|
+
qrs: qrs.map(({ png: _png, ...rest }) => rest),
|
|
209
|
+
note: "Each PNG carries the network name above the code and the address below it; images are in the same order as qrs. When showing more than one, still name the network (label) next to each image. " +
|
|
210
|
+
(managerUrl
|
|
211
|
+
? "If the user cannot see the QR, open qr_url (local-only, 15 minutes) and give the address."
|
|
212
|
+
: "If the user cannot see the QR, call open_wallet_manager and use the QR button next to the address."),
|
|
195
213
|
}, qrs.map((q) => ({
|
|
196
214
|
type: "image",
|
|
197
215
|
data: q.png.toString("base64"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../src/tools/wallets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../src/tools/wallets.ts"],"names":[],"mappings":"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"}
|
package/dist/web/manager.d.ts
CHANGED
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
*
|
|
11
11
|
* The keystore passphrase is resolved locally (generated on first use). Forms
|
|
12
12
|
* only ask for wallet name / mnemonic / count.
|
|
13
|
+
*
|
|
14
|
+
* Deleting a wallet is a manager-only action (no MCP tool): it is irreversible
|
|
15
|
+
* and destroys the local copy of a seed, so it needs a human on a separate
|
|
16
|
+
* confirmation page rather than an agent acting on a chat phrase.
|
|
13
17
|
*/
|
|
18
|
+
/** Stop the manager now instead of waiting for the inactivity timeout (tests, shutdown). */
|
|
19
|
+
export declare function closeManager(): void;
|
|
14
20
|
/** Start the manager (or reuse a running one) and return its base URL. */
|
|
15
21
|
export declare function ensureManager(): Promise<string>;
|
package/dist/web/manager.js
CHANGED
|
@@ -10,15 +10,19 @@
|
|
|
10
10
|
*
|
|
11
11
|
* The keystore passphrase is resolved locally (generated on first use). Forms
|
|
12
12
|
* only ask for wallet name / mnemonic / count.
|
|
13
|
+
*
|
|
14
|
+
* Deleting a wallet is a manager-only action (no MCP tool): it is irreversible
|
|
15
|
+
* and destroys the local copy of a seed, so it needs a human on a separate
|
|
16
|
+
* confirmation page rather than an agent acting on a chat phrase.
|
|
13
17
|
*/
|
|
14
18
|
import { createServer } from "node:http";
|
|
15
19
|
import { randomBytes } from "node:crypto";
|
|
16
20
|
import { readFileSync } from "node:fs";
|
|
17
21
|
import { fileURLToPath } from "node:url";
|
|
18
|
-
import { loadKeystore, importWallet, createWallets, revealMnemonic, markBackedUp, } from "../keystore/store.js";
|
|
22
|
+
import { loadKeystore, getEntry, importWallet, createWallets, revealMnemonic, markBackedUp, removeWallet, } from "../keystore/store.js";
|
|
19
23
|
import { requirePassphrase } from "../passphrase.js";
|
|
20
24
|
import { logError, logInfo } from "../log.js";
|
|
21
|
-
import { depositPayload, renderDepositQrPng, uniqueDepositTargets, walletOwnsDeposit, } from "../qr/deposit-qr.js";
|
|
25
|
+
import { depositCaption, depositPayload, renderDepositQrPng, uniqueDepositTargets, walletOwnsDeposit, } from "../qr/deposit-qr.js";
|
|
22
26
|
import { CONSENT_BULLETS, CONSENT_CHECKBOX, CONSENT_LEAD, CONSENT_TITLE, } from "../consent/copy.js";
|
|
23
27
|
import { hasCurrentConsent, recordConsent } from "../consent/store.js";
|
|
24
28
|
const INACTIVITY_MS = 15 * 60 * 1000;
|
|
@@ -31,6 +35,10 @@ function escapeHtml(s) {
|
|
|
31
35
|
.replace(/>/g, ">")
|
|
32
36
|
.replace(/"/g, """);
|
|
33
37
|
}
|
|
38
|
+
/** JS string literal safe to embed inside an inline <script> (no `</script>` break-out). */
|
|
39
|
+
function jsString(s) {
|
|
40
|
+
return JSON.stringify(s).replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/\u2028|\u2029/g, (c) => `\\u${c.charCodeAt(0).toString(16)}`);
|
|
41
|
+
}
|
|
34
42
|
function armInactivityTimer() {
|
|
35
43
|
if (inactivityTimer)
|
|
36
44
|
clearTimeout(inactivityTimer);
|
|
@@ -189,6 +197,13 @@ const STYLE = `
|
|
|
189
197
|
cursor:pointer; box-shadow:none;
|
|
190
198
|
}
|
|
191
199
|
button.ghost:hover { border-color:var(--primary); }
|
|
200
|
+
button.ghost.danger { color:var(--danger); }
|
|
201
|
+
button.ghost.danger:hover { border-color:var(--danger); }
|
|
202
|
+
button.btn.danger { background:var(--danger); }
|
|
203
|
+
.notice {
|
|
204
|
+
background:var(--success-bg); color:var(--success); border-radius:14px;
|
|
205
|
+
padding:12px 16px; margin:0 0 16px; font-size:14px; font-weight:600;
|
|
206
|
+
}
|
|
192
207
|
|
|
193
208
|
code { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; }
|
|
194
209
|
ol.words {
|
|
@@ -283,11 +298,58 @@ function walletCard(token, w) {
|
|
|
283
298
|
<input type="hidden" name="name" value="${escapeHtml(w.name)}">
|
|
284
299
|
<button class="ghost" type="submit">Reveal phrase</button>
|
|
285
300
|
</form>
|
|
301
|
+
<form method="POST" action="/${token}/delete" style="margin:0">
|
|
302
|
+
<input type="hidden" name="name" value="${escapeHtml(w.name)}">
|
|
303
|
+
<button class="ghost danger" type="submit">Delete</button>
|
|
304
|
+
</form>
|
|
286
305
|
</div>
|
|
287
306
|
</div>
|
|
288
307
|
${addrs}
|
|
289
308
|
</div>`;
|
|
290
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* Deletion is confirmed on a separate page, never inline: the user retypes the
|
|
312
|
+
* wallet name, and for a wallet that was never backed up also acknowledges that
|
|
313
|
+
* the recovery phrase is about to be destroyed. The server re-checks both.
|
|
314
|
+
*/
|
|
315
|
+
function deleteConfirmPage(token, w, notice = "") {
|
|
316
|
+
const err = notice ? `<p class="err">${escapeHtml(notice)}</p>` : "";
|
|
317
|
+
const seedWarning = w.backedUp
|
|
318
|
+
? ""
|
|
319
|
+
: `<label class="consent-check">
|
|
320
|
+
<input id="delete-seed" type="checkbox" name="lose_seed" value="1" required>
|
|
321
|
+
<span>This wallet was never backed up. Deleting it destroys the only copy of its recovery phrase. I understand any funds on these addresses will be unrecoverable.</span>
|
|
322
|
+
</label>`;
|
|
323
|
+
return layout(token, `Delete "${w.name}"`, `<div class="card">
|
|
324
|
+
<h2 style="margin-top:0" class="err">Delete "${escapeHtml(w.name)}"?</h2>
|
|
325
|
+
<p>This removes the encrypted seed of this wallet from this machine. Funds are not moved: anything on these addresses stays on-chain and can only be reached again by importing the recovery phrase. The manager does not check balances before deleting.</p>
|
|
326
|
+
${addressesBlock(token, w.addresses)}
|
|
327
|
+
${err}
|
|
328
|
+
<form method="POST" action="/${token}/delete/confirm" id="delete-form">
|
|
329
|
+
<input type="hidden" name="name" value="${escapeHtml(w.name)}">
|
|
330
|
+
${seedWarning}
|
|
331
|
+
<label>Type the wallet name to confirm</label>
|
|
332
|
+
<input id="delete-confirm" name="confirm" autocomplete="off" spellcheck="false" placeholder="${escapeHtml(w.name)}" required>
|
|
333
|
+
<div class="consent-actions" style="margin-top:16px">
|
|
334
|
+
<button class="btn danger" id="delete-go" type="submit" disabled>Delete wallet</button>
|
|
335
|
+
<a class="back" href="/${token}">Cancel</a>
|
|
336
|
+
</div>
|
|
337
|
+
</form>
|
|
338
|
+
</div>
|
|
339
|
+
<script>
|
|
340
|
+
(function(){
|
|
341
|
+
var name = ${jsString(w.name)};
|
|
342
|
+
var input = document.getElementById('delete-confirm');
|
|
343
|
+
var seed = document.getElementById('delete-seed');
|
|
344
|
+
var go = document.getElementById('delete-go');
|
|
345
|
+
if (!input || !go) return;
|
|
346
|
+
function sync(){ go.disabled = input.value.trim() !== name || (seed ? !seed.checked : false); }
|
|
347
|
+
input.addEventListener('input', sync);
|
|
348
|
+
if (seed) seed.addEventListener('change', sync);
|
|
349
|
+
sync();
|
|
350
|
+
})();
|
|
351
|
+
</script>`, false);
|
|
352
|
+
}
|
|
291
353
|
function netLabel(net) {
|
|
292
354
|
const map = {
|
|
293
355
|
ethereum: "EVM",
|
|
@@ -361,7 +423,8 @@ function dashboard(token, notice = "") {
|
|
|
361
423
|
const list = ks.wallets.length
|
|
362
424
|
? ks.wallets.map((w) => walletCard(token, w)).join("")
|
|
363
425
|
: '<div class="empty">No wallets yet. Import or create one below.</div>';
|
|
364
|
-
|
|
426
|
+
const banner = notice ? `<div class="notice">${escapeHtml(notice)}</div>` : "";
|
|
427
|
+
return layout(token, "IronWallet manager", `${banner}
|
|
365
428
|
<div class="card">
|
|
366
429
|
<h2>Your wallets</h2>
|
|
367
430
|
<p class="section-hint">${ks.wallets.length} wallet${ks.wallets.length === 1 ? "" : "s"} · Copy or QR to receive</p>
|
|
@@ -401,6 +464,20 @@ function wordsBlock(mnemonic) {
|
|
|
401
464
|
function addressesBlock(token, addresses) {
|
|
402
465
|
return renderAddresses(token, addresses);
|
|
403
466
|
}
|
|
467
|
+
/**
|
|
468
|
+
* POST → 303 → GET so the browser lands on a real, refreshable URL. Rendering
|
|
469
|
+
* the dashboard straight from the POST left the tab on /consent, where Refresh
|
|
470
|
+
* either re-posted the form or (Safari, bfcache) showed a stale wallet list.
|
|
471
|
+
*/
|
|
472
|
+
function redirect(res, location) {
|
|
473
|
+
res.writeHead(303, {
|
|
474
|
+
Location: location,
|
|
475
|
+
"Cache-Control": "no-store, no-cache, must-revalidate, private",
|
|
476
|
+
Pragma: "no-cache",
|
|
477
|
+
Expires: "0",
|
|
478
|
+
});
|
|
479
|
+
res.end();
|
|
480
|
+
}
|
|
404
481
|
function html(res, status, body) {
|
|
405
482
|
res.writeHead(status, {
|
|
406
483
|
"Content-Type": "text/html; charset=utf-8",
|
|
@@ -438,6 +515,10 @@ function serveAsset(res, name) {
|
|
|
438
515
|
return false;
|
|
439
516
|
}
|
|
440
517
|
}
|
|
518
|
+
/** Stop the manager now instead of waiting for the inactivity timeout (tests, shutdown). */
|
|
519
|
+
export function closeManager() {
|
|
520
|
+
shutdown();
|
|
521
|
+
}
|
|
441
522
|
/** Start the manager (or reuse a running one) and return its base URL. */
|
|
442
523
|
export async function ensureManager() {
|
|
443
524
|
if (current) {
|
|
@@ -461,7 +542,12 @@ export async function ensureManager() {
|
|
|
461
542
|
void (async () => {
|
|
462
543
|
try {
|
|
463
544
|
if (method === "GET" && sub === "/") {
|
|
464
|
-
|
|
545
|
+
if (!hasCurrentConsent()) {
|
|
546
|
+
html(res, 200, consentPage(token));
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
const deleted = new URL(req.url ?? "/", "http://127.0.0.1").searchParams.get("deleted");
|
|
550
|
+
html(res, 200, dashboard(token, deleted ? `Deleted "${deleted}".` : ""));
|
|
465
551
|
return;
|
|
466
552
|
}
|
|
467
553
|
if (method === "POST" && sub === "/consent") {
|
|
@@ -472,7 +558,13 @@ export async function ensureManager() {
|
|
|
472
558
|
}
|
|
473
559
|
recordConsent("manager");
|
|
474
560
|
logInfo("manager.consent.ok", {});
|
|
475
|
-
|
|
561
|
+
redirect(res, `${base}/`);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
// A stale /consent URL (bookmark, history, refresh after the redirect
|
|
565
|
+
// was blocked) should land on the live dashboard, not on 404.
|
|
566
|
+
if (method === "GET" && sub === "/consent") {
|
|
567
|
+
redirect(res, `${base}/`);
|
|
476
568
|
return;
|
|
477
569
|
}
|
|
478
570
|
if (method === "GET" && sub.startsWith("/assets/")) {
|
|
@@ -486,12 +578,15 @@ export async function ensureManager() {
|
|
|
486
578
|
const parsed = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
487
579
|
const network = parsed.searchParams.get("network") ?? "";
|
|
488
580
|
const address = parsed.searchParams.get("address") ?? "";
|
|
489
|
-
const
|
|
490
|
-
if (!
|
|
581
|
+
const owner = loadKeystore().wallets.find((w) => walletOwnsDeposit(w.addresses, network, address));
|
|
582
|
+
if (!owner) {
|
|
491
583
|
html(res, 404, layout(token, "Not found", `<div class="card"><p class="err">Unknown address.</p></div>`));
|
|
492
584
|
return;
|
|
493
585
|
}
|
|
494
|
-
|
|
586
|
+
// The dashboard lists one row per address (EVM collapsed), so the
|
|
587
|
+
// caption should say the same thing the row does.
|
|
588
|
+
const target = uniqueDepositTargets(owner.addresses).find((t) => t.network === network && t.address === address) ?? { network: network, address };
|
|
589
|
+
const png = await renderDepositQrPng(address, depositPayload(network, address), depositCaption(target));
|
|
495
590
|
res.writeHead(200, {
|
|
496
591
|
"Content-Type": "image/png",
|
|
497
592
|
"Cache-Control": "no-store, no-cache, must-revalidate, private",
|
|
@@ -544,6 +639,52 @@ export async function ensureManager() {
|
|
|
544
639
|
html(res, 200, layout(token, "Backup", `<div class="card"><h2 style="margin-top:0">Recovery phrase for "${escapeHtml(name)}"</h2><p class="warn">Anyone with these words controls the funds. Keep them offline.</p>${wordsBlock(mnemonic)}</div>`));
|
|
545
640
|
return;
|
|
546
641
|
}
|
|
642
|
+
// Step 1: the Delete button on a card only opens the confirmation page.
|
|
643
|
+
if (method === "POST" && sub === "/delete") {
|
|
644
|
+
if (!hasCurrentConsent()) {
|
|
645
|
+
html(res, 403, consentPage(token, "Accept the disclaimer before deleting a wallet."));
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
const form = await readForm(req);
|
|
649
|
+
const entry = getEntry(form.name ?? "");
|
|
650
|
+
if (!entry) {
|
|
651
|
+
redirect(res, `${base}/`);
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
html(res, 200, deleteConfirmPage(token, entry));
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
// Step 2: typed name (and, for never-backed-up wallets, the seed
|
|
658
|
+
// acknowledgement) are validated here regardless of the page's JS.
|
|
659
|
+
if (method === "POST" && sub === "/delete/confirm") {
|
|
660
|
+
if (!hasCurrentConsent()) {
|
|
661
|
+
html(res, 403, consentPage(token, "Accept the disclaimer before deleting a wallet."));
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
const form = await readForm(req);
|
|
665
|
+
const entry = getEntry(form.name ?? "");
|
|
666
|
+
if (!entry) {
|
|
667
|
+
redirect(res, `${base}/`);
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
if ((form.confirm ?? "").trim() !== entry.name) {
|
|
671
|
+
html(res, 400, deleteConfirmPage(token, entry, "The name you typed does not match."));
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
if (!entry.backedUp && form.lose_seed !== "1" && form.lose_seed !== "on") {
|
|
675
|
+
html(res, 400, deleteConfirmPage(token, entry, "Confirm that you understand the recovery phrase will be destroyed."));
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
removeWallet(entry.name);
|
|
679
|
+
logInfo("manager.delete.ok", { name: entry.name, backedUp: entry.backedUp });
|
|
680
|
+
redirect(res, `${base}/?deleted=${encodeURIComponent(entry.name)}`);
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
// Stale delete URLs (refresh on the confirmation page) go back to the list.
|
|
684
|
+
if (method === "GET" && (sub === "/delete" || sub === "/delete/confirm")) {
|
|
685
|
+
redirect(res, `${base}/`);
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
547
688
|
html(res, 404, "not found");
|
|
548
689
|
}
|
|
549
690
|
catch (e) {
|