tollkit-wallet 0.2.1 → 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.
Files changed (61) hide show
  1. package/README.md +49 -2
  2. package/THIRD_PARTY_NOTICES.md +4 -0
  3. package/dist/actions.d.ts +34 -33
  4. package/dist/actions.js +5 -1
  5. package/dist/actions.js.map +1 -1
  6. package/dist/bridge.d.ts +148 -0
  7. package/dist/bridge.js +460 -0
  8. package/dist/bridge.js.map +1 -0
  9. package/dist/buy.d.ts +17 -0
  10. package/dist/buy.js +23 -0
  11. package/dist/buy.js.map +1 -0
  12. package/dist/cli.js +68 -2
  13. package/dist/cli.js.map +1 -1
  14. package/dist/dapp.d.ts +89 -0
  15. package/dist/dapp.js +505 -0
  16. package/dist/dapp.js.map +1 -0
  17. package/dist/dashboard.d.ts +2 -0
  18. package/dist/dashboard.js +145 -2
  19. package/dist/dashboard.js.map +1 -1
  20. package/dist/holdings.d.ts +92 -0
  21. package/dist/holdings.js +200 -0
  22. package/dist/holdings.js.map +1 -0
  23. package/dist/keystore.d.ts +58 -11
  24. package/dist/keystore.js +87 -11
  25. package/dist/keystore.js.map +1 -1
  26. package/dist/ledger.d.ts +1 -1
  27. package/dist/mcp.d.ts +1 -1
  28. package/dist/mcp.js +1 -1
  29. package/dist/netguard.d.ts +8 -0
  30. package/dist/netguard.js +44 -0
  31. package/dist/netguard.js.map +1 -0
  32. package/dist/paths.d.ts +1 -0
  33. package/dist/paths.js +1 -0
  34. package/dist/paths.js.map +1 -1
  35. package/dist/policy.d.ts +4 -4
  36. package/dist/rules.d.ts +4 -4
  37. package/dist/sell.d.ts +60 -0
  38. package/dist/sell.js +71 -0
  39. package/dist/sell.js.map +1 -0
  40. package/dist/stake.d.ts +84 -0
  41. package/dist/stake.js +158 -0
  42. package/dist/stake.js.map +1 -0
  43. package/dist/ui.js +306 -32
  44. package/dist/ui.js.map +1 -1
  45. package/dist/wallet.d.ts +57 -2
  46. package/dist/wallet.js +185 -4
  47. package/dist/wallet.js.map +1 -1
  48. package/extension/PRIVACY.md +19 -0
  49. package/extension/README.md +16 -0
  50. package/extension/background.js +88 -0
  51. package/extension/content.js +34 -0
  52. package/extension/icons/icon.svg +1 -0
  53. package/extension/icons/icon128.png +0 -0
  54. package/extension/icons/icon16.png +0 -0
  55. package/extension/icons/icon32.png +0 -0
  56. package/extension/icons/icon48.png +0 -0
  57. package/extension/inpage.js +129 -0
  58. package/extension/manifest.json +15 -0
  59. package/extension/popup.html +35 -0
  60. package/extension/popup.js +39 -0
  61. package/package.json +3 -2
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Native SOL staking: stake with a validator, unstake, and withdraw once it's free.
3
+ *
4
+ * Checked against primary sources on 2026-10-14:
5
+ * - @solana/web3.js 1.99 StakeProgram.createAccountWithSeed / delegate / deactivate / withdraw (lib/index.d.ts)
6
+ * - getStakeActivation was removed in Agave 2.0 (solana.com/docs/rpc/deprecated/getstakeactivation),
7
+ * so status is worked out here from the delegation's epochs and the current epoch
8
+ * - minimum delegation (getStakeMinimumDelegation) and the stake account's rent reserve
9
+ * (getMinimumBalanceForRentExemption(200)) are always read live, never hard-coded
10
+ * - stake accounts list by the withdraw authority at byte 44 and staker at byte 12 (checked on a live account)
11
+ * - validator names come from on-chain ValidatorInfo in the Config program
12
+ * Stake accounts are made with a seed from the owner's key, so there's no extra key to keep.
13
+ * Staking moves no money out of the wallet's control, so it isn't counted against spending limits,
14
+ * but it needs the password every time and agents can't reach it.
15
+ */
16
+ import { Connection, PublicKey, Transaction, type Keypair } from "@solana/web3.js";
17
+ export declare const CONFIG_PROGRAM: PublicKey;
18
+ export type StakeStatus = "activating" | "active" | "deactivating" | "inactive";
19
+ export interface StakeAccount {
20
+ address: string;
21
+ lamports: number;
22
+ /** Delegated amount (lamports); 0 if never delegated. */
23
+ delegated: number;
24
+ rent_reserve: number;
25
+ status: StakeStatus;
26
+ voter: string | null;
27
+ validator: string | null;
28
+ activation_epoch: number | null;
29
+ deactivation_epoch: number | null;
30
+ }
31
+ export interface Validator {
32
+ vote: string;
33
+ name: string | null;
34
+ commission: number;
35
+ stake_sol: number;
36
+ }
37
+ export interface EpochNow {
38
+ epoch: number;
39
+ slot_index: number;
40
+ slots_in_epoch: number;
41
+ seconds_left: number;
42
+ }
43
+ /** Status from the delegation's epochs. Small stakes move in one epoch; very large network-wide moves can take longer. */
44
+ export declare function stakeStatus(activation: string | number | null, deactivation: string | number | null, epoch: number): StakeStatus;
45
+ type Conn = Pick<Connection, "getEpochInfo" | "getParsedProgramAccounts" | "getStakeMinimumDelegation" | "getMinimumBalanceForRentExemption" | "getVoteAccounts" | "getProgramAccounts" | "getBalance">;
46
+ export interface StakingOptions {
47
+ owner: string;
48
+ rpc: string;
49
+ conn?: Conn;
50
+ send?: (tx: Transaction, kp: Keypair) => Promise<string>;
51
+ }
52
+ export declare class Staking {
53
+ private o;
54
+ private conn;
55
+ private names;
56
+ private vals;
57
+ constructor(o: StakingOptions);
58
+ epoch(): Promise<EpochNow>;
59
+ /** Smallest stake (lamports) and the rent kept in each stake account. */
60
+ minimums(): Promise<{
61
+ min_delegation: number;
62
+ rent_reserve: number;
63
+ }>;
64
+ /** The owner's stake accounts (as staker or withdrawer), newest status first. */
65
+ list(epochNow?: number): Promise<StakeAccount[]>;
66
+ /** identity -> name, from ValidatorInfo published on-chain. Cached for an hour. */
67
+ validatorNames(): Promise<Map<string, string>>;
68
+ /** Validators that are voting now (delinquent ones left out), largest first. Cached for 10 minutes. */
69
+ validators(): Promise<Validator[]>;
70
+ /** Create a stake account from the owner's SOL and delegate it, in one transaction. */
71
+ stake(kp: Keypair, lamports: number, vote: string): Promise<{
72
+ tx: string;
73
+ account: string;
74
+ }>;
75
+ unstake(kp: Keypair, account: string): Promise<string>;
76
+ /** Withdraw everything and close the stake account. Only when it's inactive. */
77
+ withdraw(kp: Keypair, account: string): Promise<{
78
+ tx: string;
79
+ lamports: number;
80
+ }>;
81
+ private mine;
82
+ private send;
83
+ }
84
+ export {};
package/dist/stake.js ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Native SOL staking: stake with a validator, unstake, and withdraw once it's free.
3
+ *
4
+ * Checked against primary sources on 2026-10-14:
5
+ * - @solana/web3.js 1.99 StakeProgram.createAccountWithSeed / delegate / deactivate / withdraw (lib/index.d.ts)
6
+ * - getStakeActivation was removed in Agave 2.0 (solana.com/docs/rpc/deprecated/getstakeactivation),
7
+ * so status is worked out here from the delegation's epochs and the current epoch
8
+ * - minimum delegation (getStakeMinimumDelegation) and the stake account's rent reserve
9
+ * (getMinimumBalanceForRentExemption(200)) are always read live, never hard-coded
10
+ * - stake accounts list by the withdraw authority at byte 44 and staker at byte 12 (checked on a live account)
11
+ * - validator names come from on-chain ValidatorInfo in the Config program
12
+ * Stake accounts are made with a seed from the owner's key, so there's no extra key to keep.
13
+ * Staking moves no money out of the wallet's control, so it isn't counted against spending limits,
14
+ * but it needs the password every time and agents can't reach it.
15
+ */
16
+ import { Authorized, Connection, Lockup, PublicKey, StakeProgram, Transaction, ValidatorInfo, sendAndConfirmTransaction } from "@solana/web3.js";
17
+ export const CONFIG_PROGRAM = new PublicKey("Config1111111111111111111111111111111111111");
18
+ const U64_MAX = "18446744073709551615";
19
+ const LAMPORTS = 1_000_000_000;
20
+ /** Status from the delegation's epochs. Small stakes move in one epoch; very large network-wide moves can take longer. */
21
+ export function stakeStatus(activation, deactivation, epoch) {
22
+ if (activation === null || activation === undefined)
23
+ return "inactive";
24
+ const act = Number(activation);
25
+ if (String(deactivation) === U64_MAX || deactivation === null)
26
+ return act >= epoch ? "activating" : "active";
27
+ const de = Number(deactivation);
28
+ if (de === act)
29
+ return "inactive"; // deactivated in the same epoch it was delegated
30
+ return de >= epoch ? "deactivating" : "inactive";
31
+ }
32
+ /** Slot time measured by the network is about 0.21 s (200 ms slots since epoch 1053). */
33
+ const SLOT_SECONDS = 0.21;
34
+ export class Staking {
35
+ o;
36
+ conn;
37
+ names = null;
38
+ vals = null;
39
+ constructor(o) {
40
+ this.o = o;
41
+ this.conn = o.conn ?? new Connection(o.rpc, "confirmed");
42
+ }
43
+ async epoch() {
44
+ const e = await this.conn.getEpochInfo();
45
+ return { epoch: e.epoch, slot_index: e.slotIndex, slots_in_epoch: e.slotsInEpoch, seconds_left: Math.round((e.slotsInEpoch - e.slotIndex) * SLOT_SECONDS) };
46
+ }
47
+ /** Smallest stake (lamports) and the rent kept in each stake account. */
48
+ async minimums() {
49
+ const [m, r] = await Promise.all([this.conn.getStakeMinimumDelegation(), this.conn.getMinimumBalanceForRentExemption(StakeProgram.space)]);
50
+ return { min_delegation: Number(m.value), rent_reserve: r };
51
+ }
52
+ /** The owner's stake accounts (as staker or withdrawer), newest status first. */
53
+ async list(epochNow) {
54
+ const epoch = epochNow ?? (await this.epoch()).epoch;
55
+ const seen = new Map();
56
+ for (const offset of [44, 12]) {
57
+ const r = await this.conn.getParsedProgramAccounts(StakeProgram.programId, { filters: [{ dataSize: StakeProgram.space }, { memcmp: { offset, bytes: this.o.owner } }] });
58
+ for (const a of r)
59
+ seen.set(a.pubkey.toBase58(), a.account);
60
+ }
61
+ const byVote = new Map((await this.validators().catch(() => [])).map((v) => [v.vote, v.name]));
62
+ const out = [];
63
+ for (const [address, acct] of seen) {
64
+ const info = acct.data?.parsed?.info;
65
+ if (!info?.meta)
66
+ continue;
67
+ const d = info.stake?.delegation;
68
+ out.push({
69
+ address,
70
+ lamports: acct.lamports,
71
+ delegated: d ? Number(d.stake) : 0,
72
+ rent_reserve: Number(info.meta.rentExemptReserve),
73
+ status: d ? stakeStatus(d.activationEpoch, d.deactivationEpoch, epoch) : "inactive",
74
+ voter: d?.voter ?? null,
75
+ validator: d ? byVote.get(d.voter) ?? null : null,
76
+ activation_epoch: d ? Number(d.activationEpoch) : null,
77
+ deactivation_epoch: d && d.deactivationEpoch !== U64_MAX ? Number(d.deactivationEpoch) : null,
78
+ });
79
+ }
80
+ const order = ["activating", "active", "deactivating", "inactive"];
81
+ return out.sort((a, b) => order.indexOf(a.status) - order.indexOf(b.status) || b.lamports - a.lamports);
82
+ }
83
+ /** identity -> name, from ValidatorInfo published on-chain. Cached for an hour. */
84
+ async validatorNames() {
85
+ if (this.names && Date.now() - this.names.at < 3600_000)
86
+ return this.names.map;
87
+ const map = new Map();
88
+ for (const a of await this.conn.getProgramAccounts(CONFIG_PROGRAM)) {
89
+ try {
90
+ const v = ValidatorInfo.fromConfigData(a.account.data);
91
+ if (v?.info?.name)
92
+ map.set(v.key.toBase58(), String(v.info.name).slice(0, 60));
93
+ }
94
+ catch { /* not validator info */ }
95
+ }
96
+ this.names = { at: Date.now(), map };
97
+ return map;
98
+ }
99
+ /** Validators that are voting now (delinquent ones left out), largest first. Cached for 10 minutes. */
100
+ async validators() {
101
+ if (this.vals && Date.now() - this.vals.at < 600_000)
102
+ return this.vals.list;
103
+ const [va, names] = await Promise.all([this.conn.getVoteAccounts(), this.validatorNames().catch(() => new Map())]);
104
+ const list = va.current
105
+ .map((v) => ({ vote: v.votePubkey, name: names.get(v.nodePubkey) ?? null, commission: v.commission, stake_sol: Math.round(v.activatedStake / LAMPORTS) }))
106
+ .sort((a, b) => b.stake_sol - a.stake_sol);
107
+ this.vals = { at: Date.now(), list };
108
+ return list;
109
+ }
110
+ /** Create a stake account from the owner's SOL and delegate it, in one transaction. */
111
+ async stake(kp, lamports, vote) {
112
+ const owner = kp.publicKey;
113
+ if (owner.toBase58() !== this.o.owner)
114
+ throw new Error("wrong key");
115
+ const votePk = new PublicKey(vote);
116
+ const vals = await this.validators();
117
+ if (!vals.some((v) => v.vote === votePk.toBase58()))
118
+ throw new Error("That validator isn't voting right now. Pick another.");
119
+ const { min_delegation, rent_reserve } = await this.minimums();
120
+ if (!Number.isSafeInteger(lamports) || lamports < min_delegation)
121
+ throw new Error(`The smallest stake is ${min_delegation / LAMPORTS} SOL.`);
122
+ const have = await this.conn.getBalance(owner);
123
+ if (lamports + rent_reserve + 10_000 > have)
124
+ throw new Error(`Not enough SOL: staking ${lamports / LAMPORTS} SOL needs ${(lamports + rent_reserve) / LAMPORTS} SOL plus a network fee, and the wallet has ${have / LAMPORTS}.`);
125
+ const seed = `tk${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`;
126
+ const stakePk = await PublicKey.createWithSeed(owner, seed, StakeProgram.programId);
127
+ const tx = new Transaction()
128
+ .add(StakeProgram.createAccountWithSeed({ fromPubkey: owner, stakePubkey: stakePk, basePubkey: owner, seed, authorized: new Authorized(owner, owner), lockup: Lockup.default, lamports: lamports + rent_reserve }))
129
+ .add(StakeProgram.delegate({ stakePubkey: stakePk, authorizedPubkey: owner, votePubkey: votePk }));
130
+ return { tx: await this.send(tx, kp), account: stakePk.toBase58() };
131
+ }
132
+ async unstake(kp, account) {
133
+ const a = await this.mine(account);
134
+ if (a.status === "inactive" || a.status === "deactivating")
135
+ throw new Error("This stake is already unstaked.");
136
+ return this.send(StakeProgram.deactivate({ stakePubkey: new PublicKey(account), authorizedPubkey: kp.publicKey }), kp);
137
+ }
138
+ /** Withdraw everything and close the stake account. Only when it's inactive. */
139
+ async withdraw(kp, account) {
140
+ const a = await this.mine(account);
141
+ if (a.status !== "inactive")
142
+ throw new Error(a.status === "deactivating" ? "Still unstaking. It can be withdrawn after the current epoch ends." : "Unstake it first.");
143
+ const tx = await this.send(StakeProgram.withdraw({ stakePubkey: new PublicKey(account), authorizedPubkey: kp.publicKey, toPubkey: kp.publicKey, lamports: a.lamports }), kp);
144
+ return { tx, lamports: a.lamports };
145
+ }
146
+ async mine(account) {
147
+ const a = (await this.list()).find((x) => x.address === account);
148
+ if (!a)
149
+ throw new Error("That stake account isn't this wallet's.");
150
+ return a;
151
+ }
152
+ send(tx, kp) {
153
+ if (this.o.send)
154
+ return this.o.send(tx, kp);
155
+ return sendAndConfirmTransaction(new Connection(this.o.rpc, "confirmed"), tx, [kp]);
156
+ }
157
+ }
158
+ //# sourceMappingURL=stake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stake.js","sourceRoot":"","sources":["../src/stake.ts"],"names":[],"mappings":"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"}