import type { AnchorDisplay } from './receipt-view.js'; export interface AnchorPayload { hash: string; seq: number; keyId: string; } export interface AnchorResult { log: string; entryId: string; loggedAt: string; inclusionProof?: unknown; /** OTS / pluggable extras */ state?: 'pending' | 'bitcoin'; otsBase64?: string; bitcoinBlock?: number | null; } export interface AnchorSink { submit(payload: AnchorPayload): Promise; } /** Receipt.anchor reference shape (hash-exterior; may be filled after signing). */ export interface ReceiptAnchorRef { log: string; ref: string; state: 'pending' | 'bitcoin'; } export interface AnchorSidecarRecord { seq: number; hash: string; log: string; ots: string; state: 'pending' | 'bitcoin'; submittedAt: string; upgradedAt: string | null; bitcoinBlock: number | null; } /** * Strip `sha256:` prefix → raw 32-byte Buffer for OpenTimestamps. * Trap: our chain.hash is prefixed; OTS wants bare digest bytes. */ export declare function hashPrefixToBuffer(hash: string): Buffer; export declare class MemoryAnchorSink implements AnchorSink { readonly entries: Array; readonly calls: AnchorPayload[]; submit(payload: AnchorPayload): Promise; } /** Real OpenTimestamps calendar stamp. Only the 32-byte hash is sent. */ export declare class OpenTimestampsSink implements AnchorSink { private readonly timeoutMs; private readonly stamp; constructor(timeoutMs?: number, stamp?: (digest: Buffer) => Promise); submit(payload: AnchorPayload): Promise; } /** @deprecated Rekor rejected for plain Ed25519 / content upload — kept only so AnchorSink stays pluggable. */ export declare class RekorAnchorSink implements AnchorSink { private readonly url; constructor(url?: string); submit(payload: AnchorPayload): Promise; } export declare function createAnchorSinkFromEnv(): AnchorSink | null; export declare function anchorsPathForSink(sinkPath: string): string; export declare function appendAnchorSidecar(path: string, record: AnchorSidecarRecord): void; export declare function readAnchorSidecar(path: string): AnchorSidecarRecord[]; /** * Offline sidecar classification for the receipt page. * Never trusts receipt.anchor.state. Network is not used. */ export declare function classifyReceiptAnchor(receipt: { anchor: ReceiptAnchorRef | null; chain: { hash: string; }; }, sidecarPath?: string | null): 'none' | AnchorDisplay; export declare function findAnchorByRef(path: string, ref: string): AnchorSidecarRecord | null; export declare function rewriteAnchorSidecar(path: string, rows: AnchorSidecarRecord[]): void; export declare function resultToSidecarRecord(payload: AnchorPayload, result: AnchorResult): AnchorSidecarRecord; export declare function resultToReceiptAnchor(payload: AnchorPayload, result: AnchorResult): ReceiptAnchorRef; export declare class AnchorScheduler { private readonly sink; private sinceLast; private lastAt; private consecutiveFailures; private readonly everyN; private readonly everyMs; private readonly failWarnAfter; constructor(sink: AnchorSink, opts?: { everyN?: number; everyMs?: number; failWarnAfter?: number; }); /** Non-blocking: returns anchor result or null. Never throws to caller. */ maybeAnchor(payload: AnchorPayload): Promise; } /** * Upgrade a pending OTS proof toward Bitcoin attestation. * Returns updated record fields or null if unchanged / still pending. */ export declare function upgradeOtsProof(otsBase64: string, _hash?: string): Promise<{ otsBase64: string; state: 'pending' | 'bitcoin'; bitcoinBlock: number | null; } | null>; /** Verify an OTS proof against a chain-head hash. */ export declare function verifyOtsAgainstHash(otsBase64: string, hash: string): Promise<{ ok: boolean; pending: boolean; unknown?: boolean; detail?: string; }>; //# sourceMappingURL=anchor.d.ts.map