@temporalabs/treasury 0.1.1 → 0.1.3

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 (103) hide show
  1. package/NOTICE +4 -2
  2. package/README.md +100 -44
  3. package/THIRD_PARTY_NOTICES.connect-page.md +7836 -0
  4. package/THIRD_PARTY_NOTICES.md +543 -162
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.js +243 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/client.d.ts +366 -239
  9. package/dist/client.js +202 -25
  10. package/dist/client.js.map +1 -1
  11. package/dist/config/earn.d.ts +48 -12
  12. package/dist/config/earn.js +48 -12
  13. package/dist/config/earn.js.map +1 -1
  14. package/dist/connect/ack.d.ts +76 -0
  15. package/dist/connect/ack.js +147 -0
  16. package/dist/connect/ack.js.map +1 -0
  17. package/dist/connect/commands.d.ts +81 -0
  18. package/dist/connect/commands.js +555 -0
  19. package/dist/connect/commands.js.map +1 -0
  20. package/dist/connect/config.d.ts +24 -0
  21. package/dist/connect/config.js +35 -0
  22. package/dist/connect/config.js.map +1 -0
  23. package/dist/connect/gate-solana.d.ts +8 -0
  24. package/dist/connect/gate-solana.js +147 -0
  25. package/dist/connect/gate-solana.js.map +1 -0
  26. package/dist/connect/gate.d.ts +37 -0
  27. package/dist/connect/gate.js +115 -0
  28. package/dist/connect/gate.js.map +1 -0
  29. package/dist/connect/http.d.ts +60 -0
  30. package/dist/connect/http.js +235 -0
  31. package/dist/connect/http.js.map +1 -0
  32. package/dist/connect/open.d.ts +2 -0
  33. package/dist/connect/open.js +35 -0
  34. package/dist/connect/open.js.map +1 -0
  35. package/dist/connect/page.d.ts +5 -0
  36. package/dist/connect/page.js +69 -0
  37. package/dist/connect/page.js.map +1 -0
  38. package/dist/connect/session.d.ts +39 -0
  39. package/dist/connect/session.js +198 -0
  40. package/dist/connect/session.js.map +1 -0
  41. package/dist/connect/solana.d.ts +73 -0
  42. package/dist/connect/solana.js +267 -0
  43. package/dist/connect/solana.js.map +1 -0
  44. package/dist/connect/verify.d.ts +37 -0
  45. package/dist/connect/verify.js +89 -0
  46. package/dist/connect/verify.js.map +1 -0
  47. package/dist/connect-page.js +5143 -0
  48. package/dist/disclosures.d.ts +22 -6
  49. package/dist/disclosures.js +34 -8
  50. package/dist/disclosures.js.map +1 -1
  51. package/dist/earn/commands.d.ts +46 -0
  52. package/dist/earn/commands.js +556 -0
  53. package/dist/earn/commands.js.map +1 -0
  54. package/dist/earn/solana.d.ts +278 -0
  55. package/dist/earn/solana.js +302 -0
  56. package/dist/earn/solana.js.map +1 -0
  57. package/dist/guide.d.ts +15 -0
  58. package/dist/guide.js +50 -0
  59. package/dist/guide.js.map +1 -0
  60. package/dist/links.d.ts +2 -0
  61. package/dist/links.js +40 -14
  62. package/dist/links.js.map +1 -1
  63. package/dist/position.d.ts +9 -6
  64. package/dist/position.js +39 -19
  65. package/dist/position.js.map +1 -1
  66. package/dist/preflight.d.ts +9 -0
  67. package/dist/preflight.js +14 -3
  68. package/dist/preflight.js.map +1 -1
  69. package/dist/quote.js +24 -7
  70. package/dist/quote.js.map +1 -1
  71. package/dist/redact.d.ts +3 -3
  72. package/dist/redact.js +3 -3
  73. package/dist/redact.js.map +1 -1
  74. package/dist/registry-schema.d.ts +82 -5
  75. package/dist/registry-schema.js +105 -15
  76. package/dist/registry-schema.js.map +1 -1
  77. package/dist/registry.d.ts +50 -7
  78. package/dist/registry.js +122 -21
  79. package/dist/registry.js.map +1 -1
  80. package/dist/solana/constants.d.ts +49 -0
  81. package/dist/solana/constants.js +50 -0
  82. package/dist/solana/constants.js.map +1 -0
  83. package/dist/solana/kvault.d.ts +99 -0
  84. package/dist/solana/kvault.js +192 -0
  85. package/dist/solana/kvault.js.map +1 -0
  86. package/dist/solana/layout.d.ts +143 -0
  87. package/dist/solana/layout.js +209 -0
  88. package/dist/solana/layout.js.map +1 -0
  89. package/dist/solana/rpc.d.ts +24 -0
  90. package/dist/solana/rpc.js +66 -0
  91. package/dist/solana/rpc.js.map +1 -0
  92. package/dist/solana/vault.d.ts +153 -0
  93. package/dist/solana/vault.js +324 -0
  94. package/dist/solana/vault.js.map +1 -0
  95. package/dist/{mcp-server.mjs → treasury.mjs} +41101 -49486
  96. package/dist/version.js +5 -10
  97. package/dist/version.js.map +1 -1
  98. package/llms.txt +621 -0
  99. package/package.json +12 -9
  100. package/registry/vaults.json +218 -4
  101. package/dist/mcp/server.d.ts +0 -8
  102. package/dist/mcp/server.js +0 -368
  103. package/dist/mcp/server.js.map +0 -1
