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.
Files changed (78) hide show
  1. package/README.md +63 -4
  2. package/THIRD_PARTY_NOTICES.md +8 -0
  3. package/dist/actions.d.ts +196 -16
  4. package/dist/actions.js +46 -6
  5. package/dist/actions.js.map +1 -1
  6. package/dist/ai-icons.d.ts +5 -0
  7. package/dist/ai-icons.js +3 -0
  8. package/dist/ai-icons.js.map +1 -0
  9. package/dist/ai.d.ts +77 -0
  10. package/dist/ai.js +227 -0
  11. package/dist/ai.js.map +1 -0
  12. package/dist/bridge.d.ts +148 -0
  13. package/dist/bridge.js +460 -0
  14. package/dist/bridge.js.map +1 -0
  15. package/dist/buy.d.ts +17 -0
  16. package/dist/buy.js +23 -0
  17. package/dist/buy.js.map +1 -0
  18. package/dist/cli.js +82 -3
  19. package/dist/cli.js.map +1 -1
  20. package/dist/connect.d.ts +29 -0
  21. package/dist/connect.js +227 -0
  22. package/dist/connect.js.map +1 -0
  23. package/dist/dapp.d.ts +89 -0
  24. package/dist/dapp.js +505 -0
  25. package/dist/dapp.js.map +1 -0
  26. package/dist/dashboard.d.ts +5 -0
  27. package/dist/dashboard.js +203 -2
  28. package/dist/dashboard.js.map +1 -1
  29. package/dist/elizaos.js +2 -0
  30. package/dist/elizaos.js.map +1 -1
  31. package/dist/holdings.d.ts +92 -0
  32. package/dist/holdings.js +200 -0
  33. package/dist/holdings.js.map +1 -0
  34. package/dist/keystore.d.ts +58 -11
  35. package/dist/keystore.js +87 -11
  36. package/dist/keystore.js.map +1 -1
  37. package/dist/ledger.d.ts +1 -1
  38. package/dist/mcp.d.ts +7 -2
  39. package/dist/mcp.js +11 -5
  40. package/dist/mcp.js.map +1 -1
  41. package/dist/netguard.d.ts +8 -0
  42. package/dist/netguard.js +44 -0
  43. package/dist/netguard.js.map +1 -0
  44. package/dist/paths.d.ts +5 -0
  45. package/dist/paths.js +5 -0
  46. package/dist/paths.js.map +1 -1
  47. package/dist/policy.d.ts +4 -4
  48. package/dist/rules.d.ts +11 -2
  49. package/dist/rules.js +23 -1
  50. package/dist/rules.js.map +1 -1
  51. package/dist/sell.d.ts +60 -0
  52. package/dist/sell.js +71 -0
  53. package/dist/sell.js.map +1 -0
  54. package/dist/stake.d.ts +84 -0
  55. package/dist/stake.js +158 -0
  56. package/dist/stake.js.map +1 -0
  57. package/dist/telegram.d.ts +2 -0
  58. package/dist/telegram.js +4 -0
  59. package/dist/telegram.js.map +1 -1
  60. package/dist/ui.js +463 -36
  61. package/dist/ui.js.map +1 -1
  62. package/dist/wallet.d.ts +57 -2
  63. package/dist/wallet.js +185 -4
  64. package/dist/wallet.js.map +1 -1
  65. package/extension/PRIVACY.md +19 -0
  66. package/extension/README.md +16 -0
  67. package/extension/background.js +88 -0
  68. package/extension/content.js +34 -0
  69. package/extension/icons/icon.svg +1 -0
  70. package/extension/icons/icon128.png +0 -0
  71. package/extension/icons/icon16.png +0 -0
  72. package/extension/icons/icon32.png +0 -0
  73. package/extension/icons/icon48.png +0 -0
  74. package/extension/inpage.js +129 -0
  75. package/extension/manifest.json +15 -0
  76. package/extension/popup.html +35 -0
  77. package/extension/popup.js +39 -0
  78. package/package.json +3 -2
