@orangecheck/vote-cli 0.7.6 → 0.8.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.
package/README.md CHANGED
@@ -20,6 +20,8 @@ Fetch the poll and all ballots from Nostr, verify every BIP-322 signature, look
20
20
 
21
21
  It counts only from a complete ballot read: all but one of the relays asked (4 of the 5 defaults) must finish it, and none may cut its answer short. Otherwise a clock-dated poll's tally says it can't count and exits non-zero, and an anchored poll's count stays provisional and says why.
22
22
 
23
+ A voter whose coins the explorer did not give is unread (OC Vote SPEC §8), never weighed zero: the tally prints `STATE: unread`, each such voter and why, and no totals, and exits 3. `utxo_cap_unread` means the explorer lists no more than about 500 unspent outputs for that address, which anyone can arrange by sending it dust, so tallying again from it is unlikely to help; `chain_unread` (a rate limit, a server error, no answer in 8 s) may pass; `provider_refused_unread` is any other refusal. `--json` prints vote-core's `UnreadResult` (`state`, `snapshot_block`, `unread: [{ voter, reason }]`) with the poll's fields. Exit codes: 0 counted (or not yet countable: deferred, awaiting the reveal), 1 failed, 2 published below the write quorum, 3 unread.
24
+
23
25
  ```
24
26
  $ oc-vote tally 3054390f047f2703186943a41178bc15931500b5139229517f26e56282026ee5
25
27
 
@@ -51,7 +53,7 @@ Flags:
51
53
 
52
54
  ### `oc-vote vote --poll <poll_id> --voter <address> --option <id>`
53
55
 
54
- Build the ballot, have it signed (`--sig`, or paste a BIP-322 signature of the printed ballot_id), publish it, then ask each relay alone for it back. The ballot is in only once at least 2 relays serve a copy whose ballot signature and Nostr signature both hold; an OK from a relay is not enough. Below that it says the ballot isn't in yet, prints the signed event, and exits 2. In an anchored poll its stamp is read back the same way, and `vote` exits 2 while the stamp is on fewer than 2 relays, even with the ballot in: a final count needs the stamp.
56
+ Build the ballot, have it signed (`--sig`, or paste a BIP-322 signature of the printed ballot_id), publish it, then ask each relay alone for it back. The ballot is in only once at least 2 relays serve a copy whose ballot signature and Nostr signature both hold; an OK from a relay is not enough. Below that it says the ballot isn't in yet, prints the signed event, and exits 2. In an anchored poll its stamp is read back the same way, and `vote` exits 2 while the stamp is on fewer than 2 relays, or when it could not be made at all, even with the ballot in: a final count needs the stamp.
55
57
 
56
58
  - `--json` — `in`, `served_by`, `asked`, `quorum` and the signed `event`.
57
59
 
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import { createRequire } from 'module';
3
3
  import { Command, Option } from 'commander';
4
4
  import WebSocket from 'ws';
5
5
  import { generateX25519KeyPair, hexEncode, utf8Encode, hexDecode, utf8Decode } from '@orangecheck/lock-crypto';
6
- import { isAnchoredPoll, ballotId, lastAnchorHeight, ANCHOR_FINAL_CONFIRMATIONS, pollId, verifyPoll, canonicalBytes, commit, anchoredTallyIsFinal, revealId, distinctBallotCopies, resolveCloseBlock, mempoolBlockTimeSource, anchorHeightFromStamps, resolvePollSnapshot, tally, ballotStampContent, verifyBallot, verifyReveal } from '@orangecheck/vote-core';
6
+ import { isAnchoredPoll, ballotId, lastAnchorHeight, ANCHOR_FINAL_CONFIRMATIONS, pollId, verifyPoll, canonicalBytes, commit, anchoredTallyIsFinal, revealId, distinctBallotCopies, resolveCloseBlock, mempoolBlockTimeSource, anchorHeightFromStamps, resolvePollSnapshot, tally, ballotStampContent, verifyBallot, verifyReveal, UtxoUnreadError } from '@orangecheck/vote-core';
7
7
  import { schnorr } from '@noble/curves/secp256k1';
8
8
  import { sha256 } from '@noble/hashes/sha256';
9
9
  import { randomBytes, bytesToHex, hexToBytes } from '@noble/hashes/utils';
@@ -443,7 +443,8 @@ function standingLines(s, file) {
443
443
  }
444
444
  function report(r) {
445
445
  const stamp2 = r.stamp && "kind" in r.stamp ? r.stamp : null;
446
- if (!standingIsIn(r.main) || stamp2 && !standingIsIn(stamp2)) process.exitCode = NOT_IN_YET;
446
+ const unmade = r.stamp && "error" in r.stamp ? r.stamp : null;
447
+ if (!standingIsIn(r.main) || stamp2 && !standingIsIn(stamp2) || unmade) process.exitCode = NOT_IN_YET;
447
448
  if (r.json) {
448
449
  const stampJson = r.stamp ? "kind" in r.stamp ? { ...standingJson(r.stamp), event: r.stamp.event } : r.stamp : null;
449
450
  process.stdout.write(
@@ -465,8 +466,9 @@ function report(r) {
465
466
  for (const [k, v] of r.heading ?? []) lines.push(` ${`${k}:`.padEnd(12)}${v}`);
466
467
  lines.push(...standingLines(r.main, r.file));
467
468
  if (stamp2) lines.push(...standingLines(stamp2));
468
- else if (r.stamp && "error" in r.stamp) {
469
- lines.push(` stamp: not made here (${r.stamp.error}); vote.ochk.io's anchorer stamps every ballot it sees`);
469
+ else if (unmade) {
470
+ lines.push(` stamp: not made here (${unmade.error}), so a final count can't see this ballot yet`);
471
+ lines.push(` vote.ochk.io's anchorer stamps every ballot it sees`);
470
472
  }
471
473
  lines.push(...r.tail ?? []);
472
474
  process.stdout.write(`
@@ -930,17 +932,57 @@ function ballotVerdicts(copies, verify = verifySignature) {
930
932
  }
931
933
  return [...byId.values()];
932
934
  }
933
-
934
- // src/utxos.ts
935
- function mempoolSource(base = "https://mempool.space/api") {
935
+ var UTXO_FETCH_TIMEOUT_MS = 8e3;
936
+ function unreadBecause(status, body) {
937
+ if (/too many unspent/i.test(body)) {
938
+ return new UtxoUnreadError("utxo_cap_unread", `mempool utxo ${status}: past its cap`);
939
+ }
940
+ if (status === 429 || status >= 500) {
941
+ return new UtxoUnreadError("chain_unread", `mempool utxo ${status}`);
942
+ }
943
+ return new UtxoUnreadError("provider_refused_unread", `mempool utxo ${status}`);
944
+ }
945
+ function asCoin(u) {
946
+ const c = u;
947
+ return c && typeof c === "object" && typeof c.value === "number" && c.status && typeof c.status === "object" ? c : null;
948
+ }
949
+ async function withTimeout(ms, work) {
950
+ const ac = new AbortController();
951
+ const timer = setTimeout(() => ac.abort(), ms);
952
+ try {
953
+ return await work(ac.signal);
954
+ } finally {
955
+ clearTimeout(timer);
956
+ }
957
+ }
958
+ function mempoolSource(base = "https://mempool.space/api", timeoutMs = UTXO_FETCH_TIMEOUT_MS) {
936
959
  return {
960
+ /** Throws UtxoUnreadError when the coins were not read, so the tally names the voter. */
937
961
  async fetchUtxos(address) {
938
- const res = await fetch(`${base}/address/${address}/utxo`, {
939
- headers: { accept: "application/json" }
940
- });
941
- if (!res.ok) throw new Error(`mempool utxo ${res.status}`);
942
- const data = await res.json();
943
- return data.filter((u) => u.status.confirmed && typeof u.status.block_height === "number").map((u) => ({
962
+ let data;
963
+ try {
964
+ data = await withTimeout(timeoutMs, async (signal) => {
965
+ const res = await fetch(`${base}/address/${address}/utxo`, {
966
+ headers: { accept: "application/json" },
967
+ signal
968
+ });
969
+ if (!res.ok) throw unreadBecause(res.status, await res.text().catch(() => ""));
970
+ return res.json();
971
+ });
972
+ } catch (err) {
973
+ if (err instanceof UtxoUnreadError) throw err;
974
+ process.stderr.write(
975
+ `oc-vote: coin lookup threw ${err instanceof Error ? err.name : typeof err}; read as chain_unread
976
+ `
977
+ );
978
+ throw new UtxoUnreadError("chain_unread", "mempool utxo: no answer");
979
+ }
980
+ const listed = Array.isArray(data) ? data.map(asCoin) : null;
981
+ if (!listed || listed.some((c) => c === null)) {
982
+ process.stderr.write("oc-vote: coin lookup answered something other than a coin list; read as chain_unread\n");
983
+ throw new UtxoUnreadError("chain_unread", "mempool utxo: not a coin list");
984
+ }
985
+ return listed.filter((u) => u.status.confirmed && typeof u.status.block_height === "number").map((u) => ({
944
986
  value: u.value,
945
987
  confirmed_height: u.status.block_height
946
988
  }));
@@ -955,6 +997,22 @@ function buildLookup(source) {
955
997
  }
956
998
 
957
999
  // src/commands/tally.ts
1000
+ var UNREAD_EXIT = 3;
1001
+ var UNREAD_WHY = {
1002
+ utxo_cap_unread: "the explorer lists no more than about 500 unspent outputs for one address, and this one has more; tallying again from it is unlikely to help",
1003
+ chain_unread: "the explorer did not answer; tally again once it answers",
1004
+ provider_refused_unread: "the explorer refused the lookup"
1005
+ };
1006
+ function unreadLines(result) {
1007
+ const n = result.unread.length;
1008
+ const width = Math.max(...result.unread.map((u) => u.voter.length));
1009
+ return [
1010
+ ` STATE: unread \u2014 not counted: ${n} ${n === 1 ? "voter" : "voters"} could not be read at block ${result.snapshot_block}`,
1011
+ ...result.unread.map(
1012
+ (u, i) => ` ${i === 0 ? "unread: " : " "} ${u.voter.padEnd(width)} ${u.reason} ${UNREAD_WHY[u.reason]}`
1013
+ )
1014
+ ];
1015
+ }
958
1016
  async function unsealOption(ballot, revealSk) {
959
1017
  if (!ballot.secret) return null;
960
1018
  const result = await unseal({
@@ -1060,6 +1118,7 @@ async function runTally(opts) {
1060
1118
  ...chain?.finalBlocked ? { not_final_because: chain.finalBlocked } : {},
1061
1119
  ...result
1062
1120
  };
1121
+ if (result.state === "unread") process.exitCode = UNREAD_EXIT;
1063
1122
  if (opts.json) {
1064
1123
  process.stdout.write(JSON.stringify(output, null, 2) + "\n");
1065
1124
  return;
@@ -1115,6 +1174,10 @@ async function runTally(opts) {
1115
1174
  `);
1116
1175
  return;
1117
1176
  }
1177
+ if (result.state === "unread") {
1178
+ w(unreadLines(result).join("\n") + "\n\n");
1179
+ return;
1180
+ }
1118
1181
  w(` STATE: ${stateLine(result)}
1119
1182
  `);
