tollkit-wallet 0.2.0 → 0.2.2
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 +63 -4
- package/THIRD_PARTY_NOTICES.md +8 -0
- package/dist/actions.d.ts +196 -16
- package/dist/actions.js +46 -6
- package/dist/actions.js.map +1 -1
- package/dist/ai-icons.d.ts +5 -0
- package/dist/ai-icons.js +3 -0
- package/dist/ai-icons.js.map +1 -0
- package/dist/ai.d.ts +77 -0
- package/dist/ai.js +227 -0
- package/dist/ai.js.map +1 -0
- package/dist/bridge.d.ts +148 -0
- package/dist/bridge.js +460 -0
- package/dist/bridge.js.map +1 -0
- package/dist/buy.d.ts +17 -0
- package/dist/buy.js +23 -0
- package/dist/buy.js.map +1 -0
- package/dist/cli.js +82 -3
- package/dist/cli.js.map +1 -1
- package/dist/connect.d.ts +29 -0
- package/dist/connect.js +227 -0
- package/dist/connect.js.map +1 -0
- package/dist/dapp.d.ts +89 -0
- package/dist/dapp.js +505 -0
- package/dist/dapp.js.map +1 -0
- package/dist/dashboard.d.ts +5 -0
- package/dist/dashboard.js +203 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/elizaos.js +2 -0
- package/dist/elizaos.js.map +1 -1
- package/dist/holdings.d.ts +92 -0
- package/dist/holdings.js +200 -0
- package/dist/holdings.js.map +1 -0
- package/dist/keystore.d.ts +58 -11
- package/dist/keystore.js +87 -11
- package/dist/keystore.js.map +1 -1
- package/dist/ledger.d.ts +1 -1
- package/dist/mcp.d.ts +7 -2
- package/dist/mcp.js +11 -5
- package/dist/mcp.js.map +1 -1
- package/dist/netguard.d.ts +8 -0
- package/dist/netguard.js +44 -0
- package/dist/netguard.js.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.js +5 -0
- package/dist/paths.js.map +1 -1
- package/dist/policy.d.ts +4 -4
- package/dist/rules.d.ts +11 -2
- package/dist/rules.js +23 -1
- package/dist/rules.js.map +1 -1
- package/dist/sell.d.ts +60 -0
- package/dist/sell.js +71 -0
- package/dist/sell.js.map +1 -0
- package/dist/stake.d.ts +84 -0
- package/dist/stake.js +158 -0
- package/dist/stake.js.map +1 -0
- package/dist/telegram.d.ts +2 -0
- package/dist/telegram.js +4 -0
- package/dist/telegram.js.map +1 -1
- package/dist/ui.js +463 -36
- package/dist/ui.js.map +1 -1
- package/dist/wallet.d.ts +57 -2
- package/dist/wallet.js +185 -4
- package/dist/wallet.js.map +1 -1
- package/extension/PRIVACY.md +19 -0
- package/extension/README.md +16 -0
- package/extension/background.js +88 -0
- package/extension/content.js +34 -0
- package/extension/icons/icon.svg +1 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/inpage.js +129 -0
- package/extension/manifest.json +15 -0
- package/extension/popup.html +35 -0
- package/extension/popup.js +39 -0
- package/package.json +3 -2
package/dist/holdings.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every token the wallet holds, with prices and price history, for the dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Finding tokens:
|
|
5
|
+
* Solana getParsedTokenAccountsByOwner for the SPL Token and Token-2022 programs (all mints held).
|
|
6
|
+
* Ethereum Blockscout's public API, GET eth.blockscout.com/api/v2/addresses/{addr}/token-balances (ERC-20s).
|
|
7
|
+
* Base no free, key-less index works here (base.blockscout.com answers a Cloudflare challenge),
|
|
8
|
+
* so the wallet tracks tokens it swaps into and tokens the owner adds by address.
|
|
9
|
+
* Prices and charts: DefiLlama's public coins API (no key):
|
|
10
|
+
* GET coins.llama.fi/prices/current/{chain:address,...} -> price, symbol, decimals
|
|
11
|
+
* GET coins.llama.fi/chart/{coin}?span=&period= -> price points
|
|
12
|
+
* Tokens with no price are counted as hidden (most airdropped spam has none).
|
|
13
|
+
* Only public addresses are sent to these services, never keys.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
import { Connection, PublicKey } from "@solana/web3.js";
|
|
18
|
+
import { Contract, JsonRpcProvider, formatUnits, getAddress } from "ethers";
|
|
19
|
+
import { DEFAULT_RPC, EVM_CHAIN_ID, NATIVE_EVM, WSOL } from "./chains.js";
|
|
20
|
+
import { KNOWN } from "./tokens.js";
|
|
21
|
+
import { walletHome } from "./paths.js";
|
|
22
|
+
const SPL_TOKEN = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; // @solana/spl-token TOKEN_PROGRAM_ID
|
|
23
|
+
const SPL_TOKEN_2022 = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"; // @solana/spl-token TOKEN_2022_PROGRAM_ID
|
|
24
|
+
const LLAMA = "https://coins.llama.fi";
|
|
25
|
+
const LLAMA_CHAIN = { base: "base", ethereum: "ethereum", solana: "solana" };
|
|
26
|
+
const NATIVE_COIN = { base: "coingecko:ethereum", ethereum: "coingecko:ethereum", solana: "coingecko:solana" };
|
|
27
|
+
const ERC20 = ["function balanceOf(address) view returns (uint256)", "function decimals() view returns (uint8)", "function symbol() view returns (string)", "function name() view returns (string)"];
|
|
28
|
+
/** The DefiLlama id for a token: chain:address, or the coin itself for native ETH/SOL. */
|
|
29
|
+
export function coinId(chain, address) {
|
|
30
|
+
if (address === NATIVE_EVM || address === WSOL)
|
|
31
|
+
return NATIVE_COIN[chain];
|
|
32
|
+
return `${LLAMA_CHAIN[chain]}:${address}`;
|
|
33
|
+
}
|
|
34
|
+
const isCore = (chain, addr) => Object.values(KNOWN[chain]).some((k) => k.address.toLowerCase() === addr.toLowerCase());
|
|
35
|
+
/** Tokens the owner added or the wallet swapped into (EVM chains). */
|
|
36
|
+
export class TokenList {
|
|
37
|
+
file;
|
|
38
|
+
constructor(dir) { this.file = path.join(walletHome(dir), "tokens.json"); }
|
|
39
|
+
list() { try {
|
|
40
|
+
return existsSync(this.file) ? JSON.parse(readFileSync(this.file, "utf8")) : {};
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {};
|
|
44
|
+
} }
|
|
45
|
+
add(chain, address) {
|
|
46
|
+
if (chain === "solana" || isCore(chain, address))
|
|
47
|
+
return; // Solana is found automatically; core tokens are always shown
|
|
48
|
+
const l = this.list(), a = getAddress(address);
|
|
49
|
+
if ((l[chain] ?? []).some((x) => x.toLowerCase() === a.toLowerCase()))
|
|
50
|
+
return;
|
|
51
|
+
l[chain] = [...(l[chain] ?? []), a];
|
|
52
|
+
const t = `${this.file}.${process.pid}.tmp`;
|
|
53
|
+
writeFileSync(t, JSON.stringify(l, null, 2));
|
|
54
|
+
renameSync(t, this.file);
|
|
55
|
+
}
|
|
56
|
+
remove(chain, address) {
|
|
57
|
+
const l = this.list();
|
|
58
|
+
l[chain] = (l[chain] ?? []).filter((x) => x.toLowerCase() !== address.toLowerCase());
|
|
59
|
+
const t = `${this.file}.${process.pid}.tmp`;
|
|
60
|
+
writeFileSync(t, JSON.stringify(l, null, 2));
|
|
61
|
+
renameSync(t, this.file);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Reads an ERC-20's symbol, name and decimals; throws if the address isn't one. */
|
|
65
|
+
export async function erc20Info(chain, address, rpc = DEFAULT_RPC[chain]) {
|
|
66
|
+
const c = new Contract(getAddress(address), ERC20, new JsonRpcProvider(rpc, EVM_CHAIN_ID[chain], { staticNetwork: true }));
|
|
67
|
+
const [symbol, decimals, name] = await Promise.all([c.symbol(), c.decimals(), c.name().catch(() => undefined)]);
|
|
68
|
+
return { symbol: String(symbol), decimals: Number(decimals), name: name ? String(name) : undefined };
|
|
69
|
+
}
|
|
70
|
+
export class Holdings {
|
|
71
|
+
o;
|
|
72
|
+
snap = { tokens: [], hidden: 0, at: null, errors: [] };
|
|
73
|
+
timer = null;
|
|
74
|
+
list;
|
|
75
|
+
constructor(o) {
|
|
76
|
+
this.o = o;
|
|
77
|
+
this.list = new TokenList(o.dir);
|
|
78
|
+
}
|
|
79
|
+
get f() { return this.o.fetch ?? fetch; }
|
|
80
|
+
rpc(c) { return this.o.rpc?.[c] ?? DEFAULT_RPC[c]; }
|
|
81
|
+
snapshot() { return this.snap; }
|
|
82
|
+
async getJson(url, timeoutMs = 12_000) {
|
|
83
|
+
const r = await this.f(url, { headers: { accept: "application/json" }, signal: AbortSignal.timeout(timeoutMs) });
|
|
84
|
+
if (!r.ok)
|
|
85
|
+
throw new Error(`HTTP ${r.status}`);
|
|
86
|
+
return r.json();
|
|
87
|
+
}
|
|
88
|
+
async solana() {
|
|
89
|
+
const conn = new Connection(this.rpc("solana"), "confirmed"), owner = new PublicKey(this.o.solana);
|
|
90
|
+
const raw = new Map();
|
|
91
|
+
for (const prog of [SPL_TOKEN, SPL_TOKEN_2022]) {
|
|
92
|
+
const res = await conn.getParsedTokenAccountsByOwner(owner, { programId: new PublicKey(prog) });
|
|
93
|
+
for (const a of res.value) {
|
|
94
|
+
const info = a.account.data.parsed.info, amt = info.tokenAmount;
|
|
95
|
+
if (amt.amount === "0" || isCore("solana", info.mint))
|
|
96
|
+
continue;
|
|
97
|
+
const prev = raw.get(info.mint);
|
|
98
|
+
raw.set(info.mint, { amount: (prev?.amount ?? 0n) + BigInt(amt.amount), decimals: amt.decimals });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return [...raw].map(([mint, v]) => ({ chain: "solana", address: mint, symbol: "", decimals: v.decimals, amount: formatUnits(v.amount, v.decimals) }));
|
|
102
|
+
}
|
|
103
|
+
async ethereumIndex() {
|
|
104
|
+
const rows = await this.getJson(`https://eth.blockscout.com/api/v2/addresses/${this.o.evm}/token-balances`, 25_000);
|
|
105
|
+
return rows.filter((r) => r.token?.type === "ERC-20" && r.value !== "0" && !isCore("ethereum", r.token.address_hash)).map((r) => ({
|
|
106
|
+
chain: "ethereum", address: getAddress(r.token.address_hash), symbol: String(r.token.symbol ?? ""), name: r.token.name ?? undefined,
|
|
107
|
+
decimals: Number(r.token.decimals ?? 18), amount: formatUnits(BigInt(r.value), Number(r.token.decimals ?? 18)), icon: r.token.icon_url ?? undefined,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
async tracked(chain) {
|
|
111
|
+
const addrs = this.list.list()[chain] ?? [];
|
|
112
|
+
const p = new JsonRpcProvider(this.rpc(chain), EVM_CHAIN_ID[chain], { staticNetwork: true });
|
|
113
|
+
const out = [];
|
|
114
|
+
await Promise.all(addrs.map(async (a) => {
|
|
115
|
+
try {
|
|
116
|
+
const c = new Contract(a, ERC20, p);
|
|
117
|
+
const [bal, decimals, symbol] = await Promise.all([c.balanceOf(this.o.evm), c.decimals(), c.symbol()]);
|
|
118
|
+
if (BigInt(bal) > 0n)
|
|
119
|
+
out.push({ chain, address: a, symbol: String(symbol), decimals: Number(decimals), amount: formatUnits(BigInt(bal), Number(decimals)) });
|
|
120
|
+
}
|
|
121
|
+
catch { /* skip a token that doesn't answer */ }
|
|
122
|
+
}));
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
/** Finds holdings on the enabled chains and prices them. */
|
|
126
|
+
async refresh() {
|
|
127
|
+
const chains = this.o.chains(), errors = [];
|
|
128
|
+
const found = [];
|
|
129
|
+
const add = (rows) => { for (const r of rows)
|
|
130
|
+
if (!found.some((x) => x.chain === r.chain && x.address.toLowerCase() === r.address.toLowerCase()))
|
|
131
|
+
found.push(r); };
|
|
132
|
+
await Promise.all(chains.map(async (c) => {
|
|
133
|
+
try {
|
|
134
|
+
if (c === "solana")
|
|
135
|
+
add(await this.solana());
|
|
136
|
+
else {
|
|
137
|
+
if (c === "ethereum") {
|
|
138
|
+
try {
|
|
139
|
+
add(await this.ethereumIndex());
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
errors.push(`ethereum index: ${e.message}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
add(await this.tracked(c));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
errors.push(`${c}: ${e.message}`);
|
|
150
|
+
}
|
|
151
|
+
}));
|
|
152
|
+
let prices = {};
|
|
153
|
+
const ids = found.map((h) => coinId(h.chain, h.address));
|
|
154
|
+
for (let i = 0; i < ids.length; i += 60) {
|
|
155
|
+
try {
|
|
156
|
+
prices = { ...prices, ...(await this.getJson(`${LLAMA}/prices/current/${ids.slice(i, i + 60).join(",")}?searchWidth=6h`)).coins };
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
errors.push(`prices: ${e.message}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 24h change in percent (GET coins.llama.fi/percentage/{coins}?period=24h)
|
|
163
|
+
let pct = {};
|
|
164
|
+
const priced = ids.filter((id) => prices[id]?.price);
|
|
165
|
+
for (let i = 0; i < priced.length; i += 60) {
|
|
166
|
+
try {
|
|
167
|
+
pct = { ...pct, ...(await this.getJson(`${LLAMA}/percentage/${priced.slice(i, i + 60).join(",")}?period=24h`)).coins };
|
|
168
|
+
}
|
|
169
|
+
catch { /* change is optional */ }
|
|
170
|
+
}
|
|
171
|
+
const tokens = found.map((h) => {
|
|
172
|
+
const coin = coinId(h.chain, h.address), p = prices[coin];
|
|
173
|
+
const price = p?.price && p.price > 0 ? p.price : undefined;
|
|
174
|
+
return { ...h, coin, symbol: h.symbol || (p?.symbol ? String(p.symbol).toUpperCase() : `${h.address.slice(0, 4)}…`), price, usd: price !== undefined ? price * Number(h.amount) : undefined, ...(typeof pct[coin] === "number" ? { change_24h: pct[coin] / 100 } : {}) };
|
|
175
|
+
});
|
|
176
|
+
const shown = tokens.filter((t) => t.price !== undefined).sort((a, b) => (b.usd ?? 0) - (a.usd ?? 0));
|
|
177
|
+
this.snap = { tokens: shown, hidden: tokens.length - shown.length, at: new Date().toISOString(), errors };
|
|
178
|
+
}
|
|
179
|
+
start() { if (!this.timer) {
|
|
180
|
+
void this.refresh().catch(() => { });
|
|
181
|
+
this.timer = setInterval(() => void this.refresh().catch(() => { }), this.o.intervalMs ?? 60_000);
|
|
182
|
+
} }
|
|
183
|
+
stop() { if (this.timer)
|
|
184
|
+
clearInterval(this.timer); this.timer = null; }
|
|
185
|
+
}
|
|
186
|
+
/** Ranges for the price chart. DefiLlama span/period pairs, checked against the live API on 2026-10-14. */
|
|
187
|
+
export const CHART_RANGES = { "1D": { span: 24, period: "1h" }, "1W": { span: 42, period: "4h" }, "1M": { span: 30, period: "1d" }, "1Y": { span: 52, period: "1w" } };
|
|
188
|
+
export async function priceChart(coin, range, f = fetch) {
|
|
189
|
+
if (!/^(coingecko:[a-z0-9-]+|(base|ethereum|solana):[0-9A-Za-z]{32,44})$/.test(coin))
|
|
190
|
+
throw new Error("Unknown coin.");
|
|
191
|
+
const r = CHART_RANGES[range];
|
|
192
|
+
if (!r)
|
|
193
|
+
throw new Error("Pick 1D, 1W, 1M or 1Y.");
|
|
194
|
+
const res = await f(`${LLAMA}/chart/${coin}?span=${r.span}&period=${r.period}`, { headers: { accept: "application/json" }, signal: AbortSignal.timeout(12_000) });
|
|
195
|
+
if (!res.ok)
|
|
196
|
+
throw new Error(`Price history isn't available right now (HTTP ${res.status}).`);
|
|
197
|
+
const c = (await res.json())?.coins?.[coin];
|
|
198
|
+
return { coin, symbol: c?.symbol, range, points: (c?.prices ?? []).map((x) => ({ t: Number(x.timestamp), p: Number(x.price) })).filter((x) => x.p > 0) };
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=holdings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"holdings.js","sourceRoot":"","sources":["../src/holdings.ts"],"names":[],"mappings":"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"}
|
package/dist/keystore.d.ts
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
3
3
|
* EVM: the standard Ethereum JSON keystore (ethers v6, scrypt + AES-128-CTR).
|
|
4
4
|
* Solana: the 64-byte secret key, scrypt-derived key + AES-256-GCM.
|
|
5
5
|
* Tollkit never sees either key or the password.
|
|
6
|
+
*
|
|
7
|
+
* New wallets come from a 12-word BIP-39 recovery phrase, derived the way
|
|
8
|
+
* MetaMask and Phantom do it, so the same phrase restores the same addresses
|
|
9
|
+
* there too (checked 2026-10-14):
|
|
10
|
+
* EVM m/44'/60'/0'/0/0 (MetaMask: "default BIP-44 derivation path (m/44'/60'/0'/0)";
|
|
11
|
+
* Phantom default bip44Change "m/44'/60'/0'/0/${index}")
|
|
12
|
+
* Solana m/44'/501'/0'/0' (Phantom default bip44Change "m/44'/501'/${index}'/0'"),
|
|
13
|
+
* ed25519 via SLIP-0010 (hardened only).
|
|
14
|
+
* The phrase is kept encrypted like the keys so the owner can view it again with the password.
|
|
6
15
|
*/
|
|
7
16
|
import { Keypair } from "@solana/web3.js";
|
|
8
17
|
import { Wallet, HDNodeWallet } from "ethers";
|
|
@@ -18,30 +27,67 @@ export interface KeystoreFile {
|
|
|
18
27
|
evm_address: string;
|
|
19
28
|
solana_address: string;
|
|
20
29
|
evm: string;
|
|
21
|
-
solana:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
r: number;
|
|
25
|
-
p: number;
|
|
26
|
-
salt: string;
|
|
27
|
-
iv: string;
|
|
28
|
-
tag: string;
|
|
29
|
-
ct: string;
|
|
30
|
-
};
|
|
30
|
+
solana: Sealed;
|
|
31
|
+
/** The recovery phrase, sealed like the Solana key. Absent on wallets made before 0.2.2 (keys only). */
|
|
32
|
+
phrase?: Sealed;
|
|
31
33
|
}
|
|
34
|
+
type Sealed = {
|
|
35
|
+
kdf: "scrypt";
|
|
36
|
+
N: number;
|
|
37
|
+
r: number;
|
|
38
|
+
p: number;
|
|
39
|
+
salt: string;
|
|
40
|
+
iv: string;
|
|
41
|
+
tag: string;
|
|
42
|
+
ct: string;
|
|
43
|
+
};
|
|
44
|
+
export declare const EVM_PATH = "m/44'/60'/0'/0/0";
|
|
45
|
+
export declare const SOLANA_PATH = "m/44'/501'/0'/0'";
|
|
46
|
+
/** SLIP-0010 ed25519 private key for a hardened-only path, from a BIP-39 seed. */
|
|
47
|
+
export declare function slip10Ed25519(seed: Uint8Array, path: string): Uint8Array;
|
|
48
|
+
/** Both keys from a recovery phrase. Throws on an invalid phrase. */
|
|
49
|
+
export declare function keysFromPhrase(phrase: string): {
|
|
50
|
+
evm: HDNodeWallet;
|
|
51
|
+
solana: Keypair;
|
|
52
|
+
phrase: string;
|
|
53
|
+
};
|
|
54
|
+
export declare function newPhrase(): string;
|
|
32
55
|
export interface Keys {
|
|
33
56
|
evm: Wallet | HDNodeWallet;
|
|
34
57
|
solana: Keypair;
|
|
35
58
|
}
|
|
36
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Make a new wallet from a fresh recovery phrase, restore one from a phrase, or import raw keys.
|
|
61
|
+
* Refuses to overwrite an existing wallet unless `replace` is set, which keeps the old file as keystore.json.replaced-<time>.
|
|
62
|
+
*/
|
|
37
63
|
export declare function createKeystore(password: string, opts?: {
|
|
38
64
|
dir?: string;
|
|
65
|
+
phrase?: string;
|
|
39
66
|
evmPrivateKey?: string;
|
|
40
67
|
solanaSecretKey?: Uint8Array;
|
|
41
68
|
scrypt?: ScryptParams;
|
|
69
|
+
replace?: boolean;
|
|
42
70
|
}): Promise<{
|
|
43
71
|
evm: string;
|
|
44
72
|
solana: string;
|
|
73
|
+
phrase: string | undefined;
|
|
74
|
+
}>;
|
|
75
|
+
/** Whether the owner has confirmed they wrote the backup down. */
|
|
76
|
+
export declare function backupDone(dir?: string): boolean;
|
|
77
|
+
export declare function markBackedUp(dir?: string): void;
|
|
78
|
+
/** Is there a recovery phrase, or only keys (wallets made before 0.2.2)? */
|
|
79
|
+
export declare function backupKind(dir?: string): "phrase" | "keys";
|
|
80
|
+
/**
|
|
81
|
+
* What the owner writes down to restore the wallet: the phrase, or for older wallets
|
|
82
|
+
* the two private keys (EVM hex, Solana base58, the formats other wallets import).
|
|
83
|
+
*/
|
|
84
|
+
export declare function revealBackup(password: string, dir?: string): Promise<{
|
|
85
|
+
kind: "phrase";
|
|
86
|
+
phrase: string;
|
|
87
|
+
} | {
|
|
88
|
+
kind: "keys";
|
|
89
|
+
evm_private_key: string;
|
|
90
|
+
solana_secret_key: string;
|
|
45
91
|
}>;
|
|
46
92
|
export declare function readKeystore(dir?: string): KeystoreFile;
|
|
47
93
|
/** Public addresses only; no password needed. */
|
|
@@ -51,3 +97,4 @@ export declare function addresses(dir?: string): {
|
|
|
51
97
|
};
|
|
52
98
|
/** Unlock both keys. Throws "wrong password" on a bad password. */
|
|
53
99
|
export declare function unlock(password: string, dir?: string): Promise<Keys>;
|
|
100
|
+
export {};
|
package/dist/keystore.js
CHANGED
|
@@ -3,22 +3,64 @@
|
|
|
3
3
|
* EVM: the standard Ethereum JSON keystore (ethers v6, scrypt + AES-128-CTR).
|
|
4
4
|
* Solana: the 64-byte secret key, scrypt-derived key + AES-256-GCM.
|
|
5
5
|
* Tollkit never sees either key or the password.
|
|
6
|
+
*
|
|
7
|
+
* New wallets come from a 12-word BIP-39 recovery phrase, derived the way
|
|
8
|
+
* MetaMask and Phantom do it, so the same phrase restores the same addresses
|
|
9
|
+
* there too (checked 2026-10-14):
|
|
10
|
+
* EVM m/44'/60'/0'/0/0 (MetaMask: "default BIP-44 derivation path (m/44'/60'/0'/0)";
|
|
11
|
+
* Phantom default bip44Change "m/44'/60'/0'/0/${index}")
|
|
12
|
+
* Solana m/44'/501'/0'/0' (Phantom default bip44Change "m/44'/501'/${index}'/0'"),
|
|
13
|
+
* ed25519 via SLIP-0010 (hardened only).
|
|
14
|
+
* The phrase is kept encrypted like the keys so the owner can view it again with the password.
|
|
6
15
|
*/
|
|
7
16
|
import { Keypair } from "@solana/web3.js";
|
|
8
|
-
import { Wallet, encryptKeystoreJson } from "ethers";
|
|
17
|
+
import { Wallet, HDNodeWallet, Mnemonic, encryptKeystoreJson, computeHmac, getBytes, concat, toBeArray, zeroPadValue, encodeBase58, randomBytes as ethersRandom } from "ethers";
|
|
9
18
|
import { createCipheriv, createDecipheriv, randomBytes, scrypt as scryptCb } from "node:crypto";
|
|
10
19
|
import { existsSync, readFileSync, writeFileSync, renameSync } from "node:fs";
|
|
11
20
|
import { files, walletHome } from "./paths.js";
|
|
21
|
+
import path from "node:path";
|
|
12
22
|
export const DEFAULT_SCRYPT = { N: 1 << 17, r: 8, p: 1 };
|
|
23
|
+
export const EVM_PATH = "m/44'/60'/0'/0/0";
|
|
24
|
+
export const SOLANA_PATH = "m/44'/501'/0'/0'";
|
|
25
|
+
/** SLIP-0010 ed25519 private key for a hardened-only path, from a BIP-39 seed. */
|
|
26
|
+
export function slip10Ed25519(seed, path) {
|
|
27
|
+
if (!/^m(\/\d+')*$/.test(path))
|
|
28
|
+
throw new Error("ed25519 paths must be fully hardened, e.g. m/44'/501'/0'/0'");
|
|
29
|
+
let I = getBytes(computeHmac("sha512", new TextEncoder().encode("ed25519 seed"), seed));
|
|
30
|
+
let key = I.slice(0, 32), chain = I.slice(32);
|
|
31
|
+
for (const seg of path.split("/").slice(1)) {
|
|
32
|
+
const index = (Number(seg.slice(0, -1)) + 0x80000000) >>> 0;
|
|
33
|
+
const data = concat([new Uint8Array([0]), key, zeroPadValue(toBeArray(index), 4)]);
|
|
34
|
+
I = getBytes(computeHmac("sha512", chain, data));
|
|
35
|
+
key = I.slice(0, 32);
|
|
36
|
+
chain = I.slice(32);
|
|
37
|
+
}
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
/** Both keys from a recovery phrase. Throws on an invalid phrase. */
|
|
41
|
+
export function keysFromPhrase(phrase) {
|
|
42
|
+
const clean = phrase.trim().toLowerCase().split(/\s+/).join(" ");
|
|
43
|
+
let m;
|
|
44
|
+
try {
|
|
45
|
+
m = Mnemonic.fromPhrase(clean);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new Error("That recovery phrase isn't valid. Check the words and their order.");
|
|
49
|
+
}
|
|
50
|
+
const evm = HDNodeWallet.fromMnemonic(m, EVM_PATH);
|
|
51
|
+
const solana = Keypair.fromSeed(slip10Ed25519(getBytes(m.computeSeed()), SOLANA_PATH));
|
|
52
|
+
return { evm, solana, phrase: m.phrase };
|
|
53
|
+
}
|
|
54
|
+
export function newPhrase() { return Mnemonic.fromEntropy(ethersRandom(16)).phrase; }
|
|
13
55
|
const scrypt = (pw, salt, s) => new Promise((res, rej) => scryptCb(pw, salt, 32, { N: s.N, r: s.r, p: s.p, maxmem: 256 * 1024 * 1024 }, (e, k) => (e ? rej(e) : res(k))));
|
|
14
|
-
async function
|
|
56
|
+
async function seal(secret, pw, s) {
|
|
15
57
|
const salt = randomBytes(16), iv = randomBytes(12);
|
|
16
58
|
const key = await scrypt(pw, salt, s);
|
|
17
59
|
const c = createCipheriv("aes-256-gcm", key, iv);
|
|
18
60
|
const ct = Buffer.concat([c.update(Buffer.from(secret)), c.final()]);
|
|
19
61
|
return { kdf: "scrypt", ...s, salt: salt.toString("hex"), iv: iv.toString("hex"), tag: c.getAuthTag().toString("hex"), ct: ct.toString("hex") };
|
|
20
62
|
}
|
|
21
|
-
async function
|
|
63
|
+
async function openSealed(box, pw) {
|
|
22
64
|
const key = await scrypt(pw, Buffer.from(box.salt, "hex"), { N: box.N, r: box.r, p: box.p });
|
|
23
65
|
const d = createDecipheriv("aes-256-gcm", key, Buffer.from(box.iv, "hex"));
|
|
24
66
|
d.setAuthTag(Buffer.from(box.tag, "hex"));
|
|
@@ -29,21 +71,38 @@ async function openSolana(box, pw) {
|
|
|
29
71
|
catch {
|
|
30
72
|
throw new Error("wrong password");
|
|
31
73
|
}
|
|
32
|
-
return
|
|
74
|
+
return secret;
|
|
33
75
|
}
|
|
76
|
+
const openSolana = async (box, pw) => Keypair.fromSecretKey(new Uint8Array(await openSealed(box, pw)));
|
|
34
77
|
function checkPassword(pw) {
|
|
35
78
|
if (typeof pw !== "string" || pw.length < 12)
|
|
36
79
|
throw new Error("Use a password of at least 12 characters.");
|
|
37
80
|
}
|
|
38
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Make a new wallet from a fresh recovery phrase, restore one from a phrase, or import raw keys.
|
|
83
|
+
* Refuses to overwrite an existing wallet unless `replace` is set, which keeps the old file as keystore.json.replaced-<time>.
|
|
84
|
+
*/
|
|
39
85
|
export async function createKeystore(password, opts = {}) {
|
|
40
86
|
checkPassword(password);
|
|
41
87
|
const f = files(walletHome(opts.dir));
|
|
42
|
-
if (existsSync(f.keystore))
|
|
43
|
-
|
|
88
|
+
if (existsSync(f.keystore)) {
|
|
89
|
+
if (!opts.replace)
|
|
90
|
+
throw new Error(`A wallet already exists at ${f.keystore}. Back it up and remove it first if you want a new one.`);
|
|
91
|
+
// Keep the old wallet's files (renamed, never deleted). Its limits and saved password were sealed with the old password.
|
|
92
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
93
|
+
for (const old of [f.keystore, f.policy, f.backup, path.join(walletHome(opts.dir), "password")])
|
|
94
|
+
if (existsSync(old))
|
|
95
|
+
renameSync(old, `${old}.replaced-${stamp}`);
|
|
96
|
+
}
|
|
44
97
|
const s = opts.scrypt ?? DEFAULT_SCRYPT;
|
|
45
|
-
const
|
|
46
|
-
|
|
98
|
+
const importing = !!(opts.evmPrivateKey || opts.solanaSecretKey);
|
|
99
|
+
if (importing && opts.phrase)
|
|
100
|
+
throw new Error("Give a recovery phrase or keys, not both.");
|
|
101
|
+
if (importing && !(opts.evmPrivateKey && opts.solanaSecretKey))
|
|
102
|
+
throw new Error("Importing keys needs both the EVM private key and the Solana secret key.");
|
|
103
|
+
const fromPhrase = importing ? null : keysFromPhrase(opts.phrase ?? newPhrase());
|
|
104
|
+
const evm = fromPhrase ? fromPhrase.evm : new Wallet(opts.evmPrivateKey);
|
|
105
|
+
const sol = fromPhrase ? fromPhrase.solana : Keypair.fromSecretKey(opts.solanaSecretKey);
|
|
47
106
|
const evmJson = await encryptKeystoreJson({ address: evm.address, privateKey: evm.privateKey }, password, { scrypt: { N: s.N, r: s.r, p: s.p } });
|
|
48
107
|
const ks = {
|
|
49
108
|
version: 1,
|
|
@@ -51,12 +110,29 @@ export async function createKeystore(password, opts = {}) {
|
|
|
51
110
|
evm_address: evm.address,
|
|
52
111
|
solana_address: sol.publicKey.toBase58(),
|
|
53
112
|
evm: evmJson,
|
|
54
|
-
solana: await
|
|
113
|
+
solana: await seal(sol.secretKey, password, s),
|
|
114
|
+
...(fromPhrase ? { phrase: await seal(new TextEncoder().encode(fromPhrase.phrase), password, s) } : {}),
|
|
55
115
|
};
|
|
56
116
|
const tmp = f.keystore + ".tmp";
|
|
57
117
|
writeFileSync(tmp, JSON.stringify(ks, null, 2), { mode: 0o600 });
|
|
58
118
|
renameSync(tmp, f.keystore);
|
|
59
|
-
return { evm: ks.evm_address, solana: ks.solana_address };
|
|
119
|
+
return { evm: ks.evm_address, solana: ks.solana_address, phrase: fromPhrase?.phrase };
|
|
120
|
+
}
|
|
121
|
+
/** Whether the owner has confirmed they wrote the backup down. */
|
|
122
|
+
export function backupDone(dir) { return existsSync(files(walletHome(dir)).backup); }
|
|
123
|
+
export function markBackedUp(dir) { writeFileSync(files(walletHome(dir)).backup, JSON.stringify({ confirmed_at: new Date().toISOString() }) + "\n", { mode: 0o600 }); }
|
|
124
|
+
/** Is there a recovery phrase, or only keys (wallets made before 0.2.2)? */
|
|
125
|
+
export function backupKind(dir) { return readKeystore(dir).phrase ? "phrase" : "keys"; }
|
|
126
|
+
/**
|
|
127
|
+
* What the owner writes down to restore the wallet: the phrase, or for older wallets
|
|
128
|
+
* the two private keys (EVM hex, Solana base58, the formats other wallets import).
|
|
129
|
+
*/
|
|
130
|
+
export async function revealBackup(password, dir) {
|
|
131
|
+
const ks = readKeystore(dir);
|
|
132
|
+
if (ks.phrase)
|
|
133
|
+
return { kind: "phrase", phrase: new TextDecoder().decode(await openSealed(ks.phrase, password)) };
|
|
134
|
+
const k = await unlock(password, dir);
|
|
135
|
+
return { kind: "keys", evm_private_key: k.evm.privateKey, solana_secret_key: encodeBase58(k.solana.secretKey) };
|
|
60
136
|
}
|
|
61
137
|
export function readKeystore(dir) {
|
|
62
138
|
const f = files(walletHome(dir));
|
package/dist/keystore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":"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"}
|
package/dist/ledger.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Policy } from "./policy.js";
|
|
2
|
-
export type Kind = "trade" | "payment" | "withdrawal";
|
|
2
|
+
export type Kind = "trade" | "payment" | "withdrawal" | "stake" | "move" | "dapp";
|
|
3
3
|
export type Status = "pending" | "done" | "failed";
|
|
4
4
|
export interface Entry {
|
|
5
5
|
id: string;
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { TollkitWallet } from "./wallet.js";
|
|
3
|
-
|
|
3
|
+
/** The only tools the wallet's built-in AI chat gets: read, look at prices, and suggest rules for the owner to turn on. */
|
|
4
|
+
export declare const ADVISOR_TOOLS: string[];
|
|
5
|
+
export declare const VERSION = "0.2.2";
|
|
4
6
|
export declare function passwordFromEnv(): string;
|
|
5
|
-
export declare function buildServer(w: TollkitWallet
|
|
7
|
+
export declare function buildServer(w: TollkitWallet, o?: {
|
|
8
|
+
advisor?: boolean;
|
|
9
|
+
}): McpServer;
|
|
6
10
|
export declare function serveStdio(o?: {
|
|
7
11
|
dir?: string;
|
|
12
|
+
advisor?: boolean;
|
|
8
13
|
}): Promise<void>;
|
package/dist/mcp.js
CHANGED
|
@@ -10,8 +10,10 @@ import { readFileSync } from "node:fs";
|
|
|
10
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
12
|
import { TollkitWallet } from "./wallet.js";
|
|
13
|
-
import { ACTIONS } from "./actions.js";
|
|
14
|
-
|
|
13
|
+
import { ACTIONS, proposeRules } from "./actions.js";
|
|
14
|
+
/** The only tools the wallet's built-in AI chat gets: read, look at prices, and suggest rules for the owner to turn on. */
|
|
15
|
+
export const ADVISOR_TOOLS = ["wallet_status", "wallet_balances", "swap_quote", "receipts", "market_prices", "price_history", "autopilot_rules", "autopilot_propose", "paper_status"];
|
|
16
|
+
export const VERSION = "0.2.2";
|
|
15
17
|
export function passwordFromEnv() {
|
|
16
18
|
const file = process.env.TOLLKIT_WALLET_PASSWORD_FILE;
|
|
17
19
|
if (file)
|
|
@@ -22,21 +24,25 @@ export function passwordFromEnv() {
|
|
|
22
24
|
return pw;
|
|
23
25
|
}
|
|
24
26
|
const json = (v) => ({ content: [{ type: "text", text: JSON.stringify(v, null, 2) }] });
|
|
25
|
-
export function buildServer(w) {
|
|
27
|
+
export function buildServer(w, o = {}) {
|
|
26
28
|
const s = new McpServer({ name: "tollkit-wallet", version: VERSION });
|
|
27
29
|
for (const a of ACTIONS) {
|
|
30
|
+
if (o.advisor && !ADVISOR_TOOLS.includes(a.name))
|
|
31
|
+
continue;
|
|
32
|
+
// In advisor mode suggestions always wait for the owner, whatever agent_rules says.
|
|
33
|
+
const run = o.advisor && a.name === "autopilot_propose" ? (ww, args) => proposeRules(ww, args, { neverAuto: true }) : a.run;
|
|
28
34
|
s.registerTool(a.name, {
|
|
29
35
|
description: a.description,
|
|
30
36
|
inputSchema: a.schema.shape,
|
|
31
37
|
annotations: a.spends ? { destructiveHint: true, openWorldHint: true, idempotentHint: false }
|
|
32
38
|
: /^autopilot_(propose|cancel)$/.test(a.name) ? { readOnlyHint: false, destructiveHint: a.name === "autopilot_propose", openWorldHint: true }
|
|
33
39
|
: { readOnlyHint: true, openWorldHint: !["wallet_status", "receipts", "autopilot_rules", "paper_status"].includes(a.name) },
|
|
34
|
-
}, async (args) => json(await
|
|
40
|
+
}, async (args) => json(await run(w, args ?? {})));
|
|
35
41
|
}
|
|
36
42
|
return s;
|
|
37
43
|
}
|
|
38
44
|
export async function serveStdio(o = {}) {
|
|
39
45
|
const w = await TollkitWallet.open(passwordFromEnv(), { dir: o.dir });
|
|
40
|
-
await buildServer(w).connect(new StdioServerTransport());
|
|
46
|
+
await buildServer(w, { advisor: o.advisor }).connect(new StdioServerTransport());
|
|
41
47
|
}
|
|
42
48
|
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Keeping agent-driven requests on the public internet. */
|
|
2
|
+
/** This computer and private networks (so an agent can't reach the local dashboard or devices). */
|
|
3
|
+
export declare function isLocalUrl(u: string): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* fetch that refuses this computer and private networks, on the first URL and on every redirect
|
|
6
|
+
* (Node's fetch would otherwise follow a redirect to 127.0.0.1 with the same method and headers).
|
|
7
|
+
*/
|
|
8
|
+
export declare function publicFetch(f?: typeof fetch): typeof fetch;
|