@@ -0,0 +1,44 @@
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 function isLocalUrl(u) {
4
+ let h;
5
+ try {
6
+ h = new URL(u).hostname.toLowerCase().replace(/^\[|\]$/g, "");
7
+ }
8
+ catch {
9
+ return true;
10
+ }
11
+ if (h === "localhost" || h.endsWith(".localhost") || h.endsWith(".local") || h === "0.0.0.0" || h === "::" || h === "::1")
12
+ return true;
13
+ if (h.includes(":"))
14
+ return /^(fe80|fc|fd)/.test(h) || h.startsWith("::ffff:");
15
+ const m = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.exec(h);
16
+ if (!m)
17
+ return false;
18
+ const [a, b] = [Number(m[1]), Number(m[2])];
19
+ return a === 127 || a === 10 || a === 0 || (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || (a === 100 && b >= 64 && b <= 127);
20
+ }
21
+ /**
22
+ * fetch that refuses this computer and private networks, on the first URL and on every redirect
23
+ * (Node's fetch would otherwise follow a redirect to 127.0.0.1 with the same method and headers).
24
+ */
25
+ export function publicFetch(f = fetch) {
26
+ return (async (input, init = {}) => {
27
+ let url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
28
+ let opts = { ...init };
29
+ for (let hop = 0; hop <= 5; hop++) {
30
+ if (isLocalUrl(url))
31
+ throw new Error("Refused: that address is on this computer or a private network.");
32
+ const r = await f(url, { ...opts, redirect: "manual" });
33
+ const loc = r.headers.get("location");
34
+ if (![301, 302, 303, 307, 308].includes(r.status) || !loc)
35
+ return r;
36
+ url = new URL(loc, url).href;
37
+ const m = String(opts.method ?? "GET").toUpperCase();
38
+ if (r.status === 303 || ((r.status === 301 || r.status === 302) && m === "POST"))
39
+ opts = { ...opts, method: "GET", body: undefined };
40
+ }
41
+ throw new Error("Too many redirects.");
42
+ });
43
+ }
44
+ //# sourceMappingURL=netguard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"netguard.js","sourceRoot":"","sources":["../src/netguard.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,mGAAmG;AACnG,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAS,CAAC;IACd,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC7F,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACvI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAC7K,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAkB,KAAK;IACjD,OAAO,CAAC,KAAK,EAAE,KAAwB,EAAE,OAAoB,EAAE,EAAE,EAAE;QACjE,IAAI,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5F,IAAI,IAAI,GAAgB,EAAE,GAAG,IAAI,EAAE,CAAC;QACpC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,UAAU,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACxG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,CAAC;YACpE,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;gBAAE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvI,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC,CAAiB,CAAC;AACrB,CAAC"}
package/dist/paths.d.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  export declare function walletHome(dir?: string): string;
2
+ /** Where `tollkit-wallet password-file` saves the password so an AI app can start the MCP server. */
3
+ export declare const passwordFile: (dir?: string) => string;
4
+ /** True when the wallet lives somewhere other than the default folder. */
5
+ export declare const customHome: (dir?: string) => boolean;
2
6
  export declare const files: (dir: string) => {
3
7
  keystore: string;
4
8
  policy: string;
@@ -6,4 +10,5 @@ export declare const files: (dir: string) => {
6
10
  lock: string;
7
11
  sanctions: string;
8
12
  telegram: string;
13
+ backup: string;
9
14
  };
package/dist/paths.js CHANGED
@@ -7,6 +7,10 @@ export function walletHome(dir) {
7
7
  mkdirSync(d, { recursive: true, mode: 0o700 });
8
8
  return d;
9
9
  }
10
+ /** Where `tollkit-wallet password-file` saves the password so an AI app can start the MCP server. */
11
+ export const passwordFile = (dir) => path.join(walletHome(dir), "password");
12
+ /** True when the wallet lives somewhere other than the default folder. */
13
+ export const customHome = (dir) => path.resolve(walletHome(dir)) !== path.resolve(path.join(os.homedir(), ".tollkit-wallet"));
10
14
  export const files = (dir) => ({
11
15
  keystore: path.join(dir, "keystore.json"),
12
16
  policy: path.join(dir, "policy.json"),
@@ -14,5 +18,6 @@ export const files = (dir) => ({
14
18
  lock: path.join(dir, ".lock"),
15
19
  sanctions: path.join(dir, "sanctions.json"),
16
20
  telegram: path.join(dir, "telegram.json"),
21
+ backup: path.join(dir, "backup.json"),
17
22
  });
18
23
  //# sourceMappingURL=paths.js.map
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC/F,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;IACrC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;CAC1C,CAAC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC/F,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;AACrF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAEvI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;IACrC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;CACtC,CAAC,CAAC"}
package/dist/policy.d.ts CHANGED
@@ -17,12 +17,12 @@ export declare const PolicySchema: z.ZodObject<{
17
17
  address: z.ZodString;
18
18
  label: z.ZodDefault<z.ZodString>;
19
19
  }, "strip", z.ZodTypeAny, {
20
- chain: "base" | "ethereum" | "solana";
21
20
  address: string;
21
+ chain: "base" | "ethereum" | "solana";
22
22
  label: string;
23
23
  }, {
24
- chain: "base" | "ethereum" | "solana";
25
24
  address: string;
25
+ chain: "base" | "ethereum" | "solana";
26
26
  label?: string | undefined;
27
27
  }>, "many">>;
28
28
  }, "strip", z.ZodTypeAny, {
@@ -37,8 +37,8 @@ export declare const PolicySchema: z.ZodObject<{
37
37
  block_seller_warnings: boolean;
38
38
  agent_rules: "propose" | "auto";
39
39
  withdraw_addresses: {
40
- chain: "base" | "ethereum" | "solana";
41
40
  address: string;
41
+ chain: "base" | "ethereum" | "solana";
42
42
  label: string;
43
43
  }[];
44
44
  }, {
@@ -53,8 +53,8 @@ export declare const PolicySchema: z.ZodObject<{
53
53
  block_seller_warnings: boolean;
54
54
  agent_rules?: "propose" | "auto" | undefined;
55
55
  withdraw_addresses?: {
56
- chain: "base" | "ethereum" | "solana";
57
56
  address: string;
57
+ chain: "base" | "ethereum" | "solana";
58
58
  label?: string | undefined;
59
59
  }[] | undefined;
60
60
  }>;
package/dist/rules.d.ts CHANGED
@@ -26,12 +26,17 @@ export declare const RuleInput: z.ZodObject<{
26
26
  /** Rules sharing a group cancel each other when one fills (take-profit + stop-loss). */
27
27
  group: z.ZodOptional<z.ZodString>;
28
28
  expires_at: z.ZodOptional<z.ZodString>;
29
+ /** Why this rule: one or two plain sentences, shown to the owner on the rule card (set by AI suggestions). */
30
+ reason: z.ZodOptional<z.ZodString>;
31
+ /** Id of an existing rule this one replaces: turning this on cancels that one (e.g. moving a stop-loss up). */
32
+ replaces: z.ZodOptional<z.ZodString>;
29
33
  }, "strip", z.ZodTypeAny, {
30
- chain: "base" | "ethereum" | "solana";
31
34
  kind: "limit_buy" | "limit_sell" | "stop_loss" | "take_profit" | "trailing_stop" | "dca";
35
+ chain: "base" | "ethereum" | "solana";
32
36
  token: string;
33
37
  every?: "hour" | "day" | "week" | undefined;
34
38
  name?: string | undefined;
39
+ reason?: string | undefined;
35
40
  sell_amount?: string | undefined;
36
41
  amount_usd?: number | undefined;
37
42
  sell_percent?: number | undefined;
@@ -42,12 +47,14 @@ export declare const RuleInput: z.ZodObject<{
42
47
  max_price?: number | undefined;
43
48
  group?: string | undefined;
44
49
  expires_at?: string | undefined;
50
+ replaces?: string | undefined;
45
51
  }, {
46
- chain: "base" | "ethereum" | "solana";
47
52
  kind: "limit_buy" | "limit_sell" | "stop_loss" | "take_profit" | "trailing_stop" | "dca";
53
+ chain: "base" | "ethereum" | "solana";
48
54
  token: string;
49
55
  every?: "hour" | "day" | "week" | undefined;
50
56
  name?: string | undefined;
57
+ reason?: string | undefined;
51
58
  sell_amount?: string | undefined;
52
59
  amount_usd?: number | undefined;
53
60
  sell_percent?: number | undefined;
@@ -58,6 +65,7 @@ export declare const RuleInput: z.ZodObject<{
58
65
  max_price?: number | undefined;
59
66
  group?: string | undefined;
60
67
  expires_at?: string | undefined;
68
+ replaces?: string | undefined;
61
69
  }>;
62
70
  export type RuleInput = z.infer<typeof RuleInput>;
63
71
  export interface Fill {
@@ -82,6 +90,7 @@ export interface Rule extends RuleInput {
82
90
  last_price?: number;
83
91
  last_checked?: string;
84
92
  last_error?: string;
93
+ note?: string;
85
94
  fills: Fill[];
86
95
  };
87
96
  }
package/dist/rules.js CHANGED
@@ -40,6 +40,10 @@ export const RuleInput = z.object({
40
40
  /** Rules sharing a group cancel each other when one fills (take-profit + stop-loss). */
41
41
  group: z.string().max(40).optional(),
42
42
  expires_at: z.string().datetime().optional(),
43
+ /** Why this rule: one or two plain sentences, shown to the owner on the rule card (set by AI suggestions). */
44
+ reason: z.string().max(400).optional(),
45
+ /** Id of an existing rule this one replaces: turning this on cancels that one (e.g. moving a stop-loss up). */
46
+ replaces: z.string().min(4).max(40).optional(),
43
47
  });
44
48
  /** Plain-language summary, shown to the owner before a rule is turned on. */
45
49
  export function describeRule(r) {
@@ -95,6 +99,16 @@ export function nextRun(r, from) {
95
99
  }
96
100
  return new Date(from.getTime() + INTERVAL_MS[r.every ?? "day"]);
97
101
  }
102
+ /** When a replacement goes live, the rule it replaces is cancelled so both never run. */
103
+ function retire(rules, r) {
104
+ if (!r.replaces)
105
+ return;
106
+ const old = rules.find((x) => x.id === r.replaces);
107
+ if (old && !["done", "cancelled", "expired"].includes(old.status)) {
108
+ old.status = "cancelled";
109
+ old.state.note = `Replaced by ${r.id}`;
110
+ }
111
+ }
98
112
  export class RuleStore {
99
113
  dir;
100
114
  file;
@@ -127,6 +141,11 @@ export class RuleStore {
127
141
  const why = ruleProblem(parsed);
128
142
  if (why)
129
143
  throw new Error(why);
144
+ if (parsed.replaces) {
145
+ const old = this.get(parsed.replaces);
146
+ if (!old || ["done", "cancelled", "expired"].includes(old.status))
147
+ throw new Error(`replaces: no open rule ${parsed.replaces}.`);
148
+ }
130
149
  const now = new Date();
131
150
  const active = by === "owner" || autoActivate;
132
151
  const rule = {
@@ -134,7 +153,8 @@ export class RuleStore {
134
153
  status: active ? "active" : "proposed", ...(active ? { activated_at: now.toISOString() } : {}),
135
154
  state: { runs: 0, failures: 0, fills: [], ...(parsed.kind === "dca" ? { next_run: (parsed.every === "week" && parsed.weekday !== undefined ? nextRun(parsed, now) : now).toISOString() } : {}) },
136
155
  };
137
- await this.mutate((rules) => { rules.push(rule); });
156
+ await this.mutate((rules) => { rules.push(rule); if (active)
157
+ retire(rules, rule); });
138
158
  return rule;
139
159
  }
140
160
  /** Owner actions. Turning a rule on resets the trailing high and failure count. */
@@ -146,6 +166,8 @@ export class RuleStore {
146
166
  if (["done", "cancelled", "expired"].includes(r.status))
147
167
  throw new Error(`Rule ${id} is ${r.status}; make a new one instead.`);
148
168
  r.status = status;
169
+ if (status === "active")
170
+ retire(rules, r);
149
171
  if (status === "active") {
150
172
  r.activated_at = new Date().toISOString();
151
173
  r.state.high = undefined;
package/dist/rules.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,CAAU,CAAC;AAEnH,MAAM,CAAC,MAAM,SAAS,GAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAG1D,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0DAA0D,CAAC;IAC7F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnC,gDAAgD;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IAC3D,qFAAqF;IACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IACzD,kDAAkD;IAClD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,mFAAmF;IACnF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjD,oBAAoB;IACpB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAChG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC/F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACrG,wFAAwF;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAsBH,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,CAAY;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACtG,MAAM,CAAC,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9H,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;IACjJ,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC;QAC3G,KAAK,YAAY,CAAC,CAAC,OAAO,QAAQ,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1F,KAAK,aAAa,CAAC,CAAC,OAAO,qBAAqB,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC;QAClG,KAAK,WAAW,CAAC,CAAC,OAAO,mBAAmB,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7F,KAAK,eAAe,CAAC,CAAC,OAAO,uBAAuB,IAAI,gBAAgB,CAAC,CAAC,SAAS,2BAA2B,EAAE,EAAE,CAAC;QACnH,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC5F,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;YACpH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QAC1J,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,CAAY;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,4CAA4C,CAAC;IAChF,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,2CAA2C,CAAC;IAC9H,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,4CAA4C,CAAC;IAC/H,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,uBAAuB,CAAC;IAC9J,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,kCAAkC,CAAC;IAC1F,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,kDAAkD,CAAC;IAC5F,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,6CAA6C,CAAC;IACnG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,qEAAqE,CAAC;IACjH,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,4BAA4B,CAAC;IAChG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,EAAW,CAAC;AAEvF,0DAA0D;AAC1D,MAAM,UAAU,OAAO,CAAC,CAAuC,EAAE,IAAU;IACzE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,6BAA6B;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,SAAS;IAES;IADpB,IAAI,CAAS;IACtB,YAA6B,GAAY;QAAZ,QAAG,GAAH,GAAG,CAAS;QAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IAAC,CAAC;IAEpG,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAW,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IAC5F,CAAC;IACD,GAAG,CAAC,EAAU,IAAsB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,KAAK,CAAC,KAAa;QACzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QAC9C,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,6GAA6G;IAC7G,KAAK,CAAC,MAAM,CAAI,EAAwB;QACtC,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAgB,EAAE,EAAqB,EAAE,YAAqB;QACtE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,EAAE,KAAK,OAAO,IAAI,YAAY,CAAC;QAC9C,MAAM,IAAI,GAAS;YACjB,GAAG,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;YACtF,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACjM,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,MAAyC;QACnE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,2BAA2B,CAAC,CAAC;YAC/H,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;YAClB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,CAAC,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;gBAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC/E,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;oBAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;qBAC9C,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;oBAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACvH,CAAC;YACD,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
package/dist/sell.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import type { Chain } from "./chains.js";
2
+ export declare const SELL_ASSETS: Record<Chain, string[]>;
3
+ /** Coinbase's window after "Cash out now" (docs.cdp.coinbase.com/onramp/offramp/offramp-integration-guide). */
4
+ export declare const SEND_WINDOW_MS: number;
5
+ export interface Sale {
6
+ ref: string;
7
+ ts: string;
8
+ chain: Chain;
9
+ asset: string;
10
+ amount: string | null;
11
+ state: "open" | "sending" | "sent" | "done" | "failed" | "expired";
12
+ tx?: string;
13
+ payout?: string;
14
+ reason?: string;
15
+ }
16
+ export interface OfframpTx {
17
+ id: string;
18
+ status: string;
19
+ asset: string;
20
+ network: string;
21
+ sell_amount: {
22
+ value: string;
23
+ currency: string;
24
+ } | null;
25
+ total: {
26
+ value: string;
27
+ currency: string;
28
+ } | null;
29
+ coinbase_fee: {
30
+ value: string;
31
+ currency: string;
32
+ } | null;
33
+ to_address: string;
34
+ from_address: string;
35
+ tx_hash: string;
36
+ created_at: string;
37
+ updated_at: string;
38
+ }
39
+ type Fetch = typeof fetch;
40
+ export declare class Sales {
41
+ private o;
42
+ private file;
43
+ constructor(o: {
44
+ dir?: string;
45
+ proxy?: string;
46
+ fetch?: Fetch;
47
+ });
48
+ private get f();
49
+ private get proxy();
50
+ list(): Sale[];
51
+ get(ref: string): Sale | undefined;
52
+ update(ref: string, patch: Partial<Sale>): void;
53
+ start(address: string, chain: Chain, asset: string, amount?: string): Promise<{
54
+ url: string;
55
+ ref: string;
56
+ }>;
57
+ /** Coinbase's latest word on a sale (null until the owner has started on Coinbase). */
58
+ status(address: string, ref: string): Promise<OfframpTx | null>;
59
+ }
60
+ export {};
package/dist/sell.js ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * "Cash out": sell crypto to your bank or PayPal through Coinbase Offramp.
3
+ *
4
+ * 1. The wallet asks Tollkit's server (POST {proxy}/offramp) for a single-use Coinbase sell link and a reference.
5
+ * 2. The owner signs in to Coinbase, picks where the money goes and clicks "Cash out now".
6
+ * 3. Coinbase then says where to send the crypto (GET {proxy}/offramp/status). The wallet shows that to the owner,
7
+ * who confirms with the password; only then is the crypto sent. Coinbase allows 30 minutes for this.
8
+ * Only the public address, network, coin and amount are sent to Tollkit's server. A Coinbase account is required.
9
+ */
10
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
11
+ import path from "node:path";
12
+ import { DEFAULT_PROXY } from "./swap.js";
13
+ import { walletHome } from "./paths.js";
14
+ export const SELL_ASSETS = { base: ["USDC", "ETH"], ethereum: ["USDC", "ETH"], solana: ["USDC", "SOL"] };
15
+ /** Coinbase's window after "Cash out now" (docs.cdp.coinbase.com/onramp/offramp/offramp-integration-guide). */
16
+ export const SEND_WINDOW_MS = 30 * 60_000;
17
+ export class Sales {
18
+ o;
19
+ file;
20
+ constructor(o) {
21
+ this.o = o;
22
+ this.file = path.join(walletHome(o.dir), "sales.json");
23
+ }
24
+ get f() { return this.o.fetch ?? fetch; }
25
+ get proxy() { return this.o.proxy ?? DEFAULT_PROXY; }
26
+ list() { try {
27
+ return existsSync(this.file) ? JSON.parse(readFileSync(this.file, "utf8")) : [];
28
+ }
29
+ catch {
30
+ return [];
31
+ } }
32
+ get(ref) { return this.list().find((s) => s.ref === ref); }
33
+ update(ref, patch) {
34
+ const l = this.list().map((s) => (s.ref === ref ? { ...s, ...patch } : s));
35
+ writeFileSync(this.file, JSON.stringify(l, null, 2), { mode: 0o600 });
36
+ }
37
+ async start(address, chain, asset, amount) {
38
+ if (!SELL_ASSETS[chain]?.includes(asset))
39
+ throw new Error(`On ${chain} you can cash out ${(SELL_ASSETS[chain] ?? []).join(" or ")}.`);
40
+ if (amount === undefined || !(/^\d+(\.\d+)?$/.test(amount) && Number(amount) > 0))
41
+ throw new Error("Enter how much to cash out, like 25 or 0.05.");
42
+ const r = await this.f(`${this.proxy}/offramp`, { method: "POST", headers: { "content-type": "application/json" }, signal: AbortSignal.timeout(25_000), body: JSON.stringify({ address, network: chain, asset, ...(amount ? { amount } : {}) }) });
43
+ const j = await r.json().catch(() => ({}));
44
+ if (!r.ok)
45
+ throw new Error(r.status === 404 ? "Cashing out isn't available from Tollkit's server yet." : j?.message ?? `Tollkit's server answered HTTP ${r.status}.`);
46
+ if (typeof j.url !== "string" || !j.url.startsWith("https://pay.coinbase.com/v3/sell/") || !/^tw-[0-9a-f]{16}-[0-9a-f]{16}$/.test(String(j.ref)))
47
+ throw new Error("Didn't get a Coinbase sell link.");
48
+ const sale = { ref: j.ref, ts: new Date().toISOString(), chain, asset, amount: amount ?? null, state: "open" };
49
+ writeFileSync(this.file, JSON.stringify([sale, ...this.list()].slice(0, 50), null, 2), { mode: 0o600 });
50
+ return { url: j.url, ref: j.ref };
51
+ }
52
+ /** Coinbase's latest word on a sale (null until the owner has started on Coinbase). */
53
+ async status(address, ref) {
54
+ const r = await this.f(`${this.proxy}/offramp/status?${new URLSearchParams({ ref, address })}`, { signal: AbortSignal.timeout(20_000) });
55
+ const j = await r.json().catch(() => ({}));
56
+ if (!r.ok)
57
+ throw new Error(j?.message ?? `Tollkit's server answered HTTP ${r.status}.`);
58
+ const t = j.transaction;
59
+ if (t) {
60
+ const s = this.get(ref);
61
+ if (s && s.state !== "done" && /SUCCESS/.test(t.status))
62
+ this.update(ref, { state: "done", payout: t.total ? `${t.total.value} ${t.total.currency}` : undefined });
63
+ else if (s && s.state !== "failed" && /FAILED/.test(t.status))
64
+ this.update(ref, { state: "failed" });
65
+ else if (s && s.state === "open" && /EXPIRED/.test(t.status))
66
+ this.update(ref, { state: "expired" });
67
+ }
68
+ return t;
69
+ }
70
+ }
71
+ //# sourceMappingURL=sell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sell.js","sourceRoot":"","sources":["../src/sell.ts"],"names":[],"mappings":"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"}
@@ -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 {};