tollkit-wallet 0.2.1 → 0.3.0

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 (90) hide show
  1. package/README.md +49 -2
  2. package/THIRD_PARTY_NOTICES.md +4 -0
  3. package/dist/actions.d.ts +150 -53
  4. package/dist/actions.js +5 -1
  5. package/dist/actions.js.map +1 -1
  6. package/dist/ai.d.ts +13 -1
  7. package/dist/ai.js +2 -2
  8. package/dist/ai.js.map +1 -1
  9. package/dist/autopilot.d.ts +7 -0
  10. package/dist/autopilot.js +118 -3
  11. package/dist/autopilot.js.map +1 -1
  12. package/dist/bots.d.ts +92 -0
  13. package/dist/bots.js +183 -0
  14. package/dist/bots.js.map +1 -0
  15. package/dist/bridge.d.ts +148 -0
  16. package/dist/bridge.js +461 -0
  17. package/dist/bridge.js.map +1 -0
  18. package/dist/buy.d.ts +17 -0
  19. package/dist/buy.js +23 -0
  20. package/dist/buy.js.map +1 -0
  21. package/dist/cli.js +68 -2
  22. package/dist/cli.js.map +1 -1
  23. package/dist/dapp.d.ts +99 -0
  24. package/dist/dapp.js +572 -0
  25. package/dist/dapp.js.map +1 -0
  26. package/dist/dashboard.d.ts +14 -0
  27. package/dist/dashboard.js +260 -4
  28. package/dist/dashboard.js.map +1 -1
  29. package/dist/data/token-list.d.ts +12 -0
  30. package/dist/data/token-list.js +13 -0
  31. package/dist/data/token-list.js.map +1 -0
  32. package/dist/holdings.d.ts +98 -0
  33. package/dist/holdings.js +233 -0
  34. package/dist/holdings.js.map +1 -0
  35. package/dist/keystore.d.ts +58 -11
  36. package/dist/keystore.js +87 -11
  37. package/dist/keystore.js.map +1 -1
  38. package/dist/ledger.d.ts +1 -1
  39. package/dist/mcp.d.ts +1 -1
  40. package/dist/mcp.js +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 +1 -0
  45. package/dist/paths.js +1 -0
  46. package/dist/paths.js.map +1 -1
  47. package/dist/pay.js +1 -1
  48. package/dist/pay.js.map +1 -1
  49. package/dist/policy.d.ts +6 -6
  50. package/dist/rules.d.ts +59 -8
  51. package/dist/rules.js +45 -3
  52. package/dist/rules.js.map +1 -1
  53. package/dist/sell.d.ts +60 -0
  54. package/dist/sell.js +71 -0
  55. package/dist/sell.js.map +1 -0
  56. package/dist/seller.js +15 -4
  57. package/dist/seller.js.map +1 -1
  58. package/dist/send.js +3 -2
  59. package/dist/send.js.map +1 -1
  60. package/dist/solconfirm.d.ts +13 -0
  61. package/dist/solconfirm.js +21 -0
  62. package/dist/solconfirm.js.map +1 -0
  63. package/dist/stake.d.ts +84 -0
  64. package/dist/stake.js +159 -0
  65. package/dist/stake.js.map +1 -0
  66. package/dist/swap.d.ts +27 -4
  67. package/dist/swap.js +202 -9
  68. package/dist/swap.js.map +1 -1
  69. package/dist/tokenlist.d.ts +70 -0
  70. package/dist/tokenlist.js +259 -0
  71. package/dist/tokenlist.js.map +1 -0
  72. package/dist/ui.js +399 -37
  73. package/dist/ui.js.map +1 -1
  74. package/dist/wallet.d.ts +60 -3
  75. package/dist/wallet.js +207 -5
  76. package/dist/wallet.js.map +1 -1
  77. package/extension/PRIVACY.md +19 -0
  78. package/extension/README.md +16 -0
  79. package/extension/background.js +88 -0
  80. package/extension/content.js +34 -0
  81. package/extension/icons/icon.svg +1 -0
  82. package/extension/icons/icon128.png +0 -0
  83. package/extension/icons/icon16.png +0 -0
  84. package/extension/icons/icon32.png +0 -0
  85. package/extension/icons/icon48.png +0 -0
  86. package/extension/inpage.js +129 -0
  87. package/extension/manifest.json +15 -0
  88. package/extension/popup.html +35 -0
  89. package/extension/popup.js +39 -0
  90. package/package.json +3 -2