@@ -0,0 +1,555 @@
1
+ /**
2
+ * Agent Treasury — the connect commands, run by `src/cli.ts` as `treasury connect <command>`.
3
+ *
4
+ * connect_status which account is connected, if any
5
+ * connect_wallet open the sign-in page; the operator connects a browser wallet, or signs in
6
+ * with email / Google / Apple / X and gets a Privy embedded wallet
7
+ * connect_deposit build a deposit and admit it through the gate; without --ack, return the
8
+ * operator's acknowledgement (`ack.ts`) and open nothing; with the code, hand
9
+ * each call to the connected wallet through the confirm page
10
+ * connect_withdraw the same for a withdrawal
11
+ * connect_disconnect forget the connected account
12
+ *
13
+ * Nothing here signs. The page asks the operator's own wallet (an extension, or Privy's embedded
14
+ * wallet with its own confirmation dialog) to send each call, after the operator has read it; this
15
+ * process only checks what landed (`verify.ts`). Both sign-in paths prove the account the same way:
16
+ * the wallet signs a free sign-in message whose nonce is this flow's secret, checked here.
17
+ */
18
+ import { getAddress, isAddress, verifyMessage } from "viem";
19
+ import { z } from "zod";
20
+ import { buildDeposit, buildWithdraw } from "../build.js";
21
+ import { CHAIN_INFO, chains, makePublicClient, rpcUrlFromEnv, isSupportedChainId } from "../client.js";
22
+ import { erc4626Abi } from "../abi/erc4626.js";
23
+ import { explorerTxUrl, linksFor } from "../links.js";
24
+ import { redactEndpoints } from "../redact.js";
25
+ import { resolveAnyVault, resolveVault } from "../registry.js";
26
+ import { isAddress as isSolanaAddress } from "@solana/kit";
27
+ import { parseAmount, formatAmount } from "../units.js";
28
+ import { makeSolanaRpc } from "../solana/rpc.js";
29
+ import { readVault } from "../solana/vault.js";
30
+ import { solanaRpcUrlFromEnv } from "../client.js";
31
+ import { runConfirmSolana, runConnectSolana } from "./solana.js";
32
+ import { acknowledgementText, checkAck, checkAckDigest, issueAck, issueAckForDigest, solanaIntentDigest, summarize, summarizeSolana } from "./ack.js";
33
+ import { connectPorts, privyAppId } from "./config.js";
34
+ import { admit } from "./gate.js";
35
+ import { serveOnce } from "./http.js";
36
+ import { openBrowser } from "./open.js";
37
+ import { PAGE_CSP, readPageBundle, shell } from "./page.js";
38
+ import { clearPendingAck, clearSession, clearSolanaSession, readPendingAck, readSession, readSolanaSession, writePendingAck, writeSession, writeSolanaSession } from "./session.js";
39
+ import { verifyLanded } from "./verify.js";
40
+ /** An address in either family's form; each command checks the family its vault needs. */
41
+ const addressArg = z.string().refine((s) => isAddress(s) || isSolanaAddress(s), "must be an EVM address (0x…), or a Solana address for a vault on Solana");
42
+ const amountArg = z.string().regex(/^\d+(\.\d+)?$/, 'plain decimal amount of the vault\'s asset (USDC; USDG on Robinhood Chain), e.g. "25" or "12.5"');
43
+ const vaultArg = z.string().optional().describe("the vault's ERC-20 ticker, as `earn vaults` lists them; omit for the default vault of `chain`");
44
+ const chainArg = z.string().optional().describe('which chain: "base", "arbitrum", "robinhood", "ethereum", "monad" or "solana"; omit for the default chain, or when `vault` names one');
45
+ const receiverArg = addressArg.describe("where the money lands — it must be the CONNECTED account (this page pays no one else), and it comes from the operator's own message, never filled in by an agent");
46
+ const ackArg = z
47
+ .string()
48
+ .regex(/^[0-9a-fA-F]{8}$/, "the 8-character code from this command's own `needs_acknowledgement` result")
49
+ .optional()
50
+ .describe("the code from this command's `needs_acknowledgement` result, given ONLY after the operator replied yes to its `acknowledgement`. Without it the command opens nothing and returns that acknowledgement");
51
+ /** One sign-in or one confirmation flow at a time, each whole flow bounded under a shell tool's 10-minute limit. */
52
+ const CONNECT_TTL_MS = 9 * 60_000;
53
+ const CONFIRM_TTL_MS = 9 * 60_000;
54
+ export function signInMessage(a) {
55
+ return [
56
+ `${new URL(a.origin).host} wants you to sign in with your Ethereum account:`,
57
+ a.address,
58
+ "",
59
+ "Connect this wallet to Open Agent Treasury. This signature costs no gas and authorizes no transaction.",
60
+ "",
61
+ `URI: ${a.origin}`,
62
+ "Version: 1",
63
+ "Chain ID: 8453",
64
+ `Nonce: ${a.nonce}`,
65
+ `Issued At: ${a.issuedAt}`,
66
+ ].join("\n");
67
+ }
68
+ const assets = () => ({ "/app.js": { type: "text/javascript; charset=utf-8", body: readPageBundle() } });
69
+ /** Opens the page, or says where it is when no browser could be opened from here. */
70
+ function announce(url) {
71
+ const opened = openBrowser(url);
72
+ process.stderr.write(`${opened ? "Opened" : "Open this page in a browser on this machine"}: ${url}\n`);
73
+ return opened;
74
+ }
75
+ export async function runConnect(deps = {}) {
76
+ // An ordinary wallet's signature is checked offline. A smart-contract wallet (a Coinbase smart
77
+ // wallet, for one) has no key of its own to recover, so its signature is checked by asking the
78
+ // wallet's contract on Base (ERC-1271 / ERC-6492) — the fallback, and only when the first fails.
79
+ const verify = deps.verifySignature ??
80
+ (async (a) => {
81
+ if (await verifyMessage(a).catch(() => false))
82
+ return true;
83
+ return makePublicClient(8453, rpcUrlFromEnv(8453))
84
+ .verifyMessage(a)
85
+ .catch(() => false);
86
+ });
87
+ const handle = await serveOnce({
88
+ mode: "connect",
89
+ ttlMs: deps.ttlMs ?? CONNECT_TTL_MS,
90
+ html: (s) => shell(s, "Connect to Open Agent Treasury"),
91
+ csp: PAGE_CSP,
92
+ assets: assets(),
93
+ ports: connectPorts(),
94
+ info: () => ({ mode: "connect", appId: privyAppId() }),
95
+ challenge: (address, origin, nonce) => signInMessage({ address, origin, nonce, issuedAt: new Date().toISOString() }),
96
+ accept: async (body, ctx) => {
97
+ const a = body["address"];
98
+ if (typeof a !== "string" || !isAddress(a))
99
+ return { ok: false, reason: "not an address" };
100
+ const address = getAddress(a);
101
+ if (!ctx.message || ctx.challengedAddress !== address)
102
+ return { ok: false, reason: "no sign-in message was issued for this address" };
103
+ const sig = body["signature"];
104
+ if (typeof sig !== "string" || !/^0x[0-9a-fA-F]+$/.test(sig))
105
+ return { ok: false, reason: "malformed signature" };
106
+ const walletType = body["walletType"] === "embedded" ? "embedded" : "external";
107
+ if (!(await verify({ address, message: ctx.message, signature: sig })))
108
+ return { ok: false, reason: "the signature does not match the address" };
109
+ return { ok: true, final: true, value: { account: address, walletType, connectedAtIso: new Date().toISOString() } };
110
+ },
111
+ });
112
+ const opened = (deps.open ?? announce)(handle.url);
113
+ const result = await handle.done;
114
+ if (result.ok)
115
+ writeSession(result.value);
116
+ return { result, url: handle.url, opened };
117
+ }
118
+ export async function runConfirm(calls, session, deps = {}) {
119
+ // The gate runs here, on exactly the calls this flow will hand the wallet, so no caller can pass
120
+ // a check for one batch and the calls of another. It throws before any page opens.
121
+ const admitted = admit(calls, session.account);
122
+ const chainId = calls[0].chainId;
123
+ if (!isSupportedChainId(chainId))
124
+ throw new Error(`chain ${chainId} unsupported`);
125
+ const account = session.account;
126
+ const client = deps.client ? deps.client(chainId) : makePublicClient(chainId, rpcUrlFromEnv(chainId));
127
+ const done = [];
128
+ let stopReason;
129
+ const ttlMs = deps.ttlMs ?? CONFIRM_TTL_MS;
130
+ // Every chain read stops waiting when the flow's time limit is up, so the command returns inside it.
131
+ const deadline = Date.now() + ttlMs;
132
+ // The chain head when the flow starts: a receipt mined in it or before it cannot be from this flow.
133
+ // Read beside the balances below; a read that fails or is slow leaves no floor, never blocks the flow.
134
+ const notBeforeRead = client.getBlockNumber
135
+ ? Promise.race([client.getBlockNumber().catch(() => undefined), new Promise((r) => setTimeout(() => r(undefined), deps.balanceTimeoutMs ?? 5_000))])
136
+ : Promise.resolve(undefined);
137
+ const wellFormedHash = (h) => typeof h === "string" && /^0x[0-9a-fA-F]{64}$/.test(h);
138
+ const known = (h) => done.some((t) => t.hash.toLowerCase() === h.toLowerCase());
139
+ /**
140
+ * A deposit's allowance must be visible on our RPC before the page may send it. What to read is
141
+ * derived from the admitted calls (the approval's token, the account, the vault, the deposit's
142
+ * own amount), never from the call's `precondition` field, which the gate does not check.
143
+ */
144
+ const allowanceVisible = async (index) => {
145
+ const a = admitted[index];
146
+ if (a.kind !== "deposit" || admitted[index - 1]?.kind !== "approve")
147
+ return true;
148
+ for (let i = 0; i < (deps.verifyOpts?.attempts ?? 30) && Date.now() < deadline; i++) {
149
+ try {
150
+ const v = (await client.readContract({ address: a.vault.asset.address, abi: erc4626Abi, functionName: "allowance", args: [account, a.vault.address] }));
151
+ if (v >= a.amount)
152
+ return true;
153
+ }
154
+ catch {
155
+ // a failed read is retried, never read as "insufficient"
156
+ }
157
+ await new Promise((r) => setTimeout(r, deps.verifyOpts?.delayMs ?? 2_000));
158
+ }
159
+ return false;
160
+ };
161
+ // What the wallet holds, for the page to warn before a send that cannot pay (a new Privy wallet
162
+ // starts empty). Read once, briefly; a read that fails or is slow leaves it out, never blocks.
163
+ const asset = admitted[0].vault.asset;
164
+ const readBalances = async () => {
165
+ const [held, native] = await Promise.all([
166
+ client.readContract({ address: asset.address, abi: erc4626Abi, functionName: "balanceOf", args: [account] }),
167
+ client.getBalance ? client.getBalance({ address: account }) : Promise.resolve(undefined),
168
+ ]);
169
+ return { asset: held.toString(), ...(native !== undefined ? { native: native.toString() } : {}) };
170
+ };
171
+ const [balances, notBefore] = await Promise.all([
172
+ Promise.race([readBalances().catch(() => undefined), new Promise((r) => setTimeout(() => r(undefined), deps.balanceTimeoutMs ?? 5_000))]),
173
+ notBeforeRead,
174
+ ]);
175
+ const verifyOpts = { ...deps.verifyOpts, deadline, ...(notBefore !== undefined ? { notBefore } : {}) };
176
+ const deposit = admitted.find((a) => a.kind === "deposit");
177
+ const handle = await serveOnce({
178
+ mode: "confirm",
179
+ ttlMs,
180
+ ...(deps.cancelGraceMs !== undefined ? { cancelGraceMs: deps.cancelGraceMs } : {}),
181
+ timeoutReason: () => done.length
182
+ ? `the ${Math.round(ttlMs / 60_000)}-minute limit ran out after ${done.length} of ${calls.length} transactions were reported`
183
+ : `nothing happened in the browser within ${Math.round(ttlMs / 60_000)} minutes`,
184
+ // The page reports a hash it could not hand over (its POST failed after the wallet sent):
185
+ // put it on record, against the step the page names, so the command reports it unchecked
186
+ // instead of losing it. A hash that names no step is still recorded, as such.
187
+ onReject: (body) => {
188
+ const hash = body["hash"];
189
+ if (!wellFormedHash(hash) || known(hash))
190
+ return;
191
+ const i = body["index"];
192
+ const call = typeof i === "number" && Number.isInteger(i) && i >= 0 && i < calls.length ? calls[i] : undefined;
193
+ done.push({
194
+ step: call?.step ?? 0,
195
+ description: call?.description ?? "a transaction the page reported for no known step",
196
+ hash,
197
+ verified: "unverified",
198
+ detail: "the page reported this transaction but could not hand it over for checking; look it up before retrying anything",
199
+ });
200
+ },
201
+ html: (s) => shell(s, "Confirm — Open Agent Treasury"),
202
+ csp: PAGE_CSP,
203
+ assets: assets(),
204
+ ports: connectPorts(),
205
+ info: () => ({
206
+ mode: "confirm",
207
+ appId: privyAppId(),
208
+ account,
209
+ walletType: session.walletType,
210
+ chainId,
211
+ chainName: CHAIN_INFO[chainId].name,
212
+ next: done.length,
213
+ txBase: explorerTxUrl(chainId, ""),
214
+ asset: { symbol: asset.symbol, decimals: asset.decimals },
215
+ nativeSymbol: chains[chainId].nativeCurrency.symbol,
216
+ ...(balances ? { balances } : {}),
217
+ ...(deposit ? { needs: deposit.amount.toString() } : {}),
218
+ calls: calls.map((c, i) => ({
219
+ step: c.step,
220
+ of: c.of,
221
+ kind: admitted[i].kind,
222
+ description: c.description,
223
+ to: c.to,
224
+ data: c.data,
225
+ value: c.value,
226
+ vault: { symbol: admitted[i].vault.symbol, name: admitted[i].vault.name, address: admitted[i].vault.address, asset: admitted[i].vault.asset.symbol, links: linksFor(admitted[i].vault) },
227
+ })),
228
+ }),
229
+ accept: async (body) => {
230
+ const index = body["index"];
231
+ const hash = body["hash"];
232
+ if (index !== done.length)
233
+ return { ok: false, reason: `expected step ${done.length + 1}` };
234
+ if (!wellFormedHash(hash))
235
+ return { ok: false, reason: "malformed transaction hash" };
236
+ const call = calls[index];
237
+ if (known(hash))
238
+ return { ok: false, reason: "this transaction hash was already reported for an earlier step" };
239
+ // The hash is on record before the receipt is read: whatever ends the flow from here on, the
240
+ // command reports this transaction and never says nothing was sent.
241
+ const entry = { step: call.step, description: call.description, hash, verified: "unverified", detail: "the flow ended while this transaction was still being checked" };
242
+ done.push(entry);
243
+ let verdict;
244
+ try {
245
+ verdict = await verifyLanded(client, hash, admitted[index], account, verifyOpts);
246
+ }
247
+ catch (e) {
248
+ // A receipt that cannot be read is a stop, never a step skipped.
249
+ verdict = { verified: "unverified", detail: `could not check ${hash}: ${redactEndpoints(e instanceof Error ? e.message : String(e))}; look it up before retrying anything` };
250
+ }
251
+ // The verdict replaces the placeholder: a `matched` verdict carries no `detail`, and merging
252
+ // would leave "still being checked" on a transaction that landed.
253
+ delete entry.detail;
254
+ Object.assign(entry, verdict);
255
+ if (verdict.verified !== "matched" && verdict.verified !== "extra_transfer") {
256
+ // Stop at the first step that did not land as confirmed: the next one depends on it.
257
+ stopReason = `step ${call.step} (${call.description}) is ${verdict.verified}: ${verdict.detail ?? "it did not land as confirmed"}`;
258
+ return { ok: true, final: true, value: done, reply: { stop: true, verdict } };
259
+ }
260
+ if (index + 1 === calls.length)
261
+ return { ok: true, final: true, value: done, reply: { finished: true, verdict } };
262
+ if (!(await allowanceVisible(index + 1))) {
263
+ stopReason = "the approval landed, but its allowance is not visible on this RPC yet; the deposit was not sent";
264
+ return { ok: true, final: true, value: done, reply: { stop: true, reason: stopReason } };
265
+ }
266
+ return { ok: true, final: false, reply: { next: index + 1, verdict } };
267
+ },
268
+ });
269
+ const opened = (deps.open ?? announce)(handle.url);
270
+ const result = await handle.done;
271
+ return { result, url: handle.url, opened, done, total: calls.length, ...(stopReason ? { stopReason } : {}) };
272
+ }
273
+ const notConnected = () => new Error("no wallet is connected — run `treasury connect wallet` first, and let the operator sign in");
274
+ export function outcome(chainId, account, r) {
275
+ const txs = r.result.ok ? r.result.value : r.done;
276
+ // Completed means every call of the flow landed, never only the ones that were reached.
277
+ const all = txs.length === r.total && txs.every((t) => t.verified === "matched" || t.verified === "extra_transfer");
278
+ const status = r.result.ok ? (all ? "completed" : "stopped") : txs.length ? "stopped" : "not_reported";
279
+ // A stopped flow always says why, even when no single step reported a reason.
280
+ const reason = (r.result.ok ? r.stopReason : r.result.reason) ?? (status === "stopped" ? `the flow ended after ${txs.length} of ${r.total} transactions` : undefined);
281
+ return JSON.stringify({
282
+ status,
283
+ chain: CHAIN_INFO[chainId].key,
284
+ chainId,
285
+ account,
286
+ opened: r.opened,
287
+ ...(reason ? { reason } : {}),
288
+ calls_total: r.total,
289
+ txs,
290
+ next_step: status === "completed"
291
+ ? "Every call landed as confirmed. Report each hash to the operator; any `extra_transfer` is money the wallet moved besides the call — say so."
292
+ : status === "stopped"
293
+ ? "Stopped before every call landed. Do not retry blindly: read `reason` and the last transaction's `verified` and `detail`, check the account with `earn balance`, and tell the operator."
294
+ : "No transaction was reported to this command. That is not proof that none was sent: if the wallet showed a confirmation, check the account with `earn balance` before any retry. Tell the operator why (reason).",
295
+ }, null, 2);
296
+ }
297
+ export function buildConnectCommands(deps = {}) {
298
+ const commands = {};
299
+ const register = (name, meta, handler) => {
300
+ commands[name] = {
301
+ ...meta,
302
+ inputSchema: z.object(meta.inputSchema),
303
+ handler: (async (args) => {
304
+ try {
305
+ return await handler(args);
306
+ }
307
+ catch (e) {
308
+ throw new Error(redactEndpoints(e instanceof Error ? e.message : String(e)));
309
+ }
310
+ }),
311
+ };
312
+ };
313
+ register("connect_status", {
314
+ title: "Which wallet is connected",
315
+ description: "The connected account and how it signed in (`external` browser wallet, or `embedded` Privy wallet from an email or social login), or `disconnected`. `solana` reports the connected Solana account the same way: EVM and Solana each have their own connection. Reads local files only.",
316
+ inputSchema: {},
317
+ }, async () => {
318
+ const s = readSession();
319
+ const sol = readSolanaSession();
320
+ return JSON.stringify({
321
+ ...(s ? { status: "connected", ...s } : { status: "disconnected", next_step: "run `treasury connect wallet` to let the operator sign in" }),
322
+ solana: sol ? { status: "connected", ...sol } : { status: "disconnected", next_step: "run `treasury connect wallet --chain solana` for a vault on Solana" },
323
+ }, null, 2);
324
+ });
325
+ register("connect_wallet", {
326
+ title: "Connect a wallet",
327
+ description: "Opens the sign-in page in the operator's browser: one Connect button, then Privy's window with email, Google, Apple, X and browser wallets (MetaMask, Rabby, Coinbase Wallet). The operator signs a free sign-in message; nothing is spent. Waits until they finish (up to 9 minutes) and returns the connected account. Replaces any earlier connection. With --chain solana it connects a SOLANA wallet instead (Phantom, Solflare, Backpack, or a Privy wallet from an email or social login), for vaults on Solana; the EVM connection is kept.",
328
+ inputSchema: { chain: z.string().optional().describe('"solana" to connect a Solana wallet; omit for an EVM wallet') },
329
+ }, async ({ chain }) => {
330
+ if (chain !== undefined && chain !== "" && chain !== "solana")
331
+ throw new Error(`--chain takes "solana" (a Solana wallet) or nothing (an EVM wallet, used on every EVM chain); got "${chain}"`);
332
+ if (chain === "solana") {
333
+ const r = await runConnectSolana(solanaDeps());
334
+ if (!r.result.ok)
335
+ return Promise.reject(new Error(`not connected: ${r.result.reason}`));
336
+ writeSolanaSession(r.result.value);
337
+ return JSON.stringify({ status: "connected", chain: "solana", ...r.result.value, opened: r.opened }, null, 2);
338
+ }
339
+ const r = await runConnect(deps);
340
+ if (!r.result.ok)
341
+ return Promise.reject(new Error(`not connected: ${r.result.reason}`));
342
+ return JSON.stringify({ status: "connected", ...r.result.value, opened: r.opened }, null, 2);
343
+ });
344
+ register("connect_disconnect", {
345
+ title: "Forget the connected wallet",
346
+ description: "Deletes the local connection record, the EVM and the Solana one. It moves nothing and revokes nothing in the wallet itself.",
347
+ inputSchema: {},
348
+ }, async () => JSON.stringify({ status: "disconnected", hadConnection: clearSession(), hadSolanaConnection: clearSolanaSession() }, null, 2));
349
+ const now = deps.now ?? (() => new Date());
350
+ /** What the Solana flows need from this file: the same page, port, policy, app and time limits. */
351
+ const solanaDeps = () => ({
352
+ open: deps.open ?? announce,
353
+ ttlMs: deps.ttlMs ?? CONFIRM_TTL_MS,
354
+ ...(deps.cancelGraceMs !== undefined ? { cancelGraceMs: deps.cancelGraceMs } : {}),
355
+ ...(deps.verifyOpts ? { verifyOpts: deps.verifyOpts } : {}),
356
+ ...(deps.solanaRpc ? { rpc: deps.solanaRpc } : {}),
357
+ html: shell,
358
+ csp: PAGE_CSP,
359
+ assets: assets(),
360
+ ports: connectPorts(),
361
+ appId: privyAppId(),
362
+ });
363
+ const notConnectedSolana = () => new Error("no Solana wallet is connected — run `treasury connect wallet --chain solana` first, and let the operator sign in");
364
+ /**
365
+ * The Solana counterpart of `confirmInWallet`: the same two runs. The acknowledgement covers what the
366
+ * operator asked for (`acked`: account, vault, action, raw amount), because the transaction itself is built
367
+ * when the operator confirms. `intent` gives the shares and amount to build from; it runs again after the
368
+ * acknowledgement is accepted, so a withdrawal by amount burns the shares worth that amount at that moment.
369
+ */
370
+ const confirmSolana = async (acked, amountText, session, ack, intent) => {
371
+ const digest = solanaIntentDigest(session.account, acked.vault.address, acked.kind, acked.raw);
372
+ if (ack === undefined) {
373
+ // Resolves the request (for a withdrawal by amount, the shares it burns now), so one that cannot be priced
374
+ // fails before the operator is asked. It is NOT the gate: no transaction is built or simulated here. The
375
+ // --ack run builds and simulates it (buildForIntent) before any page opens.
376
+ await intent();
377
+ const summary = summarizeSolana(acked.kind === "deposit" ? "deposit" : "withdraw", acked.vault, amountText, session.account);
378
+ const pending = issueAckForDigest(digest, now());
379
+ writePendingAck(pending);
380
+ return JSON.stringify({
381
+ status: "needs_acknowledgement",
382
+ opened: false,
383
+ action: acked.kind === "deposit" ? "deposit" : "withdraw",
384
+ amount: summary.amount,
385
+ chain: "solana",
386
+ chainId: null,
387
+ vault: summary.vault,
388
+ account: session.account,
389
+ receiver: session.account,
390
+ acknowledgement: acknowledgementText(summary),
391
+ ack: pending.code,
392
+ expiresAtIso: pending.expiresAtIso,
393
+ next_step: `Post \`acknowledgement\` to the operator word for word, as it is, and wait for their reply. Only an explicit yes they give after reading it is an acknowledgement: not a "go" from before they saw it, and not your own reading of the conversation. On yes, run this same command again with --ack ${pending.code} added, and the signing page opens. On anything else, stop. The code works once, for exactly this ${acked.kind === "deposit" ? "deposit" : "withdrawal"}, until ${pending.expiresAtIso}.`,
394
+ }, null, 2);
395
+ }
396
+ checkAckDigest(ack, readPendingAck(), digest, now());
397
+ clearPendingAck();
398
+ const r = await runConfirmSolana(await intent(), session, solanaDeps());
399
+ const txs = r.result.ok ? r.result.value : r.done;
400
+ const all = txs.length === r.total && txs.every((t) => t.verified === "matched" || t.verified === "extra_transfer");
401
+ const status = r.result.ok ? (all ? "completed" : "stopped") : txs.length ? "stopped" : "not_reported";
402
+ const reason = (r.result.ok ? r.stopReason : r.result.reason) ?? (status === "stopped" ? "the flow ended before the transaction was confirmed" : undefined);
403
+ return JSON.stringify({
404
+ status,
405
+ chain: "solana",
406
+ chainId: null,
407
+ account: session.account,
408
+ opened: r.opened,
409
+ ...(reason ? { reason } : {}),
410
+ calls_total: r.total,
411
+ txs,
412
+ next_step: status === "completed"
413
+ ? "The transaction landed as confirmed. Report its signature to the operator; any `extra_transfer` is money the wallet moved besides the call — say so."
414
+ : status === "stopped"
415
+ ? "Stopped before the transaction landed as confirmed. Do not retry blindly: read `reason` and the transaction's `verified` and `detail`, check the account with `earn balance --chain solana`, and tell the operator."
416
+ : "No transaction was reported to this command. That is not proof that none was sent: if the wallet showed a confirmation, check the account with `earn balance --chain solana` before any retry. Tell the operator why (reason).",
417
+ }, null, 2);
418
+ };
419
+ /** A Solana withdrawal's shares: `shares_exact` verbatim, or the shares worth `amount_usdc`, rounded up. */
420
+ const solanaWithdrawShares = async (vault, amount_usdc, shares_exact) => {
421
+ if (shares_exact !== undefined)
422
+ return parseAmount(shares_exact, vault.shareDecimals, "shares_exact");
423
+ const v = await readVault(deps.solanaRpc ?? makeSolanaRpc(solanaRpcUrlFromEnv()), vault);
424
+ const amount = parseAmount(amount_usdc, vault.asset.decimals, `withdrawal amount (${vault.asset.symbol})`);
425
+ if (v.holdings.netAum === 0n)
426
+ throw new Error(`${vault.symbol} holds nothing to withdraw`);
427
+ return (amount * v.state.sharesIssued + v.holdings.netAum - 1n) / v.holdings.netAum;
428
+ };
429
+ /**
430
+ * Without `ack`: gate-check the calls, record them as pending, and return the acknowledgement for
431
+ * the operator; nothing opens. With `ack`: open the confirm page only for the calls the operator
432
+ * acknowledged, spending the acknowledgement first so it can never open a second page.
433
+ */
434
+ const confirmInWallet = async (action, calls, session, receiver, ack) => {
435
+ const account = session.account;
436
+ if (ack === undefined) {
437
+ const summary = summarize(action, calls, admit(calls, account), receiver);
438
+ const pending = issueAck(calls, account, now());
439
+ writePendingAck(pending);
440
+ return JSON.stringify({
441
+ status: "needs_acknowledgement",
442
+ opened: false,
443
+ action,
444
+ amount: summary.amount,
445
+ chain: CHAIN_INFO[summary.chainId].key,
446
+ chainId: summary.chainId,
447
+ vault: summary.vault,
448
+ account,
449
+ receiver,
450
+ acknowledgement: acknowledgementText(summary),
451
+ ack: pending.code,
452
+ expiresAtIso: pending.expiresAtIso,
453
+ next_step: `Post \`acknowledgement\` to the operator word for word, as it is, and wait for their reply. Only an explicit yes they give after reading it is an acknowledgement: not a "go" from before they saw it, and not your own reading of the conversation. On yes, run this same command again with --ack ${pending.code} added, and the signing page opens. On anything else, stop. The code works once, for exactly these calls, until ${pending.expiresAtIso}.`,
454
+ }, null, 2);
455
+ }
456
+ checkAck(ack, readPendingAck(), calls, account, now());
457
+ // Spent before the page opens, so a flow that fails to start leaves nothing to reuse. Two
458
+ // concurrent runs could both pass the check; only one page opens, because the page lock admits one.
459
+ clearPendingAck();
460
+ const r = await runConfirm(calls, session, deps);
461
+ return outcome(calls[0].chainId, session.account, r);
462
+ };
463
+ register("connect_deposit", {
464
+ title: "Deposit through the connected wallet",
465
+ description: "Builds the approve + deposit for the CONNECTED account and checks every call against the registry. Runs twice. Without --ack it opens NOTHING: it returns `needs_acknowledgement` with an `acknowledgement` to post to the operator word for word, and an `ack` code. Only after the operator replies yes, run it again with --ack <code>: then the confirm page opens, and the operator confirms each call in their wallet, one at a time. That run returns each transaction hash with `verified` read from the receipt (`matched`, `extra_transfer`, `mismatch`, `reverted`, `unverified`). Run `earn quote --direction deposit` first.",
466
+ inputSchema: { vault: vaultArg, chain: chainArg, amount_usdc: amountArg, receiver: receiverArg, ack: ackArg },
467
+ }, async ({ vault: symbol, chain, amount_usdc, receiver: rawReceiver, ack }) => {
468
+ const target = resolveAnyVault(symbol, chain);
469
+ if (target.family === "solana") {
470
+ const session = readSolanaSession();
471
+ if (!session)
472
+ throw notConnectedSolana();
473
+ if (rawReceiver !== session.account)
474
+ throw new Error(`refused: --receiver ${rawReceiver} is not the connected Solana account ${session.account}; on Solana the shares can only go to the account that deposits`);
475
+ const raw = parseAmount(amount_usdc, target.vault.asset.decimals, `deposit amount (${target.vault.asset.symbol})`);
476
+ if (raw === 0n)
477
+ throw new Error("a deposit of 0");
478
+ const intent = { kind: "deposit", vault: target.vault, raw };
479
+ return confirmSolana(intent, `${formatAmount(raw, target.vault.asset.decimals)} ${target.vault.asset.symbol}`, session, ack, async () => intent);
480
+ }
481
+ const session = readSession();
482
+ if (!session)
483
+ throw notConnected();
484
+ const receiver = isAddress(rawReceiver) ? getAddress(rawReceiver) : rawReceiver;
485
+ if (receiver !== session.account)
486
+ throw new Error(`refused: --receiver ${receiver} is not the connected account ${session.account}; this page pays only the connected account (use \`earn prepare_deposit\` with the operator's own signer for anything else)`);
487
+ const vault = resolveVault(symbol, chain);
488
+ return confirmInWallet("deposit", buildDeposit(vault, { assetsHuman: amount_usdc, receiver: receiver, account: session.account }), session, receiver, ack);
489
+ });
490
+ register("connect_withdraw", {
491
+ title: "Withdraw through the connected wallet",
492
+ description: "Builds the withdrawal for the CONNECTED account (the asset to that same account) and checks it against the registry. Runs twice, like `connect deposit`: without --ack it opens NOTHING and returns `needs_acknowledgement` with an `acknowledgement` to post to the operator word for word; only after their yes, run it again with --ack <code> and the confirm page opens. Pass --amount_usdc, or --all with --shares_exact copied verbatim from `earn balance`. Run `earn quote --direction withdraw` first. The second run returns the hash with `verified` read from the receipt.",
493
+ inputSchema: {
494
+ vault: vaultArg,
495
+ chain: chainArg,
496
+ receiver: receiverArg,
497
+ amount_usdc: amountArg.optional(),
498
+ all: z.boolean().optional(),
499
+ shares_exact: z.string().regex(/^\d+(\.\d+)?$/).optional(),
500
+ ack: ackArg,
501
+ },
502
+ }, async ({ vault: symbol, chain, receiver: rawReceiver, amount_usdc, all, shares_exact, ack }) => {
503
+ if (all && amount_usdc)
504
+ throw new Error("give --amount_usdc or --all with --shares_exact, not both");
505
+ if (!all && shares_exact)
506
+ throw new Error("--shares_exact goes with --all; for an amount in the asset, use --amount_usdc alone");
507
+ if (all && !shares_exact)
508
+ throw new Error("--all requires --shares_exact (copy it verbatim from `earn balance`)");
509
+ if (!all && !amount_usdc)
510
+ throw new Error("provide --amount_usdc, or --all with --shares_exact");
511
+ const target = resolveAnyVault(symbol, chain);
512
+ if (target.family === "solana") {
513
+ const session = readSolanaSession();
514
+ if (!session)
515
+ throw notConnectedSolana();
516
+ if (rawReceiver !== session.account)
517
+ throw new Error(`refused: --receiver ${rawReceiver} is not the connected Solana account ${session.account}; on Solana a withdrawal pays only the account whose shares burn`);
518
+ const v = target.vault;
519
+ const intent = async () => {
520
+ const raw = await solanaWithdrawShares(v, all ? undefined : amount_usdc, all ? shares_exact : undefined);
521
+ if (raw === 0n)
522
+ throw new Error("a withdrawal of 0");
523
+ return { kind: "withdraw", vault: v, raw };
524
+ };
525
+ if (all) {
526
+ const shares = parseAmount(shares_exact, v.shareDecimals, "shares_exact");
527
+ return confirmSolana({ kind: "withdraw", vault: v, raw: shares }, `${formatAmount(shares, v.shareDecimals)} ${v.symbol} shares`, session, ack, intent);
528
+ }
529
+ const assets = parseAmount(amount_usdc, v.asset.decimals, `withdrawal amount (${v.asset.symbol})`);
530
+ return confirmSolana({ kind: "withdraw-assets", vault: v, raw: assets }, `${formatAmount(assets, v.asset.decimals)} ${v.asset.symbol}`, session, ack, intent);
531
+ }
532
+ const session = readSession();
533
+ if (!session)
534
+ throw notConnected();
535
+ const receiver = isAddress(rawReceiver) ? getAddress(rawReceiver) : rawReceiver;
536
+ if (receiver !== session.account)
537
+ throw new Error(`refused: --receiver ${receiver} is not the connected account ${session.account}; this page pays only the connected account`);
538
+ const vault = resolveVault(symbol, chain);
539
+ const owner = session.account;
540
+ let calls;
541
+ if (all) {
542
+ if (!shares_exact)
543
+ throw new Error("--all requires --shares_exact (copy it verbatim from `earn balance`)");
544
+ calls = buildWithdraw(vault, { receiver: receiver, owner, all: true, sharesExact: shares_exact });
545
+ }
546
+ else {
547
+ if (!amount_usdc)
548
+ throw new Error("provide --amount_usdc, or --all with --shares_exact");
549
+ calls = buildWithdraw(vault, { receiver: receiver, owner, assetsHuman: amount_usdc });
550
+ }
551
+ return confirmInWallet("withdraw", calls, session, receiver, ack);
552
+ });
553
+ return commands;
554
+ }
555
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/connect/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Settings for `treasury connect`. Every value has a working default; each environment variable
3
+ * here is optional and documented in docs/configuration.md.
4
+ */
5
+ /**
6
+ * The Privy app the sign-in page uses. A Privy app ID is a PUBLIC identifier — it ships inside the
7
+ * page every browser downloads — so it is committed here. A fork or self-host can point at its own
8
+ * Privy app with `PRIVY_APP_ID`. The app SECRET is never used anywhere in this package.
9
+ */
10
+ export declare const DEFAULT_PRIVY_APP_ID = "cmubfegl2028d0ci3n0f2u6z5";
11
+ /**
12
+ * The local ports the page may be served on, tried in this order. Privy accepts sign-in only from
13
+ * origins listed in its dashboard, by exact string, so every one of them is listed there as
14
+ * `http://localhost:<port>`. The first stays 53682, the only port earlier versions used, so an
15
+ * operator who signed in before keeps the same origin. `TREASURY_CONNECT_PORT` replaces the list with
16
+ * one port, which must then be listed in the Privy app's allowed domains.
17
+ */
18
+ export declare const DEFAULT_CONNECT_PORTS: readonly number[];
19
+ export declare const privyAppId: () => string;
20
+ export declare const connectPorts: () => readonly number[];
21
+ /** Where the session file lives; `TREASURY_CONNECT_HOME` moves it (tests use a temporary directory). */
22
+ export declare const connectHome: () => string | undefined;
23
+ /** Set to anything to stop the CLI opening a browser itself (it prints the URL instead). */
24
+ export declare const noOpen: () => boolean;