1120
1183
  w(` counted: ${result.counted.length} ballot(s)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nostr.ts","../src/anchors.ts","../src/events.ts","../src/bip322.ts","../src/quorum.ts","../src/report.ts","../src/sig.ts","../src/commands/create.ts","../src/select.ts","../src/commands/discover.ts","../src/commands/gen-reveal-key.ts","../src/commands/reveal.ts","../src/commands/republish.ts","../src/commands/show.ts","../src/ballots.ts","../src/utxos.ts","../src/commands/tally.ts","../src/commands/verify.ts","../src/commands/vote.ts","../src/cli.ts"],"names":["pollId","DEFAULT_RELAYS","randomBytes","parseStamp","query","queryEvents","ballotId","revealId","verify","stampVerify","publishEvent","stamp","canonicalBytes","computePollId","verifyPoll","verifyReveal","generateX25519KeyPair","hexEncode","isAnchoredPoll","resolveCloseBlock","mempoolBlockTimeSource","lastAnchorHeight","ANCHOR_FINAL_CONFIRMATIONS","serving","verifyEvent","verifyBallot","parsed","verifySignature"],"mappings":"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","file":"cli.js","sourcesContent":["// oc-vote's Nostr layer: @orangecheck/nostr-core for transport (which checks\n// each event's id, signature and filter match), plus vote-shaped queries.\n\nimport {\n DEFAULT_RELAYS,\n queryEvents,\n type Filter,\n type NostrEvent,\n type QueryResult,\n} from '@orangecheck/nostr-core';\n\nexport { DEFAULT_RELAYS, publishEvent } from '@orangecheck/nostr-core';\nexport type { NostrEvent, PublishResult } from '@orangecheck/nostr-core';\n\nconst QUERY_TIMEOUT_MS = 8000;\n/** The whole of one relay's paged read, every page together. */\nconst PAGED_READ_DEADLINE_MS = 2 * QUERY_TIMEOUT_MS;\n\nexport interface EventsFetch {\n events: NostrEvent[];\n /** The result stands for what exists. For `query`, a relay reached EOSE:\n * without that, an empty or short result says nothing. For `queryPaged`,\n * see `readShortfall`. */\n complete: boolean;\n}\n\n/** A relay finished answering only if it sent EOSE; `ok` alone also covers\n * a relay that timed out or closed after sending some events. */\nexport function reachedEose(relayStatus: QueryResult['relayStatus']): boolean {\n return relayStatus.some((r) => r.eose);\n}\n\nexport async function query(filter: Filter, relays?: readonly string[]): Promise<EventsFetch> {\n const { events, relayStatus } = await queryEvents(filter, relays, QUERY_TIMEOUT_MS);\n return { events, complete: reachedEose(relayStatus) };\n}\n\n/**\n * Every event under the poll's d-tag, newest first. Not `limit: 1`: anyone\n * can publish under any d-tag with any created_at, so callers choose by\n * content and signature (see select.ts).\n */\nexport function fetchPollEvents(pollId: string, relays?: readonly string[]) {\n return query({ kinds: [30080], '#d': [`oc-vote:poll:${pollId}`] }, relays);\n}\n\n/**\n * Every ballot in a poll, by the indexed `t` tag (relays index single-letter\n * tags only). Callers must still check each parsed ballot's `poll_id`: `t` is\n * shared by poll id, family marker and voter address.\n */\nexport function fetchBallotEvents(pollId: string, relays?: readonly string[], queryFn?: QueryFn) {\n return queryPaged({ kinds: [30081], '#t': [pollId] }, relays, queryFn);\n}\n\n// A relay answers a REQ with at most its own cap of events, newest first, so\n// junk under a tag can push older events out of an answer. Reads a count\n// depends on page each relay with `until` until a short page.\n\n/** Events per page: below every reference relay's cap, so a short page means the end. */\nexport const PAGE_SIZE = 100;\n/** Pages per relay before the read is cut off. */\nexport const MAX_PAGES = 20;\n\n/**\n * Relays a ballot must reach for every read at the floor to hear it: the\n * family's rule (chat-core `readFloor`, OC Chat SPEC §8.7), the one the lock,\n * vault and ochk.io device and revocation reads use.\n */\nexport const WRITE_QUORUM = 2;\n\n/**\n * How many of `asked` relays must finish a read in full before a count rests\n * on it: `asked - WRITE_QUORUM + 1`, at least 1. Five asked (DEFAULT_RELAYS):\n * four. The floor plus the quorum exceeds the relays asked, so a ballot two of\n * them hold is in every read that meets the floor.\n */\nexport function readFloor(asked: number): number {\n return Math.max(1, asked - WRITE_QUORUM + 1);\n}\n\nexport interface RelayRead {\n relay: string;\n /** Finished: EOSE for every page, down to a short page. */\n answered: boolean;\n /** Cut off: it sent events but not to the end (a full page from one second,\n * MAX_PAGES, or it stopped answering). Not an answer. */\n truncated: boolean;\n}\n\n/**\n * Why a paged read does not stand for everything the relays hold, or null when\n * it does. A relay that was cut off holds the count: what it did not send may\n * be what decides it. Below the floor, a ballot only the silent relays hold\n * may be missing.\n */\nexport function readShortfall(reads: readonly RelayRead[]): string | null {\n const cut = reads.filter((r) => r.truncated).map((r) => r.relay);\n if (cut.length) return `was cut short on ${cut.join(', ')}`;\n const finished = reads.filter((r) => r.answered).length;\n const floor = readFloor(reads.length);\n return finished < floor\n ? `finished on ${finished} of ${reads.length} relays, fewer than the ${floor} a count needs`\n : null;\n}\n\nexport interface PagedFetch extends EventsFetch {\n relays: RelayRead[];\n}\n\nexport type QueryFn = (filter: Filter, relays: readonly string[], timeoutMs?: number) => Promise<QueryResult>;\n\n/**\n * Every event one relay holds for `filter`, that relay asked alone, page by page\n * under one deadline for the whole read.\n */\nexport async function pageRelay(filter: Filter, relay: string, queryFn: QueryFn) {\n const byId = new Map<string, NostrEvent>();\n const done = (answered: boolean, truncated = false) => ({\n events: [...byId.values()],\n read: { relay, answered, truncated },\n });\n let until: number | undefined;\n // One deadline for the whole read, not a fresh timeout per page: a relay that\n // answers every page slowly would otherwise hold the read for MAX_PAGES of them.\n const deadlineAt = Date.now() + PAGED_READ_DEADLINE_MS;\n for (let page = 0; page < MAX_PAGES; page++) {\n const budget = Math.min(QUERY_TIMEOUT_MS, deadlineAt - Date.now());\n // Out of time after a full page: cut off.\n if (budget <= 0) return done(false, true);\n const { events, relayStatus } = await queryFn(\n { ...filter, limit: PAGE_SIZE, ...(until !== undefined ? { until } : {}) },\n [relay],\n budget\n );\n const status = relayStatus.find((s) => s.relay === relay) ?? relayStatus[0];\n // Everything the relay sent on this page, what nostr-core rejected included.\n const sent = (status?.events ?? 0) + (status?.rejected ?? 0);\n const known = byId.size;\n // A page that stopped short still counts what it sent.\n for (const e of events) byId.set(e.id, e);\n // A relay that sent anything and then stopped is cut off, not silent: the\n // rest of its answer may be what decides the count.\n if (!status?.eose) return done(false, page > 0 || sent > 0);\n // Short only by the relay's count: rejected events fill a page as much as any.\n if (sent < PAGE_SIZE) return done(true);\n // A full page that adds no verified event cannot be paged past.\n if (byId.size === known) return done(false, true);\n const oldest = Math.min(...events.map((e) => e.created_at));\n // A whole page from one second cannot be paged past with `until`.\n if (events.every((e) => e.created_at === oldest)) return done(false, true);\n // Inclusive: the boundary second is read again, so none of it is skipped.\n until = oldest;\n }\n return done(false, true);\n}\n\n/**\n * Every event each relay holds for `filter`, paged per relay. `complete` when\n * no relay was cut off and at least the floor finished (`readShortfall`).\n */\nexport async function queryPaged(\n filter: Filter,\n relays: readonly string[] = DEFAULT_RELAYS,\n queryFn: QueryFn = queryEvents\n): Promise<PagedFetch> {\n const results = await Promise.all(relays.map((r) => pageRelay(filter, r, queryFn)));\n const byId = new Map<string, NostrEvent>();\n for (const r of results) for (const e of r.events) byId.set(e.id, e);\n return {\n events: [...byId.values()].sort((a, b) => b.created_at - a.created_at),\n complete: readShortfall(results.map((r) => r.read)) === null,\n relays: results.map((r) => r.read),\n };\n}\n\n/**\n * Every event under the poll's reveal d-tag, paged per relay like the ballot\n * read. Anyone can publish under that d-tag from fresh keys, so a flood dated\n * after the reveal pushes it out of a single read; \"no reveal\" stands only on\n * a read that is `complete` (`readShortfall`).\n */\nexport function fetchRevealEvents(pollId: string, relays?: readonly string[], queryFn?: QueryFn) {\n return queryPaged({ kinds: [30082], '#d': [`oc-vote:reveal:${pollId}`] }, relays, queryFn);\n}\n\n// `oc-vote-poll` marker: kind 30080 is shared with other Nostr applications.\nexport function fetchRecentPolls(limit = 30, relays?: readonly string[]) {\n return query({ kinds: [30080], '#t': ['oc-vote-poll'], limit }, relays);\n}\n","// Anchored polls (OC Vote SPEC §4.6): a ballot is in time when a Bitcoin block\n// anchors it. This reads every OC Stamp copy over each ballot from the relays,\n// rebuilds each stamp's id, and walks its proof to block headers this CLI\n// fetches itself. It also stamps a ballot this CLI publishes.\n\nimport { randomBytes } from '@noble/hashes/utils';\nimport { addressFromPrivateKey, signMessage } from '@orangecheck/bip322';\nimport { canonicalizeEnvelope, computeEnvelopeId, parseStamp, stamp } from '@orangecheck/stamp-core';\nimport type { StampEnvelope } from '@orangecheck/stamp-core';\nimport { mempoolHeaderSource, submitToCalendars, toStampOts, verifiedAnchor } from '@orangecheck/stamp-ots';\nimport type { BlockHeaderSource } from '@orangecheck/stamp-ots';\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n anchorHeightFromStamps,\n ballotStampContent,\n lastAnchorHeight,\n isAnchoredPoll,\n mempoolBlockTimeSource,\n resolveCloseBlock,\n} from '@orangecheck/vote-core';\nimport type { Ballot, BlockTimeSource, Poll } from '@orangecheck/vote-core';\n\nimport { DEFAULT_RELAYS, queryPaged, readShortfall, type QueryFn, type RelayRead } from './nostr.js';\n\nexport const STAMP_KIND = 30083;\n/** Ballot ids per REQ: fewer per filter, so one ballot's flood pages alone. */\nconst IDS_PER_QUERY = 20;\n\nexport interface AnchoredChain {\n /** The tip the tally is given: held below the final block while `finalBlocked`. */\n tipHeight: number;\n /** The chain tip as read. */\n chainTip: number;\n /** Why this count cannot be final however far the chain is, or null. */\n finalBlocked: string | null;\n /** `H_close`, null while no block's median_time_past has passed the deadline. */\n closeHeight: number | null;\n anchorHeight: (ballotId: string) => number | null;\n}\n\n/** Header lookups shared across one run; a failed lookup is retried, never remembered as \"no header\". */\nexport function cachedHeaders(inner: BlockHeaderSource): BlockHeaderSource {\n const seen = new Map<number, Promise<Uint8Array | null>>();\n return {\n getHeaderAt(height) {\n let p = seen.get(height);\n if (!p) {\n p = inner.getHeaderAt(height);\n p.catch(() => seen.delete(height));\n seen.set(height, p);\n }\n return p;\n },\n };\n}\n\n/**\n * The block a stamp anchors its own id in, or null. The id is rebuilt from the\n * envelope's fields and must equal the one it declares; the proof is walked\n * from that id to headers from `headers`. What the stamp declares about its\n * anchor is not read. Throws when a header cannot be read.\n */\nexport function stampAnchorVerifier(headers: BlockHeaderSource) {\n return async (raw: unknown): Promise<number | null> => {\n let env: StampEnvelope;\n let id: string;\n try {\n env = parseStamp(raw);\n id = computeEnvelopeId({\n address: env.signer.address,\n content_hash: env.content.hash,\n content_length: env.content.length,\n content_mime: env.content.mime,\n signed_at: env.signed_at,\n });\n } catch {\n return null;\n }\n if (id !== env.id || !env.ots?.proof) return null;\n return (await verifiedAnchor(env.ots.proof, id, headers))?.blockHeight ?? null;\n };\n}\n\n/**\n * Every stamp copy over each ballot id, never collapsed, paged per relay so a\n * flood under a ballot's tag cannot push its stamps out. `relays` says which\n * relays answered every page of every lookup.\n */\nexport async function fetchBallotStamps(\n ballotIds: readonly string[],\n relays: readonly string[] = DEFAULT_RELAYS,\n queryFn?: QueryFn\n): Promise<{ stamps: Map<string, unknown[]>; relays: RelayRead[] }> {\n const ids = [...new Set(ballotIds)];\n const stamps = new Map<string, unknown[]>(ids.map((id) => [id, []]));\n const reads = new Map<string, RelayRead>(relays.map((relay) => [relay, { relay, answered: true, truncated: false }]));\n for (let i = 0; i < ids.length; i += IDS_PER_QUERY) {\n const chunk = ids.slice(i, i + IDS_PER_QUERY);\n const r = await queryPaged({ kinds: [STAMP_KIND], '#t': chunk.map((id) => `sha256:${id}`) }, relays, queryFn);\n for (const read of r.relays) {\n const sum = reads.get(read.relay)!;\n reads.set(read.relay, {\n relay: read.relay,\n answered: sum.answered && read.answered,\n truncated: sum.truncated || read.truncated,\n });\n }\n for (const e of r.events) {\n let content: unknown;\n try {\n content = JSON.parse(e.content);\n } catch {\n continue;\n }\n const hash = (content as { content?: { hash?: unknown } } | null)?.content?.hash;\n if (typeof hash === 'string' && hash.startsWith('sha256:')) stamps.get(hash.slice(7))?.push(content);\n }\n }\n return { stamps, relays: [...reads.values()] };\n}\n\n/**\n * What the tally needs for an anchored poll: the tip, `H_close`, and each\n * ballot's anchor height. Null for a clock-dated poll. Throws when the chain\n * or the relays cannot be read.\n */\nexport async function anchoredChain(\n poll: Poll,\n ballotIds: readonly string[],\n opts: {\n /** How the ballots were read: which relays answered to the end. */\n ballotRelays: readonly RelayRead[];\n relays?: readonly string[];\n blockTimes?: BlockTimeSource;\n headers?: BlockHeaderSource;\n mempoolBase?: string;\n queryFn?: QueryFn;\n }\n): Promise<AnchoredChain | null> {\n if (!isAnchoredPoll(poll)) return null;\n const close = await resolveCloseBlock(\n poll.deadline,\n opts.blockTimes ?? mempoolBlockTimeSource(opts.mempoolBase ? { base: opts.mempoolBase } : {})\n );\n if (!close.ok) throw new Error(`the block at the deadline could not be read (${close.code}): ${close.reason}`);\n const read = await fetchBallotStamps(ballotIds, opts.relays ?? DEFAULT_RELAYS, opts.queryFn);\n // A stamp lookup cut short holds the count below; only a lookup no relay answered at all refuses it.\n if (!read.relays.some((r) => r.answered || r.truncated)) {\n throw new Error('no relay finished answering the stamp query; try again');\n }\n const headers =\n opts.headers ?? cachedHeaders(mempoolHeaderSource(opts.mempoolBase ? { baseUrl: opts.mempoolBase } : {}));\n const verify = stampAnchorVerifier(headers);\n const heights = new Map<string, number | null>();\n for (const [id, copies] of read.stamps) heights.set(id, await anchorHeightFromStamps(id, copies, (s) => verify(s)));\n\n // A final count rests on the relays the ballots came from: the ballot\n // lookup must meet the floor with none cut short (`readShortfall`, as for a\n // clock-dated poll), and each relay that finished it must have answered the\n // stamp lookup to the end. A stamp a relay did not send is not evidence of none.\n const stampsDone = read.relays.filter((r) => r.answered && !r.truncated).map((r) => r.relay);\n const ballotsShort = readShortfall(opts.ballotRelays);\n const stampsMissing = opts.ballotRelays\n .filter((r) => r.answered && !stampsDone.includes(r.relay))\n .map((r) => r.relay);\n const incomplete = ballotsShort\n ? `the ballot lookup ${ballotsShort}`\n : stampsMissing.length\n ? `the stamp lookup did not finish on ${stampsMissing.join(', ')}`\n : null;\n const finalAt = close.height === null ? null : lastAnchorHeight(close.height) + ANCHOR_FINAL_CONFIRMATIONS;\n // Named only when it holds the count back: before the final block it is provisional anyway.\n const finalBlocked = incomplete && finalAt !== null && close.tip >= finalAt ? incomplete : null;\n return {\n tipHeight: finalBlocked && finalAt !== null ? finalAt - 1 : close.tip,\n chainTip: close.tip,\n finalBlocked,\n closeHeight: close.height,\n anchorHeight: (id) => heights.get(id) ?? null,\n };\n}\n\n/**\n * An OC Stamp over a ballot (SPEC §4.6), signed by a fresh key: who signs a\n * stamp carries no authority. Its id is submitted to the calendars.\n */\nexport async function stampBallot(ballot: Ballot, fetchImpl?: typeof fetch): Promise<StampEnvelope> {\n const key = randomBytes(32);\n const address = addressFromPrivateKey(key, 'p2wpkh');\n const content = ballotStampContent(ballot);\n const env = await stamp({\n content: { hash: content.hash, length: content.length },\n mime: content.mime,\n signer: { address, signMessage: async (m) => signMessage(address, m, key) },\n });\n const proof = await submitToCalendars(env.id, fetchImpl ? { fetch: fetchImpl } : {});\n return { ...env, ots: toStampOts(proof) };\n}\n\n/** The kind-30083 tags and content that publish a stamp (OC Stamp §7). */\nexport function stampEventParts(env: StampEnvelope): { tags: string[][]; content: string } {\n return {\n tags: [\n ['d', `oc-stamp:${env.id}`],\n ['t', env.signer.address],\n ['t', env.content.hash],\n ['t', 'oc-stamp'],\n ],\n content: canonicalizeEnvelope(env),\n };\n}\n","// Build NIP-01 events for oc-vote kinds 30080/30081/30082.\n// Mirror of oc-vote-web/src/lib/vote/events.ts but node-safe (uses @noble only).\n\nimport { schnorr } from '@noble/curves/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes, randomBytes } from '@noble/hashes/utils';\n\nimport { canonicalBytes, ballotId, pollId, revealId } from '@orangecheck/vote-core';\nimport type { Ballot, Poll, Reveal } from '@orangecheck/vote-core';\n\nimport type { StampEnvelope } from '@orangecheck/stamp-core';\n\nimport { STAMP_KIND, stampEventParts } from './anchors.js';\nimport type { NostrEvent } from './nostr.js';\n\nfunction nip01Id(pubkey: string, created_at: number, kind: number, tags: string[][], content: string): string {\n const serialized = JSON.stringify([0, pubkey, created_at, kind, tags, content]);\n return bytesToHex(sha256(new TextEncoder().encode(serialized)));\n}\n\nfunction sign(kind: number, tags: string[][], content: string): NostrEvent {\n const sk = randomBytes(32);\n const pubkey = bytesToHex(schnorr.getPublicKey(sk));\n const created_at = Math.floor(Date.now() / 1000);\n const id = nip01Id(pubkey, created_at, kind, tags, content);\n const sig = bytesToHex(schnorr.sign(hexToBytes(id), sk));\n return { id, pubkey, created_at, kind, tags, content, sig };\n}\n\nexport function buildPollEvent(poll: Poll): NostrEvent {\n const pid = pollId(poll);\n const content = canonicalBytes(poll).trimEnd();\n const snapshot =\n typeof poll.snapshot_block === 'number' ? String(poll.snapshot_block) : poll.snapshot_block;\n// NIP-12 relays index SINGLE-LETTER tag names only. The multi-letter\n// `poll_id` / `voter` / `creator` tags below are readable diagnostics and are\n// NOT queryable — a `#poll_id` filter matches nothing on a conforming relay.\n// The `t` tags are what make these events findable, and for ballots they are\n// the ONLY way to enumerate a poll: a ballot's d-tag embeds the voter, tag\n// filters are exact-match, and enumerating voters is the point of the query.\n// Kept in sync with oc-vote-web/src/lib/vote/events.ts and normative in\n// oc-vote-protocol SPEC §3.4/§3.6.\n return sign(30080, [\n ['d', `oc-vote:poll:${pid}`],\n ['t', pid],\n ['t', 'oc-vote-poll'],\n ['t', poll.creator],\n ['poll_id', pid],\n ['creator', poll.creator],\n ['deadline', poll.deadline],\n ['snapshot', snapshot],\n ['mode', poll.mode],\n ], content);\n}\n\nexport function buildBallotEvent(ballot: Ballot): NostrEvent {\n const bid = ballotId(ballot);\n const content = canonicalBytes(ballot).trimEnd();\n return sign(30081, [\n ['d', `oc-vote:ballot:${ballot.poll_id}:${ballot.voter}`],\n // `t` = poll_id is the only path to \"every ballot in this poll\".\n ['t', ballot.poll_id],\n ['t', 'oc-vote-ballot'],\n ['t', ballot.voter],\n ['poll_id', ballot.poll_id],\n ['voter', ballot.voter],\n ['ballot_id', bid],\n ], content);\n}\n\nexport function buildRevealEvent(reveal: Reveal): NostrEvent {\n const rid = revealId(reveal);\n const content = canonicalBytes(reveal).trimEnd();\n return sign(30082, [\n ['d', `oc-vote:reveal:${reveal.poll_id}`],\n ['t', reveal.poll_id],\n ['t', 'oc-vote-reveal'],\n ['poll_id', reveal.poll_id],\n ['reveal_id', rid],\n ], content);\n}\n\n/** The kind-30083 event that publishes an OC Stamp over a ballot (OC Stamp §7), under a fresh key. */\nexport function buildStampEvent(env: StampEnvelope): NostrEvent {\n const { tags, content } = stampEventParts(env);\n return sign(STAMP_KIND, tags, content);\n}\n","import { verifySignature } from '@orangecheck/bip322';\n\n// BIP-322 verification in vote-core's named-argument shape. Returns false on\n// any parse or verify failure.\n\nexport async function bip322Verify(args: {\n address: string;\n message: string;\n signature: string;\n}): Promise<boolean> {\n return verifySignature(args.address, args.message, args.signature);\n}\n","// A signed object (poll, ballot, reveal, stamp) is in only once two relays, each\n// asked alone, serve it back: the write quorum the readers' floor assumes\n// (`readFloor`: a count may go without any one relay, so an object only one\n// relay holds is lost whenever that relay is the one it went without). An OK\n// from a relay is not enough: some say OK and keep nothing. OC Vote SPEC §3.4;\n// oc-vote-web reads ballots back the same way, and OC Agent SPEC §9.4 sets the\n// rule for a revocation.\n\nimport { matchFilter, publishEvent, queryEvents, verifyEvent, type Filter } from '@orangecheck/nostr-core';\nimport { parseStamp, verify as stampVerify, type StampEnvelope } from '@orangecheck/stamp-core';\nimport {\n ballotId,\n pollId,\n revealId,\n verifyBallot,\n verifyPoll,\n verifyReveal,\n type Ballot,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n} from '@orangecheck/vote-core';\n\nimport { STAMP_KIND } from './anchors.js';\nimport { bip322Verify } from './bip322.js';\nimport { DEFAULT_RELAYS, pageRelay, WRITE_QUORUM, type NostrEvent, type PublishResult, type QueryFn } from './nostr.js';\n\n/** min(2, asked): a single relay asked must serve it itself. Never 0, so no relays is never \"in\". */\nexport function writeQuorum(asked: number): number {\n return Math.max(1, Math.min(WRITE_QUORUM, asked));\n}\n\n/** In once `serving` of the `asked` relays serve it back, each asked alone. */\nexport function isIn(serving: number, asked: number): boolean {\n return serving >= writeQuorum(asked);\n}\n\n/** The object of `kind` that `content` holds, or null when it holds none. */\nfunction parsed<T>(content: string, kind: string): T | null {\n try {\n const o = JSON.parse(content) as { kind?: unknown } | null;\n return o && typeof o === 'object' && o.kind === kind ? (o as T) : null;\n } catch {\n return null;\n }\n}\n\n/** The ballot an event carries, or null when its content is not one. */\nexport function ballotOf(ev: NostrEvent): Ballot | null {\n return parsed<Ballot>(ev.content, 'oc-vote/ballot');\n}\n\n/** The poll an event carries, or null when its content is not one. */\nexport function pollOf(ev: NostrEvent): Poll | null {\n return parsed<Poll>(ev.content, 'oc-vote/poll');\n}\n\n/** The reveal an event carries, or null when its content is not one. */\nexport function revealOf(ev: NostrEvent): Reveal | null {\n return parsed<Reveal>(ev.content, 'oc-vote/reveal');\n}\n\n/** The OC Stamp `content` holds, or null when it holds none. */\nfunction stampIn(content: string): StampEnvelope | null {\n try {\n return parseStamp(JSON.parse(content));\n } catch {\n return null;\n }\n}\n\n/** The OC Stamp an event carries, or null when its content is not one. */\nexport function stampOf(ev: NostrEvent): StampEnvelope | null {\n return stampIn(ev.content);\n}\n\n/** `id(x)`, or null where it throws (content too deep or malformed to hash). */\nfunction safely<T>(id: (x: T) => string, x: T): string | null {\n try {\n return id(x);\n } catch {\n return null;\n }\n}\n\nexport interface ReadBackOptions {\n relays?: readonly string[];\n query?: QueryFn;\n verify?: SignatureVerifier;\n}\n\n/**\n * The relays that serve back a copy `accept` takes. Each relay is asked alone\n * and paged under its own deadline (`pageRelay`), so one relay's answer never\n * speaks for another and a slow one holds up only itself. A copy is judged only\n * if its Nostr id and signature hold and it matches `filter`, the query a\n * reader makes: a relay can send anything. `accept` judges the content alone,\n * so each distinct content is judged once, however many relays serve it.\n */\nexport async function relaysServing(\n filter: Filter,\n accept: (content: string) => Promise<boolean>,\n opts: ReadBackOptions = {}\n): Promise<string[]> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const query = opts.query ?? queryEvents;\n const checked = new Map<string, Promise<boolean>>();\n const valid = (ev: NostrEvent): Promise<boolean> => {\n if (!verifyEvent(ev) || !matchFilter(ev, filter)) return Promise.resolve(false);\n let check = checked.get(ev.content);\n if (!check) {\n check = accept(ev.content).catch(() => false);\n checked.set(ev.content, check);\n }\n return check;\n };\n\n const held = await Promise.all(\n relays.map(async (url) => {\n const read = await pageRelay(filter, url, query).catch(() => null);\n for (const ev of read?.events ?? []) if (await valid(ev)) return url;\n return null;\n })\n );\n return held.filter((u): u is string => u !== null);\n}\n\n/**\n * The relays that serve a valid copy of `ballot` back, asked the way a count\n * asks (kind 30081 under the poll's `t`), narrowed to this voter's d-tag. A copy\n * counts when it carries this ballot's ballot_id and its own ballot signature\n * verifies. ballot_id leaves out sig.value, so a copy under the same id with a\n * junk signature does not count.\n */\nexport function relaysServingBallot(ballot: Ballot, opts: ReadBackOptions = {}): Promise<string[]> {\n const id = ballotId(ballot);\n const verify = opts.verify ?? bip322Verify;\n const filter: Filter = { kinds: [30081], '#d': [`oc-vote:ballot:${ballot.poll_id}:${ballot.voter}`], '#t': [ballot.poll_id] };\n return relaysServing(\n filter,\n async (content) => {\n const copy = parsed<Ballot>(content, 'oc-vote/ballot');\n return !!copy && safely(ballotId, copy) === id && (await verifyBallot(copy, verify)).ok;\n },\n opts\n );\n}\n\n/**\n * The relays that serve a valid copy of `poll` back, asked the way the poll\n * lookup asks (kind 30080 under its d-tag). A copy counts when it hashes to this\n * poll id and the creator's signature verifies.\n */\nexport function relaysServingPoll(poll: Poll, opts: ReadBackOptions = {}): Promise<string[]> {\n const id = pollId(poll);\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [30080], '#d': [`oc-vote:poll:${id}`] },\n async (content) => {\n const copy = parsed<Poll>(content, 'oc-vote/poll');\n return !!copy && safely(pollId, copy) === id && (await verifyPoll(copy, verify)).ok;\n },\n opts\n );\n}\n\n/** What a count needs to accept a reveal of an anchored poll (vote-core `verifyReveal`). */\nexport type RevealChain = { tipHeight: number; closeHeight: number | null };\n\n/**\n * The relays that serve a valid copy of `reveal` back, asked the way a count\n * asks (kind 30082 under the poll's reveal d-tag). A copy counts when it carries\n * this reveal's id and verifies against `poll` the way a count checks it now\n * (signature, timing, and for an anchored poll the chain).\n */\nexport function relaysServingReveal(\n reveal: Reveal,\n poll: Poll,\n opts: ReadBackOptions & { chain?: RevealChain } = {}\n): Promise<string[]> {\n const id = revealId(reveal);\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [30082], '#d': [`oc-vote:reveal:${reveal.poll_id}`] },\n async (content) => {\n const copy = parsed<Reveal>(content, 'oc-vote/reveal');\n return (\n !!copy && safely(revealId, copy) === id && (await verifyReveal(copy, poll, verify, Date.now(), opts.chain)).ok\n );\n },\n opts\n );\n}\n\n/** BIP-322 in stamp-core's argument order. */\nconst stampSigVerifier = (verify: SignatureVerifier) => (message: string, signature: string, address: string) =>\n Promise.resolve(verify({ address, message, signature }));\n\n/**\n * The relays that serve back this stamp (kind 30083 under its own d-tag). A\n * final count of an anchored poll reads ballots' stamps at the read floor, so a\n * stamp only one relay holds can be missed with that relay. A copy counts when\n * it is this envelope (its id covers the content hash) and its signature\n * verifies.\n */\nexport function relaysServingStamp(env: StampEnvelope, opts: ReadBackOptions = {}): Promise<string[]> {\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [STAMP_KIND], '#d': [`oc-stamp:${env.id}`] },\n async (content) => {\n const copy = stampIn(content);\n if (!copy || copy.id !== env.id) return false;\n return (await stampVerify({ envelope: copy, verifyBip322: stampSigVerifier(verify) })).ok;\n },\n opts\n );\n}\n\nexport interface CastOptions {\n relays?: readonly string[];\n publish?: (event: NostrEvent, relays: readonly string[]) => Promise<PublishResult[]>;\n}\n\n/**\n * One try at getting a signed event in: publish `event` to the relays that did\n * not serve it back last time (`serving`), then `readBack`, which asks every\n * relay alone again. `event` is signed once and sent as it is on every try, so\n * publishing it again needs no new signature.\n *\n * Returns the relays that serve a valid copy now. Tries that land on different\n * relays add up while the earlier relays still serve it; one that has dropped\n * it no longer counts, so this errs towards \"not in yet\", never \"in\".\n */\nexport async function castEvent(\n event: NostrEvent,\n serving: readonly string[],\n readBack: () => Promise<string[]>,\n opts: CastOptions = {}\n): Promise<string[]> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const missing = relays.filter((r) => !serving.includes(r));\n if (missing.length > 0) await (opts.publish ?? publishEvent)(event, missing);\n return readBack();\n}\n\n/** `castEvent` for a ballot, read back with `relaysServingBallot`. */\nexport function castBallot(\n event: NostrEvent,\n ballot: Ballot,\n serving: readonly string[],\n opts: CastOptions & ReadBackOptions = {}\n): Promise<string[]> {\n return castEvent(event, serving, () => relaysServingBallot(ballot, opts), opts);\n}\n","// Where a published object stands, from the relays that serve it back, each\n// asked alone (quorum.ts). Never more than the read-back showed. Below\n// min(2, asked) it says the object isn't in yet, gives the signed event to send\n// again with `oc-vote republish`, and sets the exit status to NOT_IN_YET.\n\nimport type { NostrEvent } from './nostr.js';\nimport { isIn, writeQuorum } from './quorum.js';\n\n/** Exit status when something was published but is not in yet. */\nexport const NOT_IN_YET = 2;\n\nexport type Kind = 'poll' | 'ballot' | 'reveal' | 'stamp';\n\n/** A signed event this command published, and the relays that serve it back now. */\nexport interface Standing {\n kind: Kind;\n event: NostrEvent;\n relays: readonly string[];\n serving: readonly string[];\n}\n\nexport function standingIsIn(s: Standing): boolean {\n return isIn(s.serving.length, s.relays.length);\n}\n\nfunction standingJson(s: Standing) {\n return { in: standingIsIn(s), served_by: s.serving, asked: s.relays.length, quorum: writeQuorum(s.relays.length) };\n}\n\nconst LABEL: Record<Kind, string> = { poll: 'published:', ballot: 'in:', reveal: 'published:', stamp: 'stamp:' };\n/** What missing every relay means for each kind's readers. */\nconst MISSED: Record<Kind, string> = {\n poll: 'so no one can find it',\n ballot: 'so a count would not see it',\n reveal: 'so a count would not see it',\n stamp: 'so a final count would not see it',\n};\n/** Who is sure to see it at the quorum. */\nconst SURE: Record<Kind, string> = {\n poll: 'it is sure to be found',\n ballot: 'a count is sure to see it',\n reveal: 'a count is sure to see it',\n stamp: 'a final count is sure to see it',\n};\n\n/** Where `s` stands, its relays one a line, and, below the quorum, how to send it again. */\nexport function standingLines(s: Standing, file?: string): string[] {\n const asked = s.relays.length;\n const n = s.serving.length;\n const label = ` ${LABEL[s.kind].padEnd(12)}`;\n const lines: string[] = [];\n if (standingIsIn(s)) {\n lines.push(`${label}yes, ${n} of ${asked} relays serve it back`);\n if (s.kind === 'stamp') lines.push(` a Bitcoin block usually anchors it within an hour or two`);\n } else if (n === 0) {\n lines.push(`${label}not yet: no relay serves it back, ${MISSED[s.kind]}`);\n } else {\n lines.push(\n `${label}not yet: only ${n} of ${asked} relays serves it back, ` +\n `and ${SURE[s.kind]} only once ${writeQuorum(asked)} do`\n );\n }\n for (const relay of s.relays) lines.push(` ${s.serving.includes(relay) ? '✓' : '✗'} ${relay}`);\n if (standingIsIn(s)) return lines;\n if (s.kind === 'stamp') lines.push(` vote.ochk.io's anchorer also stamps every ballot it sees`);\n if (file) {\n lines.push(` again: oc-vote republish ${file}`);\n lines.push(` sends the same signed ${s.kind}, with nothing new to sign`);\n } else {\n lines.push(` again: save the signed event below to a file and run oc-vote republish <file>;`);\n lines.push(` it sends the same signed ${s.kind}, with nothing new to sign`);\n lines.push(` event: ${JSON.stringify(s.event)}`);\n }\n return lines;\n}\n\nexport interface Report {\n /** The object's id line, e.g. ['ballot_id', '…']. */\n id: [string, string];\n heading?: [string, string][];\n main: Standing;\n /** A ballot's stamp in an anchored poll: where it stands, or why none was made. */\n stamp?: Standing | { error: string } | null;\n json: boolean;\n /** JSON fields after the standing and before `event`. */\n jsonExtra?: Record<string, unknown>;\n /** Human lines after the standing. */\n tail?: string[];\n /** The file the signed event came from, for the \"again\" line. */\n file?: string;\n}\n\n/** Writes where `r.main` (and its stamp) stand; NOT_IN_YET when either isn't in. */\nexport function report(r: Report): void {\n const stamp = r.stamp && 'kind' in r.stamp ? r.stamp : null;\n if (!standingIsIn(r.main) || (stamp && !standingIsIn(stamp))) process.exitCode = NOT_IN_YET;\n\n if (r.json) {\n const stampJson = r.stamp ? ('kind' in r.stamp ? { ...standingJson(r.stamp), event: r.stamp.event } : r.stamp) : null;\n process.stdout.write(\n JSON.stringify(\n {\n [r.id[0]]: r.id[1],\n ...standingJson(r.main),\n ...(stampJson ? { stamp: stampJson } : {}),\n ...r.jsonExtra,\n event: r.main.event,\n },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const lines = [` ${`${r.id[0]}:`.padEnd(12)}${r.id[1]}`];\n for (const [k, v] of r.heading ?? []) lines.push(` ${`${k}:`.padEnd(12)}${v}`);\n lines.push(...standingLines(r.main, r.file));\n if (stamp) lines.push(...standingLines(stamp));\n else if (r.stamp && 'error' in r.stamp) {\n lines.push(` stamp: not made here (${r.stamp.error}); vote.ochk.io's anchorer stamps every ballot it sees`);\n }\n lines.push(...(r.tail ?? []));\n process.stdout.write(`\\n${lines.join('\\n')}\\n\\n`);\n}\n","// Interactive signature prompt.\n// The CLI never holds a Bitcoin private key. To sign a poll / ballot / reveal,\n// the caller either passes --sig <base64> on the command line, or we compute\n// the canonical id, print it, and ask the user to sign elsewhere (UniSat,\n// Xverse, Leather, sparrow-wallet, any BIP-322 signer) and paste back.\n\nimport { createInterface } from 'node:readline/promises';\n\nexport async function promptForSignature(\n address: string,\n id: string,\n preset?: string\n): Promise<string> {\n if (preset && preset.trim()) return preset.trim();\n\n process.stderr.write(\n `\\n sign with BIP-322, address ${address}\\n` +\n ` message: ${id}\\n\\n` +\n ` paste the base64 signature and press enter:\\n > `\n );\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n const sig = (await rl.question('')).trim();\n rl.close();\n if (!sig) throw new Error('empty signature');\n return sig;\n}\n","// oc-vote create — build + sign + publish a poll, then ask each relay alone for\n// it back. It is published only once min(2, asked) relays serve a valid copy\n// (OC Vote SPEC §3.4, quorum.ts); below that it says so and exits 2, and\n// `oc-vote republish` sends the same signed event again.\n\nimport { hexEncode } from '@orangecheck/lock-crypto';\nimport { generateX25519KeyPair } from '@orangecheck/lock-crypto';\nimport { canonicalBytes, pollId } from '@orangecheck/vote-core';\nimport type { Poll, PollMode, Tiebreak, WeightMode } from '@orangecheck/vote-core';\n\nimport { buildPollEvent } from '../events.js';\nimport { DEFAULT_RELAYS } from '../nostr.js';\nimport { castEvent, relaysServingPoll } from '../quorum.js';\nimport { report } from '../report.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface CreateOptions {\n creator: string;\n question: string;\n options: { id: string; label: string }[];\n deadline: string;\n snapshotBlock: number | 'deadline';\n weightMode: WeightMode;\n capDays?: number;\n minSats: number;\n minDays: number;\n tiebreak: Tiebreak;\n mode: PollMode;\n notes?: string;\n sig?: string;\n relays?: string[];\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport async function runCreate(opts: CreateOptions): Promise<void> {\n if (!/^(bc1|1|3)[0-9a-zA-Z]+$/.test(opts.creator)) {\n throw new Error(`creator does not look like a Bitcoin mainnet address: ${opts.creator}`);\n }\n if (opts.options.length < 2) throw new Error('need at least 2 options');\n if (new Set(opts.options.map((o) => o.id)).size !== opts.options.length) {\n throw new Error('option ids must be unique');\n }\n\n // Secret mode: generate an X25519 reveal keypair.\n let reveal_pk: string | null = null;\n let reveal_sk: string | null = null;\n if (opts.mode === 'secret') {\n const kp = generateX25519KeyPair();\n reveal_sk = hexEncode(kp.secret);\n reveal_pk = hexEncode(kp.public);\n }\n\n const draft: Poll = {\n v: 0,\n kind: 'oc-vote/poll',\n creator: opts.creator,\n question: opts.question,\n options: opts.options,\n deadline: opts.deadline,\n snapshot_block: opts.snapshotBlock,\n weight_mode: opts.weightMode,\n weight_params:\n opts.weightMode === 'sats_days' && opts.capDays\n ? { cap_days: opts.capDays }\n : null,\n min_sats: opts.minSats,\n min_days: opts.minDays,\n mode: opts.mode,\n reveal_pk,\n tiebreak: opts.tiebreak,\n notes: opts.notes ?? null,\n created_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.creator, value: '' },\n };\n\n const pid = pollId(draft);\n\n if (opts.dryRun) {\n const out = {\n poll_id: pid,\n poll: draft,\n ...(reveal_sk ? { reveal_sk, reveal_pk } : {}),\n };\n process.stdout.write(JSON.stringify(out, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.creator, pid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: `oc-vote republish` sends this same event, so a poll that isn't\n // published yet keeps its id, and ballots cast against it stay its own.\n const event = buildPollEvent(draft);\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const serving = await castEvent(event, [], () => relaysServingPoll(draft, { relays }), { relays });\n const url = `https://vote.ochk.io/p/${pid}`;\n\n const tail = [` url: ${url}`];\n if (reveal_sk) {\n tail.push(\n '',\n ' SECRET MODE — save these or the poll is abandoned at deadline:',\n ` reveal_pk: ${reveal_pk}`,\n ` reveal_sk: ${reveal_sk}`,\n ' to publish the reveal:',\n ` oc-vote reveal --poll ${pid} --reveal-sk ${reveal_sk} --creator ${opts.creator}`\n );\n }\n tail.push('', ' canonical bytes:', canonicalBytes({ ...draft, sig: { ...draft.sig, value: '' } }).trimEnd());\n\n report({\n id: ['poll_id', pid],\n main: { kind: 'poll', event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { poll: draft, ...(reveal_sk ? { reveal_sk, reveal_pk } : {}), url },\n tail,\n });\n}\n","// Pick the poll / reveal out of everything relays return under a d-tag.\n//\n// The poll is an event whose content hashes to the requested id (SPEC §3.2);\n// among those, one whose creator signature verifies (§10.1) is preferred.\n// The reveal is the first that verifies against the poll (§6.4, §10.3).\n\nimport {\n pollId as computePollId,\n verifyPoll,\n verifyReveal,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n} from '@orangecheck/vote-core';\n\nimport { readShortfall, type EventsFetch, type NostrEvent, type PagedFetch } from './nostr.js';\n\nfunction parse<T>(ev: NostrEvent): T | null {\n try {\n return JSON.parse(ev.content) as T;\n } catch {\n return null;\n }\n}\n\nexport async function selectPoll(\n events: NostrEvent[],\n pid: string,\n verify: SignatureVerifier\n): Promise<{ poll: Poll; signatureValid: boolean } | null> {\n let unverified: Poll | null = null;\n for (const ev of events) {\n const p = parse<Poll>(ev);\n if (!p || p.kind !== 'oc-vote/poll' || computePollId(p) !== pid) continue;\n if ((await verifyPoll(p, verify)).ok) return { poll: p, signatureValid: true };\n unverified ??= p;\n }\n return unverified ? { poll: unverified, signatureValid: false } : null;\n}\n\n/**\n * selectPoll over a relay answer, distinguishing \"no relay has it\" from \"no\n * relay finished answering\" — only the first is \"not found\".\n */\nexport async function findPoll(\n fetched: EventsFetch,\n pid: string,\n verify: SignatureVerifier\n): Promise<{ poll: Poll; signatureValid: boolean }> {\n const selected = await selectPoll(fetched.events, pid, verify);\n if (selected) return selected;\n throw new Error(\n fetched.complete\n ? 'poll not found on relays'\n : 'no relay finished answering the poll query; try again'\n );\n}\n\n/** Refuse to draw a conclusion from a set that does not stand for what the relays hold. */\nexport function requireComplete(fetched: EventsFetch | PagedFetch, what: string): NostrEvent[] {\n if (fetched.complete) return fetched.events;\n const short = 'relays' in fetched ? readShortfall(fetched.relays) : null;\n throw new Error(\n short\n ? `can't count: the ${what} lookup ${short}, so ${what}s may be missing; try again`\n : `no relay finished answering the ${what} query; try again`\n );\n}\n\n/**\n * The ballots a tally counts. A clock-dated count rests on the ballot read\n * alone, so a read that was cut short or is below the floor can't be counted.\n * An anchored count is held provisional instead (anchoredChain, the same\n * `readShortfall`), so it needs only a relay that answered at all.\n */\nexport function ballotsToCount(fetched: PagedFetch, anchored: boolean): NostrEvent[] {\n if (!anchored) return requireComplete(fetched, 'ballot');\n if (fetched.relays.some((r) => r.answered || r.truncated)) return fetched.events;\n throw new Error('no relay finished answering the ballot query; try again');\n}\n\n/**\n * The first reveal that verifies against the poll. An anchored poll's reveal\n * counts only once `chain.tipHeight` reaches H_close + G + 6 (SPEC §10.3), so\n * without `chain` none does.\n */\nexport async function selectReveal(\n events: NostrEvent[],\n poll: Poll,\n verify: SignatureVerifier,\n chain?: { tipHeight: number; closeHeight: number | null }\n): Promise<Reveal | null> {\n return (await findReveal(events, poll, verify, chain))?.reveal ?? null;\n}\n\n/** `selectReveal`, with the event that carried it. */\nexport async function findReveal(\n events: readonly NostrEvent[],\n poll: Poll,\n verify: SignatureVerifier,\n chain?: { tipHeight: number; closeHeight: number | null }\n): Promise<{ event: NostrEvent; reveal: Reveal } | null> {\n for (const event of events) {\n const reveal = parse<Reveal>(event);\n if (reveal && (await verifyReveal(reveal, poll, verify, Date.now(), chain)).ok) return { event, reveal };\n }\n return null;\n}\n","// oc-vote discover — list recent polls across the default relay set.\n\nimport { pollId as computePollId, verifyPoll } from '@orangecheck/vote-core';\nimport type { Poll } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchRecentPolls } from '../nostr.js';\nimport { requireComplete } from '../select.js';\n\nexport interface DiscoverOptions {\n limit?: number;\n relays?: string[];\n json?: boolean;\n openOnly?: boolean;\n}\n\nexport async function runDiscover(opts: DiscoverOptions): Promise<void> {\n const limit = opts.limit ?? 30;\n const events = requireComplete(await fetchRecentPolls(limit, opts.relays ?? DEFAULT_RELAYS), 'poll listing');\n\n interface Item {\n poll_id: string;\n poll: Poll;\n nostr_created_at: number;\n }\n const seen = new Set<string>();\n const items: Item[] = [];\n for (const ev of events) {\n try {\n const poll = JSON.parse(ev.content) as Poll;\n if (poll.kind !== 'oc-vote/poll' || poll.v !== 0) continue;\n const pid = computePollId(poll);\n if (seen.has(pid)) continue;\n if (opts.openOnly && Date.parse(poll.deadline) < Date.now()) continue;\n // Listed only when the creator's signature verifies (SPEC §10.1). A copy\n // that fails leaves the id open for another: poll_id leaves out sig.value.\n if (!(await verifyPoll(poll, bip322Verify)).ok) continue;\n seen.add(pid);\n items.push({ poll_id: pid, poll, nostr_created_at: ev.created_at });\n } catch {}\n }\n items.sort((a, b) => b.nostr_created_at - a.nostr_created_at);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(items, null, 2) + '\\n');\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n discovered ${items.length} poll(s) across ${(opts.relays ?? DEFAULT_RELAYS).length} relays\\n\\n`);\n for (const { poll, poll_id, nostr_created_at } of items) {\n const isPast = Date.parse(poll.deadline) < Date.now();\n const age = Math.max(0, Math.floor((Date.now() / 1000 - nostr_created_at) / 60));\n const ageStr =\n age < 1\n ? 'just now'\n : age < 60\n ? `${age}m`\n : age < 60 * 24\n ? `${Math.floor(age / 60)}h`\n : `${Math.floor(age / (60 * 24))}d`;\n w(` [${isPast ? 'closed' : ' open '}] [${poll.weight_mode.padEnd(15)}] ${ageStr.padStart(5)} · ${poll.question}\\n`);\n w(` https://vote.ochk.io/p/${poll_id}\\n`);\n }\n if (items.length === 0) {\n w(` No polls found. Try: oc-vote create\\n`);\n }\n w(`\\n`);\n}\n","// oc-vote gen-reveal-key — print a fresh X25519 keypair for secret-mode\n// polls. Use this to pre-generate a key pair you pin into a --reveal-pk\n// flag, then publish the matching --reveal-sk at deadline.\n//\n// The standard `oc-vote create --mode secret` already generates one\n// automatically; this command exists for flows that want the key in hand\n// before composing the poll (e.g. DAO trustee ceremonies).\n\nimport { generateX25519KeyPair, hexEncode } from '@orangecheck/lock-crypto';\n\nexport interface GenRevealKeyOptions {\n json?: boolean;\n}\n\nexport function runGenRevealKey(opts: GenRevealKeyOptions): void {\n const kp = generateX25519KeyPair();\n const reveal_sk = hexEncode(kp.secret);\n const reveal_pk = hexEncode(kp.public);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ reveal_sk, reveal_pk }, null, 2) + '\\n');\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n reveal_pk: ${reveal_pk}\\n`);\n w(` reveal_sk: ${reveal_sk}\\n\\n`);\n w(` pass reveal_pk to --reveal-pk at poll creation.\\n`);\n w(` keep reveal_sk offline until deadline; publish via:\\n`);\n w(` oc-vote reveal --poll <id> --reveal-sk ${reveal_sk} --creator <addr>\\n\\n`);\n}\n","// oc-vote reveal — publish the reveal event for a secret-mode poll, then ask\n// each relay alone for it back. It is published only once min(2, asked) relays\n// serve a copy a count accepts (OC Vote SPEC §3.4, quorum.ts); below that it\n// says so and exits 2, and `oc-vote republish` sends the same signed event\n// again. A reveal already on the relays is sent again as it is, not re-signed.\n\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n anchoredTallyIsFinal,\n isAnchoredPoll,\n lastAnchorHeight,\n mempoolBlockTimeSource,\n resolveCloseBlock,\n revealId,\n} from '@orangecheck/vote-core';\nimport type { Poll, Reveal } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\n\nimport { buildRevealEvent } from '../events.js';\nimport { DEFAULT_RELAYS, fetchPollEvents, fetchRevealEvents } from '../nostr.js';\nimport { castEvent, relaysServingReveal, type RevealChain } from '../quorum.js';\nimport { report } from '../report.js';\nimport { findPoll, findReveal } from '../select.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface RevealOptions {\n pollId: string;\n revealSk: string;\n creator: string;\n sig?: string;\n relays?: string[];\n force?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n/**\n * For an anchored poll, the chain a count checks a reveal against (vote-core\n * `verifyReveal`); undefined for a clock-dated poll.\n */\nexport async function revealChainFor(poll: Poll): Promise<RevealChain | undefined> {\n if (!isAnchoredPoll(poll)) return undefined;\n const close = await resolveCloseBlock(poll.deadline, mempoolBlockTimeSource());\n if (!close.ok) throw new Error(`the block at the deadline could not be read: ${close.reason}`);\n return { tipHeight: close.tip, closeHeight: close.height };\n}\n\nexport async function runReveal(opts: RevealOptions): Promise<void> {\n if (!/^[0-9a-f]{64}$/.test(opts.pollId)) {\n throw new Error('poll id must be 64 hex chars');\n }\n if (!/^[0-9a-f]{64}$/.test(opts.revealSk)) {\n throw new Error('reveal_sk must be 64 hex chars');\n }\n\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const selected = await findPoll(await fetchPollEvents(opts.pollId, relays), opts.pollId, bip322Verify);\n const poll = selected.poll;\n if (poll.mode !== 'secret') throw new Error('poll is public-mode — no reveal needed');\n if (poll.creator !== opts.creator) {\n throw new Error(\n `poll creator is ${poll.creator} but you provided ${opts.creator}`\n );\n }\n // SPEC §10.3: an anchored poll's reveal counts only once the tip reaches\n // H_close + G + 6; a clock-dated poll's once the deadline has passed.\n const chain = await revealChainFor(poll);\n if (chain) {\n if (!anchoredTallyIsFinal(chain.closeHeight, chain.tipHeight) && !opts.force) {\n throw new Error(\n chain.closeHeight === null\n ? 'no block at the deadline yet: talliers would not accept a reveal now (pass --force to publish anyway)'\n : `talliers accept the reveal from block ${lastAnchorHeight(chain.closeHeight) + ANCHOR_FINAL_CONFIRMATIONS}; the tip is ${chain.tipHeight} (pass --force to publish anyway)`\n );\n }\n } else if (Date.parse(poll.deadline) > Date.now() && !opts.force) {\n throw new Error(\n `poll deadline is ${poll.deadline} — pass --force to publish before deadline`\n );\n }\n\n // A reveal that verifies against the poll is already signed: send that same\n // event to the relays that don't serve it, rather than ask for a new\n // signature. --force signs a new one instead.\n const existing = await findReveal((await fetchRevealEvents(opts.pollId, relays)).events, poll, bip322Verify, chain);\n if (existing && !opts.force) {\n const readBack = () => relaysServingReveal(existing.reveal, poll, { relays, chain });\n const serving = await castEvent(existing.event, await readBack(), readBack, { relays });\n report({\n id: ['reveal_id', revealId(existing.reveal)],\n heading: [\n ['poll', poll.question],\n ['revealed', existing.reveal.revealed_at],\n ],\n main: { kind: 'reveal', event: existing.event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { reveal: existing.reveal, signed_earlier: true },\n tail: [\n ' note: this reveal was signed earlier and found on the relays; it was sent as it is',\n '',\n ` tally with: oc-vote tally ${opts.pollId}`,\n ],\n });\n return;\n }\n\n const draft: Reveal = {\n v: 0,\n kind: 'oc-vote/reveal',\n poll_id: opts.pollId,\n reveal_sk: opts.revealSk,\n revealed_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.creator, value: '' },\n };\n\n const rid = revealId(draft);\n\n if (opts.dryRun) {\n process.stdout.write(JSON.stringify({ reveal_id: rid, reveal: draft }, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.creator, rid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: `oc-vote republish` sends this same event.\n const event = buildRevealEvent(draft);\n const serving = await castEvent(event, [], () => relaysServingReveal(draft, poll, { relays, chain }), { relays });\n report({\n id: ['reveal_id', rid],\n heading: [\n ['poll', poll.question],\n ['revealed', draft.revealed_at],\n ],\n main: { kind: 'reveal', event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { reveal: draft },\n tail: ['', ` tally with: oc-vote tally ${opts.pollId}`],\n });\n}\n","// oc-vote republish <file> — send a signed poll, ballot, reveal or ballot stamp\n// again, as it is, and ask each relay alone for it back. The file holds the\n// event `create`, `vote` or `reveal` printed (an `event:` line, or the whole\n// --json output). Nothing new is signed: a poll keeps its id, so ballots cast\n// against it stay its own, and nothing waits on a wallet.\n\nimport { readFileSync } from 'node:fs';\n\nimport { verifyEvent } from '@orangecheck/nostr-core';\nimport { verify as stampVerify } from '@orangecheck/stamp-core';\nimport { ballotId, pollId, revealId, verifyBallot, verifyPoll, verifyReveal } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchPollEvents, type NostrEvent } from '../nostr.js';\nimport {\n ballotOf,\n castEvent,\n pollOf,\n relaysServingBallot,\n relaysServingPoll,\n relaysServingReveal,\n relaysServingStamp,\n revealOf,\n stampOf,\n} from '../quorum.js';\nimport { report, type Kind } from '../report.js';\nimport { findPoll } from '../select.js';\nimport { revealChainFor } from './reveal.js';\n\nexport interface RepublishOptions {\n file: string;\n relays?: string[];\n json?: boolean;\n}\n\n/** A signed event checked the way its readers check it, and how to read it back. */\nexport interface Signed {\n kind: Kind;\n event: NostrEvent;\n id: [string, string];\n heading: [string, string][];\n jsonExtra: Record<string, unknown>;\n readBack: (relays: readonly string[]) => Promise<string[]>;\n}\n\n/** Why `p` did not verify, or null when it did. */\nasync function failure(p: Promise<{ ok: boolean; reason?: string } | { ok: true }>): Promise<string | null> {\n const v = await p.catch((e: unknown) => ({ ok: false, reason: (e as Error).message }));\n return v.ok ? null : ('reason' in v && v.reason) || 'it does not verify';\n}\n\n/**\n * The signed event in `text`: an event, or --json output carrying one as\n * `event`. Refused unless its Nostr id and signature hold, it is a poll, ballot,\n * reveal or stamp, and that object verifies: a poll's or ballot's own signature,\n * a reveal against its poll (read from `relays`) as a count checks it now, a\n * stamp's signature.\n */\nexport async function readSigned(text: string, relays: readonly string[] = DEFAULT_RELAYS): Promise<Signed> {\n let obj: unknown;\n try {\n obj = JSON.parse(text);\n } catch {\n throw new Error('the file is not JSON');\n }\n const event = obj && typeof obj === 'object' && 'event' in obj ? (obj as { event: unknown }).event : obj;\n if (!verifyEvent(event)) throw new Error(\"no signed Nostr event in the file: its id or signature doesn't hold\");\n\n if (event.kind === 30080) {\n const poll = pollOf(event);\n if (!poll) throw new Error(\"the event doesn't carry a poll\");\n const why = await failure(verifyPoll(poll, bip322Verify));\n if (why) throw new Error(`the poll's signature doesn't verify: ${why}`);\n return {\n kind: 'poll',\n event,\n id: ['poll_id', pollId(poll)],\n heading: [['poll', poll.question]],\n jsonExtra: { poll },\n readBack: (r) => relaysServingPoll(poll, { relays: r }),\n };\n }\n if (event.kind === 30081) {\n const ballot = ballotOf(event);\n if (!ballot) throw new Error(\"the event doesn't carry a ballot\");\n const why = await failure(verifyBallot(ballot, bip322Verify));\n if (why) throw new Error(`the ballot's signature doesn't verify: ${why}`);\n return {\n kind: 'ballot',\n event,\n id: ['ballot_id', ballotId(ballot)],\n heading: [\n ['poll', ballot.poll_id],\n ['voter', ballot.voter],\n ],\n jsonExtra: { ballot },\n readBack: (r) => relaysServingBallot(ballot, { relays: r }),\n };\n }\n if (event.kind === 30082) {\n const reveal = revealOf(event);\n if (!reveal) throw new Error(\"the event doesn't carry a reveal\");\n const poll = (await findPoll(await fetchPollEvents(reveal.poll_id, relays), reveal.poll_id, bip322Verify)).poll;\n const chain = await revealChainFor(poll);\n const why = await failure(verifyReveal(reveal, poll, bip322Verify, Date.now(), chain));\n if (why) throw new Error(`the reveal doesn't verify against its poll: ${why}`);\n return {\n kind: 'reveal',\n event,\n id: ['reveal_id', revealId(reveal)],\n heading: [['poll', poll.question]],\n jsonExtra: { reveal },\n readBack: (r) => relaysServingReveal(reveal, poll, { relays: r, chain }),\n };\n }\n if (event.kind === 30083) {\n const env = stampOf(event);\n if (!env) throw new Error(\"the event doesn't carry an OC Stamp\");\n const why = await failure(\n stampVerify({\n envelope: env,\n verifyBip322: async (message, signature, address) => bip322Verify({ address, message, signature }),\n }).then((v) => (v.ok ? { ok: true as const } : { ok: false, reason: v.message ?? v.code }))\n );\n if (why) throw new Error(`the stamp's signature doesn't verify: ${why}`);\n return {\n kind: 'stamp',\n event,\n id: ['stamp_id', env.id],\n heading: [['over', env.content.hash]],\n jsonExtra: { stamp: env },\n readBack: (r) => relaysServingStamp(env, { relays: r }),\n };\n }\n throw new Error(`the event is kind ${event.kind}: not a poll, ballot, reveal or stamp (30080 to 30083)`);\n}\n\nexport async function runRepublish(opts: RepublishOptions): Promise<void> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const signed = await readSigned(readFileSync(opts.file, 'utf8'), relays);\n // Which relays serve it now is unknown here, so it goes to all of them.\n const serving = await castEvent(signed.event, [], () => signed.readBack(relays), { relays });\n report({\n id: signed.id,\n heading: signed.heading,\n main: { kind: signed.kind, event: signed.event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: signed.jsonExtra,\n file: opts.file,\n });\n}\n","// oc-vote show <poll_id> — print the poll metadata + ballot count.\n\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchBallotEvents, fetchPollEvents } from '../nostr.js';\nimport { findPoll, requireComplete } from '../select.js';\n\nexport interface ShowOptions {\n pollId: string;\n relays?: string[];\n json?: boolean;\n}\n\nexport async function runShow(opts: ShowOptions): Promise<void> {\n const pid = opts.pollId;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const [pollFetch, ballotFetch] = await Promise.all([\n fetchPollEvents(pid, relays),\n fetchBallotEvents(pid, relays),\n ]);\n const selected = await findPoll(pollFetch, pid, bip322Verify);\n const ballotEvents = requireComplete(ballotFetch, 'ballot');\n const { poll, signatureValid } = selected;\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n { poll, poll_signature_valid: signatureValid, ballot_count: ballotEvents.length },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n question: ${poll.question}\\n`);\n w(` options: ${poll.options.map((o) => `${o.id} (${o.label})`).join(', ')}\\n`);\n w(` creator: ${poll.creator}${signatureValid ? '' : ' (SIGNATURE DOES NOT VERIFY)'}\\n`);\n w(` mode: ${poll.mode}\\n`);\n w(` weight: ${poll.weight_mode}${poll.weight_mode === 'sats_days' && poll.weight_params?.cap_days ? ` (cap ${poll.weight_params.cap_days}d)` : ''}\\n`);\n w(` threshold: ${poll.min_sats} sat / ${poll.min_days} d\\n`);\n w(` tiebreak: ${poll.tiebreak}\\n`);\n w(` deadline: ${poll.deadline}\\n`);\n w(` snapshot: ${poll.snapshot_block}\\n`);\n w(` ballots: ${ballotEvents.length}\\n`);\n if (poll.notes) w(` notes: ${poll.notes}\\n`);\n w(`\\n`);\n}\n","import { verifySignature } from '@orangecheck/bip322';\nimport { ballotId, distinctBallotCopies, type Ballot } from '@orangecheck/vote-core';\n\nimport type { NostrEvent } from './nostr.js';\n\n/**\n * Every copy of this poll's ballots in `events`, byte-identical copies\n * collapsed. vote-core's tally verifies each copy before it picks one ballot\n * per voter; ballot_id leaves out sig.value, so copies with one id can carry\n * different signatures.\n */\nexport function ballotCopiesFromEvents(events: NostrEvent[], pid: string): Ballot[] {\n const parsed: Ballot[] = [];\n for (const ev of events) {\n try {\n const b = JSON.parse(ev.content) as Ballot;\n if (b && b.poll_id === pid) parsed.push(b);\n } catch {\n // skip malformed\n }\n }\n return distinctBallotCopies(parsed);\n}\n\nexport interface BallotVerdict {\n voter: string;\n ballot_id: string;\n ok: boolean;\n}\n\n/** One verdict per ballot_id: valid when any copy of it carries a signature that verifies. */\nexport function ballotVerdicts(\n copies: Ballot[],\n verify: (address: string, message: string, signature: string) => boolean = verifySignature\n): BallotVerdict[] {\n const byId = new Map<string, BallotVerdict>();\n for (const b of copies) {\n const id = ballotId(b);\n const ok = verify(b.voter, id, b.sig?.value ?? '');\n const prior = byId.get(id);\n if (!prior || (!prior.ok && ok)) byId.set(id, { voter: b.voter, ballot_id: id, ok });\n }\n return [...byId.values()];\n}\n","// UTXO snapshot source for the CLI. Defaults to mempool.space; swappable via\n// --mempool-base flag.\n\nimport type { Utxo, UtxoLookup } from '@orangecheck/vote-core';\n\ninterface MempoolUtxo {\n txid: string;\n vout: number;\n value: number;\n status: { confirmed: boolean; block_height?: number; block_time?: number };\n}\n\nexport interface UtxoSource {\n fetchUtxos(address: string): Promise<Utxo[]>;\n}\n\nexport function mempoolSource(base = 'https://mempool.space/api'): UtxoSource {\n return {\n async fetchUtxos(address) {\n const res = await fetch(`${base}/address/${address}/utxo`, {\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`mempool utxo ${res.status}`);\n const data = (await res.json()) as MempoolUtxo[];\n return data\n .filter((u) => u.status.confirmed && typeof u.status.block_height === 'number')\n .map((u) => ({\n value: u.value,\n confirmed_height: u.status.block_height as number,\n }));\n },\n };\n}\n\nexport function buildLookup(source: UtxoSource): UtxoLookup {\n return async (addr: string, snapshot: number): Promise<Utxo[]> => {\n const all = await source.fetchUtxos(addr);\n return all.filter((u) => u.confirmed_height <= snapshot);\n };\n}\n","// oc-vote tally <poll_id>\n\nimport { hexDecode, utf8Decode } from '@orangecheck/lock-crypto';\nimport { unseal } from '@orangecheck/lock-core';\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n ballotId,\n isAnchoredPoll,\n lastAnchorHeight,\n mempoolBlockTimeSource,\n resolvePollSnapshot,\n tally,\n type Ballot,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n type TalliedResult,\n type TallyResult,\n type UtxoLookup,\n} from '@orangecheck/vote-core';\n\nimport { anchoredChain, type AnchoredChain } from '../anchors.js';\nimport { ballotCopiesFromEvents } from '../ballots.js';\nimport { bip322Verify } from '../bip322.js';\nimport {\n DEFAULT_RELAYS,\n fetchBallotEvents,\n fetchPollEvents,\n fetchRevealEvents,\n} from '../nostr.js';\nimport { ballotsToCount, findPoll, requireComplete, selectReveal } from '../select.js';\nimport { buildLookup, mempoolSource } from '../utxos.js';\n\nexport interface TallyOptions {\n pollId: string;\n relays?: string[];\n mempoolBase?: string;\n json?: boolean;\n verify?: boolean;\n snapshotBlock?: number;\n}\n\n/** Open a secret ballot's envelope with the revealed key (SPEC §6.4 step 2). */\nexport async function unsealOption(ballot: Ballot, revealSk: string): Promise<string | null> {\n if (!ballot.secret) return null;\n const result = await unseal({\n envelope: ballot.secret.envelope as unknown as Parameters<typeof unseal>[0]['envelope'],\n device: { device_id: 'reveal', secretKey: hexDecode(revealSk) },\n skipSenderVerification: true,\n });\n return utf8Decode(result.payload);\n}\n\nexport interface ComputeTallyInput {\n poll: Poll;\n ballots: Ballot[];\n /** A reveal that already passed verifyReveal; null when none exists. */\n reveal: Reveal | null;\n utxosAt: UtxoLookup;\n /** A clock-dated poll's snapshot height; an anchored poll's \"deadline\" snapshot is H_close. */\n snapshotBlock?: number;\n /** An anchored poll's tip, H_close and anchor heights (SPEC §4.6). */\n chain?: AnchoredChain | null;\n /** null skips every signature check (--no-verify). */\n verify: SignatureVerifier | null;\n}\n\n/**\n * vote-core's tally with this CLI's unsealer. vote-core calls `unseal` on each\n * voter's verified, tiebroken ballot only, so a ballot that fails its\n * signature never supplies a voter's option.\n */\nexport function computeTally(input: ComputeTallyInput): Promise<TallyResult> {\n const { poll, reveal } = input;\n return tally({\n poll,\n ballots: input.ballots,\n utxosAt: input.utxosAt,\n ...(input.snapshotBlock !== undefined ? { snapshotBlock: input.snapshotBlock } : {}),\n ...(input.chain\n ? {\n tipHeight: input.chain.tipHeight,\n closeHeight: input.chain.closeHeight,\n anchorHeight: input.chain.anchorHeight,\n }\n : {}),\n ...(input.verify ? { verify: input.verify } : { skipSignatures: true }),\n ...(poll.mode === 'secret' && reveal\n ? { unseal: (b: Ballot) => unsealOption(b, reveal.reveal_sk) }\n : {}),\n });\n}\n\n/**\n * The snapshot height, resolved by vote-core per SPEC §3 (greatest\n * median_time_past ≤ deadline, ≥ 6 confirmations) — the same code the web\n * tallier runs. `--snapshot` overrides a deadline poll explicitly.\n */\nexport async function resolveSnapshot(\n poll: Poll,\n opts: Pick<TallyOptions, 'mempoolBase' | 'snapshotBlock'>,\n fetchImpl?: typeof fetch\n): Promise<number> {\n if (poll.snapshot_block === 'deadline' && opts.snapshotBlock !== undefined) {\n return opts.snapshotBlock;\n }\n const r = await resolvePollSnapshot(\n poll,\n mempoolBlockTimeSource({\n ...(opts.mempoolBase ? { base: opts.mempoolBase } : {}),\n ...(fetchImpl ? { fetch: fetchImpl } : {}),\n })\n );\n if (!r.ok) throw new Error(`snapshot not tallyable yet (${r.code}): ${r.reason}`);\n return r.height;\n}\n\n/** What a tally run did not check, so its output can say so. */\nexport function skippedChecks(\n poll: Pick<Poll, 'snapshot_block'>,\n opts: Pick<TallyOptions, 'verify' | 'snapshotBlock'>\n): string[] {\n const skipped: string[] = [];\n if (opts.verify === false) skipped.push('signatures (--no-verify)');\n if (poll.snapshot_block === 'deadline' && opts.snapshotBlock !== undefined) {\n skipped.push('snapshot resolution and confirmations (--snapshot)');\n }\n return skipped;\n}\n\n/** The STATE line for a counted poll; a provisional count says what it still waits on. */\nexport function stateLine(result: TalliedResult): string {\n if (result.state === 'tallied') return 'tallied';\n const waiting = result.unanchored ?? 0;\n if (result.counted.length === 0) return 'provisional — not final; no ballot counted yet';\n return waiting > 0\n ? `provisional — not final; ${waiting} counted ballot(s) not anchored in a block yet`\n : 'provisional — not final; every counted ballot is anchored';\n}\n\nexport async function runTally(opts: TallyOptions): Promise<void> {\n const { pollId: pid } = opts;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const verify = opts.verify !== false ? bip322Verify : null;\n // The ballot read starts with the poll's; the reveal is read only once the\n // poll is known to be secret, so junk under a public poll's reveal tag\n // cannot hold its count up.\n const ballotRead = fetchBallotEvents(pid, relays);\n ballotRead.catch(() => undefined);\n const selected = await findPoll(await fetchPollEvents(pid, relays), pid, verify ?? bip322Verify);\n if (verify && !selected.signatureValid) {\n throw new Error('poll signature does not verify against its creator (SPEC §10.1)');\n }\n const poll = selected.poll;\n const [ballotFetch, revealFetch] = await Promise.all([\n ballotRead,\n poll.mode === 'secret' ? fetchRevealEvents(pid, relays) : null,\n ]);\n\n // Every copy: the tally verifies each before it picks one ballot per voter.\n // A clock-dated poll is not counted from a ballot read cut short or below\n // the floor; an anchored one is counted, and held provisional (anchoredChain).\n const ballots = ballotCopiesFromEvents(ballotsToCount(ballotFetch, isAnchoredPoll(poll)), pid);\n\n // An anchored poll is counted against the chain (SPEC §4.6): the tip,\n // H_close, and each ballot's anchor from every stamp the relays hold.\n const chain = await anchoredChain(poll, ballots.map(ballotId), {\n ballotRelays: ballotFetch.relays,\n relays,\n ...(opts.mempoolBase ? { mempoolBase: opts.mempoolBase } : {}),\n });\n\n // Only a reveal signed by the creator, once the poll has closed, opens ballots.\n const reveal: Reveal | null = revealFetch\n ? await selectReveal(revealFetch.events, poll, bip322Verify, chain ?? undefined)\n : null;\n // No reveal found is \"awaiting reveal\" only on a reveal read that finished:\n // no relay cut off, and the floor answered in full. Otherwise it can't count.\n if (revealFetch && !reveal) requireComplete(revealFetch, 'reveal');\n\n const source = mempoolSource(opts.mempoolBase);\n const utxosAt = buildLookup(source);\n // An anchored poll's tally checks its own snapshot against the tip.\n const snapshot = chain ? undefined : await resolveSnapshot(poll, opts);\n\n // Pass `snapshotBlock` rather than mutating poll.snapshot_block: the\n // poll's canonical bytes (and therefore pollId) include snapshot_block\n // verbatim, and mutating it would invalidate every ballot's poll_id.\n const result = await computeTally({\n poll,\n ballots,\n reveal,\n utxosAt,\n ...(snapshot !== undefined ? { snapshotBlock: snapshot } : {}),\n chain,\n verify,\n });\n\n const skipped = skippedChecks(poll, opts);\n const output = {\n poll_id: pid,\n question: poll.question,\n creator: poll.creator,\n mode: poll.mode,\n weight_mode: poll.weight_mode,\n deadline: poll.deadline,\n ballot_count: new Set(ballots.map((b) => ballotId(b))).size,\n reveal_present: reveal != null,\n skipped,\n ...(chain?.finalBlocked ? { not_final_because: chain.finalBlocked } : {}),\n ...result,\n };\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n return;\n }\n\n // Human-readable\n const w = (s: string) => process.stdout.write(s);\n w(`\\n poll: ${poll.question}\\n`);\n w(` poll_id: ${pid}\\n`);\n w(` creator: ${poll.creator}\\n`);\n w(` mode: ${poll.mode}${poll.mode === 'secret' ? (reveal ? ' (revealed)' : ' (awaiting reveal)') : ''}\\n`);\n w(` weight: ${poll.weight_mode}\\n`);\n w(` threshold: ${poll.min_sats} sat / ${poll.min_days} d\\n`);\n w(` deadline: ${poll.deadline}\\n`);\n if (snapshot !== undefined) w(` snapshot: ${snapshot}\\n`);\n if (chain) {\n const close = chain.closeHeight;\n w(` timing: anchored in Bitcoin blocks (SPEC §4.6); tip ${chain.chainTip}\\n`);\n if (chain.finalBlocked) w(` ! not final: ${chain.finalBlocked}\\n`);\n w(\n close === null\n ? ` close: no block at the deadline yet\\n`\n : ` close: H_close ${close}; anchors count up to ${lastAnchorHeight(close)}; final at ${lastAnchorHeight(close) + ANCHOR_FINAL_CONFIRMATIONS}\\n`\n );\n } else {\n w(` timing: dated by each voter's own clock (deadline before 2026-11-15)\\n`);\n }\n w(` ballots: ${new Set(ballots.map((b) => ballotId(b))).size}\\n`);\n for (const what of skipped) w(` ! not checked: ${what}\\n`);\n w(`\\n`);\n\n if (result.state === 'awaiting_reveal') {\n w(` STATE: awaiting reveal — secret-mode poll, no reveal accepted yet\\n\\n`);\n return;\n }\n if (result.state === 'deferred') {\n w(` STATE: deferred (${result.code}) — the snapshot block is not known yet or has fewer than 6 confirmations\\n\\n`);\n return;\n }\n\n w(` STATE: ${stateLine(result)}\\n`);\n w(` counted: ${result.counted.length} ballot(s)\\n`);\n w(` turnout: ${result.turnout.voters} voters, weight ${result.turnout.weight.toLocaleString()}\\n\\n`);\n\n // Sort options by poll.options order\n const total = result.turnout.weight;\n const maxLabel = Math.max(...poll.options.map((o) => o.label.length));\n for (const opt of poll.options) {\n const wgt = result.tallies[opt.id] ?? 0;\n const pct = total > 0 ? (wgt / total) * 100 : 0;\n const barLen = total > 0 ? Math.round((wgt / total) * 30) : 0;\n const bar = '█'.repeat(barLen) + '·'.repeat(30 - barLen);\n w(` ${opt.label.padEnd(maxLabel)} ${bar} ${wgt.toLocaleString().padStart(12)} ${pct.toFixed(1).padStart(5)}%\\n`);\n }\n w(`\\n`);\n}\n","// oc-vote verify <poll_id> — fetch poll + ballots, verify every BIP-322 signature, report.\n\nimport { ballotCopiesFromEvents, ballotVerdicts } from '../ballots.js';\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchBallotEvents, fetchPollEvents } from '../nostr.js';\nimport { findPoll, requireComplete } from '../select.js';\n\nexport interface VerifyOptions {\n pollId: string;\n relays?: string[];\n json?: boolean;\n}\n\nexport async function runVerify(opts: VerifyOptions): Promise<void> {\n const pid = opts.pollId;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const [pollFetch, ballotFetch] = await Promise.all([\n fetchPollEvents(pid, relays),\n fetchBallotEvents(pid, relays),\n ]);\n const selected = await findPoll(pollFetch, pid, bip322Verify);\n const ballotEvents = requireComplete(ballotFetch, 'ballot');\n\n const pollSigOk = selected.signatureValid;\n\n // One verdict per ballot, from every copy the relays hold: valid when any copy verifies.\n const ballotResults = ballotVerdicts(ballotCopiesFromEvents(ballotEvents, pid));\n const ballots = ballotResults;\n\n const okCount = ballotResults.filter((r) => r.ok).length;\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n {\n poll_id: pid,\n poll_signature_valid: pollSigOk,\n ballot_count: ballots.length,\n ballots_valid: okCount,\n ballots_invalid: ballots.length - okCount,\n ballot_details: ballotResults,\n },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n poll_id: ${pid}\\n`);\n w(` poll signature: ${pollSigOk ? 'VALID ✓' : 'INVALID ✗'}\\n`);\n w(` ballots observed: ${ballots.length}\\n`);\n w(` ballots valid: ${okCount}\\n`);\n w(` ballots invalid: ${ballots.length - okCount}\\n\\n`);\n if (ballots.length - okCount > 0) {\n w(` invalid ballots:\\n`);\n for (const r of ballotResults.filter((x) => !x.ok)) {\n w(` - ${r.voter} · ${r.ballot_id}\\n`);\n }\n w(`\\n`);\n }\n}\n","// oc-vote vote — build + sign + publish a ballot, then ask each relay alone for\n// it back. It is in only once min(2, asked) relays serve a valid copy (quorum.ts);\n// below that it says so and exits 2, and `oc-vote republish` sends the same\n// signed event again. An anchored poll's ballot stamp is read back the same way.\n//\n// Public mode: just --poll --voter --option --sig.\n// Secret mode: additionally --reveal-pk (from the poll); we seal the option\n// id into an oc-lock envelope + commit it per SPEC §4.4.\n\nimport { seal } from '@orangecheck/lock-core';\nimport { utf8Encode } from '@orangecheck/lock-crypto';\nimport { ballotId, commit, isAnchoredPoll } from '@orangecheck/vote-core';\nimport type { Ballot } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\n\nimport { stampBallot } from '../anchors.js';\nimport { buildBallotEvent, buildStampEvent } from '../events.js';\nimport { DEFAULT_RELAYS, fetchPollEvents } from '../nostr.js';\nimport { castBallot, castEvent, relaysServingStamp } from '../quorum.js';\nimport { report, type Standing } from '../report.js';\nimport { findPoll } from '../select.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface VoteOptions {\n pollId: string;\n voter: string;\n option: string;\n sig?: string;\n relays?: string[];\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport async function runVote(opts: VoteOptions): Promise<void> {\n if (!/^[0-9a-f]{64}$/.test(opts.pollId)) {\n throw new Error('poll id must be 64 hex chars');\n }\n\n // Fetch the poll from relays so we know the mode + options + reveal_pk.\n const fetched = await fetchPollEvents(opts.pollId, opts.relays ?? DEFAULT_RELAYS);\n const selected = await findPoll(fetched, opts.pollId, bip322Verify);\n if (!selected.signatureValid) {\n throw new Error('poll signature does not verify against its creator (SPEC §10.1)');\n }\n const poll = selected.poll;\n if (poll.mode === 'public' && !poll.options.some((o) => o.id === opts.option)) {\n throw new Error(`option \"${opts.option}\" not in poll options (${poll.options.map((o) => o.id).join(', ')})`);\n }\n\n let ballotOption: string | null = opts.option;\n let secret: Ballot['secret'] = null;\n\n if (poll.mode === 'secret') {\n if (!poll.reveal_pk) throw new Error('secret-mode poll missing reveal_pk');\n const envelope = await seal({\n payload: utf8Encode(opts.option),\n sender: { address: opts.voter, signMessage: async () => '' },\n recipients: [\n {\n address: `oc-vote:reveal:${opts.pollId}`,\n device_id: 'reveal',\n device_pk: poll.reveal_pk,\n },\n ],\n });\n ballotOption = null;\n secret = {\n envelope: envelope as unknown as Record<string, unknown>,\n commit: commit(opts.pollId, opts.voter, opts.option),\n };\n }\n\n const draft: Ballot = {\n v: 0,\n kind: 'oc-vote/ballot',\n poll_id: opts.pollId,\n voter: opts.voter,\n option: ballotOption,\n attestation_id: null,\n secret,\n created_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.voter, value: '' },\n };\n\n const bid = ballotId(draft);\n\n if (opts.dryRun) {\n process.stdout.write(JSON.stringify({ ballot_id: bid, ballot: draft }, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.voter, bid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: every try, and `oc-vote republish`, sends this same event.\n const pub = buildBallotEvent(draft);\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const serving = await castBallot(pub, draft, [], { relays });\n\n // SPEC §4.6: in an anchored poll the voter's client stamps the ballot it\n // publishes, once a relay serves it back. A final count reads stamps at the\n // read floor, so the stamp is read back the same way as the ballot.\n let stamp: Standing | { error: string } | null = null;\n if (serving.length > 0 && isAnchoredPoll(poll)) {\n try {\n const env = await stampBallot(draft);\n const event = buildStampEvent(env);\n const on = await castEvent(event, [], () => relaysServingStamp(env, { relays }), { relays });\n stamp = { kind: 'stamp', event, relays, serving: on };\n } catch (e) {\n stamp = { error: (e as Error).message };\n }\n }\n\n report({\n id: ['ballot_id', bid],\n heading: [\n ['poll', poll.question],\n ['voter', opts.voter],\n ['option', `${opts.option}${poll.mode === 'secret' ? ' (sealed)' : ''}`],\n ],\n main: { kind: 'ballot', event: pub, relays, serving },\n stamp,\n json: Boolean(opts.json),\n jsonExtra: { ballot: draft },\n });\n}\n","/**\n * @orangecheck/vote-cli — shell interface to OC Vote.\n *\n * read:\n * oc-vote tally <poll_id> run the pure tally function\n * oc-vote verify <poll_id> verify every BIP-322 signature\n * oc-vote show <poll_id> poll metadata + ballot count\n * oc-vote discover list recent polls across relays\n *\n * write (headless — signature via --sig or interactive paste):\n * oc-vote create build + sign + publish a poll\n * oc-vote vote cast a ballot (public or secret)\n * oc-vote republish <file> send a signed poll, ballot, reveal or stamp again\n * oc-vote reveal publish the reveal event\n *\n * utility:\n * oc-vote gen-reveal-key mint a fresh X25519 pair\n *\n * Defaults: nostr-core's DEFAULT_RELAYS + mempool.space for UTXOs.\n * Swap via --relay wss://... (repeatable) and --mempool-base https://...\n */\n\nimport { createRequire } from 'node:module';\n\nimport { Command, Option } from 'commander';\nimport WebSocket from 'ws';\n\nimport { runCreate } from './commands/create.js';\nimport { runDiscover } from './commands/discover.js';\nimport { runGenRevealKey } from './commands/gen-reveal-key.js';\nimport { runRepublish } from './commands/republish.js';\nimport { runReveal } from './commands/reveal.js';\nimport { runShow } from './commands/show.js';\nimport { runTally } from './commands/tally.js';\nimport { runVerify } from './commands/verify.js';\nimport { runVote } from './commands/vote.js';\n\n// nostr-core uses the global WebSocket, which Node only ships from v22.\nif (typeof globalThis.WebSocket === 'undefined') {\n (globalThis as { WebSocket?: unknown }).WebSocket = WebSocket;\n}\n\n// The installed package's own version, so `--version` can't drift from a release.\nconst { version } = createRequire(import.meta.url)('../package.json') as { version: string };\n\nconst program = new Command();\n\nfunction collectRelay(v: string, prev: string[] = []): string[] {\n return [...prev, v];\n}\n\nfunction collectOption(v: string, prev: { id: string; label: string }[] = []) {\n const [id, ...rest] = v.split(':');\n if (!id) throw new Error(`--option requires \"id\" or \"id:label\"`);\n const label = rest.length ? rest.join(':') : id;\n return [...prev, { id, label }];\n}\n\nfunction parseDeadline(raw: string): string {\n const rel = raw.match(/^\\+(\\d+)([dh])$/);\n if (rel) {\n const n = Number.parseInt(rel[1]!, 10);\n const unit = rel[2];\n const ms = (unit === 'd' ? n * 24 : n) * 3600 * 1000;\n const d = new Date(Date.now() + ms);\n return d.toISOString().replace(/\\.\\d+Z$/, 'Z');\n }\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) throw new Error(`invalid deadline: ${raw}`);\n return parsed.toISOString().replace(/\\.\\d+Z$/, 'Z');\n}\n\nfunction parseSnapshot(raw: string): number | 'deadline' {\n if (raw === 'deadline') return 'deadline';\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) throw new Error(`invalid snapshot block: ${raw}`);\n return n;\n}\n\nprogram\n .name('oc-vote')\n .description('OC Vote — sovereign signaling for the open web')\n .version(version);\n\n// ── read ──────────────────────────────────────────────────────────────────\n\nprogram\n .command('tally <poll_id>')\n .description('Fetch the poll + ballots and run the pure tally function')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--mempool-base <url>', 'mempool.space-compatible base URL', 'https://mempool.space/api')\n .option('--snapshot <height>', 'Override snapshot block (integer)')\n .option('--no-verify', 'Skip BIP-322 signature verification')\n .option('--json', 'Emit JSON instead of human-readable output')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runTally({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n mempoolBase: opts.mempoolBase as string,\n json: Boolean(opts.json),\n verify: opts.verify !== false,\n snapshotBlock: opts.snapshot ? Number.parseInt(String(opts.snapshot), 10) : undefined,\n });\n });\n\nprogram\n .command('verify <poll_id>')\n .description('Verify every BIP-322 signature on the poll + its ballots')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runVerify({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('show <poll_id>')\n .description('Print the poll metadata + ballot count without running the tally')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runShow({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('discover')\n .description('List recent polls across the default relay set')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--limit <n>', 'max polls to return', '30')\n .option('--open-only', 'hide polls whose deadline has passed')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runDiscover({\n limit: Number.parseInt(String(opts.limit ?? '30'), 10),\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n openOnly: Boolean(opts.openOnly),\n });\n });\n\n// ── write ─────────────────────────────────────────────────────────────────\n\nprogram\n .command('create')\n .description(\n 'Build + sign + publish a poll. It is published once 2 relays, each asked alone, serve it back; below that it exits 2 (see republish)'\n )\n .requiredOption('--creator <btc-addr>', 'Bitcoin address of the poll creator')\n .requiredOption('--question <text>', 'poll question')\n .requiredOption(\n '--option <id:label>',\n 'poll option; repeatable; \"id\" or \"id:label\"',\n collectOption,\n [] as { id: string; label: string }[]\n )\n .option('--deadline <iso8601 | +Nd | +Nh>', 'deadline in UTC', '+7d')\n .option('--snapshot <height | deadline>', 'snapshot block', 'deadline')\n .addOption(\n new Option('--weight-mode <mode>', 'weight function')\n .choices(['one_per_address', 'sats', 'sats_days'])\n .default('sats')\n )\n .option('--cap-days <n>', 'age cap in days (required for sats_days)', '180')\n .option('--min-sats <n>', 'minimum sat threshold', '0')\n .option('--min-days <n>', 'minimum UTXO-age threshold', '0')\n .addOption(\n new Option('--tiebreak <mode>', 'per-voter dedup rule')\n .choices(['latest', 'first'])\n .default('latest')\n )\n .addOption(\n new Option('--mode <mode>', 'ballot mode')\n .choices(['public', 'secret'])\n .default('public')\n )\n .option('--notes <text>', 'free-form notes (≤ 2048 bytes)')\n .option('--sig <base64>', 'BIP-322 signature of poll_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--dry-run', 'print canonical + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n const mode = opts.mode as 'public' | 'secret';\n const weightMode = opts.weightMode as 'one_per_address' | 'sats' | 'sats_days';\n await runCreate({\n creator: String(opts.creator),\n question: String(opts.question),\n options: opts.option as { id: string; label: string }[],\n deadline: parseDeadline(String(opts.deadline)),\n snapshotBlock: parseSnapshot(String(opts.snapshot)),\n weightMode,\n capDays: weightMode === 'sats_days' ? Number.parseInt(String(opts.capDays), 10) : undefined,\n minSats: Number.parseInt(String(opts.minSats), 10),\n minDays: Number.parseInt(String(opts.minDays), 10),\n tiebreak: opts.tiebreak as 'latest' | 'first',\n mode,\n notes: opts.notes ? String(opts.notes) : undefined,\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('vote')\n .description(\n 'Cast a ballot on a poll. It is in once 2 relays, each asked alone, serve it back; below that it exits 2 (see republish)'\n )\n .requiredOption('--poll <poll_id>', '64-hex poll id')\n .requiredOption('--voter <btc-addr>', 'voter Bitcoin address')\n .requiredOption('--option <id>', 'chosen option id')\n .option('--sig <base64>', 'BIP-322 signature of ballot_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--dry-run', 'print canonical + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runVote({\n pollId: String(opts.poll),\n voter: String(opts.voter),\n option: String(opts.option),\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('republish <file>')\n .description(\n 'Send a signed poll, ballot, reveal or ballot stamp again, as it is (from --json output, or an event: line), and ask each relay for it back'\n )\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (file: string, opts: Record<string, unknown>) => {\n await runRepublish({\n file,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('reveal')\n .description(\n 'Publish the reveal for a secret-mode poll, or send the one already signed again. It is published once 2 relays serve it back; below that it exits 2'\n )\n .requiredOption('--poll <poll_id>', '64-hex poll id')\n .requiredOption('--reveal-sk <hex>', '64-hex X25519 secret key')\n .requiredOption('--creator <btc-addr>', 'poll creator address (must match the poll)')\n .option('--sig <base64>', 'BIP-322 signature of reveal_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--force', 'publish before the deadline, or sign a new reveal when one is already on the relays')\n .option('--dry-run', 'print reveal + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runReveal({\n pollId: String(opts.poll),\n revealSk: String(opts.revealSk),\n creator: String(opts.creator),\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n force: Boolean(opts.force),\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\n// ── utility ───────────────────────────────────────────────────────────────\n\nprogram\n .command('gen-reveal-key')\n .description('Mint a fresh X25519 keypair for secret-mode polls')\n .option('--json', 'Emit JSON')\n .action((opts: Record<string, unknown>) => {\n runGenRevealKey({ json: Boolean(opts.json) });\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`oc-vote: ${msg}\\n`);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/nostr.ts","../src/anchors.ts","../src/events.ts","../src/bip322.ts","../src/quorum.ts","../src/report.ts","../src/sig.ts","../src/commands/create.ts","../src/select.ts","../src/commands/discover.ts","../src/commands/gen-reveal-key.ts","../src/commands/reveal.ts","../src/commands/republish.ts","../src/commands/show.ts","../src/ballots.ts","../src/utxos.ts","../src/commands/tally.ts","../src/commands/verify.ts","../src/commands/vote.ts","../src/cli.ts"],"names":["pollId","DEFAULT_RELAYS","randomBytes","parseStamp","query","queryEvents","ballotId","revealId","verify","stampVerify","publishEvent","stamp","canonicalBytes","computePollId","verifyPoll","verifyReveal","generateX25519KeyPair","hexEncode","isAnchoredPoll","resolveCloseBlock","mempoolBlockTimeSource","lastAnchorHeight","ANCHOR_FINAL_CONFIRMATIONS","serving","verifyEvent","verifyBallot","parsed","verifySignature"],"mappings":"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","file":"cli.js","sourcesContent":["// oc-vote's Nostr layer: @orangecheck/nostr-core for transport (which checks\n// each event's id, signature and filter match), plus vote-shaped queries.\n\nimport {\n DEFAULT_RELAYS,\n queryEvents,\n type Filter,\n type NostrEvent,\n type QueryResult,\n} from '@orangecheck/nostr-core';\n\nexport { DEFAULT_RELAYS, publishEvent } from '@orangecheck/nostr-core';\nexport type { NostrEvent, PublishResult } from '@orangecheck/nostr-core';\n\nconst QUERY_TIMEOUT_MS = 8000;\n/** The whole of one relay's paged read, every page together. */\nconst PAGED_READ_DEADLINE_MS = 2 * QUERY_TIMEOUT_MS;\n\nexport interface EventsFetch {\n events: NostrEvent[];\n /** The result stands for what exists. For `query`, a relay reached EOSE:\n * without that, an empty or short result says nothing. For `queryPaged`,\n * see `readShortfall`. */\n complete: boolean;\n}\n\n/** A relay finished answering only if it sent EOSE; `ok` alone also covers\n * a relay that timed out or closed after sending some events. */\nexport function reachedEose(relayStatus: QueryResult['relayStatus']): boolean {\n return relayStatus.some((r) => r.eose);\n}\n\nexport async function query(filter: Filter, relays?: readonly string[]): Promise<EventsFetch> {\n const { events, relayStatus } = await queryEvents(filter, relays, QUERY_TIMEOUT_MS);\n return { events, complete: reachedEose(relayStatus) };\n}\n\n/**\n * Every event under the poll's d-tag, newest first. Not `limit: 1`: anyone\n * can publish under any d-tag with any created_at, so callers choose by\n * content and signature (see select.ts).\n */\nexport function fetchPollEvents(pollId: string, relays?: readonly string[]) {\n return query({ kinds: [30080], '#d': [`oc-vote:poll:${pollId}`] }, relays);\n}\n\n/**\n * Every ballot in a poll, by the indexed `t` tag (relays index single-letter\n * tags only). Callers must still check each parsed ballot's `poll_id`: `t` is\n * shared by poll id, family marker and voter address.\n */\nexport function fetchBallotEvents(pollId: string, relays?: readonly string[], queryFn?: QueryFn) {\n return queryPaged({ kinds: [30081], '#t': [pollId] }, relays, queryFn);\n}\n\n// A relay answers a REQ with at most its own cap of events, newest first, so\n// junk under a tag can push older events out of an answer. Reads a count\n// depends on page each relay with `until` until a short page.\n\n/** Events per page: below every reference relay's cap, so a short page means the end. */\nexport const PAGE_SIZE = 100;\n/** Pages per relay before the read is cut off. */\nexport const MAX_PAGES = 20;\n\n/**\n * Relays a ballot must reach for every read at the floor to hear it: the\n * family's rule (chat-core `readFloor`, OC Chat SPEC §8.7), the one the lock,\n * vault and ochk.io device and revocation reads use.\n */\nexport const WRITE_QUORUM = 2;\n\n/**\n * How many of `asked` relays must finish a read in full before a count rests\n * on it: `asked - WRITE_QUORUM + 1`, at least 1. Five asked (DEFAULT_RELAYS):\n * four. The floor plus the quorum exceeds the relays asked, so a ballot two of\n * them hold is in every read that meets the floor.\n */\nexport function readFloor(asked: number): number {\n return Math.max(1, asked - WRITE_QUORUM + 1);\n}\n\nexport interface RelayRead {\n relay: string;\n /** Finished: EOSE for every page, down to a short page. */\n answered: boolean;\n /** Cut off: it sent events but not to the end (a full page from one second,\n * MAX_PAGES, or it stopped answering). Not an answer. */\n truncated: boolean;\n}\n\n/**\n * Why a paged read does not stand for everything the relays hold, or null when\n * it does. A relay that was cut off holds the count: what it did not send may\n * be what decides it. Below the floor, a ballot only the silent relays hold\n * may be missing.\n */\nexport function readShortfall(reads: readonly RelayRead[]): string | null {\n const cut = reads.filter((r) => r.truncated).map((r) => r.relay);\n if (cut.length) return `was cut short on ${cut.join(', ')}`;\n const finished = reads.filter((r) => r.answered).length;\n const floor = readFloor(reads.length);\n return finished < floor\n ? `finished on ${finished} of ${reads.length} relays, fewer than the ${floor} a count needs`\n : null;\n}\n\nexport interface PagedFetch extends EventsFetch {\n relays: RelayRead[];\n}\n\nexport type QueryFn = (filter: Filter, relays: readonly string[], timeoutMs?: number) => Promise<QueryResult>;\n\n/**\n * Every event one relay holds for `filter`, that relay asked alone, page by page\n * under one deadline for the whole read.\n */\nexport async function pageRelay(filter: Filter, relay: string, queryFn: QueryFn) {\n const byId = new Map<string, NostrEvent>();\n const done = (answered: boolean, truncated = false) => ({\n events: [...byId.values()],\n read: { relay, answered, truncated },\n });\n let until: number | undefined;\n // One deadline for the whole read, not a fresh timeout per page: a relay that\n // answers every page slowly would otherwise hold the read for MAX_PAGES of them.\n const deadlineAt = Date.now() + PAGED_READ_DEADLINE_MS;\n for (let page = 0; page < MAX_PAGES; page++) {\n const budget = Math.min(QUERY_TIMEOUT_MS, deadlineAt - Date.now());\n // Out of time after a full page: cut off.\n if (budget <= 0) return done(false, true);\n const { events, relayStatus } = await queryFn(\n { ...filter, limit: PAGE_SIZE, ...(until !== undefined ? { until } : {}) },\n [relay],\n budget\n );\n const status = relayStatus.find((s) => s.relay === relay) ?? relayStatus[0];\n // Everything the relay sent on this page, what nostr-core rejected included.\n const sent = (status?.events ?? 0) + (status?.rejected ?? 0);\n const known = byId.size;\n // A page that stopped short still counts what it sent.\n for (const e of events) byId.set(e.id, e);\n // A relay that sent anything and then stopped is cut off, not silent: the\n // rest of its answer may be what decides the count.\n if (!status?.eose) return done(false, page > 0 || sent > 0);\n // Short only by the relay's count: rejected events fill a page as much as any.\n if (sent < PAGE_SIZE) return done(true);\n // A full page that adds no verified event cannot be paged past.\n if (byId.size === known) return done(false, true);\n const oldest = Math.min(...events.map((e) => e.created_at));\n // A whole page from one second cannot be paged past with `until`.\n if (events.every((e) => e.created_at === oldest)) return done(false, true);\n // Inclusive: the boundary second is read again, so none of it is skipped.\n until = oldest;\n }\n return done(false, true);\n}\n\n/**\n * Every event each relay holds for `filter`, paged per relay. `complete` when\n * no relay was cut off and at least the floor finished (`readShortfall`).\n */\nexport async function queryPaged(\n filter: Filter,\n relays: readonly string[] = DEFAULT_RELAYS,\n queryFn: QueryFn = queryEvents\n): Promise<PagedFetch> {\n const results = await Promise.all(relays.map((r) => pageRelay(filter, r, queryFn)));\n const byId = new Map<string, NostrEvent>();\n for (const r of results) for (const e of r.events) byId.set(e.id, e);\n return {\n events: [...byId.values()].sort((a, b) => b.created_at - a.created_at),\n complete: readShortfall(results.map((r) => r.read)) === null,\n relays: results.map((r) => r.read),\n };\n}\n\n/**\n * Every event under the poll's reveal d-tag, paged per relay like the ballot\n * read. Anyone can publish under that d-tag from fresh keys, so a flood dated\n * after the reveal pushes it out of a single read; \"no reveal\" stands only on\n * a read that is `complete` (`readShortfall`).\n */\nexport function fetchRevealEvents(pollId: string, relays?: readonly string[], queryFn?: QueryFn) {\n return queryPaged({ kinds: [30082], '#d': [`oc-vote:reveal:${pollId}`] }, relays, queryFn);\n}\n\n// `oc-vote-poll` marker: kind 30080 is shared with other Nostr applications.\nexport function fetchRecentPolls(limit = 30, relays?: readonly string[]) {\n return query({ kinds: [30080], '#t': ['oc-vote-poll'], limit }, relays);\n}\n","// Anchored polls (OC Vote SPEC §4.6): a ballot is in time when a Bitcoin block\n// anchors it. This reads every OC Stamp copy over each ballot from the relays,\n// rebuilds each stamp's id, and walks its proof to block headers this CLI\n// fetches itself. It also stamps a ballot this CLI publishes.\n\nimport { randomBytes } from '@noble/hashes/utils';\nimport { addressFromPrivateKey, signMessage } from '@orangecheck/bip322';\nimport { canonicalizeEnvelope, computeEnvelopeId, parseStamp, stamp } from '@orangecheck/stamp-core';\nimport type { StampEnvelope } from '@orangecheck/stamp-core';\nimport { mempoolHeaderSource, submitToCalendars, toStampOts, verifiedAnchor } from '@orangecheck/stamp-ots';\nimport type { BlockHeaderSource } from '@orangecheck/stamp-ots';\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n anchorHeightFromStamps,\n ballotStampContent,\n lastAnchorHeight,\n isAnchoredPoll,\n mempoolBlockTimeSource,\n resolveCloseBlock,\n} from '@orangecheck/vote-core';\nimport type { Ballot, BlockTimeSource, Poll } from '@orangecheck/vote-core';\n\nimport { DEFAULT_RELAYS, queryPaged, readShortfall, type QueryFn, type RelayRead } from './nostr.js';\n\nexport const STAMP_KIND = 30083;\n/** Ballot ids per REQ: fewer per filter, so one ballot's flood pages alone. */\nconst IDS_PER_QUERY = 20;\n\nexport interface AnchoredChain {\n /** The tip the tally is given: held below the final block while `finalBlocked`. */\n tipHeight: number;\n /** The chain tip as read. */\n chainTip: number;\n /** Why this count cannot be final however far the chain is, or null. */\n finalBlocked: string | null;\n /** `H_close`, null while no block's median_time_past has passed the deadline. */\n closeHeight: number | null;\n anchorHeight: (ballotId: string) => number | null;\n}\n\n/** Header lookups shared across one run; a failed lookup is retried, never remembered as \"no header\". */\nexport function cachedHeaders(inner: BlockHeaderSource): BlockHeaderSource {\n const seen = new Map<number, Promise<Uint8Array | null>>();\n return {\n getHeaderAt(height) {\n let p = seen.get(height);\n if (!p) {\n p = inner.getHeaderAt(height);\n p.catch(() => seen.delete(height));\n seen.set(height, p);\n }\n return p;\n },\n };\n}\n\n/**\n * The block a stamp anchors its own id in, or null. The id is rebuilt from the\n * envelope's fields and must equal the one it declares; the proof is walked\n * from that id to headers from `headers`. What the stamp declares about its\n * anchor is not read. Throws when a header cannot be read.\n */\nexport function stampAnchorVerifier(headers: BlockHeaderSource) {\n return async (raw: unknown): Promise<number | null> => {\n let env: StampEnvelope;\n let id: string;\n try {\n env = parseStamp(raw);\n id = computeEnvelopeId({\n address: env.signer.address,\n content_hash: env.content.hash,\n content_length: env.content.length,\n content_mime: env.content.mime,\n signed_at: env.signed_at,\n });\n } catch {\n return null;\n }\n if (id !== env.id || !env.ots?.proof) return null;\n return (await verifiedAnchor(env.ots.proof, id, headers))?.blockHeight ?? null;\n };\n}\n\n/**\n * Every stamp copy over each ballot id, never collapsed, paged per relay so a\n * flood under a ballot's tag cannot push its stamps out. `relays` says which\n * relays answered every page of every lookup.\n */\nexport async function fetchBallotStamps(\n ballotIds: readonly string[],\n relays: readonly string[] = DEFAULT_RELAYS,\n queryFn?: QueryFn\n): Promise<{ stamps: Map<string, unknown[]>; relays: RelayRead[] }> {\n const ids = [...new Set(ballotIds)];\n const stamps = new Map<string, unknown[]>(ids.map((id) => [id, []]));\n const reads = new Map<string, RelayRead>(relays.map((relay) => [relay, { relay, answered: true, truncated: false }]));\n for (let i = 0; i < ids.length; i += IDS_PER_QUERY) {\n const chunk = ids.slice(i, i + IDS_PER_QUERY);\n const r = await queryPaged({ kinds: [STAMP_KIND], '#t': chunk.map((id) => `sha256:${id}`) }, relays, queryFn);\n for (const read of r.relays) {\n const sum = reads.get(read.relay)!;\n reads.set(read.relay, {\n relay: read.relay,\n answered: sum.answered && read.answered,\n truncated: sum.truncated || read.truncated,\n });\n }\n for (const e of r.events) {\n let content: unknown;\n try {\n content = JSON.parse(e.content);\n } catch {\n continue;\n }\n const hash = (content as { content?: { hash?: unknown } } | null)?.content?.hash;\n if (typeof hash === 'string' && hash.startsWith('sha256:')) stamps.get(hash.slice(7))?.push(content);\n }\n }\n return { stamps, relays: [...reads.values()] };\n}\n\n/**\n * What the tally needs for an anchored poll: the tip, `H_close`, and each\n * ballot's anchor height. Null for a clock-dated poll. Throws when the chain\n * or the relays cannot be read.\n */\nexport async function anchoredChain(\n poll: Poll,\n ballotIds: readonly string[],\n opts: {\n /** How the ballots were read: which relays answered to the end. */\n ballotRelays: readonly RelayRead[];\n relays?: readonly string[];\n blockTimes?: BlockTimeSource;\n headers?: BlockHeaderSource;\n mempoolBase?: string;\n queryFn?: QueryFn;\n }\n): Promise<AnchoredChain | null> {\n if (!isAnchoredPoll(poll)) return null;\n const close = await resolveCloseBlock(\n poll.deadline,\n opts.blockTimes ?? mempoolBlockTimeSource(opts.mempoolBase ? { base: opts.mempoolBase } : {})\n );\n if (!close.ok) throw new Error(`the block at the deadline could not be read (${close.code}): ${close.reason}`);\n const read = await fetchBallotStamps(ballotIds, opts.relays ?? DEFAULT_RELAYS, opts.queryFn);\n // A stamp lookup cut short holds the count below; only a lookup no relay answered at all refuses it.\n if (!read.relays.some((r) => r.answered || r.truncated)) {\n throw new Error('no relay finished answering the stamp query; try again');\n }\n const headers =\n opts.headers ?? cachedHeaders(mempoolHeaderSource(opts.mempoolBase ? { baseUrl: opts.mempoolBase } : {}));\n const verify = stampAnchorVerifier(headers);\n const heights = new Map<string, number | null>();\n for (const [id, copies] of read.stamps) heights.set(id, await anchorHeightFromStamps(id, copies, (s) => verify(s)));\n\n // A final count rests on the relays the ballots came from: the ballot\n // lookup must meet the floor with none cut short (`readShortfall`, as for a\n // clock-dated poll), and each relay that finished it must have answered the\n // stamp lookup to the end. A stamp a relay did not send is not evidence of none.\n const stampsDone = read.relays.filter((r) => r.answered && !r.truncated).map((r) => r.relay);\n const ballotsShort = readShortfall(opts.ballotRelays);\n const stampsMissing = opts.ballotRelays\n .filter((r) => r.answered && !stampsDone.includes(r.relay))\n .map((r) => r.relay);\n const incomplete = ballotsShort\n ? `the ballot lookup ${ballotsShort}`\n : stampsMissing.length\n ? `the stamp lookup did not finish on ${stampsMissing.join(', ')}`\n : null;\n const finalAt = close.height === null ? null : lastAnchorHeight(close.height) + ANCHOR_FINAL_CONFIRMATIONS;\n // Named only when it holds the count back: before the final block it is provisional anyway.\n const finalBlocked = incomplete && finalAt !== null && close.tip >= finalAt ? incomplete : null;\n return {\n tipHeight: finalBlocked && finalAt !== null ? finalAt - 1 : close.tip,\n chainTip: close.tip,\n finalBlocked,\n closeHeight: close.height,\n anchorHeight: (id) => heights.get(id) ?? null,\n };\n}\n\n/**\n * An OC Stamp over a ballot (SPEC §4.6), signed by a fresh key: who signs a\n * stamp carries no authority. Its id is submitted to the calendars.\n */\nexport async function stampBallot(ballot: Ballot, fetchImpl?: typeof fetch): Promise<StampEnvelope> {\n const key = randomBytes(32);\n const address = addressFromPrivateKey(key, 'p2wpkh');\n const content = ballotStampContent(ballot);\n const env = await stamp({\n content: { hash: content.hash, length: content.length },\n mime: content.mime,\n signer: { address, signMessage: async (m) => signMessage(address, m, key) },\n });\n const proof = await submitToCalendars(env.id, fetchImpl ? { fetch: fetchImpl } : {});\n return { ...env, ots: toStampOts(proof) };\n}\n\n/** The kind-30083 tags and content that publish a stamp (OC Stamp §7). */\nexport function stampEventParts(env: StampEnvelope): { tags: string[][]; content: string } {\n return {\n tags: [\n ['d', `oc-stamp:${env.id}`],\n ['t', env.signer.address],\n ['t', env.content.hash],\n ['t', 'oc-stamp'],\n ],\n content: canonicalizeEnvelope(env),\n };\n}\n","// Build NIP-01 events for oc-vote kinds 30080/30081/30082.\n// Mirror of oc-vote-web/src/lib/vote/events.ts but node-safe (uses @noble only).\n\nimport { schnorr } from '@noble/curves/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes, randomBytes } from '@noble/hashes/utils';\n\nimport { canonicalBytes, ballotId, pollId, revealId } from '@orangecheck/vote-core';\nimport type { Ballot, Poll, Reveal } from '@orangecheck/vote-core';\n\nimport type { StampEnvelope } from '@orangecheck/stamp-core';\n\nimport { STAMP_KIND, stampEventParts } from './anchors.js';\nimport type { NostrEvent } from './nostr.js';\n\nfunction nip01Id(pubkey: string, created_at: number, kind: number, tags: string[][], content: string): string {\n const serialized = JSON.stringify([0, pubkey, created_at, kind, tags, content]);\n return bytesToHex(sha256(new TextEncoder().encode(serialized)));\n}\n\nfunction sign(kind: number, tags: string[][], content: string): NostrEvent {\n const sk = randomBytes(32);\n const pubkey = bytesToHex(schnorr.getPublicKey(sk));\n const created_at = Math.floor(Date.now() / 1000);\n const id = nip01Id(pubkey, created_at, kind, tags, content);\n const sig = bytesToHex(schnorr.sign(hexToBytes(id), sk));\n return { id, pubkey, created_at, kind, tags, content, sig };\n}\n\nexport function buildPollEvent(poll: Poll): NostrEvent {\n const pid = pollId(poll);\n const content = canonicalBytes(poll).trimEnd();\n const snapshot =\n typeof poll.snapshot_block === 'number' ? String(poll.snapshot_block) : poll.snapshot_block;\n// NIP-12 relays index SINGLE-LETTER tag names only. The multi-letter\n// `poll_id` / `voter` / `creator` tags below are readable diagnostics and are\n// NOT queryable — a `#poll_id` filter matches nothing on a conforming relay.\n// The `t` tags are what make these events findable, and for ballots they are\n// the ONLY way to enumerate a poll: a ballot's d-tag embeds the voter, tag\n// filters are exact-match, and enumerating voters is the point of the query.\n// Kept in sync with oc-vote-web/src/lib/vote/events.ts and normative in\n// oc-vote-protocol SPEC §3.4/§3.6.\n return sign(30080, [\n ['d', `oc-vote:poll:${pid}`],\n ['t', pid],\n ['t', 'oc-vote-poll'],\n ['t', poll.creator],\n ['poll_id', pid],\n ['creator', poll.creator],\n ['deadline', poll.deadline],\n ['snapshot', snapshot],\n ['mode', poll.mode],\n ], content);\n}\n\nexport function buildBallotEvent(ballot: Ballot): NostrEvent {\n const bid = ballotId(ballot);\n const content = canonicalBytes(ballot).trimEnd();\n return sign(30081, [\n ['d', `oc-vote:ballot:${ballot.poll_id}:${ballot.voter}`],\n // `t` = poll_id is the only path to \"every ballot in this poll\".\n ['t', ballot.poll_id],\n ['t', 'oc-vote-ballot'],\n ['t', ballot.voter],\n ['poll_id', ballot.poll_id],\n ['voter', ballot.voter],\n ['ballot_id', bid],\n ], content);\n}\n\nexport function buildRevealEvent(reveal: Reveal): NostrEvent {\n const rid = revealId(reveal);\n const content = canonicalBytes(reveal).trimEnd();\n return sign(30082, [\n ['d', `oc-vote:reveal:${reveal.poll_id}`],\n ['t', reveal.poll_id],\n ['t', 'oc-vote-reveal'],\n ['poll_id', reveal.poll_id],\n ['reveal_id', rid],\n ], content);\n}\n\n/** The kind-30083 event that publishes an OC Stamp over a ballot (OC Stamp §7), under a fresh key. */\nexport function buildStampEvent(env: StampEnvelope): NostrEvent {\n const { tags, content } = stampEventParts(env);\n return sign(STAMP_KIND, tags, content);\n}\n","import { verifySignature } from '@orangecheck/bip322';\n\n// BIP-322 verification in vote-core's named-argument shape. Returns false on\n// any parse or verify failure.\n\nexport async function bip322Verify(args: {\n address: string;\n message: string;\n signature: string;\n}): Promise<boolean> {\n return verifySignature(args.address, args.message, args.signature);\n}\n","// A signed object (poll, ballot, reveal, stamp) is in only once two relays, each\n// asked alone, serve it back: the write quorum the readers' floor assumes\n// (`readFloor`: a count may go without any one relay, so an object only one\n// relay holds is lost whenever that relay is the one it went without). An OK\n// from a relay is not enough: some say OK and keep nothing. OC Vote SPEC §3.4;\n// oc-vote-web reads ballots back the same way, and OC Agent SPEC §9.4 sets the\n// rule for a revocation.\n\nimport { matchFilter, publishEvent, queryEvents, verifyEvent, type Filter } from '@orangecheck/nostr-core';\nimport { parseStamp, verify as stampVerify, type StampEnvelope } from '@orangecheck/stamp-core';\nimport {\n ballotId,\n pollId,\n revealId,\n verifyBallot,\n verifyPoll,\n verifyReveal,\n type Ballot,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n} from '@orangecheck/vote-core';\n\nimport { STAMP_KIND } from './anchors.js';\nimport { bip322Verify } from './bip322.js';\nimport { DEFAULT_RELAYS, pageRelay, WRITE_QUORUM, type NostrEvent, type PublishResult, type QueryFn } from './nostr.js';\n\n/** min(2, asked): a single relay asked must serve it itself. Never 0, so no relays is never \"in\". */\nexport function writeQuorum(asked: number): number {\n return Math.max(1, Math.min(WRITE_QUORUM, asked));\n}\n\n/** In once `serving` of the `asked` relays serve it back, each asked alone. */\nexport function isIn(serving: number, asked: number): boolean {\n return serving >= writeQuorum(asked);\n}\n\n/** The object of `kind` that `content` holds, or null when it holds none. */\nfunction parsed<T>(content: string, kind: string): T | null {\n try {\n const o = JSON.parse(content) as { kind?: unknown } | null;\n return o && typeof o === 'object' && o.kind === kind ? (o as T) : null;\n } catch {\n return null;\n }\n}\n\n/** The ballot an event carries, or null when its content is not one. */\nexport function ballotOf(ev: NostrEvent): Ballot | null {\n return parsed<Ballot>(ev.content, 'oc-vote/ballot');\n}\n\n/** The poll an event carries, or null when its content is not one. */\nexport function pollOf(ev: NostrEvent): Poll | null {\n return parsed<Poll>(ev.content, 'oc-vote/poll');\n}\n\n/** The reveal an event carries, or null when its content is not one. */\nexport function revealOf(ev: NostrEvent): Reveal | null {\n return parsed<Reveal>(ev.content, 'oc-vote/reveal');\n}\n\n/** The OC Stamp `content` holds, or null when it holds none. */\nfunction stampIn(content: string): StampEnvelope | null {\n try {\n return parseStamp(JSON.parse(content));\n } catch {\n return null;\n }\n}\n\n/** The OC Stamp an event carries, or null when its content is not one. */\nexport function stampOf(ev: NostrEvent): StampEnvelope | null {\n return stampIn(ev.content);\n}\n\n/** `id(x)`, or null where it throws (content too deep or malformed to hash). */\nfunction safely<T>(id: (x: T) => string, x: T): string | null {\n try {\n return id(x);\n } catch {\n return null;\n }\n}\n\nexport interface ReadBackOptions {\n relays?: readonly string[];\n query?: QueryFn;\n verify?: SignatureVerifier;\n}\n\n/**\n * The relays that serve back a copy `accept` takes. Each relay is asked alone\n * and paged under its own deadline (`pageRelay`), so one relay's answer never\n * speaks for another and a slow one holds up only itself. A copy is judged only\n * if its Nostr id and signature hold and it matches `filter`, the query a\n * reader makes: a relay can send anything. `accept` judges the content alone,\n * so each distinct content is judged once, however many relays serve it.\n */\nexport async function relaysServing(\n filter: Filter,\n accept: (content: string) => Promise<boolean>,\n opts: ReadBackOptions = {}\n): Promise<string[]> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const query = opts.query ?? queryEvents;\n const checked = new Map<string, Promise<boolean>>();\n const valid = (ev: NostrEvent): Promise<boolean> => {\n if (!verifyEvent(ev) || !matchFilter(ev, filter)) return Promise.resolve(false);\n let check = checked.get(ev.content);\n if (!check) {\n check = accept(ev.content).catch(() => false);\n checked.set(ev.content, check);\n }\n return check;\n };\n\n const held = await Promise.all(\n relays.map(async (url) => {\n const read = await pageRelay(filter, url, query).catch(() => null);\n for (const ev of read?.events ?? []) if (await valid(ev)) return url;\n return null;\n })\n );\n return held.filter((u): u is string => u !== null);\n}\n\n/**\n * The relays that serve a valid copy of `ballot` back, asked the way a count\n * asks (kind 30081 under the poll's `t`), narrowed to this voter's d-tag. A copy\n * counts when it carries this ballot's ballot_id and its own ballot signature\n * verifies. ballot_id leaves out sig.value, so a copy under the same id with a\n * junk signature does not count.\n */\nexport function relaysServingBallot(ballot: Ballot, opts: ReadBackOptions = {}): Promise<string[]> {\n const id = ballotId(ballot);\n const verify = opts.verify ?? bip322Verify;\n const filter: Filter = { kinds: [30081], '#d': [`oc-vote:ballot:${ballot.poll_id}:${ballot.voter}`], '#t': [ballot.poll_id] };\n return relaysServing(\n filter,\n async (content) => {\n const copy = parsed<Ballot>(content, 'oc-vote/ballot');\n return !!copy && safely(ballotId, copy) === id && (await verifyBallot(copy, verify)).ok;\n },\n opts\n );\n}\n\n/**\n * The relays that serve a valid copy of `poll` back, asked the way the poll\n * lookup asks (kind 30080 under its d-tag). A copy counts when it hashes to this\n * poll id and the creator's signature verifies.\n */\nexport function relaysServingPoll(poll: Poll, opts: ReadBackOptions = {}): Promise<string[]> {\n const id = pollId(poll);\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [30080], '#d': [`oc-vote:poll:${id}`] },\n async (content) => {\n const copy = parsed<Poll>(content, 'oc-vote/poll');\n return !!copy && safely(pollId, copy) === id && (await verifyPoll(copy, verify)).ok;\n },\n opts\n );\n}\n\n/** What a count needs to accept a reveal of an anchored poll (vote-core `verifyReveal`). */\nexport type RevealChain = { tipHeight: number; closeHeight: number | null };\n\n/**\n * The relays that serve a valid copy of `reveal` back, asked the way a count\n * asks (kind 30082 under the poll's reveal d-tag). A copy counts when it carries\n * this reveal's id and verifies against `poll` the way a count checks it now\n * (signature, timing, and for an anchored poll the chain).\n */\nexport function relaysServingReveal(\n reveal: Reveal,\n poll: Poll,\n opts: ReadBackOptions & { chain?: RevealChain } = {}\n): Promise<string[]> {\n const id = revealId(reveal);\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [30082], '#d': [`oc-vote:reveal:${reveal.poll_id}`] },\n async (content) => {\n const copy = parsed<Reveal>(content, 'oc-vote/reveal');\n return (\n !!copy && safely(revealId, copy) === id && (await verifyReveal(copy, poll, verify, Date.now(), opts.chain)).ok\n );\n },\n opts\n );\n}\n\n/** BIP-322 in stamp-core's argument order. */\nconst stampSigVerifier = (verify: SignatureVerifier) => (message: string, signature: string, address: string) =>\n Promise.resolve(verify({ address, message, signature }));\n\n/**\n * The relays that serve back this stamp (kind 30083 under its own d-tag). A\n * final count of an anchored poll reads ballots' stamps at the read floor, so a\n * stamp only one relay holds can be missed with that relay. A copy counts when\n * it is this envelope (its id covers the content hash) and its signature\n * verifies.\n */\nexport function relaysServingStamp(env: StampEnvelope, opts: ReadBackOptions = {}): Promise<string[]> {\n const verify = opts.verify ?? bip322Verify;\n return relaysServing(\n { kinds: [STAMP_KIND], '#d': [`oc-stamp:${env.id}`] },\n async (content) => {\n const copy = stampIn(content);\n if (!copy || copy.id !== env.id) return false;\n return (await stampVerify({ envelope: copy, verifyBip322: stampSigVerifier(verify) })).ok;\n },\n opts\n );\n}\n\nexport interface CastOptions {\n relays?: readonly string[];\n publish?: (event: NostrEvent, relays: readonly string[]) => Promise<PublishResult[]>;\n}\n\n/**\n * One try at getting a signed event in: publish `event` to the relays that did\n * not serve it back last time (`serving`), then `readBack`, which asks every\n * relay alone again. `event` is signed once and sent as it is on every try, so\n * publishing it again needs no new signature.\n *\n * Returns the relays that serve a valid copy now. Tries that land on different\n * relays add up while the earlier relays still serve it; one that has dropped\n * it no longer counts, so this errs towards \"not in yet\", never \"in\".\n */\nexport async function castEvent(\n event: NostrEvent,\n serving: readonly string[],\n readBack: () => Promise<string[]>,\n opts: CastOptions = {}\n): Promise<string[]> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const missing = relays.filter((r) => !serving.includes(r));\n if (missing.length > 0) await (opts.publish ?? publishEvent)(event, missing);\n return readBack();\n}\n\n/** `castEvent` for a ballot, read back with `relaysServingBallot`. */\nexport function castBallot(\n event: NostrEvent,\n ballot: Ballot,\n serving: readonly string[],\n opts: CastOptions & ReadBackOptions = {}\n): Promise<string[]> {\n return castEvent(event, serving, () => relaysServingBallot(ballot, opts), opts);\n}\n","// Where a published object stands, from the relays that serve it back, each\n// asked alone (quorum.ts). Never more than the read-back showed. Below\n// min(2, asked) it says the object isn't in yet, gives the signed event to send\n// again with `oc-vote republish`, and sets the exit status to NOT_IN_YET.\n\nimport type { NostrEvent } from './nostr.js';\nimport { isIn, writeQuorum } from './quorum.js';\n\n/** Exit status when something was published but is not in yet. */\nexport const NOT_IN_YET = 2;\n\nexport type Kind = 'poll' | 'ballot' | 'reveal' | 'stamp';\n\n/** A signed event this command published, and the relays that serve it back now. */\nexport interface Standing {\n kind: Kind;\n event: NostrEvent;\n relays: readonly string[];\n serving: readonly string[];\n}\n\nexport function standingIsIn(s: Standing): boolean {\n return isIn(s.serving.length, s.relays.length);\n}\n\nfunction standingJson(s: Standing) {\n return { in: standingIsIn(s), served_by: s.serving, asked: s.relays.length, quorum: writeQuorum(s.relays.length) };\n}\n\nconst LABEL: Record<Kind, string> = { poll: 'published:', ballot: 'in:', reveal: 'published:', stamp: 'stamp:' };\n/** What missing every relay means for each kind's readers. */\nconst MISSED: Record<Kind, string> = {\n poll: 'so no one can find it',\n ballot: 'so a count would not see it',\n reveal: 'so a count would not see it',\n stamp: 'so a final count would not see it',\n};\n/** Who is sure to see it at the quorum. */\nconst SURE: Record<Kind, string> = {\n poll: 'it is sure to be found',\n ballot: 'a count is sure to see it',\n reveal: 'a count is sure to see it',\n stamp: 'a final count is sure to see it',\n};\n\n/** Where `s` stands, its relays one a line, and, below the quorum, how to send it again. */\nexport function standingLines(s: Standing, file?: string): string[] {\n const asked = s.relays.length;\n const n = s.serving.length;\n const label = ` ${LABEL[s.kind].padEnd(12)}`;\n const lines: string[] = [];\n if (standingIsIn(s)) {\n lines.push(`${label}yes, ${n} of ${asked} relays serve it back`);\n if (s.kind === 'stamp') lines.push(` a Bitcoin block usually anchors it within an hour or two`);\n } else if (n === 0) {\n lines.push(`${label}not yet: no relay serves it back, ${MISSED[s.kind]}`);\n } else {\n lines.push(\n `${label}not yet: only ${n} of ${asked} relays serves it back, ` +\n `and ${SURE[s.kind]} only once ${writeQuorum(asked)} do`\n );\n }\n for (const relay of s.relays) lines.push(` ${s.serving.includes(relay) ? '✓' : '✗'} ${relay}`);\n if (standingIsIn(s)) return lines;\n if (s.kind === 'stamp') lines.push(` vote.ochk.io's anchorer also stamps every ballot it sees`);\n if (file) {\n lines.push(` again: oc-vote republish ${file}`);\n lines.push(` sends the same signed ${s.kind}, with nothing new to sign`);\n } else {\n lines.push(` again: save the signed event below to a file and run oc-vote republish <file>;`);\n lines.push(` it sends the same signed ${s.kind}, with nothing new to sign`);\n lines.push(` event: ${JSON.stringify(s.event)}`);\n }\n return lines;\n}\n\nexport interface Report {\n /** The object's id line, e.g. ['ballot_id', '…']. */\n id: [string, string];\n heading?: [string, string][];\n main: Standing;\n /** A ballot's stamp in an anchored poll: where it stands, or why none was made. */\n stamp?: Standing | { error: string } | null;\n json: boolean;\n /** JSON fields after the standing and before `event`. */\n jsonExtra?: Record<string, unknown>;\n /** Human lines after the standing. */\n tail?: string[];\n /** The file the signed event came from, for the \"again\" line. */\n file?: string;\n}\n\n/** Writes where `r.main` (and its stamp) stand; NOT_IN_YET when either isn't in. */\nexport function report(r: Report): void {\n const stamp = r.stamp && 'kind' in r.stamp ? r.stamp : null;\n // A stamp that was never made is on no relay: a final count can't see it either.\n const unmade = r.stamp && 'error' in r.stamp ? r.stamp : null;\n if (!standingIsIn(r.main) || (stamp && !standingIsIn(stamp)) || unmade) process.exitCode = NOT_IN_YET;\n\n if (r.json) {\n const stampJson = r.stamp ? ('kind' in r.stamp ? { ...standingJson(r.stamp), event: r.stamp.event } : r.stamp) : null;\n process.stdout.write(\n JSON.stringify(\n {\n [r.id[0]]: r.id[1],\n ...standingJson(r.main),\n ...(stampJson ? { stamp: stampJson } : {}),\n ...r.jsonExtra,\n event: r.main.event,\n },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const lines = [` ${`${r.id[0]}:`.padEnd(12)}${r.id[1]}`];\n for (const [k, v] of r.heading ?? []) lines.push(` ${`${k}:`.padEnd(12)}${v}`);\n lines.push(...standingLines(r.main, r.file));\n if (stamp) lines.push(...standingLines(stamp));\n else if (unmade) {\n lines.push(` stamp: not made here (${unmade.error}), so a final count can't see this ballot yet`);\n lines.push(` vote.ochk.io's anchorer stamps every ballot it sees`);\n }\n lines.push(...(r.tail ?? []));\n process.stdout.write(`\\n${lines.join('\\n')}\\n\\n`);\n}\n","// Interactive signature prompt.\n// The CLI never holds a Bitcoin private key. To sign a poll / ballot / reveal,\n// the caller either passes --sig <base64> on the command line, or we compute\n// the canonical id, print it, and ask the user to sign elsewhere (UniSat,\n// Xverse, Leather, sparrow-wallet, any BIP-322 signer) and paste back.\n\nimport { createInterface } from 'node:readline/promises';\n\nexport async function promptForSignature(\n address: string,\n id: string,\n preset?: string\n): Promise<string> {\n if (preset && preset.trim()) return preset.trim();\n\n process.stderr.write(\n `\\n sign with BIP-322, address ${address}\\n` +\n ` message: ${id}\\n\\n` +\n ` paste the base64 signature and press enter:\\n > `\n );\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n const sig = (await rl.question('')).trim();\n rl.close();\n if (!sig) throw new Error('empty signature');\n return sig;\n}\n","// oc-vote create — build + sign + publish a poll, then ask each relay alone for\n// it back. It is published only once min(2, asked) relays serve a valid copy\n// (OC Vote SPEC §3.4, quorum.ts); below that it says so and exits 2, and\n// `oc-vote republish` sends the same signed event again.\n\nimport { hexEncode } from '@orangecheck/lock-crypto';\nimport { generateX25519KeyPair } from '@orangecheck/lock-crypto';\nimport { canonicalBytes, pollId } from '@orangecheck/vote-core';\nimport type { Poll, PollMode, Tiebreak, WeightMode } from '@orangecheck/vote-core';\n\nimport { buildPollEvent } from '../events.js';\nimport { DEFAULT_RELAYS } from '../nostr.js';\nimport { castEvent, relaysServingPoll } from '../quorum.js';\nimport { report } from '../report.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface CreateOptions {\n creator: string;\n question: string;\n options: { id: string; label: string }[];\n deadline: string;\n snapshotBlock: number | 'deadline';\n weightMode: WeightMode;\n capDays?: number;\n minSats: number;\n minDays: number;\n tiebreak: Tiebreak;\n mode: PollMode;\n notes?: string;\n sig?: string;\n relays?: string[];\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport async function runCreate(opts: CreateOptions): Promise<void> {\n if (!/^(bc1|1|3)[0-9a-zA-Z]+$/.test(opts.creator)) {\n throw new Error(`creator does not look like a Bitcoin mainnet address: ${opts.creator}`);\n }\n if (opts.options.length < 2) throw new Error('need at least 2 options');\n if (new Set(opts.options.map((o) => o.id)).size !== opts.options.length) {\n throw new Error('option ids must be unique');\n }\n\n // Secret mode: generate an X25519 reveal keypair.\n let reveal_pk: string | null = null;\n let reveal_sk: string | null = null;\n if (opts.mode === 'secret') {\n const kp = generateX25519KeyPair();\n reveal_sk = hexEncode(kp.secret);\n reveal_pk = hexEncode(kp.public);\n }\n\n const draft: Poll = {\n v: 0,\n kind: 'oc-vote/poll',\n creator: opts.creator,\n question: opts.question,\n options: opts.options,\n deadline: opts.deadline,\n snapshot_block: opts.snapshotBlock,\n weight_mode: opts.weightMode,\n weight_params:\n opts.weightMode === 'sats_days' && opts.capDays\n ? { cap_days: opts.capDays }\n : null,\n min_sats: opts.minSats,\n min_days: opts.minDays,\n mode: opts.mode,\n reveal_pk,\n tiebreak: opts.tiebreak,\n notes: opts.notes ?? null,\n created_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.creator, value: '' },\n };\n\n const pid = pollId(draft);\n\n if (opts.dryRun) {\n const out = {\n poll_id: pid,\n poll: draft,\n ...(reveal_sk ? { reveal_sk, reveal_pk } : {}),\n };\n process.stdout.write(JSON.stringify(out, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.creator, pid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: `oc-vote republish` sends this same event, so a poll that isn't\n // published yet keeps its id, and ballots cast against it stay its own.\n const event = buildPollEvent(draft);\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const serving = await castEvent(event, [], () => relaysServingPoll(draft, { relays }), { relays });\n const url = `https://vote.ochk.io/p/${pid}`;\n\n const tail = [` url: ${url}`];\n if (reveal_sk) {\n tail.push(\n '',\n ' SECRET MODE — save these or the poll is abandoned at deadline:',\n ` reveal_pk: ${reveal_pk}`,\n ` reveal_sk: ${reveal_sk}`,\n ' to publish the reveal:',\n ` oc-vote reveal --poll ${pid} --reveal-sk ${reveal_sk} --creator ${opts.creator}`\n );\n }\n tail.push('', ' canonical bytes:', canonicalBytes({ ...draft, sig: { ...draft.sig, value: '' } }).trimEnd());\n\n report({\n id: ['poll_id', pid],\n main: { kind: 'poll', event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { poll: draft, ...(reveal_sk ? { reveal_sk, reveal_pk } : {}), url },\n tail,\n });\n}\n","// Pick the poll / reveal out of everything relays return under a d-tag.\n//\n// The poll is an event whose content hashes to the requested id (SPEC §3.2);\n// among those, one whose creator signature verifies (§10.1) is preferred.\n// The reveal is the first that verifies against the poll (§6.4, §10.3).\n\nimport {\n pollId as computePollId,\n verifyPoll,\n verifyReveal,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n} from '@orangecheck/vote-core';\n\nimport { readShortfall, type EventsFetch, type NostrEvent, type PagedFetch } from './nostr.js';\n\nfunction parse<T>(ev: NostrEvent): T | null {\n try {\n return JSON.parse(ev.content) as T;\n } catch {\n return null;\n }\n}\n\nexport async function selectPoll(\n events: NostrEvent[],\n pid: string,\n verify: SignatureVerifier\n): Promise<{ poll: Poll; signatureValid: boolean } | null> {\n let unverified: Poll | null = null;\n for (const ev of events) {\n const p = parse<Poll>(ev);\n if (!p || p.kind !== 'oc-vote/poll' || computePollId(p) !== pid) continue;\n if ((await verifyPoll(p, verify)).ok) return { poll: p, signatureValid: true };\n unverified ??= p;\n }\n return unverified ? { poll: unverified, signatureValid: false } : null;\n}\n\n/**\n * selectPoll over a relay answer, distinguishing \"no relay has it\" from \"no\n * relay finished answering\" — only the first is \"not found\".\n */\nexport async function findPoll(\n fetched: EventsFetch,\n pid: string,\n verify: SignatureVerifier\n): Promise<{ poll: Poll; signatureValid: boolean }> {\n const selected = await selectPoll(fetched.events, pid, verify);\n if (selected) return selected;\n throw new Error(\n fetched.complete\n ? 'poll not found on relays'\n : 'no relay finished answering the poll query; try again'\n );\n}\n\n/** Refuse to draw a conclusion from a set that does not stand for what the relays hold. */\nexport function requireComplete(fetched: EventsFetch | PagedFetch, what: string): NostrEvent[] {\n if (fetched.complete) return fetched.events;\n const short = 'relays' in fetched ? readShortfall(fetched.relays) : null;\n throw new Error(\n short\n ? `can't count: the ${what} lookup ${short}, so ${what}s may be missing; try again`\n : `no relay finished answering the ${what} query; try again`\n );\n}\n\n/**\n * The ballots a tally counts. A clock-dated count rests on the ballot read\n * alone, so a read that was cut short or is below the floor can't be counted.\n * An anchored count is held provisional instead (anchoredChain, the same\n * `readShortfall`), so it needs only a relay that answered at all.\n */\nexport function ballotsToCount(fetched: PagedFetch, anchored: boolean): NostrEvent[] {\n if (!anchored) return requireComplete(fetched, 'ballot');\n if (fetched.relays.some((r) => r.answered || r.truncated)) return fetched.events;\n throw new Error('no relay finished answering the ballot query; try again');\n}\n\n/**\n * The first reveal that verifies against the poll. An anchored poll's reveal\n * counts only once `chain.tipHeight` reaches H_close + G + 6 (SPEC §10.3), so\n * without `chain` none does.\n */\nexport async function selectReveal(\n events: NostrEvent[],\n poll: Poll,\n verify: SignatureVerifier,\n chain?: { tipHeight: number; closeHeight: number | null }\n): Promise<Reveal | null> {\n return (await findReveal(events, poll, verify, chain))?.reveal ?? null;\n}\n\n/** `selectReveal`, with the event that carried it. */\nexport async function findReveal(\n events: readonly NostrEvent[],\n poll: Poll,\n verify: SignatureVerifier,\n chain?: { tipHeight: number; closeHeight: number | null }\n): Promise<{ event: NostrEvent; reveal: Reveal } | null> {\n for (const event of events) {\n const reveal = parse<Reveal>(event);\n if (reveal && (await verifyReveal(reveal, poll, verify, Date.now(), chain)).ok) return { event, reveal };\n }\n return null;\n}\n","// oc-vote discover — list recent polls across the default relay set.\n\nimport { pollId as computePollId, verifyPoll } from '@orangecheck/vote-core';\nimport type { Poll } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchRecentPolls } from '../nostr.js';\nimport { requireComplete } from '../select.js';\n\nexport interface DiscoverOptions {\n limit?: number;\n relays?: string[];\n json?: boolean;\n openOnly?: boolean;\n}\n\nexport async function runDiscover(opts: DiscoverOptions): Promise<void> {\n const limit = opts.limit ?? 30;\n const events = requireComplete(await fetchRecentPolls(limit, opts.relays ?? DEFAULT_RELAYS), 'poll listing');\n\n interface Item {\n poll_id: string;\n poll: Poll;\n nostr_created_at: number;\n }\n const seen = new Set<string>();\n const items: Item[] = [];\n for (const ev of events) {\n try {\n const poll = JSON.parse(ev.content) as Poll;\n if (poll.kind !== 'oc-vote/poll' || poll.v !== 0) continue;\n const pid = computePollId(poll);\n if (seen.has(pid)) continue;\n if (opts.openOnly && Date.parse(poll.deadline) < Date.now()) continue;\n // Listed only when the creator's signature verifies (SPEC §10.1). A copy\n // that fails leaves the id open for another: poll_id leaves out sig.value.\n if (!(await verifyPoll(poll, bip322Verify)).ok) continue;\n seen.add(pid);\n items.push({ poll_id: pid, poll, nostr_created_at: ev.created_at });\n } catch {}\n }\n items.sort((a, b) => b.nostr_created_at - a.nostr_created_at);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(items, null, 2) + '\\n');\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n discovered ${items.length} poll(s) across ${(opts.relays ?? DEFAULT_RELAYS).length} relays\\n\\n`);\n for (const { poll, poll_id, nostr_created_at } of items) {\n const isPast = Date.parse(poll.deadline) < Date.now();\n const age = Math.max(0, Math.floor((Date.now() / 1000 - nostr_created_at) / 60));\n const ageStr =\n age < 1\n ? 'just now'\n : age < 60\n ? `${age}m`\n : age < 60 * 24\n ? `${Math.floor(age / 60)}h`\n : `${Math.floor(age / (60 * 24))}d`;\n w(` [${isPast ? 'closed' : ' open '}] [${poll.weight_mode.padEnd(15)}] ${ageStr.padStart(5)} · ${poll.question}\\n`);\n w(` https://vote.ochk.io/p/${poll_id}\\n`);\n }\n if (items.length === 0) {\n w(` No polls found. Try: oc-vote create\\n`);\n }\n w(`\\n`);\n}\n","// oc-vote gen-reveal-key — print a fresh X25519 keypair for secret-mode\n// polls. Use this to pre-generate a key pair you pin into a --reveal-pk\n// flag, then publish the matching --reveal-sk at deadline.\n//\n// The standard `oc-vote create --mode secret` already generates one\n// automatically; this command exists for flows that want the key in hand\n// before composing the poll (e.g. DAO trustee ceremonies).\n\nimport { generateX25519KeyPair, hexEncode } from '@orangecheck/lock-crypto';\n\nexport interface GenRevealKeyOptions {\n json?: boolean;\n}\n\nexport function runGenRevealKey(opts: GenRevealKeyOptions): void {\n const kp = generateX25519KeyPair();\n const reveal_sk = hexEncode(kp.secret);\n const reveal_pk = hexEncode(kp.public);\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({ reveal_sk, reveal_pk }, null, 2) + '\\n');\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n reveal_pk: ${reveal_pk}\\n`);\n w(` reveal_sk: ${reveal_sk}\\n\\n`);\n w(` pass reveal_pk to --reveal-pk at poll creation.\\n`);\n w(` keep reveal_sk offline until deadline; publish via:\\n`);\n w(` oc-vote reveal --poll <id> --reveal-sk ${reveal_sk} --creator <addr>\\n\\n`);\n}\n","// oc-vote reveal — publish the reveal event for a secret-mode poll, then ask\n// each relay alone for it back. It is published only once min(2, asked) relays\n// serve a copy a count accepts (OC Vote SPEC §3.4, quorum.ts); below that it\n// says so and exits 2, and `oc-vote republish` sends the same signed event\n// again. A reveal already on the relays is sent again as it is, not re-signed.\n\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n anchoredTallyIsFinal,\n isAnchoredPoll,\n lastAnchorHeight,\n mempoolBlockTimeSource,\n resolveCloseBlock,\n revealId,\n} from '@orangecheck/vote-core';\nimport type { Poll, Reveal } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\n\nimport { buildRevealEvent } from '../events.js';\nimport { DEFAULT_RELAYS, fetchPollEvents, fetchRevealEvents } from '../nostr.js';\nimport { castEvent, relaysServingReveal, type RevealChain } from '../quorum.js';\nimport { report } from '../report.js';\nimport { findPoll, findReveal } from '../select.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface RevealOptions {\n pollId: string;\n revealSk: string;\n creator: string;\n sig?: string;\n relays?: string[];\n force?: boolean;\n dryRun?: boolean;\n json?: boolean;\n}\n\n/**\n * For an anchored poll, the chain a count checks a reveal against (vote-core\n * `verifyReveal`); undefined for a clock-dated poll.\n */\nexport async function revealChainFor(poll: Poll): Promise<RevealChain | undefined> {\n if (!isAnchoredPoll(poll)) return undefined;\n const close = await resolveCloseBlock(poll.deadline, mempoolBlockTimeSource());\n if (!close.ok) throw new Error(`the block at the deadline could not be read: ${close.reason}`);\n return { tipHeight: close.tip, closeHeight: close.height };\n}\n\nexport async function runReveal(opts: RevealOptions): Promise<void> {\n if (!/^[0-9a-f]{64}$/.test(opts.pollId)) {\n throw new Error('poll id must be 64 hex chars');\n }\n if (!/^[0-9a-f]{64}$/.test(opts.revealSk)) {\n throw new Error('reveal_sk must be 64 hex chars');\n }\n\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const selected = await findPoll(await fetchPollEvents(opts.pollId, relays), opts.pollId, bip322Verify);\n const poll = selected.poll;\n if (poll.mode !== 'secret') throw new Error('poll is public-mode — no reveal needed');\n if (poll.creator !== opts.creator) {\n throw new Error(\n `poll creator is ${poll.creator} but you provided ${opts.creator}`\n );\n }\n // SPEC §10.3: an anchored poll's reveal counts only once the tip reaches\n // H_close + G + 6; a clock-dated poll's once the deadline has passed.\n const chain = await revealChainFor(poll);\n if (chain) {\n if (!anchoredTallyIsFinal(chain.closeHeight, chain.tipHeight) && !opts.force) {\n throw new Error(\n chain.closeHeight === null\n ? 'no block at the deadline yet: talliers would not accept a reveal now (pass --force to publish anyway)'\n : `talliers accept the reveal from block ${lastAnchorHeight(chain.closeHeight) + ANCHOR_FINAL_CONFIRMATIONS}; the tip is ${chain.tipHeight} (pass --force to publish anyway)`\n );\n }\n } else if (Date.parse(poll.deadline) > Date.now() && !opts.force) {\n throw new Error(\n `poll deadline is ${poll.deadline} — pass --force to publish before deadline`\n );\n }\n\n // A reveal that verifies against the poll is already signed: send that same\n // event to the relays that don't serve it, rather than ask for a new\n // signature. --force signs a new one instead.\n const existing = await findReveal((await fetchRevealEvents(opts.pollId, relays)).events, poll, bip322Verify, chain);\n if (existing && !opts.force) {\n const readBack = () => relaysServingReveal(existing.reveal, poll, { relays, chain });\n const serving = await castEvent(existing.event, await readBack(), readBack, { relays });\n report({\n id: ['reveal_id', revealId(existing.reveal)],\n heading: [\n ['poll', poll.question],\n ['revealed', existing.reveal.revealed_at],\n ],\n main: { kind: 'reveal', event: existing.event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { reveal: existing.reveal, signed_earlier: true },\n tail: [\n ' note: this reveal was signed earlier and found on the relays; it was sent as it is',\n '',\n ` tally with: oc-vote tally ${opts.pollId}`,\n ],\n });\n return;\n }\n\n const draft: Reveal = {\n v: 0,\n kind: 'oc-vote/reveal',\n poll_id: opts.pollId,\n reveal_sk: opts.revealSk,\n revealed_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.creator, value: '' },\n };\n\n const rid = revealId(draft);\n\n if (opts.dryRun) {\n process.stdout.write(JSON.stringify({ reveal_id: rid, reveal: draft }, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.creator, rid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: `oc-vote republish` sends this same event.\n const event = buildRevealEvent(draft);\n const serving = await castEvent(event, [], () => relaysServingReveal(draft, poll, { relays, chain }), { relays });\n report({\n id: ['reveal_id', rid],\n heading: [\n ['poll', poll.question],\n ['revealed', draft.revealed_at],\n ],\n main: { kind: 'reveal', event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: { reveal: draft },\n tail: ['', ` tally with: oc-vote tally ${opts.pollId}`],\n });\n}\n","// oc-vote republish <file> — send a signed poll, ballot, reveal or ballot stamp\n// again, as it is, and ask each relay alone for it back. The file holds the\n// event `create`, `vote` or `reveal` printed (an `event:` line, or the whole\n// --json output). Nothing new is signed: a poll keeps its id, so ballots cast\n// against it stay its own, and nothing waits on a wallet.\n\nimport { readFileSync } from 'node:fs';\n\nimport { verifyEvent } from '@orangecheck/nostr-core';\nimport { verify as stampVerify } from '@orangecheck/stamp-core';\nimport { ballotId, pollId, revealId, verifyBallot, verifyPoll, verifyReveal } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchPollEvents, type NostrEvent } from '../nostr.js';\nimport {\n ballotOf,\n castEvent,\n pollOf,\n relaysServingBallot,\n relaysServingPoll,\n relaysServingReveal,\n relaysServingStamp,\n revealOf,\n stampOf,\n} from '../quorum.js';\nimport { report, type Kind } from '../report.js';\nimport { findPoll } from '../select.js';\nimport { revealChainFor } from './reveal.js';\n\nexport interface RepublishOptions {\n file: string;\n relays?: string[];\n json?: boolean;\n}\n\n/** A signed event checked the way its readers check it, and how to read it back. */\nexport interface Signed {\n kind: Kind;\n event: NostrEvent;\n id: [string, string];\n heading: [string, string][];\n jsonExtra: Record<string, unknown>;\n readBack: (relays: readonly string[]) => Promise<string[]>;\n}\n\n/** Why `p` did not verify, or null when it did. */\nasync function failure(p: Promise<{ ok: boolean; reason?: string } | { ok: true }>): Promise<string | null> {\n const v = await p.catch((e: unknown) => ({ ok: false, reason: (e as Error).message }));\n return v.ok ? null : ('reason' in v && v.reason) || 'it does not verify';\n}\n\n/**\n * The signed event in `text`: an event, or --json output carrying one as\n * `event`. Refused unless its Nostr id and signature hold, it is a poll, ballot,\n * reveal or stamp, and that object verifies: a poll's or ballot's own signature,\n * a reveal against its poll (read from `relays`) as a count checks it now, a\n * stamp's signature.\n */\nexport async function readSigned(text: string, relays: readonly string[] = DEFAULT_RELAYS): Promise<Signed> {\n let obj: unknown;\n try {\n obj = JSON.parse(text);\n } catch {\n throw new Error('the file is not JSON');\n }\n const event = obj && typeof obj === 'object' && 'event' in obj ? (obj as { event: unknown }).event : obj;\n if (!verifyEvent(event)) throw new Error(\"no signed Nostr event in the file: its id or signature doesn't hold\");\n\n if (event.kind === 30080) {\n const poll = pollOf(event);\n if (!poll) throw new Error(\"the event doesn't carry a poll\");\n const why = await failure(verifyPoll(poll, bip322Verify));\n if (why) throw new Error(`the poll's signature doesn't verify: ${why}`);\n return {\n kind: 'poll',\n event,\n id: ['poll_id', pollId(poll)],\n heading: [['poll', poll.question]],\n jsonExtra: { poll },\n readBack: (r) => relaysServingPoll(poll, { relays: r }),\n };\n }\n if (event.kind === 30081) {\n const ballot = ballotOf(event);\n if (!ballot) throw new Error(\"the event doesn't carry a ballot\");\n const why = await failure(verifyBallot(ballot, bip322Verify));\n if (why) throw new Error(`the ballot's signature doesn't verify: ${why}`);\n return {\n kind: 'ballot',\n event,\n id: ['ballot_id', ballotId(ballot)],\n heading: [\n ['poll', ballot.poll_id],\n ['voter', ballot.voter],\n ],\n jsonExtra: { ballot },\n readBack: (r) => relaysServingBallot(ballot, { relays: r }),\n };\n }\n if (event.kind === 30082) {\n const reveal = revealOf(event);\n if (!reveal) throw new Error(\"the event doesn't carry a reveal\");\n const poll = (await findPoll(await fetchPollEvents(reveal.poll_id, relays), reveal.poll_id, bip322Verify)).poll;\n const chain = await revealChainFor(poll);\n const why = await failure(verifyReveal(reveal, poll, bip322Verify, Date.now(), chain));\n if (why) throw new Error(`the reveal doesn't verify against its poll: ${why}`);\n return {\n kind: 'reveal',\n event,\n id: ['reveal_id', revealId(reveal)],\n heading: [['poll', poll.question]],\n jsonExtra: { reveal },\n readBack: (r) => relaysServingReveal(reveal, poll, { relays: r, chain }),\n };\n }\n if (event.kind === 30083) {\n const env = stampOf(event);\n if (!env) throw new Error(\"the event doesn't carry an OC Stamp\");\n const why = await failure(\n stampVerify({\n envelope: env,\n verifyBip322: async (message, signature, address) => bip322Verify({ address, message, signature }),\n }).then((v) => (v.ok ? { ok: true as const } : { ok: false, reason: v.message ?? v.code }))\n );\n if (why) throw new Error(`the stamp's signature doesn't verify: ${why}`);\n return {\n kind: 'stamp',\n event,\n id: ['stamp_id', env.id],\n heading: [['over', env.content.hash]],\n jsonExtra: { stamp: env },\n readBack: (r) => relaysServingStamp(env, { relays: r }),\n };\n }\n throw new Error(`the event is kind ${event.kind}: not a poll, ballot, reveal or stamp (30080 to 30083)`);\n}\n\nexport async function runRepublish(opts: RepublishOptions): Promise<void> {\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const signed = await readSigned(readFileSync(opts.file, 'utf8'), relays);\n // Which relays serve it now is unknown here, so it goes to all of them.\n const serving = await castEvent(signed.event, [], () => signed.readBack(relays), { relays });\n report({\n id: signed.id,\n heading: signed.heading,\n main: { kind: signed.kind, event: signed.event, relays, serving },\n json: Boolean(opts.json),\n jsonExtra: signed.jsonExtra,\n file: opts.file,\n });\n}\n","// oc-vote show <poll_id> — print the poll metadata + ballot count.\n\n\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchBallotEvents, fetchPollEvents } from '../nostr.js';\nimport { findPoll, requireComplete } from '../select.js';\n\nexport interface ShowOptions {\n pollId: string;\n relays?: string[];\n json?: boolean;\n}\n\nexport async function runShow(opts: ShowOptions): Promise<void> {\n const pid = opts.pollId;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const [pollFetch, ballotFetch] = await Promise.all([\n fetchPollEvents(pid, relays),\n fetchBallotEvents(pid, relays),\n ]);\n const selected = await findPoll(pollFetch, pid, bip322Verify);\n const ballotEvents = requireComplete(ballotFetch, 'ballot');\n const { poll, signatureValid } = selected;\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n { poll, poll_signature_valid: signatureValid, ballot_count: ballotEvents.length },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n question: ${poll.question}\\n`);\n w(` options: ${poll.options.map((o) => `${o.id} (${o.label})`).join(', ')}\\n`);\n w(` creator: ${poll.creator}${signatureValid ? '' : ' (SIGNATURE DOES NOT VERIFY)'}\\n`);\n w(` mode: ${poll.mode}\\n`);\n w(` weight: ${poll.weight_mode}${poll.weight_mode === 'sats_days' && poll.weight_params?.cap_days ? ` (cap ${poll.weight_params.cap_days}d)` : ''}\\n`);\n w(` threshold: ${poll.min_sats} sat / ${poll.min_days} d\\n`);\n w(` tiebreak: ${poll.tiebreak}\\n`);\n w(` deadline: ${poll.deadline}\\n`);\n w(` snapshot: ${poll.snapshot_block}\\n`);\n w(` ballots: ${ballotEvents.length}\\n`);\n if (poll.notes) w(` notes: ${poll.notes}\\n`);\n w(`\\n`);\n}\n","import { verifySignature } from '@orangecheck/bip322';\nimport { ballotId, distinctBallotCopies, type Ballot } from '@orangecheck/vote-core';\n\nimport type { NostrEvent } from './nostr.js';\n\n/**\n * Every copy of this poll's ballots in `events`, byte-identical copies\n * collapsed. vote-core's tally verifies each copy before it picks one ballot\n * per voter; ballot_id leaves out sig.value, so copies with one id can carry\n * different signatures.\n */\nexport function ballotCopiesFromEvents(events: NostrEvent[], pid: string): Ballot[] {\n const parsed: Ballot[] = [];\n for (const ev of events) {\n try {\n const b = JSON.parse(ev.content) as Ballot;\n if (b && b.poll_id === pid) parsed.push(b);\n } catch {\n // skip malformed\n }\n }\n return distinctBallotCopies(parsed);\n}\n\nexport interface BallotVerdict {\n voter: string;\n ballot_id: string;\n ok: boolean;\n}\n\n/** One verdict per ballot_id: valid when any copy of it carries a signature that verifies. */\nexport function ballotVerdicts(\n copies: Ballot[],\n verify: (address: string, message: string, signature: string) => boolean = verifySignature\n): BallotVerdict[] {\n const byId = new Map<string, BallotVerdict>();\n for (const b of copies) {\n const id = ballotId(b);\n const ok = verify(b.voter, id, b.sig?.value ?? '');\n const prior = byId.get(id);\n if (!prior || (!prior.ok && ok)) byId.set(id, { voter: b.voter, ballot_id: id, ok });\n }\n return [...byId.values()];\n}\n","// UTXO snapshot source for the CLI. Defaults to mempool.space; swappable via\n// --mempool-base flag.\n\nimport { UtxoUnreadError, type Utxo, type UtxoLookup } from '@orangecheck/vote-core';\n\ninterface MempoolUtxo {\n txid: string;\n vout: number;\n value: number;\n status: { confirmed: boolean; block_height?: number; block_time?: number };\n}\n\nexport interface UtxoSource {\n fetchUtxos(address: string): Promise<Utxo[]>;\n}\n\n/** How long one ask may take, its body included: a hung explorer is a voter not read, not a tally that waits. */\nexport const UTXO_FETCH_TIMEOUT_MS = 8_000;\n\n/**\n * Why a voter's coins were not read (OC Vote SPEC §8). mempool.space answers 400\n * \"Too many unspent transaction outputs (>500). Contact support to raise limits.\"\n * for an address with more coins than it lists (read 2026-11-05), and anyone can\n * push an address there by sending it dust. blockstream.info lists more (all\n * 3,171 coins of an address mempool.space caps) and refuses a very large one\n * with 400 \"Scripthash history too large to scan\" (both read 2026-11-05), which\n * this reads as the explorer's refusal. A rate limit, a server error, no answer\n * or an answer that is not a coin list may pass; any other refusal is the\n * explorer's.\n */\nfunction unreadBecause(status: number, body: string): UtxoUnreadError {\n if (/too many unspent/i.test(body)) {\n return new UtxoUnreadError('utxo_cap_unread', `mempool utxo ${status}: past its cap`);\n }\n if (status === 429 || status >= 500) {\n return new UtxoUnreadError('chain_unread', `mempool utxo ${status}`);\n }\n return new UtxoUnreadError('provider_refused_unread', `mempool utxo ${status}`);\n}\n\n/** A coin as mempool.space lists it, or null for anything else. */\nfunction asCoin(u: unknown): MempoolUtxo | null {\n const c = u as MempoolUtxo | null;\n return c && typeof c === 'object' && typeof c.value === 'number' && c.status && typeof c.status === 'object'\n ? c\n : null;\n}\n\n/** `work` with a signal that aborts after `ms`, body reads included. */\nasync function withTimeout<T>(ms: number, work: (signal: AbortSignal) => Promise<T>): Promise<T> {\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), ms);\n try {\n return await work(ac.signal);\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function mempoolSource(base = 'https://mempool.space/api', timeoutMs = UTXO_FETCH_TIMEOUT_MS): UtxoSource {\n return {\n /** Throws UtxoUnreadError when the coins were not read, so the tally names the voter. */\n async fetchUtxos(address) {\n let data: unknown;\n try {\n data = await withTimeout(timeoutMs, async (signal) => {\n const res = await fetch(`${base}/address/${address}/utxo`, {\n headers: { accept: 'application/json' },\n signal,\n });\n if (!res.ok) throw unreadBecause(res.status, await res.text().catch(() => ''));\n return res.json();\n });\n } catch (err) {\n if (err instanceof UtxoUnreadError) throw err;\n // No answer, a timeout, a body that is not JSON, or a bug here:\n // each reads as chain_unread, so say which by name. Only the\n // name: a message can carry the voter's address.\n process.stderr.write(\n `oc-vote: coin lookup threw ${err instanceof Error ? err.name : typeof err}; read as chain_unread\\n`\n );\n throw new UtxoUnreadError('chain_unread', 'mempool utxo: no answer');\n }\n const listed = Array.isArray(data) ? data.map(asCoin) : null;\n if (!listed || listed.some((c) => c === null)) {\n process.stderr.write('oc-vote: coin lookup answered something other than a coin list; read as chain_unread\\n');\n throw new UtxoUnreadError('chain_unread', 'mempool utxo: not a coin list');\n }\n return (listed as MempoolUtxo[])\n .filter((u) => u.status.confirmed && typeof u.status.block_height === 'number')\n .map((u) => ({\n value: u.value,\n confirmed_height: u.status.block_height as number,\n }));\n },\n };\n}\n\nexport function buildLookup(source: UtxoSource): UtxoLookup {\n return async (addr: string, snapshot: number): Promise<Utxo[]> => {\n const all = await source.fetchUtxos(addr);\n return all.filter((u) => u.confirmed_height <= snapshot);\n };\n}\n","// oc-vote tally <poll_id>\n\nimport { hexDecode, utf8Decode } from '@orangecheck/lock-crypto';\nimport { unseal } from '@orangecheck/lock-core';\nimport {\n ANCHOR_FINAL_CONFIRMATIONS,\n ballotId,\n isAnchoredPoll,\n lastAnchorHeight,\n mempoolBlockTimeSource,\n resolvePollSnapshot,\n tally,\n type Ballot,\n type Poll,\n type Reveal,\n type SignatureVerifier,\n type TalliedResult,\n type TallyResult,\n type UnreadResult,\n type UtxoLookup,\n type UtxoUnreadReason,\n} from '@orangecheck/vote-core';\n\nimport { anchoredChain, type AnchoredChain } from '../anchors.js';\nimport { ballotCopiesFromEvents } from '../ballots.js';\nimport { bip322Verify } from '../bip322.js';\nimport {\n DEFAULT_RELAYS,\n fetchBallotEvents,\n fetchPollEvents,\n fetchRevealEvents,\n} from '../nostr.js';\nimport { ballotsToCount, findPoll, requireComplete, selectReveal } from '../select.js';\nimport { buildLookup, mempoolSource } from '../utxos.js';\n\n/**\n * The exit code of a tally with voters whose coins were not read (SPEC §8): no\n * count, which is neither a count (0), a failure (1), nor a publish below the\n * write quorum (2, report.ts NOT_IN_YET). Tally again once the chain answers.\n */\nexport const UNREAD_EXIT = 3;\n\n/** What each unread reason means for whoever runs the tally next. */\nconst UNREAD_WHY: Record<UtxoUnreadReason, string> = {\n utxo_cap_unread:\n \"the explorer lists no more than about 500 unspent outputs for one address, and this one has more; tallying again from it is unlikely to help\",\n chain_unread: 'the explorer did not answer; tally again once it answers',\n provider_refused_unread: 'the explorer refused the lookup',\n};\n\n/** The STATE and unread lines for a tally with voters whose coins were not read. */\nexport function unreadLines(result: UnreadResult): string[] {\n const n = result.unread.length;\n const width = Math.max(...result.unread.map((u) => u.voter.length));\n return [\n ` STATE: unread — not counted: ${n} ${n === 1 ? 'voter' : 'voters'} could not be read at block ${result.snapshot_block}`,\n ...result.unread.map(\n (u, i) => ` ${i === 0 ? 'unread: ' : ' '} ${u.voter.padEnd(width)} ${u.reason} ${UNREAD_WHY[u.reason]}`\n ),\n ];\n}\n\nexport interface TallyOptions {\n pollId: string;\n relays?: string[];\n mempoolBase?: string;\n json?: boolean;\n verify?: boolean;\n snapshotBlock?: number;\n}\n\n/** Open a secret ballot's envelope with the revealed key (SPEC §6.4 step 2). */\nexport async function unsealOption(ballot: Ballot, revealSk: string): Promise<string | null> {\n if (!ballot.secret) return null;\n const result = await unseal({\n envelope: ballot.secret.envelope as unknown as Parameters<typeof unseal>[0]['envelope'],\n device: { device_id: 'reveal', secretKey: hexDecode(revealSk) },\n skipSenderVerification: true,\n });\n return utf8Decode(result.payload);\n}\n\nexport interface ComputeTallyInput {\n poll: Poll;\n ballots: Ballot[];\n /** A reveal that already passed verifyReveal; null when none exists. */\n reveal: Reveal | null;\n utxosAt: UtxoLookup;\n /** A clock-dated poll's snapshot height; an anchored poll's \"deadline\" snapshot is H_close. */\n snapshotBlock?: number;\n /** An anchored poll's tip, H_close and anchor heights (SPEC §4.6). */\n chain?: AnchoredChain | null;\n /** null skips every signature check (--no-verify). */\n verify: SignatureVerifier | null;\n}\n\n/**\n * vote-core's tally with this CLI's unsealer. vote-core calls `unseal` on each\n * voter's verified, tiebroken ballot only, so a ballot that fails its\n * signature never supplies a voter's option.\n */\nexport function computeTally(input: ComputeTallyInput): Promise<TallyResult> {\n const { poll, reveal } = input;\n return tally({\n poll,\n ballots: input.ballots,\n utxosAt: input.utxosAt,\n ...(input.snapshotBlock !== undefined ? { snapshotBlock: input.snapshotBlock } : {}),\n ...(input.chain\n ? {\n tipHeight: input.chain.tipHeight,\n closeHeight: input.chain.closeHeight,\n anchorHeight: input.chain.anchorHeight,\n }\n : {}),\n ...(input.verify ? { verify: input.verify } : { skipSignatures: true }),\n ...(poll.mode === 'secret' && reveal\n ? { unseal: (b: Ballot) => unsealOption(b, reveal.reveal_sk) }\n : {}),\n });\n}\n\n/**\n * The snapshot height, resolved by vote-core per SPEC §3 (greatest\n * median_time_past ≤ deadline, ≥ 6 confirmations) — the same code the web\n * tallier runs. `--snapshot` overrides a deadline poll explicitly.\n */\nexport async function resolveSnapshot(\n poll: Poll,\n opts: Pick<TallyOptions, 'mempoolBase' | 'snapshotBlock'>,\n fetchImpl?: typeof fetch\n): Promise<number> {\n if (poll.snapshot_block === 'deadline' && opts.snapshotBlock !== undefined) {\n return opts.snapshotBlock;\n }\n const r = await resolvePollSnapshot(\n poll,\n mempoolBlockTimeSource({\n ...(opts.mempoolBase ? { base: opts.mempoolBase } : {}),\n ...(fetchImpl ? { fetch: fetchImpl } : {}),\n })\n );\n if (!r.ok) throw new Error(`snapshot not tallyable yet (${r.code}): ${r.reason}`);\n return r.height;\n}\n\n/** What a tally run did not check, so its output can say so. */\nexport function skippedChecks(\n poll: Pick<Poll, 'snapshot_block'>,\n opts: Pick<TallyOptions, 'verify' | 'snapshotBlock'>\n): string[] {\n const skipped: string[] = [];\n if (opts.verify === false) skipped.push('signatures (--no-verify)');\n if (poll.snapshot_block === 'deadline' && opts.snapshotBlock !== undefined) {\n skipped.push('snapshot resolution and confirmations (--snapshot)');\n }\n return skipped;\n}\n\n/** The STATE line for a counted poll; a provisional count says what it still waits on. */\nexport function stateLine(result: TalliedResult): string {\n if (result.state === 'tallied') return 'tallied';\n const waiting = result.unanchored ?? 0;\n if (result.counted.length === 0) return 'provisional — not final; no ballot counted yet';\n return waiting > 0\n ? `provisional — not final; ${waiting} counted ballot(s) not anchored in a block yet`\n : 'provisional — not final; every counted ballot is anchored';\n}\n\nexport async function runTally(opts: TallyOptions): Promise<void> {\n const { pollId: pid } = opts;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const verify = opts.verify !== false ? bip322Verify : null;\n // The ballot read starts with the poll's; the reveal is read only once the\n // poll is known to be secret, so junk under a public poll's reveal tag\n // cannot hold its count up.\n const ballotRead = fetchBallotEvents(pid, relays);\n ballotRead.catch(() => undefined);\n const selected = await findPoll(await fetchPollEvents(pid, relays), pid, verify ?? bip322Verify);\n if (verify && !selected.signatureValid) {\n throw new Error('poll signature does not verify against its creator (SPEC §10.1)');\n }\n const poll = selected.poll;\n const [ballotFetch, revealFetch] = await Promise.all([\n ballotRead,\n poll.mode === 'secret' ? fetchRevealEvents(pid, relays) : null,\n ]);\n\n // Every copy: the tally verifies each before it picks one ballot per voter.\n // A clock-dated poll is not counted from a ballot read cut short or below\n // the floor; an anchored one is counted, and held provisional (anchoredChain).\n const ballots = ballotCopiesFromEvents(ballotsToCount(ballotFetch, isAnchoredPoll(poll)), pid);\n\n // An anchored poll is counted against the chain (SPEC §4.6): the tip,\n // H_close, and each ballot's anchor from every stamp the relays hold.\n const chain = await anchoredChain(poll, ballots.map(ballotId), {\n ballotRelays: ballotFetch.relays,\n relays,\n ...(opts.mempoolBase ? { mempoolBase: opts.mempoolBase } : {}),\n });\n\n // Only a reveal signed by the creator, once the poll has closed, opens ballots.\n const reveal: Reveal | null = revealFetch\n ? await selectReveal(revealFetch.events, poll, bip322Verify, chain ?? undefined)\n : null;\n // No reveal found is \"awaiting reveal\" only on a reveal read that finished:\n // no relay cut off, and the floor answered in full. Otherwise it can't count.\n if (revealFetch && !reveal) requireComplete(revealFetch, 'reveal');\n\n const source = mempoolSource(opts.mempoolBase);\n const utxosAt = buildLookup(source);\n // An anchored poll's tally checks its own snapshot against the tip.\n const snapshot = chain ? undefined : await resolveSnapshot(poll, opts);\n\n // Pass `snapshotBlock` rather than mutating poll.snapshot_block: the\n // poll's canonical bytes (and therefore pollId) include snapshot_block\n // verbatim, and mutating it would invalidate every ballot's poll_id.\n const result = await computeTally({\n poll,\n ballots,\n reveal,\n utxosAt,\n ...(snapshot !== undefined ? { snapshotBlock: snapshot } : {}),\n chain,\n verify,\n });\n\n const skipped = skippedChecks(poll, opts);\n const output = {\n poll_id: pid,\n question: poll.question,\n creator: poll.creator,\n mode: poll.mode,\n weight_mode: poll.weight_mode,\n deadline: poll.deadline,\n ballot_count: new Set(ballots.map((b) => ballotId(b))).size,\n reveal_present: reveal != null,\n skipped,\n ...(chain?.finalBlocked ? { not_final_because: chain.finalBlocked } : {}),\n ...result,\n };\n\n // No count: who was not read and why (SPEC §8), and an exit code of its own.\n if (result.state === 'unread') process.exitCode = UNREAD_EXIT;\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n return;\n }\n\n // Human-readable\n const w = (s: string) => process.stdout.write(s);\n w(`\\n poll: ${poll.question}\\n`);\n w(` poll_id: ${pid}\\n`);\n w(` creator: ${poll.creator}\\n`);\n w(` mode: ${poll.mode}${poll.mode === 'secret' ? (reveal ? ' (revealed)' : ' (awaiting reveal)') : ''}\\n`);\n w(` weight: ${poll.weight_mode}\\n`);\n w(` threshold: ${poll.min_sats} sat / ${poll.min_days} d\\n`);\n w(` deadline: ${poll.deadline}\\n`);\n if (snapshot !== undefined) w(` snapshot: ${snapshot}\\n`);\n if (chain) {\n const close = chain.closeHeight;\n w(` timing: anchored in Bitcoin blocks (SPEC §4.6); tip ${chain.chainTip}\\n`);\n if (chain.finalBlocked) w(` ! not final: ${chain.finalBlocked}\\n`);\n w(\n close === null\n ? ` close: no block at the deadline yet\\n`\n : ` close: H_close ${close}; anchors count up to ${lastAnchorHeight(close)}; final at ${lastAnchorHeight(close) + ANCHOR_FINAL_CONFIRMATIONS}\\n`\n );\n } else {\n w(` timing: dated by each voter's own clock (deadline before 2026-11-15)\\n`);\n }\n w(` ballots: ${new Set(ballots.map((b) => ballotId(b))).size}\\n`);\n for (const what of skipped) w(` ! not checked: ${what}\\n`);\n w(`\\n`);\n\n if (result.state === 'awaiting_reveal') {\n w(` STATE: awaiting reveal — secret-mode poll, no reveal accepted yet\\n\\n`);\n return;\n }\n if (result.state === 'deferred') {\n w(` STATE: deferred (${result.code}) — the snapshot block is not known yet or has fewer than 6 confirmations\\n\\n`);\n return;\n }\n if (result.state === 'unread') {\n w(unreadLines(result).join('\\n') + '\\n\\n');\n return;\n }\n\n w(` STATE: ${stateLine(result)}\\n`);\n w(` counted: ${result.counted.length} ballot(s)\\n`);\n w(` turnout: ${result.turnout.voters} voters, weight ${result.turnout.weight.toLocaleString()}\\n\\n`);\n\n // Sort options by poll.options order\n const total = result.turnout.weight;\n const maxLabel = Math.max(...poll.options.map((o) => o.label.length));\n for (const opt of poll.options) {\n const wgt = result.tallies[opt.id] ?? 0;\n const pct = total > 0 ? (wgt / total) * 100 : 0;\n const barLen = total > 0 ? Math.round((wgt / total) * 30) : 0;\n const bar = '█'.repeat(barLen) + '·'.repeat(30 - barLen);\n w(` ${opt.label.padEnd(maxLabel)} ${bar} ${wgt.toLocaleString().padStart(12)} ${pct.toFixed(1).padStart(5)}%\\n`);\n }\n w(`\\n`);\n}\n","// oc-vote verify <poll_id> — fetch poll + ballots, verify every BIP-322 signature, report.\n\nimport { ballotCopiesFromEvents, ballotVerdicts } from '../ballots.js';\nimport { bip322Verify } from '../bip322.js';\nimport { DEFAULT_RELAYS, fetchBallotEvents, fetchPollEvents } from '../nostr.js';\nimport { findPoll, requireComplete } from '../select.js';\n\nexport interface VerifyOptions {\n pollId: string;\n relays?: string[];\n json?: boolean;\n}\n\nexport async function runVerify(opts: VerifyOptions): Promise<void> {\n const pid = opts.pollId;\n if (!/^[0-9a-f]{64}$/.test(pid)) {\n throw new Error('poll id must be 64 hex chars');\n }\n const relays = opts.relays ?? DEFAULT_RELAYS;\n\n const [pollFetch, ballotFetch] = await Promise.all([\n fetchPollEvents(pid, relays),\n fetchBallotEvents(pid, relays),\n ]);\n const selected = await findPoll(pollFetch, pid, bip322Verify);\n const ballotEvents = requireComplete(ballotFetch, 'ballot');\n\n const pollSigOk = selected.signatureValid;\n\n // One verdict per ballot, from every copy the relays hold: valid when any copy verifies.\n const ballotResults = ballotVerdicts(ballotCopiesFromEvents(ballotEvents, pid));\n const ballots = ballotResults;\n\n const okCount = ballotResults.filter((r) => r.ok).length;\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n {\n poll_id: pid,\n poll_signature_valid: pollSigOk,\n ballot_count: ballots.length,\n ballots_valid: okCount,\n ballots_invalid: ballots.length - okCount,\n ballot_details: ballotResults,\n },\n null,\n 2\n ) + '\\n'\n );\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w(`\\n poll_id: ${pid}\\n`);\n w(` poll signature: ${pollSigOk ? 'VALID ✓' : 'INVALID ✗'}\\n`);\n w(` ballots observed: ${ballots.length}\\n`);\n w(` ballots valid: ${okCount}\\n`);\n w(` ballots invalid: ${ballots.length - okCount}\\n\\n`);\n if (ballots.length - okCount > 0) {\n w(` invalid ballots:\\n`);\n for (const r of ballotResults.filter((x) => !x.ok)) {\n w(` - ${r.voter} · ${r.ballot_id}\\n`);\n }\n w(`\\n`);\n }\n}\n","// oc-vote vote — build + sign + publish a ballot, then ask each relay alone for\n// it back. It is in only once min(2, asked) relays serve a valid copy (quorum.ts);\n// below that it says so and exits 2, and `oc-vote republish` sends the same\n// signed event again. An anchored poll's ballot stamp is read back the same way.\n//\n// Public mode: just --poll --voter --option --sig.\n// Secret mode: additionally --reveal-pk (from the poll); we seal the option\n// id into an oc-lock envelope + commit it per SPEC §4.4.\n\nimport { seal } from '@orangecheck/lock-core';\nimport { utf8Encode } from '@orangecheck/lock-crypto';\nimport { ballotId, commit, isAnchoredPoll } from '@orangecheck/vote-core';\nimport type { Ballot } from '@orangecheck/vote-core';\n\nimport { bip322Verify } from '../bip322.js';\n\nimport { stampBallot } from '../anchors.js';\nimport { buildBallotEvent, buildStampEvent } from '../events.js';\nimport { DEFAULT_RELAYS, fetchPollEvents } from '../nostr.js';\nimport { castBallot, castEvent, relaysServingStamp } from '../quorum.js';\nimport { report, type Standing } from '../report.js';\nimport { findPoll } from '../select.js';\nimport { promptForSignature } from '../sig.js';\n\nexport interface VoteOptions {\n pollId: string;\n voter: string;\n option: string;\n sig?: string;\n relays?: string[];\n dryRun?: boolean;\n json?: boolean;\n}\n\nexport async function runVote(opts: VoteOptions): Promise<void> {\n if (!/^[0-9a-f]{64}$/.test(opts.pollId)) {\n throw new Error('poll id must be 64 hex chars');\n }\n\n // Fetch the poll from relays so we know the mode + options + reveal_pk.\n const fetched = await fetchPollEvents(opts.pollId, opts.relays ?? DEFAULT_RELAYS);\n const selected = await findPoll(fetched, opts.pollId, bip322Verify);\n if (!selected.signatureValid) {\n throw new Error('poll signature does not verify against its creator (SPEC §10.1)');\n }\n const poll = selected.poll;\n if (poll.mode === 'public' && !poll.options.some((o) => o.id === opts.option)) {\n throw new Error(`option \"${opts.option}\" not in poll options (${poll.options.map((o) => o.id).join(', ')})`);\n }\n\n let ballotOption: string | null = opts.option;\n let secret: Ballot['secret'] = null;\n\n if (poll.mode === 'secret') {\n if (!poll.reveal_pk) throw new Error('secret-mode poll missing reveal_pk');\n const envelope = await seal({\n payload: utf8Encode(opts.option),\n sender: { address: opts.voter, signMessage: async () => '' },\n recipients: [\n {\n address: `oc-vote:reveal:${opts.pollId}`,\n device_id: 'reveal',\n device_pk: poll.reveal_pk,\n },\n ],\n });\n ballotOption = null;\n secret = {\n envelope: envelope as unknown as Record<string, unknown>,\n commit: commit(opts.pollId, opts.voter, opts.option),\n };\n }\n\n const draft: Ballot = {\n v: 0,\n kind: 'oc-vote/ballot',\n poll_id: opts.pollId,\n voter: opts.voter,\n option: ballotOption,\n attestation_id: null,\n secret,\n created_at: new Date().toISOString().replace(/\\.\\d+Z$/, 'Z'),\n sig: { alg: 'bip322', pubkey: opts.voter, value: '' },\n };\n\n const bid = ballotId(draft);\n\n if (opts.dryRun) {\n process.stdout.write(JSON.stringify({ ballot_id: bid, ballot: draft }, null, 2) + '\\n');\n return;\n }\n\n const sigValue = await promptForSignature(opts.voter, bid, opts.sig);\n draft.sig.value = sigValue;\n\n // Built once: every try, and `oc-vote republish`, sends this same event.\n const pub = buildBallotEvent(draft);\n const relays = opts.relays ?? DEFAULT_RELAYS;\n const serving = await castBallot(pub, draft, [], { relays });\n\n // SPEC §4.6: in an anchored poll the voter's client stamps the ballot it\n // publishes, once a relay serves it back. A final count reads stamps at the\n // read floor, so the stamp is read back the same way as the ballot.\n let stamp: Standing | { error: string } | null = null;\n if (serving.length > 0 && isAnchoredPoll(poll)) {\n try {\n const env = await stampBallot(draft);\n const event = buildStampEvent(env);\n const on = await castEvent(event, [], () => relaysServingStamp(env, { relays }), { relays });\n stamp = { kind: 'stamp', event, relays, serving: on };\n } catch (e) {\n stamp = { error: (e as Error).message };\n }\n }\n\n report({\n id: ['ballot_id', bid],\n heading: [\n ['poll', poll.question],\n ['voter', opts.voter],\n ['option', `${opts.option}${poll.mode === 'secret' ? ' (sealed)' : ''}`],\n ],\n main: { kind: 'ballot', event: pub, relays, serving },\n stamp,\n json: Boolean(opts.json),\n jsonExtra: { ballot: draft },\n });\n}\n","/**\n * @orangecheck/vote-cli — shell interface to OC Vote.\n *\n * read:\n * oc-vote tally <poll_id> run the pure tally function\n * oc-vote verify <poll_id> verify every BIP-322 signature\n * oc-vote show <poll_id> poll metadata + ballot count\n * oc-vote discover list recent polls across relays\n *\n * write (headless — signature via --sig or interactive paste):\n * oc-vote create build + sign + publish a poll\n * oc-vote vote cast a ballot (public or secret)\n * oc-vote republish <file> send a signed poll, ballot, reveal or stamp again\n * oc-vote reveal publish the reveal event\n *\n * utility:\n * oc-vote gen-reveal-key mint a fresh X25519 pair\n *\n * Defaults: nostr-core's DEFAULT_RELAYS + mempool.space for UTXOs.\n * Swap via --relay wss://... (repeatable) and --mempool-base https://...\n */\n\nimport { createRequire } from 'node:module';\n\nimport { Command, Option } from 'commander';\nimport WebSocket from 'ws';\n\nimport { runCreate } from './commands/create.js';\nimport { runDiscover } from './commands/discover.js';\nimport { runGenRevealKey } from './commands/gen-reveal-key.js';\nimport { runRepublish } from './commands/republish.js';\nimport { runReveal } from './commands/reveal.js';\nimport { runShow } from './commands/show.js';\nimport { runTally } from './commands/tally.js';\nimport { runVerify } from './commands/verify.js';\nimport { runVote } from './commands/vote.js';\n\n// nostr-core uses the global WebSocket, which Node only ships from v22.\nif (typeof globalThis.WebSocket === 'undefined') {\n (globalThis as { WebSocket?: unknown }).WebSocket = WebSocket;\n}\n\n// The installed package's own version, so `--version` can't drift from a release.\nconst { version } = createRequire(import.meta.url)('../package.json') as { version: string };\n\nconst program = new Command();\n\nfunction collectRelay(v: string, prev: string[] = []): string[] {\n return [...prev, v];\n}\n\nfunction collectOption(v: string, prev: { id: string; label: string }[] = []) {\n const [id, ...rest] = v.split(':');\n if (!id) throw new Error(`--option requires \"id\" or \"id:label\"`);\n const label = rest.length ? rest.join(':') : id;\n return [...prev, { id, label }];\n}\n\nfunction parseDeadline(raw: string): string {\n const rel = raw.match(/^\\+(\\d+)([dh])$/);\n if (rel) {\n const n = Number.parseInt(rel[1]!, 10);\n const unit = rel[2];\n const ms = (unit === 'd' ? n * 24 : n) * 3600 * 1000;\n const d = new Date(Date.now() + ms);\n return d.toISOString().replace(/\\.\\d+Z$/, 'Z');\n }\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) throw new Error(`invalid deadline: ${raw}`);\n return parsed.toISOString().replace(/\\.\\d+Z$/, 'Z');\n}\n\nfunction parseSnapshot(raw: string): number | 'deadline' {\n if (raw === 'deadline') return 'deadline';\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) throw new Error(`invalid snapshot block: ${raw}`);\n return n;\n}\n\nprogram\n .name('oc-vote')\n .description('OC Vote — sovereign signaling for the open web')\n .version(version);\n\n// ── read ──────────────────────────────────────────────────────────────────\n\nprogram\n .command('tally <poll_id>')\n .description('Fetch the poll + ballots and run the pure tally function')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--mempool-base <url>', 'mempool.space-compatible base URL', 'https://mempool.space/api')\n .option('--snapshot <height>', 'Override snapshot block (integer)')\n .option('--no-verify', 'Skip BIP-322 signature verification')\n .option('--json', 'Emit JSON instead of human-readable output')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runTally({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n mempoolBase: opts.mempoolBase as string,\n json: Boolean(opts.json),\n verify: opts.verify !== false,\n snapshotBlock: opts.snapshot ? Number.parseInt(String(opts.snapshot), 10) : undefined,\n });\n });\n\nprogram\n .command('verify <poll_id>')\n .description('Verify every BIP-322 signature on the poll + its ballots')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runVerify({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('show <poll_id>')\n .description('Print the poll metadata + ballot count without running the tally')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (pollId: string, opts: Record<string, unknown>) => {\n await runShow({\n pollId,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('discover')\n .description('List recent polls across the default relay set')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--limit <n>', 'max polls to return', '30')\n .option('--open-only', 'hide polls whose deadline has passed')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runDiscover({\n limit: Number.parseInt(String(opts.limit ?? '30'), 10),\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n openOnly: Boolean(opts.openOnly),\n });\n });\n\n// ── write ─────────────────────────────────────────────────────────────────\n\nprogram\n .command('create')\n .description(\n 'Build + sign + publish a poll. It is published once 2 relays, each asked alone, serve it back; below that it exits 2 (see republish)'\n )\n .requiredOption('--creator <btc-addr>', 'Bitcoin address of the poll creator')\n .requiredOption('--question <text>', 'poll question')\n .requiredOption(\n '--option <id:label>',\n 'poll option; repeatable; \"id\" or \"id:label\"',\n collectOption,\n [] as { id: string; label: string }[]\n )\n .option('--deadline <iso8601 | +Nd | +Nh>', 'deadline in UTC', '+7d')\n .option('--snapshot <height | deadline>', 'snapshot block', 'deadline')\n .addOption(\n new Option('--weight-mode <mode>', 'weight function')\n .choices(['one_per_address', 'sats', 'sats_days'])\n .default('sats')\n )\n .option('--cap-days <n>', 'age cap in days (required for sats_days)', '180')\n .option('--min-sats <n>', 'minimum sat threshold', '0')\n .option('--min-days <n>', 'minimum UTXO-age threshold', '0')\n .addOption(\n new Option('--tiebreak <mode>', 'per-voter dedup rule')\n .choices(['latest', 'first'])\n .default('latest')\n )\n .addOption(\n new Option('--mode <mode>', 'ballot mode')\n .choices(['public', 'secret'])\n .default('public')\n )\n .option('--notes <text>', 'free-form notes (≤ 2048 bytes)')\n .option('--sig <base64>', 'BIP-322 signature of poll_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--dry-run', 'print canonical + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n const mode = opts.mode as 'public' | 'secret';\n const weightMode = opts.weightMode as 'one_per_address' | 'sats' | 'sats_days';\n await runCreate({\n creator: String(opts.creator),\n question: String(opts.question),\n options: opts.option as { id: string; label: string }[],\n deadline: parseDeadline(String(opts.deadline)),\n snapshotBlock: parseSnapshot(String(opts.snapshot)),\n weightMode,\n capDays: weightMode === 'sats_days' ? Number.parseInt(String(opts.capDays), 10) : undefined,\n minSats: Number.parseInt(String(opts.minSats), 10),\n minDays: Number.parseInt(String(opts.minDays), 10),\n tiebreak: opts.tiebreak as 'latest' | 'first',\n mode,\n notes: opts.notes ? String(opts.notes) : undefined,\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('vote')\n .description(\n 'Cast a ballot on a poll. It is in once 2 relays, each asked alone, serve it back; below that it exits 2 (see republish)'\n )\n .requiredOption('--poll <poll_id>', '64-hex poll id')\n .requiredOption('--voter <btc-addr>', 'voter Bitcoin address')\n .requiredOption('--option <id>', 'chosen option id')\n .option('--sig <base64>', 'BIP-322 signature of ballot_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--dry-run', 'print canonical + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runVote({\n pollId: String(opts.poll),\n voter: String(opts.voter),\n option: String(opts.option),\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('republish <file>')\n .description(\n 'Send a signed poll, ballot, reveal or ballot stamp again, as it is (from --json output, or an event: line), and ask each relay for it back'\n )\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--json', 'Emit JSON')\n .action(async (file: string, opts: Record<string, unknown>) => {\n await runRepublish({\n file,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n json: Boolean(opts.json),\n });\n });\n\nprogram\n .command('reveal')\n .description(\n 'Publish the reveal for a secret-mode poll, or send the one already signed again. It is published once 2 relays serve it back; below that it exits 2'\n )\n .requiredOption('--poll <poll_id>', '64-hex poll id')\n .requiredOption('--reveal-sk <hex>', '64-hex X25519 secret key')\n .requiredOption('--creator <btc-addr>', 'poll creator address (must match the poll)')\n .option('--sig <base64>', 'BIP-322 signature of reveal_id; prompts if omitted')\n .option('--relay <url>', 'Nostr relay (repeatable)', collectRelay, [] as string[])\n .option('--force', 'publish before the deadline, or sign a new reveal when one is already on the relays')\n .option('--dry-run', 'print reveal + id; do not sign or publish')\n .option('--json', 'Emit JSON')\n .action(async (opts: Record<string, unknown>) => {\n await runReveal({\n pollId: String(opts.poll),\n revealSk: String(opts.revealSk),\n creator: String(opts.creator),\n sig: opts.sig ? String(opts.sig) : undefined,\n relays: (opts.relay as string[] | undefined)?.length ? (opts.relay as string[]) : undefined,\n force: Boolean(opts.force),\n dryRun: Boolean(opts.dryRun),\n json: Boolean(opts.json),\n });\n });\n\n// ── utility ───────────────────────────────────────────────────────────────\n\nprogram\n .command('gen-reveal-key')\n .description('Mint a fresh X25519 keypair for secret-mode polls')\n .option('--json', 'Emit JSON')\n .action((opts: Record<string, unknown>) => {\n runGenRevealKey({ json: Boolean(opts.json) });\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`oc-vote: ${msg}\\n`);\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orangecheck/vote-cli",
3
- "version": "0.7.6",
3
+ "version": "0.8.0",
4
4
  "description": "Command-line tool for OC Vote \u2014 tally, verify, and inspect polls from your shell.",
5
5
  "keywords": [
6
6
  "oc-vote",
@@ -44,7 +44,7 @@
44
44
  "@noble/curves": "^1.6.0",
45
45
  "@noble/hashes": "^1.5.0",
46
46
  "@orangecheck/bip322": "^1.1.2",
47
- "@orangecheck/vote-core": "^2.1.0",
47
+ "@orangecheck/vote-core": "^2.2.0",
48
48
  "@orangecheck/lock-core": "^1.2.0",
49
49
  "@orangecheck/lock-crypto": "^0.1.0",
50
50
  "@orangecheck/nostr-core": "^0.8.0",