package/dist/bots.js ADDED
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Bots: ready-made, rule-based (no AI) trading bots built from the autopilot's rules, a status board for them,
3
+ * and an opt-in, anonymous share of their results for Tollkit's public bot board.
4
+ *
5
+ * A bot is one or more rules made together from a template; they share a bot id. Every trade a bot makes is an
6
+ * ordinary autopilot fill, so the owner's limits, approvals, the 0.5% fee and receipts all apply.
7
+ */
8
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
9
+ import { randomUUID } from "node:crypto";
10
+ import path from "node:path";
11
+ import { walletHome } from "./paths.js";
12
+ import { describeRule, gridLevels, ruleProblem } from "./rules.js";
13
+ /** Owner-facing catalog. Each builds plain rules the owner can read before turning them on. */
14
+ export const TEMPLATES = [
15
+ { id: "dca", name: "Steady buyer", blurb: "Buys a fixed dollar amount on a schedule, whatever the price (dollar-cost averaging).", risk: "Keeps buying in a falling market.",
16
+ fields: [{ key: "amount_usd", label: "Dollars each time", kind: "usd", default: 25, min: 1 }, { key: "every", label: "How often", kind: "choice", default: "week", choices: [["day", "Every day"], ["week", "Every week"]] }, { key: "times", label: "How many buys (0 = no end)", kind: "int", default: 0, min: 0, max: 10000 }] },
17
+ { id: "dip", name: "Buy the dip", blurb: "Buys when the price falls a set amount, then sells for a profit if it recovers.", risk: "The price may keep falling after it buys.",
18
+ fields: [{ key: "amount_usd", label: "Dollars to buy", kind: "usd", default: 50, min: 1 }, { key: "drop_pct", label: "Buy after a drop of (%)", kind: "pct", default: 5, min: 0.5, max: 80 }, { key: "profit_pct", label: "Then sell at a gain of (%)", kind: "pct", default: 8, min: 0.5, max: 500 }] },
19
+ { id: "protect", name: "Protect a position", blurb: "Sells what you hold if the price falls too far, or takes the profit if it rises; whichever comes first.", risk: "A quick dip can trigger the stop, then recover.",
20
+ fields: [{ key: "sell_percent", label: "Share of your holding to sell (%)", kind: "pct", default: 100, min: 1, max: 100 }, { key: "stop_pct", label: "Stop if it falls (%)", kind: "pct", default: 10, min: 0.5, max: 90 }, { key: "profit_pct", label: "Take profit if it rises (%)", kind: "pct", default: 20, min: 0.5, max: 1000 }] },
21
+ { id: "trail", name: "Trailing stop", blurb: "Follows the price up and sells if it falls a set amount from its highest point.", risk: "Normal swings can trigger it.",
22
+ fields: [{ key: "sell_percent", label: "Share of your holding to sell (%)", kind: "pct", default: 100, min: 1, max: 100 }, { key: "trail_pct", label: "Sell after a fall from the high of (%)", kind: "pct", default: 10, min: 0.5, max: 90 }] },
23
+ { id: "ladder", name: "Take-profit ladder", blurb: "Sells a quarter at +10%, a quarter at +25% and the rest at +50% (you can change the steps).", risk: "Sells early if the price keeps climbing.",
24
+ fields: [{ key: "step1", label: "First sale at a gain of (%)", kind: "pct", default: 10, min: 1, max: 1000 }, { key: "step2", label: "Second at (%)", kind: "pct", default: 25, min: 1, max: 1000 }, { key: "step3", label: "Last at (%)", kind: "pct", default: 50, min: 1, max: 1000 }] },
25
+ { id: "grid", name: "Grid trader", blurb: "Buys a little at each level as the price falls through a range and sells each one a level higher. Works best when the price moves sideways.", risk: "If the price drops out of the range, it holds what it bought; if it rises out, it stops buying.",
26
+ fields: [{ key: "amount_usd", label: "Dollars per level", kind: "usd", default: 20, min: 1 }, { key: "range_pct", label: "Range around today's price (± %)", kind: "pct", default: 10, min: 1, max: 60 }, { key: "levels", label: "Levels", kind: "int", default: 8, min: 3, max: 40 }] },
27
+ ];
28
+ const round = (n) => Number(n.toPrecision(6));
29
+ /** The rules a template makes, at today's price. Throws a plain reason for a bad field. */
30
+ export function buildBot(templateId, token, chain, params, price) {
31
+ const tpl = TEMPLATES.find((t) => t.id === templateId);
32
+ if (!tpl)
33
+ throw new Error("Pick a bot.");
34
+ const v = {};
35
+ for (const f of tpl.fields) {
36
+ const raw = params[f.key] ?? f.default;
37
+ if (f.kind === "choice") {
38
+ if (!f.choices.some((c) => c[0] === raw))
39
+ throw new Error(`Pick ${f.label.toLowerCase()}.`);
40
+ v[f.key] = String(raw);
41
+ continue;
42
+ }
43
+ const n = Number(raw);
44
+ if (!Number.isFinite(n) || (f.min !== undefined && n < f.min) || (f.max !== undefined && n > f.max) || (f.kind === "int" && !Number.isInteger(n)))
45
+ throw new Error(`${f.label}: ${f.min !== undefined ? `from ${f.min}` : ""}${f.max !== undefined ? ` to ${f.max}` : ""}.`);
46
+ v[f.key] = n;
47
+ }
48
+ const needsPrice = templateId !== "dca";
49
+ if (needsPrice && !(price && price > 0))
50
+ throw new Error("No price for this token right now, so the bot's levels can't be set. Try again in a minute.");
51
+ const bot = randomUUID().slice(0, 8), T = token.length > 12 ? `${token.slice(0, 4)}…` : token.toUpperCase();
52
+ const name = `${tpl.name} · ${T}`;
53
+ const base = { chain, token, bot, bot_name: name, template: tpl.id };
54
+ const n = (k) => v[k];
55
+ const p = price;
56
+ let rules;
57
+ switch (tpl.id) {
58
+ case "dca":
59
+ rules = [{ ...base, kind: "dca", amount_usd: n("amount_usd"), every: v.every, ...(n("times") > 0 ? { times: n("times") } : {}), ...(v.every === "week" ? { weekday: new Date().getUTCDay() } : {}) }];
60
+ break;
61
+ case "dip": {
62
+ const buyAt = round(p * (1 - n("drop_pct") / 100));
63
+ // The take-profit waits for the buy, then sells exactly what the bot bought (not the rest of your holding).
64
+ rules = [{ ...base, kind: "limit_buy", amount_usd: n("amount_usd"), trigger_price: buyAt },
65
+ { ...base, kind: "take_profit", sell_from: "@0", after: "@0", trigger_price: round(buyAt * (1 + n("profit_pct") / 100)) }];
66
+ break;
67
+ }
68
+ case "protect": {
69
+ const group = `bot-${bot}`;
70
+ rules = [{ ...base, group, kind: "stop_loss", sell_percent: n("sell_percent"), trigger_price: round(p * (1 - n("stop_pct") / 100)) },
71
+ { ...base, group, kind: "take_profit", sell_percent: n("sell_percent"), trigger_price: round(p * (1 + n("profit_pct") / 100)) }];
72
+ break;
73
+ }
74
+ case "trail":
75
+ rules = [{ ...base, kind: "trailing_stop", sell_percent: n("sell_percent"), trail_pct: n("trail_pct") }];
76
+ break;
77
+ case "ladder": {
78
+ const steps = [n("step1"), n("step2"), n("step3")];
79
+ if (!(steps[0] < steps[1] && steps[1] < steps[2]))
80
+ throw new Error("Each step needs a bigger gain than the one before.");
81
+ // 25% of the holding, then a third of what's left (25% of the start), then all the rest.
82
+ rules = [{ ...base, kind: "take_profit", sell_percent: 25, trigger_price: round(p * (1 + steps[0] / 100)) },
83
+ { ...base, kind: "take_profit", sell_percent: 33.33, trigger_price: round(p * (1 + steps[1] / 100)) },
84
+ { ...base, kind: "take_profit", sell_percent: 100, trigger_price: round(p * (1 + steps[2] / 100)) }];
85
+ break;
86
+ }
87
+ case "grid":
88
+ rules = [{ ...base, kind: "grid", amount_usd: n("amount_usd"), lower_price: round(p * (1 - n("range_pct") / 100)), upper_price: round(p * (1 + n("range_pct") / 100)), levels: n("levels") }];
89
+ break;
90
+ default: throw new Error("Pick a bot.");
91
+ }
92
+ for (const r of rules) {
93
+ const why = ruleProblem(r);
94
+ if (why)
95
+ throw new Error(why);
96
+ }
97
+ return { bot, name, rules };
98
+ }
99
+ /** Status board: rules grouped into bots (a rule made by hand is a bot of one). */
100
+ export function summarize(rules) {
101
+ const groups = new Map();
102
+ for (const r of rules) {
103
+ if (r.status === "proposed")
104
+ continue;
105
+ const k = r.bot ?? `rule-${r.id}`;
106
+ groups.set(k, [...(groups.get(k) ?? []), r]);
107
+ }
108
+ const out = [];
109
+ for (const [id, rs] of groups) {
110
+ const s = (f) => rs.reduce((a, r) => a + (f(r) ?? 0), 0);
111
+ const ok = s((r) => r.state.ok_count ?? r.state.fills.filter((x) => x.ok).length), bad = s((r) => r.state.fail_count ?? r.state.fills.filter((x) => !x.ok).length);
112
+ const spent = s((r) => r.state.spent_usd), got = s((r) => r.state.received_usd);
113
+ const held = Math.max(0, s((r) => r.state.bought_units) - s((r) => r.state.sold_units));
114
+ const price = rs.map((r) => r.state.last_price).find((x) => typeof x === "number") ?? null;
115
+ const value = price !== null ? held * price : null;
116
+ const st = rs.map((r) => r.status);
117
+ const status = st.some((x) => x === "error") ? "error" : st.some((x) => x === "active") ? (ok > 0 || rs.some((r) => r.kind === "grid" || r.kind === "dca") ? "running" : "waiting") : st.some((x) => x === "paused") ? "paused" : st.every((x) => x === "done" || (x === "cancelled" && st.includes("done"))) ? "done" : "stopped";
118
+ const last = rs.flatMap((r) => r.state.fills.filter((x) => x.ok).map((x) => x.ts)).sort().at(-1) ?? null;
119
+ const result = spent > 0 && value !== null ? got + value - spent : spent > 0 && held === 0 ? got - spent : null;
120
+ out.push({
121
+ id, name: rs[0].bot_name ?? describeRule(rs[0]), template: rs[0].template ?? null, chain: rs[0].chain, token: rs[0].token, status,
122
+ rules: rs.map((r) => ({ id: r.id, description: describeRule(r), status: r.status, ...(r.state.last_error ? { last_error: r.state.last_error } : {}) })),
123
+ trades_ok: ok, trades_failed: bad, success_rate: ok + bad ? Math.round((ok / (ok + bad)) * 1000) / 10 : null,
124
+ spent_usd: Math.round(spent * 100) / 100, received_usd: Math.round(got * 100) / 100, units_held: held, value_now_usd: value === null ? null : Math.round(value * 100) / 100,
125
+ result_usd: result === null ? null : Math.round(result * 100) / 100, result_pct: result === null ? null : Math.round((result / spent) * 1000) / 10,
126
+ round_trips: s((r) => r.state.round_trips), last_trade: last, last_price: price, started: rs.map((r) => r.created_at).sort()[0],
127
+ });
128
+ }
129
+ const order = { running: 0, waiting: 1, error: 2, paused: 3, done: 4, stopped: 5 };
130
+ return out.sort((a, b) => order[a.status] - order[b.status] || b.started.localeCompare(a.started));
131
+ }
132
+ /** Grid levels for showing a grid bot's range. */
133
+ export { gridLevels };
134
+ const shareFile = (dir) => path.join(walletHome(dir), "bots.json");
135
+ export function shareSettings(dir) {
136
+ try {
137
+ if (existsSync(shareFile(dir))) {
138
+ const j = JSON.parse(readFileSync(shareFile(dir), "utf8"));
139
+ if (typeof j.install === "string")
140
+ return j;
141
+ }
142
+ }
143
+ catch { /* new */ }
144
+ return { share: false, install: randomUUID() };
145
+ }
146
+ export function setShare(on, dir) {
147
+ const f = { ...shareSettings(dir), share: on };
148
+ writeFileSync(shareFile(dir), JSON.stringify(f, null, 2), { mode: 0o600 });
149
+ return f;
150
+ }
151
+ /**
152
+ * What is shared, when the owner turns it on: per bot, the template, chain and token symbol (only for the
153
+ * built-in or listed tokens), trade counts, success rate, result %, round trips and days running. A random
154
+ * id for this install lets Tollkit replace earlier reports instead of counting them twice. No addresses,
155
+ * amounts in dollars, transaction ids or keys.
156
+ */
157
+ export function shareReport(bots, install, symbolOf, now = Date.now()) {
158
+ return {
159
+ install,
160
+ bots: bots.filter((b) => b.template && b.trades_ok + b.trades_failed > 0).slice(0, 50).map((b) => ({
161
+ bot: b.id, template: b.template, chain: b.chain, token: symbolOf(b.chain, b.token), status: b.status,
162
+ trades_ok: b.trades_ok, trades_failed: b.trades_failed, result_pct: b.result_pct, round_trips: b.round_trips,
163
+ days: Math.max(0, Math.round((now - Date.parse(b.started)) / 86_400_000)),
164
+ })),
165
+ };
166
+ }
167
+ /** Sends the report at most once a day. */
168
+ export async function maybeShare(dir, bots, symbolOf, o) {
169
+ const s = shareSettings(dir), now = o.now ?? Date.now();
170
+ if (!s.share)
171
+ return false;
172
+ if (s.last_sent && now - Date.parse(s.last_sent) < 23 * 3600_000)
173
+ return false;
174
+ const body = shareReport(bots, s.install, symbolOf, now);
175
+ if (!body.bots.length)
176
+ return false;
177
+ const r = await (o.fetch ?? fetch)(`${o.proxy}/bots/report`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body), signal: AbortSignal.timeout(15_000) });
178
+ if (!r.ok)
179
+ return false;
180
+ writeFileSync(shareFile(dir), JSON.stringify({ ...s, last_sent: new Date(now).toISOString() }, null, 2), { mode: 0o600 });
181
+ return true;
182
+ }
183
+ //# sourceMappingURL=bots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bots.js","sourceRoot":"","sources":["../src/bots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import { Connection, Keypair, PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js";
2
+ import { type HDNodeWallet, type Wallet } from "ethers";
3
+ import { type Chain } from "./chains.js";
4
+ type Fetch = typeof fetch;
5
+ type Keys = {
6
+ evm: Wallet | HDNodeWallet;
7
+ solana: Keypair;
8
+ };
9
+ export type MoveAsset = "USDC" | "ETH";
10
+ export declare const BRIDGE_FEE_BPS = 25;
11
+ export declare const IRIS = "https://iris-api.circle.com";
12
+ export declare const CCTP_DOMAIN: Record<Chain, number>;
13
+ export declare const TOKEN_MESSENGER_V2 = "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d";
14
+ export declare const SOL_TMM: PublicKey;
15
+ export declare const SOL_MT: PublicKey;
16
+ export declare const ACROSS_PERIPHERY = "0x97CCDBea4632140639aD5eA9b944aa034eb15fD4";
17
+ export declare const USDC: Record<Chain, string>;
18
+ /** The Forwarding Service hook: "cctp-forward" padded to 24 bytes, version 0, length 0 (32 bytes). */
19
+ export declare function forwardHook(solanaRecipientSetup?: PublicKey): Uint8Array;
20
+ export declare const canMove: (asset: MoveAsset, from: Chain, to: Chain) => boolean;
21
+ export interface MoveQuote {
22
+ asset: MoveAsset;
23
+ from: Chain;
24
+ to: Chain;
25
+ via: "cctp" | "across";
26
+ /** Everything in atomic units of the asset (USDC 6 decimals, ETH 18). */
27
+ amount: string;
28
+ tollkit_fee: string;
29
+ bridge_fee_max: string;
30
+ receive_min: string;
31
+ eta_seconds: number;
32
+ /** CCTP details. */
33
+ burn?: string;
34
+ max_fee?: string;
35
+ hook?: string;
36
+ mint_recipient?: string;
37
+ recipient_setup?: boolean;
38
+ /** Across transaction to sign (checked). */
39
+ tx?: {
40
+ to: string;
41
+ data: string;
42
+ value: string;
43
+ chainId: number;
44
+ };
45
+ }
46
+ export interface MoveRecord {
47
+ id: string;
48
+ ts: string;
49
+ asset: MoveAsset;
50
+ from: Chain;
51
+ to: Chain;
52
+ amount: string;
53
+ receive_min: string;
54
+ via: "cctp" | "across";
55
+ tx: string;
56
+ fee_tx?: string;
57
+ state: "sent" | "arrived" | "failed";
58
+ dest_tx?: string;
59
+ eta_seconds: number;
60
+ checked?: string;
61
+ }
62
+ export declare const fmtAmount: (a: MoveAsset, atomic: string | bigint) => string;
63
+ interface Cfg {
64
+ fee_bps: number;
65
+ fee_recipient: {
66
+ evm: string | null;
67
+ solana: string | null;
68
+ };
69
+ across: boolean;
70
+ }
71
+ export type MoverOptions = ConstructorParameters<typeof Mover>[0];
72
+ export declare class Mover {
73
+ private o;
74
+ private cfg;
75
+ private file;
76
+ constructor(o: {
77
+ evm: string;
78
+ solana: string;
79
+ dir?: string;
80
+ proxy: string;
81
+ fetch?: Fetch;
82
+ rpc?: Partial<Record<Chain, string>>;
83
+ /** Tests: replace chain calls. */ sendEvm?: (from: Chain, tx: {
84
+ to: string;
85
+ data: string;
86
+ value?: bigint;
87
+ }, keys: Keys) => Promise<string>;
88
+ sendSolana?: (tx: Transaction, signers: Keypair[]) => Promise<string>;
89
+ solConn?: Pick<Connection, "getAccountInfo" | "getParsedTokenAccountsByOwner" | "getBalance">;
90
+ evmRead?: (from: Chain, what: "usdc" | "eth" | "allowance") => Promise<bigint>;
91
+ });
92
+ private get f();
93
+ private rpc;
94
+ private sol;
95
+ config(): Promise<Cfg>;
96
+ /** The owner's USDC token account on Solana, and whether it exists yet. */
97
+ private solUsdcAccount;
98
+ quote(asset: MoveAsset, from: Chain, to: Chain, amountAtomic: string): Promise<MoveQuote>;
99
+ private quoteCctp;
100
+ private quoteAcross;
101
+ /** Sign and send. Returns the record that the dashboard tracks until it arrives. */
102
+ execute(q: MoveQuote, keys: Keys): Promise<MoveRecord>;
103
+ private evmSend;
104
+ private evmRead;
105
+ private burnFromEvm;
106
+ /** One Solana transaction: Tollkit's fee transfer + CCTP deposit_for_burn_with_hook (all or nothing). */
107
+ solanaBurnTx(q: MoveQuote, owner: PublicKey, cfg: Cfg, event: Keypair, feeAtaExists?: boolean): Promise<Transaction>;
108
+ private burnFromSolana;
109
+ list(): MoveRecord[];
110
+ private save;
111
+ /** Check Circle's attestation service for USDC moves still on their way (at most every 10 s each). */
112
+ refresh(): Promise<MoveRecord[]>;
113
+ }
114
+ /** deposit_for_burn_with_hook, encoded by hand from Circle's IDL (Anchor: 8-byte discriminator + Borsh params). */
115
+ export declare function depositForBurnWithHookIx(a: {
116
+ owner: PublicKey;
117
+ burnTokenAccount: PublicKey;
118
+ mint: PublicKey;
119
+ event: PublicKey;
120
+ amount: bigint;
121
+ destinationDomain: number;
122
+ mintRecipient: Uint8Array;
123
+ maxFee: bigint;
124
+ minFinality: number;
125
+ hook: Uint8Array;
126
+ }): TransactionInstruction;
127
+ /** Across (docs.across.to/chains-and-contracts): SpokePool per network, MulticallHandler on both; WETH from tokens.ts. */
128
+ export declare const ACROSS_SPOKE: Record<"base" | "ethereum", string>;
129
+ export declare const ACROSS_MULTICALL = "0x0F7Ae28dE1C8532170AD4ee566B5801485c13a0E";
130
+ /**
131
+ * Decode and check an Across ETH deposit before signing: Across's SpokePool on this network, from this wallet,
132
+ * ETH in for exactly the amount, ETH out on the other network to this wallet (directly, or through Across's
133
+ * MulticallHandler whose only steps unwrap WETH, pay Tollkit's fee, and send everything left to this wallet).
134
+ * Returns what's actually delivered, Tollkit's fee, and what this wallet receives at least.
135
+ */
136
+ export declare function checkAcrossDeposit(data: string, o: {
137
+ from: "base" | "ethereum";
138
+ to: "base" | "ethereum";
139
+ amount: bigint;
140
+ me: string;
141
+ feeRecipient: string;
142
+ feeBps: number;
143
+ }): {
144
+ output: bigint;
145
+ fee: bigint;
146
+ receive: bigint;
147
+ };
148
+ export {};