{"version":3,"sources":["../src/types.ts","../src/canonical.ts","../src/delegation.ts","../src/pledge.ts","../src/outcome.ts","../src/abandonment.ts","../src/state.ts","../src/bond.ts","../src/resolution.ts"],"names":["r","sha256","err"],"mappings":"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","file":"index.mjs","sourcesContent":["// Wire types for OC Pledge v0.1 envelopes. SPEC.md §3, §4, §5.\n\nexport const ENVELOPE_VERSION = 1 as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Resolution mechanism — the closed set of seven, plus refusal of self_proof.\n// SPEC §3.4.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ResolutionMechanism =\n    | 'chain_state'\n    | 'counterparty_signs'\n    | 'nostr_event_exists'\n    | 'stamp_published'\n    | 'http_get_hash'\n    | 'dns_record'\n    | 'vote_resolves';\n\nexport const RESOLUTION_MECHANISMS: readonly ResolutionMechanism[] = Object.freeze([\n    'chain_state',\n    'counterparty_signs',\n    'nostr_event_exists',\n    'stamp_published',\n    'http_get_hash',\n    'dns_record',\n    'vote_resolves',\n]);\n\nexport type DisputeMechanism = 'vote_resolves' | 'named_oracle';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pledge envelope (SPEC §3.3)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PledgeResolution {\n    mechanism: ResolutionMechanism;\n    /** Single-line query string in the named mechanism's grammar (≤ 1024 UTF-8 bytes). */\n    query: string;\n}\n\n/** `resolves_at` is exactly one of `time` or `block`. SPEC §3.1. */\nexport type PledgeResolvesAt = { time: string } | { block: number };\n\nexport interface PledgeBond {\n    /** SHA-256 hex of an OrangeCheck attestation canonical message. */\n    attestation_id: string;\n    /** Non-negative integer. */\n    min_sats: number;\n    /** Non-negative integer. */\n    min_days: number;\n}\n\nexport interface PledgeDispute {\n    mechanism: DisputeMechanism | null;\n    /** Single-line params string in the named dispute mechanism's grammar, or null. */\n    params: string | null;\n}\n\nexport interface PledgeSwearer {\n    address: string;\n    alg: 'bip322';\n}\n\nexport interface PledgeSignature {\n    alg: 'bip322';\n    /**\n     * MUST equal swearer.address when via_delegation is absent;\n     * MUST equal agent_address when via_delegation is present.\n     */\n    pubkey: string;\n    /** base64 BIP-322 signature over the lowercase-hex pledge id. */\n    value: string;\n}\n\nexport interface PledgeEnvelope {\n    v: typeof ENVELOPE_VERSION;\n    kind: 'pledge';\n    /** 64-hex of sha256(canonical_message). */\n    id: string;\n\n    swearer: PledgeSwearer;\n    proposition: string;\n    resolution: PledgeResolution;\n    resolves_at: PledgeResolvesAt;\n    expires_at: string;\n    bond: PledgeBond;\n    counterparty: string | null;\n    dispute: PledgeDispute;\n    /** Fixed at \"breach_recorded\" in v0.1. */\n    remediation: 'breach_recorded';\n    sworn_at: string;\n    /** 32 lowercase hex chars (16 random bytes). MUST be non-empty. */\n    nonce: string;\n\n    /** Optional — present iff the pledge was signed by an agent under OC Agent delegation. */\n    via_delegation?: string;\n    /** Optional — Bitcoin address of the agent. Required iff via_delegation is present. */\n    agent_address?: string;\n\n    sig: PledgeSignature;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Outcome envelope (SPEC §4.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type OutcomeKind = 'kept' | 'broken' | 'expired_unresolved' | 'disputed';\n\nexport interface OutcomeEvidence {\n    /** Same mechanism string as the referenced pledge's resolution.mechanism. */\n    mechanism: ResolutionMechanism;\n    /** Single-line canonical result string. */\n    result: string;\n    /** Single-line canonical witness string (mechanism-specific shape — see SPEC §4.1). */\n    witness: string;\n}\n\nexport interface OutcomeSignature {\n    alg: 'bip322';\n    /** Equals the resolved_by address. */\n    pubkey: string;\n    /** base64 BIP-322 over the lowercase-hex outcome id. */\n    value: string;\n}\n\nexport interface OutcomeEnvelope {\n    v: typeof ENVELOPE_VERSION;\n    kind: 'pledge-outcome';\n    /** 64-hex of sha256(canonical_message). */\n    id: string;\n\n    pledge_id: string;\n    outcome: OutcomeKind;\n    resolved_at: string;\n    /**\n     * Either a Bitcoin address (when the resolver is a real party — i.e.\n     * counterparty_signs) or the literal string \"deterministic\" for any of\n     * the deterministic mechanisms.\n     */\n    resolved_by: string;\n\n    evidence: OutcomeEvidence;\n    dispute_window_ends_at: string;\n\n    /**\n     * null for deterministic mechanisms (resolved_by === \"deterministic\");\n     * required for counterparty_signs (resolved_by === counterparty.address).\n     */\n    sig: OutcomeSignature | null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abandonment envelope (SPEC §5.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AbandonmentSignature {\n    alg: 'bip322';\n    /** MUST equal the original pledge's swearer.address. Agents MUST NOT sign abandonments in v0.1. */\n    pubkey: string;\n    /** base64 BIP-322 over the lowercase-hex abandonment id. */\n    value: string;\n}\n\nexport interface AbandonmentEnvelope {\n    v: typeof ENVELOPE_VERSION;\n    kind: 'pledge-abandonment';\n    /** 64-hex of sha256(canonical_message). */\n    id: string;\n\n    pledge_id: string;\n    abandoned_at: string;\n    /** Single-line UTF-8 string, ≤ 280 bytes. Informational only. */\n    reason: string;\n\n    sig: AbandonmentSignature;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Canonical-message inputs — exact field set covered by the BIP-322 signature.\n// `via_delegation` and `agent_address` are NOT in the canonical message\n// (SPEC §3.1) — they're envelope-only claims the verifier reconciles via the\n// OC Agent delegation registry.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PledgeCanonicalInput {\n    swearer: string;\n    proposition: string;\n    resolution: PledgeResolution;\n    resolves_at: PledgeResolvesAt;\n    expires_at: string;\n    bond: PledgeBond;\n    counterparty: string | null;\n    dispute: PledgeDispute;\n    remediation: 'breach_recorded';\n    sworn_at: string;\n    nonce: string;\n}\n\nexport interface OutcomeCanonicalInput {\n    pledge_id: string;\n    outcome: OutcomeKind;\n    resolved_at: string;\n    resolved_by: string;\n    evidence: OutcomeEvidence;\n    dispute_window_ends_at: string;\n}\n\nexport interface AbandonmentCanonicalInput {\n    pledge_id: string;\n    abandoned_at: string;\n    reason: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Create-side inputs — what callers pass to createPledge / createOutcome /\n// createAbandonment. The SDK fills sig.value from the supplied signer adapter\n// and computes the id.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A signer adapter — the caller wires their wallet of choice. Returns a\n * base64 BIP-322 signature over the UTF-8 bytes of the supplied message.\n * `address` is the Bitcoin address the wallet signs for.\n */\nexport interface Bip322Signer {\n    address: string;\n    signMessage: (msg: string) => Promise<string>;\n}\n\nexport interface CreatePledgeInput extends Omit<PledgeCanonicalInput, 'sworn_at' | 'nonce' | 'remediation'> {\n    /** Defaults to \"now\" (truncated to seconds, ISO 8601 UTC, Z-terminated). */\n    swornAt?: Date | string;\n    /**\n     * 32 lowercase hex chars (16 random bytes). If omitted, a fresh random\n     * nonce is generated via crypto.getRandomValues. Pass an explicit value\n     * for test-vector reproduction.\n     */\n    nonce?: string;\n    /** Defaults to \"breach_recorded\" (the only legal value in v0.1). */\n    remediation?: 'breach_recorded';\n    swearerSigner: Bip322Signer;\n    /**\n     * If present, pledge is signed by this agent under an OC Agent delegation.\n     * `via_delegation` (the delegation id) and `agent_address` (the agent's\n     * address) appear in the envelope but are NOT in the canonical message.\n     */\n    viaDelegation?: { delegation_id: string; agent_signer: Bip322Signer };\n}\n\nexport interface CreateOutcomeInput extends OutcomeCanonicalInput {\n    /**\n     * Required when resolved_by !== \"deterministic\" (i.e. counterparty_signs).\n     * For deterministic mechanisms, omit and the SDK leaves sig = null.\n     */\n    signer?: Bip322Signer;\n}\n\nexport interface CreateAbandonmentInput extends AbandonmentCanonicalInput {\n    swearerSigner: Bip322Signer;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Verify-side inputs and results.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Caller-supplied BIP-322 verifier. Returns true iff the signature verifies\n * under the named address over the UTF-8 bytes of `msg`.\n */\nexport type VerifyBip322 = (\n    msg: string,\n    signatureB64: string,\n    address: string,\n) => Promise<boolean>;\n\nexport interface VerifyPledgeInput {\n    envelope: PledgeEnvelope;\n    /** Optional — omit to skip BIP-322 verification (e.g. for test vectors with placeholder sigs). */\n    verifyBip322?: VerifyBip322;\n    /** Default false. Set true to bypass BIP-322 entirely. */\n    skipSignatureVerification?: boolean;\n    /**\n     * Optional — when present AND envelope.via_delegation is set, verifyPledge\n     * runs SPEC §7.3 steps 1–5: resolve the delegation, confirm\n     * principal == swearer, agent == agent_address, expires_at > sworn_at,\n     * and that scopes contain a `pledge:create(...)` whose constraints fit\n     * the pledge's bond / mechanism / counterparty.\n     *\n     * Without this hook, agent-delegated pledges still verify at the\n     * envelope-shape + BIP-322 layer (§7.3 step 6), but the §7.3 1–5 chain\n     * is skipped. Surface a delegationLookup adapter (e.g. one that uses\n     * `@orangecheck/agent-core`'s `verifyDelegation`) for full scope\n     * enforcement.\n     */\n    delegationLookup?: DelegationLookup;\n}\n\n/**\n * Caller-supplied delegation resolver. Returns the resolved delegation\n * fields (principal, agent, scope strings, expires_at) or null if the\n * delegation cannot be resolved or its signature does not verify.\n *\n * The adapter is responsible for fetching the delegation envelope from\n * wherever it lives (typically Nostr kind 30083 with d-tag\n * `oc-agent-del:<delegation_id>`) and running OC Agent's full\n * verifyDelegation check before returning the typed shape. pledge-core\n * trusts the adapter's output for the §7.3 1–5 logic.\n */\nexport type DelegationLookup = (\n    delegationId: string,\n    nowIso: string,\n) => Promise<DelegationLookupResult | null>;\n\nexport interface DelegationLookupResult {\n    /** delegation.principal_address */\n    principal: string;\n    /** delegation.agent_address */\n    agent: string;\n    /**\n     * Raw scope strings as registered in the delegation (e.g.\n     * `[\"pledge:create(max_bond_sats=2000000)\", \"stamp:sign(mime=*)\"]`).\n     * pledge-core scans for an entry whose product:verb is `pledge:create`.\n     */\n    scopes: string[];\n    /** delegation.expires_at, ISO 8601 UTC. */\n    expires_at: string;\n}\n\nexport interface VerifyOutcomeInput {\n    envelope: OutcomeEnvelope;\n    /**\n     * Required when the outcome envelope's mechanism requires a signature\n     * (counterparty_signs). For deterministic outcomes, sig === null and\n     * BIP-322 is not consulted.\n     */\n    verifyBip322?: VerifyBip322;\n    skipSignatureVerification?: boolean;\n}\n\nexport interface VerifyAbandonmentInput {\n    envelope: AbandonmentEnvelope;\n    verifyBip322?: VerifyBip322;\n    skipSignatureVerification?: boolean;\n}\n\nexport type PledgeErrorCode =\n    | 'E_UNSUPPORTED_VERSION'\n    | 'E_PLEDGE_MALFORMED'\n    | 'E_PLEDGE_BAD_ID'\n    | 'E_PLEDGE_BAD_SIG'\n    | 'E_RESOLUTION_UNKNOWN'\n    | 'E_RESOLUTION_NONDETERMINISTIC'\n    | 'E_BOND_NOT_FOUND'\n    | 'E_BOND_ADDRESS_MISMATCH'\n    | 'E_BOND_SPENT'\n    | 'E_BOND_INSUFFICIENT_SATS'\n    | 'E_BOND_INSUFFICIENT_DAYS'\n    | 'E_OUTCOME_MALFORMED'\n    | 'E_OUTCOME_BAD_ID'\n    | 'E_OUTCOME_BAD_SIG'\n    | 'E_OUTCOME_EVIDENCE_MISMATCH'\n    | 'E_OUTCOME_RESOLVER_UNAUTHORIZED'\n    | 'E_ABANDONMENT_MALFORMED'\n    | 'E_ABANDONMENT_BAD_ID'\n    | 'E_ABANDONMENT_BAD_SIG'\n    | 'E_DELEGATION_NOT_FOUND'\n    | 'E_DELEGATION_SCOPE_VIOLATED'\n    | 'E_DELEGATION_EXPIRED';\n\nexport interface VerifyPledgeOk {\n    ok: true;\n    envelope: PledgeEnvelope;\n    canonicalMessage: string;\n    id: string;\n}\n\nexport interface VerifyOutcomeOk {\n    ok: true;\n    envelope: OutcomeEnvelope;\n    canonicalMessage: string;\n    id: string;\n}\n\nexport interface VerifyAbandonmentOk {\n    ok: true;\n    envelope: AbandonmentEnvelope;\n    canonicalMessage: string;\n    id: string;\n}\n\nexport interface VerifyErr {\n    ok: false;\n    code: PledgeErrorCode;\n    message: string;\n}\n\nexport type VerifyPledgeResult = VerifyPledgeOk | VerifyErr;\nexport type VerifyOutcomeResult = VerifyOutcomeOk | VerifyErr;\nexport type VerifyAbandonmentResult = VerifyAbandonmentOk | VerifyErr;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// State machine (SPEC §4.4)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type PledgeState =\n    | 'pending'\n    | 'resolvable'\n    | 'kept'\n    | 'broken'\n    | 'disputed'\n    | 'expired_unresolved';\n\nexport interface ClassifyStateInput {\n    pledge: PledgeEnvelope;\n    outcome: OutcomeEnvelope | null;\n    abandonment: AbandonmentEnvelope | null;\n    /** ISO 8601 UTC. */\n    now: string;\n    /**\n     * Optional — block-height resolutions need a wall-clock timestamp for the\n     * resolves_at.block. If the block isn't yet mined or no chain state is\n     * supplied, the SDK treats resolves_at as +infinity.\n     */\n    chain?: {\n        /** Highest seen block height. */\n        tip_height: number;\n        /** Wall-clock ISO 8601 UTC of `tip_height`. */\n        tip_time: string;\n        /** Optional override mapping a specific block to its mined-time. */\n        blockTimes?: Record<number, string>;\n    };\n    /**\n     * Optional list of additional outcome envelopes from authorized resolvers\n     * (e.g. swearer + counterparty in a bilateral pledge). Used to detect\n     * contradictory outcomes → `disputed`.\n     */\n    contradictoryOutcomes?: OutcomeEnvelope[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bond verification (SPEC §8) — the SDK ships the algorithm; the chain\n// accessor is injected by the caller.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AttestationLookupResult {\n    /**\n     * Bitcoin address the attestation was signed by — the OrangeCheck\n     * attestation's canonical-message `address` field.\n     */\n    address: string;\n    /**\n     * Sats currently bonded by the named UTXOs at the verifier's clock.\n     * Computed by the caller's chain accessor.\n     */\n    sats_bonded: number;\n    /** Days the named UTXOs have been unspent at the verifier's clock. */\n    days_unspent: number;\n    /** True if the named UTXO has been spent at or before `now`. */\n    utxo_spent_at_or_before_now: boolean;\n}\n\n/**\n * Caller-supplied lookup that resolves an OrangeCheck attestation id against\n * live Bitcoin chain state. Returns null if the attestation can't be found.\n *\n * The SDK does not bundle a Bitcoin RPC client by design — the caller (CLI,\n * web, server) wires their accessor of choice (Esplora, mempool.space,\n * bitcoind RPC, oc-attest sdk).\n */\nexport type AttestationLookup = (\n    attestationId: string,\n    nowIso: string,\n) => Promise<AttestationLookupResult | null>;\n\nexport interface VerifyBondInput {\n    pledge: PledgeEnvelope;\n    /** ISO 8601 UTC. */\n    now: string;\n    lookup: AttestationLookup;\n}\n\nexport interface VerifyBondOk {\n    ok: true;\n    sats_bonded: number;\n    days_unspent: number;\n}\n\nexport interface VerifyBondErr {\n    ok: false;\n    code: Extract<\n        PledgeErrorCode,\n        'E_BOND_NOT_FOUND' | 'E_BOND_ADDRESS_MISMATCH' | 'E_BOND_SPENT' | 'E_BOND_INSUFFICIENT_SATS' | 'E_BOND_INSUFFICIENT_DAYS'\n    >;\n    message: string;\n}\n\nexport type VerifyBondResult = VerifyBondOk | VerifyBondErr;\n","// Canonical messages + RFC 8785 envelope canonicalization for OC Pledge.\n//\n// Three independent canonical-message builders (one per envelope kind) and a\n// single RFC 8785 JSON canonicalizer reused across all three envelope wires.\n//\n// The canonical-message builders are the load-bearing pieces of this SDK —\n// they MUST produce byte-identical output across implementations for identical\n// inputs (SPEC §11.8). Every committed test vector in oc-pledge-protocol/\n// test-vectors/ pins the exact bytes.\n\nimport { sha256 } from '@noble/hashes/sha256';\n\nimport type {\n    AbandonmentCanonicalInput,\n    AbandonmentEnvelope,\n    OutcomeCanonicalInput,\n    OutcomeEnvelope,\n    PledgeCanonicalInput,\n    PledgeEnvelope,\n    PledgeResolvesAt,\n} from './types.js';\nimport { RESOLUTION_MECHANISMS } from './types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pledge canonical message — SPEC §3.1\n//\n// Layout (LF-separated, no trailing LF):\n//   oc-pledge/v1\n//   swearer: <btc_address>\n//   proposition: <single line>\n//   resolution:\n//     mechanism: <one of the seven>\n//     query: <single line>\n//   resolves_at:\n//     time: <ISO> | block: <integer>\n//   expires_at: <ISO>\n//   bond:\n//     attestation_id: <64-hex>\n//     min_sats: <integer>\n//     min_days: <integer>\n//   counterparty: <btc_address | null>\n//   dispute:\n//     mechanism: <vote_resolves | named_oracle | null>\n//     params: <string | null>\n//   remediation: breach_recorded\n//   sworn_at: <ISO>\n//   nonce: <32-hex>\n//\n// Sub-blocks (resolution, resolves_at, bond, dispute) are introduced by a\n// label-only line (\"foo:\") followed by 2-space-indented sub-fields. The\n// `null` token is the literal four-character string, not a quoted string.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst PLEDGE_DOMAIN = 'oc-pledge/v1';\nconst OUTCOME_DOMAIN = 'oc-pledge-outcome/v1';\nconst ABANDONMENT_DOMAIN = 'oc-pledge-abandonment/v1';\n\nexport function canonicalPledgeMessage(input: PledgeCanonicalInput): string {\n    const lines: string[] = [];\n    lines.push(PLEDGE_DOMAIN);\n    lines.push(`swearer: ${input.swearer}`);\n    lines.push(`proposition: ${input.proposition}`);\n    lines.push('resolution:');\n    lines.push(`  mechanism: ${input.resolution.mechanism}`);\n    lines.push(`  query: ${input.resolution.query}`);\n    lines.push('resolves_at:');\n    lines.push(`  ${resolvesAtLine(input.resolves_at)}`);\n    lines.push(`expires_at: ${input.expires_at}`);\n    lines.push('bond:');\n    lines.push(`  attestation_id: ${input.bond.attestation_id}`);\n    lines.push(`  min_sats: ${input.bond.min_sats}`);\n    lines.push(`  min_days: ${input.bond.min_days}`);\n    lines.push(`counterparty: ${input.counterparty === null ? 'null' : input.counterparty}`);\n    lines.push('dispute:');\n    lines.push(`  mechanism: ${input.dispute.mechanism === null ? 'null' : input.dispute.mechanism}`);\n    lines.push(`  params: ${input.dispute.params === null ? 'null' : input.dispute.params}`);\n    lines.push(`remediation: ${input.remediation}`);\n    lines.push(`sworn_at: ${input.sworn_at}`);\n    lines.push(`nonce: ${input.nonce}`);\n    return lines.join('\\n');\n}\n\nfunction resolvesAtLine(r: PledgeResolvesAt): string {\n    if ('time' in r) return `time: ${r.time}`;\n    return `block: ${r.block}`;\n}\n\nexport function canonicalPledgeMessageBytes(input: PledgeCanonicalInput): Uint8Array {\n    return new TextEncoder().encode(canonicalPledgeMessage(input));\n}\n\nexport function computePledgeId(input: PledgeCanonicalInput): string {\n    return hexEncode(sha256(canonicalPledgeMessageBytes(input)));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Outcome canonical message — SPEC §4.1\n//\n// Layout:\n//   oc-pledge-outcome/v1\n//   pledge_id: <64-hex>\n//   outcome: <kept | broken | expired_unresolved | disputed>\n//   resolved_at: <ISO>\n//   resolved_by: <addr | \"deterministic\">\n//   evidence:\n//     mechanism: <same as pledge>\n//     result: <single line>\n//     witness: <single line>\n//   dispute_window_ends_at: <ISO>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function canonicalOutcomeMessage(input: OutcomeCanonicalInput): string {\n    const lines: string[] = [];\n    lines.push(OUTCOME_DOMAIN);\n    lines.push(`pledge_id: ${input.pledge_id}`);\n    lines.push(`outcome: ${input.outcome}`);\n    lines.push(`resolved_at: ${input.resolved_at}`);\n    lines.push(`resolved_by: ${input.resolved_by}`);\n    lines.push('evidence:');\n    lines.push(`  mechanism: ${input.evidence.mechanism}`);\n    lines.push(`  result: ${input.evidence.result}`);\n    lines.push(`  witness: ${input.evidence.witness}`);\n    lines.push(`dispute_window_ends_at: ${input.dispute_window_ends_at}`);\n    return lines.join('\\n');\n}\n\nexport function canonicalOutcomeMessageBytes(input: OutcomeCanonicalInput): Uint8Array {\n    return new TextEncoder().encode(canonicalOutcomeMessage(input));\n}\n\nexport function computeOutcomeId(input: OutcomeCanonicalInput): string {\n    return hexEncode(sha256(canonicalOutcomeMessageBytes(input)));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abandonment canonical message — SPEC §5.1\n//\n// Layout:\n//   oc-pledge-abandonment/v1\n//   pledge_id: <64-hex>\n//   abandoned_at: <ISO>\n//   reason: <single line, ≤ 280 UTF-8 bytes>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function canonicalAbandonmentMessage(input: AbandonmentCanonicalInput): string {\n    return [\n        ABANDONMENT_DOMAIN,\n        `pledge_id: ${input.pledge_id}`,\n        `abandoned_at: ${input.abandoned_at}`,\n        `reason: ${input.reason}`,\n    ].join('\\n');\n}\n\nexport function canonicalAbandonmentMessageBytes(\n    input: AbandonmentCanonicalInput,\n): Uint8Array {\n    return new TextEncoder().encode(canonicalAbandonmentMessage(input));\n}\n\nexport function computeAbandonmentId(input: AbandonmentCanonicalInput): string {\n    return hexEncode(sha256(canonicalAbandonmentMessageBytes(input)));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Field validation — runs before any of the canonical-message builders so a\n// caller can preview validity without producing a malformed signed envelope.\n// SPEC §3.6, §4.2 (table), §5.3 (table).\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * SPEC §0: ISO 8601 UTC means YYYY-MM-DDTHH:MM:SSZ — no fractional seconds,\n * no offsets other than the literal capital-Z suffix. Stricter than stamp's\n * ISO regex; pledge canonical bytes must reject `+00:00`, lowercase `z`, and\n * any fractional-second form.\n */\nconst ISO_UTC_STRICT = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/;\nconst HEX_64 = /^[0-9a-f]{64}$/;\nconst HEX_32 = /^[0-9a-f]{32}$/;\n\nexport type ValidateResult = { ok: true } | { ok: false; reason: string };\n\nexport function validatePledgeInput(input: PledgeCanonicalInput): ValidateResult {\n    if (!input.swearer || /[\\s\\x00-\\x1f]/.test(input.swearer)) {\n        return r('swearer must be non-empty with no whitespace or control chars');\n    }\n    if (input.proposition.length === 0 || /[\\n\\r]/.test(input.proposition)) {\n        return r('proposition must be non-empty and a single line (no LF or CR)');\n    }\n    if (new TextEncoder().encode(input.proposition).byteLength > 512) {\n        return r('proposition exceeds 512 UTF-8 bytes');\n    }\n    if (!RESOLUTION_MECHANISMS.includes(input.resolution.mechanism)) {\n        return r(\n            `resolution.mechanism \"${input.resolution.mechanism}\" is not in the SPEC §3.4 set`,\n        );\n    }\n    if (input.resolution.query.length === 0 || /[\\n\\r]/.test(input.resolution.query)) {\n        return r('resolution.query must be non-empty and a single line');\n    }\n    if (new TextEncoder().encode(input.resolution.query).byteLength > 1024) {\n        return r('resolution.query exceeds 1024 UTF-8 bytes');\n    }\n    if ('time' in input.resolves_at) {\n        if (!ISO_UTC_STRICT.test(input.resolves_at.time)) {\n            return r('resolves_at.time must be ISO 8601 UTC ending in Z (no fractional seconds)');\n        }\n    } else if ('block' in input.resolves_at) {\n        if (!Number.isInteger(input.resolves_at.block) || input.resolves_at.block < 0) {\n            return r('resolves_at.block must be a non-negative integer');\n        }\n    } else {\n        return r('resolves_at must contain exactly one of {time} or {block}');\n    }\n    if (!ISO_UTC_STRICT.test(input.expires_at)) {\n        return r('expires_at must be ISO 8601 UTC ending in Z (no fractional seconds)');\n    }\n    if (!HEX_64.test(input.bond.attestation_id)) {\n        return r('bond.attestation_id must be 64 lowercase hex chars');\n    }\n    if (!Number.isInteger(input.bond.min_sats) || input.bond.min_sats < 0) {\n        return r('bond.min_sats must be a non-negative integer');\n    }\n    if (!Number.isInteger(input.bond.min_days) || input.bond.min_days < 0) {\n        return r('bond.min_days must be a non-negative integer');\n    }\n    if (input.counterparty !== null && /[\\s\\x00-\\x1f]/.test(input.counterparty)) {\n        return r('counterparty must be a Bitcoin address or null');\n    }\n    if (input.resolution.mechanism === 'counterparty_signs' && input.counterparty === null) {\n        return r('counterparty MUST be non-null when resolution.mechanism == counterparty_signs');\n    }\n    if (\n        input.dispute.mechanism !== null &&\n        input.dispute.mechanism !== 'vote_resolves' &&\n        input.dispute.mechanism !== 'named_oracle'\n    ) {\n        return r('dispute.mechanism must be null, \"vote_resolves\", or \"named_oracle\"');\n    }\n    if (input.dispute.params !== null && /[\\n\\r]/.test(input.dispute.params)) {\n        return r('dispute.params must be a single line or null');\n    }\n    if (input.remediation !== 'breach_recorded') {\n        return r('remediation must equal \"breach_recorded\" in v0.1');\n    }\n    if (!ISO_UTC_STRICT.test(input.sworn_at)) {\n        return r('sworn_at must be ISO 8601 UTC ending in Z (no fractional seconds)');\n    }\n    // Empty nonce is the test-vector v28 path — must reject.\n    if (input.nonce.length === 0) {\n        return r('nonce MUST be non-empty (E_PLEDGE_MALFORMED per SPEC §3.1)');\n    }\n    if (!HEX_32.test(input.nonce)) {\n        return r('nonce must be 32 lowercase hex characters');\n    }\n    return { ok: true };\n}\n\nexport function validateOutcomeInput(input: OutcomeCanonicalInput): ValidateResult {\n    if (!HEX_64.test(input.pledge_id)) return r('pledge_id must be 64 lowercase hex chars');\n    if (!['kept', 'broken', 'expired_unresolved', 'disputed'].includes(input.outcome)) {\n        return r('outcome must be one of: kept, broken, expired_unresolved, disputed');\n    }\n    if (!ISO_UTC_STRICT.test(input.resolved_at)) {\n        return r('resolved_at must be ISO 8601 UTC ending in Z');\n    }\n    if (\n        input.resolved_by !== 'deterministic' &&\n        (!input.resolved_by || /[\\s\\x00-\\x1f]/.test(input.resolved_by))\n    ) {\n        return r('resolved_by must be \"deterministic\" or a Bitcoin address');\n    }\n    if (!RESOLUTION_MECHANISMS.includes(input.evidence.mechanism)) {\n        return r(`evidence.mechanism \"${input.evidence.mechanism}\" is not in the SPEC §3.4 set`);\n    }\n    if (input.evidence.result.length === 0 || /[\\n\\r]/.test(input.evidence.result)) {\n        return r('evidence.result must be a non-empty single line');\n    }\n    if (input.evidence.witness.length === 0 || /[\\n\\r]/.test(input.evidence.witness)) {\n        return r('evidence.witness must be a non-empty single line');\n    }\n    if (!ISO_UTC_STRICT.test(input.dispute_window_ends_at)) {\n        return r('dispute_window_ends_at must be ISO 8601 UTC ending in Z');\n    }\n    return { ok: true };\n}\n\nexport function validateAbandonmentInput(\n    input: AbandonmentCanonicalInput,\n): ValidateResult {\n    if (!HEX_64.test(input.pledge_id)) return r('pledge_id must be 64 lowercase hex chars');\n    if (!ISO_UTC_STRICT.test(input.abandoned_at)) {\n        return r('abandoned_at must be ISO 8601 UTC ending in Z');\n    }\n    if (input.reason.length === 0 || /[\\n\\r]/.test(input.reason)) {\n        return r('reason must be a non-empty single line');\n    }\n    if (new TextEncoder().encode(input.reason).byteLength > 280) {\n        return r('reason exceeds 280 UTF-8 bytes');\n    }\n    return { ok: true };\n}\n\nfunction r(reason: string): ValidateResult {\n    return { ok: false, reason };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Envelope canonicalization — SPEC §6 (RFC 8785)\n//\n// Same encoder as stamp-core: keys sorted, no insignificant whitespace,\n// integers serialized without exponents, control chars `\\uXXXX`-escaped.\n// `undefined` keys are dropped (used for optional via_delegation / agent_address).\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type JsonValue =\n    | null\n    | boolean\n    | number\n    | string\n    | JsonValue[]\n    | { [key: string]: JsonValue };\n\nexport function canonicalize(value: JsonValue): string {\n    return encode(value);\n}\n\nexport function canonicalizePledgeEnvelope(env: PledgeEnvelope): string {\n    return canonicalize(env as unknown as JsonValue);\n}\n\nexport function canonicalizeOutcomeEnvelope(env: OutcomeEnvelope): string {\n    return canonicalize(env as unknown as JsonValue);\n}\n\nexport function canonicalizeAbandonmentEnvelope(env: AbandonmentEnvelope): string {\n    return canonicalize(env as unknown as JsonValue);\n}\n\nfunction encode(v: JsonValue): string {\n    if (v === null) return 'null';\n    if (typeof v === 'boolean') return v ? 'true' : 'false';\n    if (typeof v === 'number') return encodeNumber(v);\n    if (typeof v === 'string') return encodeString(v);\n    if (Array.isArray(v)) {\n        const parts: string[] = [];\n        for (const item of v) parts.push(encode(item));\n        return '[' + parts.join(',') + ']';\n    }\n    if (typeof v === 'object') {\n        const keys = Object.keys(v).sort();\n        const parts: string[] = [];\n        for (const k of keys) {\n            const inner = v[k];\n            if (inner === undefined) continue;\n            parts.push(encodeString(k) + ':' + encode(inner as JsonValue));\n        }\n        return '{' + parts.join(',') + '}';\n    }\n    throw new Error('cannot canonicalize value of type ' + typeof v);\n}\n\nfunction encodeNumber(n: number): string {\n    if (!Number.isFinite(n)) throw new Error('non-finite number not JSON-canonicalizable');\n    if (Object.is(n, -0)) return '0';\n    if (Number.isInteger(n) && Math.abs(n) < 1e21) {\n        return String(n);\n    }\n    return JSON.stringify(n);\n}\n\nconst ESCAPE_TABLE: Record<string, string> = {\n    '\\\\': '\\\\\\\\',\n    '\"': '\\\\\"',\n    '\\b': '\\\\b',\n    '\\f': '\\\\f',\n    '\\n': '\\\\n',\n    '\\r': '\\\\r',\n    '\\t': '\\\\t',\n};\n\nfunction encodeString(s: string): string {\n    let out = '\"';\n    for (let i = 0; i < s.length; i++) {\n        const ch = s[i]!;\n        const code = ch.charCodeAt(0);\n        if (ESCAPE_TABLE[ch]) {\n            out += ESCAPE_TABLE[ch];\n        } else if (code < 0x20) {\n            out += '\\\\u' + code.toString(16).padStart(4, '0');\n        } else {\n            out += ch;\n        }\n    }\n    out += '\"';\n    return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Small utilities\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst HEX_TABLE = '0123456789abcdef';\n\nexport function hexEncode(bytes: Uint8Array): string {\n    let out = '';\n    for (let i = 0; i < bytes.length; i++) {\n        const b = bytes[i]!;\n        out += HEX_TABLE[(b >> 4) & 0x0f]! + HEX_TABLE[b & 0x0f]!;\n    }\n    return out;\n}\n\nexport function sha256Hex(bytes: Uint8Array): string {\n    return hexEncode(sha256(bytes));\n}\n\n/**\n * Generate a 32-char-hex random nonce (16 random bytes). Uses globalThis.crypto\n * which is available in Node 20+ and every browser. Throws if the runtime\n * lacks a crypto source; callers wanting deterministic test fixtures pass an\n * explicit nonce instead.\n */\nexport function generateNonce(): string {\n    const bytes = new Uint8Array(16);\n    const c = (globalThis as { crypto?: Crypto }).crypto;\n    if (!c || typeof c.getRandomValues !== 'function') {\n        throw new Error('no crypto.getRandomValues available; pass an explicit nonce');\n    }\n    c.getRandomValues(bytes);\n    return hexEncode(bytes);\n}\n","// OC Agent §7.3 delegation checks for agent-delegated pledges.\n//\n// pledge-core's verifyPledge calls into this module when via_delegation is\n// present in an envelope AND the caller supplied a DelegationLookup. The\n// adapter (@orangecheck/agent-core or any equivalent) does the\n// fetch + signature-verify side; this module does the pledge-specific\n// scope-matching against the resolved delegation.\n//\n// The pledge:create scope grammar is documented in SPEC §7.3:\n//\n//   pledge:create\n//   pledge:create(max_bond_sats=<N>)\n//   pledge:create(mechanism=<m>)\n//   pledge:create(counterparty=<addr>)\n//   pledge:create(max_bond_sats=<N>,mechanism=<m>)\n//   pledge:create(max_bond_sats=<N>,mechanism=<m>,counterparty=<addr>)\n//\n// Multiple constraints are AND-joined by comma. A pledge passes scope\n// check iff every named constraint is satisfied.\n\nimport type {\n    DelegationLookupResult,\n    PledgeEnvelope,\n    PledgeErrorCode,\n} from './types.js';\n\nexport interface ScopeCheckOk {\n    ok: true;\n    matched_scope: string;\n}\n\nexport interface ScopeCheckErr {\n    ok: false;\n    code: Extract<\n        PledgeErrorCode,\n        'E_DELEGATION_SCOPE_VIOLATED' | 'E_DELEGATION_NOT_FOUND'\n    >;\n    reason: string;\n}\n\nexport type ScopeCheckResult = ScopeCheckOk | ScopeCheckErr;\n\n/**\n * Find the first `pledge:create(...)` scope in the delegation and verify the\n * pledge satisfies all its constraints. SPEC §7.3.\n *\n * Returns ok with the matched raw scope string, or err with\n * E_DELEGATION_SCOPE_VIOLATED naming the failed constraint.\n */\nexport function checkPledgeCreateScope(\n    pledge: PledgeEnvelope,\n    delegation: DelegationLookupResult,\n): ScopeCheckResult {\n    let matched: string | null = null;\n    let lastFailReason = '';\n    for (const raw of delegation.scopes) {\n        const parsed = parsePledgeCreateScope(raw);\n        if (!parsed) continue;\n        const violation = pledgeFailsConstraint(pledge, parsed);\n        if (violation === null) {\n            matched = raw;\n            break;\n        }\n        lastFailReason = violation;\n    }\n    if (matched !== null) {\n        return { ok: true, matched_scope: matched };\n    }\n    if (lastFailReason !== '') {\n        return {\n            ok: false,\n            code: 'E_DELEGATION_SCOPE_VIOLATED',\n            reason: lastFailReason,\n        };\n    }\n    return {\n        ok: false,\n        code: 'E_DELEGATION_SCOPE_VIOLATED',\n        reason: 'delegation does not authorize pledge:create',\n    };\n}\n\n/**\n * Parse a single scope string. Returns the constraint map iff the scope's\n * product:verb is `pledge:create`; null for any other scope (caller skips\n * those). Tolerates whitespace inside parens; rejects malformed syntax by\n * returning null (the scope is treated as non-matching rather than\n * surfacing a parse error — matches OC Agent's permissive scope mode).\n */\nexport function parsePledgeCreateScope(scope: string): Record<string, string> | null {\n    const trimmed = scope.trim();\n    // Bare scope: just `pledge:create` with no constraints.\n    if (trimmed === 'pledge:create') return {};\n    const m = /^pledge:create\\(([^)]*)\\)$/.exec(trimmed);\n    if (!m) return null;\n    const inside = m[1]!.trim();\n    if (inside === '') return {};\n    const out: Record<string, string> = {};\n    for (const pair of inside.split(',')) {\n        const eq = pair.indexOf('=');\n        if (eq === -1) return null; // malformed\n        const key = pair.slice(0, eq).trim();\n        const val = pair.slice(eq + 1).trim();\n        if (!key) return null;\n        out[key] = val;\n    }\n    return out;\n}\n\n/**\n * Returns null if the pledge satisfies every constraint; otherwise a\n * human-readable reason naming the first failed constraint.\n */\nfunction pledgeFailsConstraint(\n    pledge: PledgeEnvelope,\n    constraints: Record<string, string>,\n): string | null {\n    if ('max_bond_sats' in constraints) {\n        const max = Number.parseInt(constraints['max_bond_sats']!, 10);\n        if (!Number.isFinite(max)) {\n            return `delegation max_bond_sats=\"${constraints['max_bond_sats']}\" is not a valid integer`;\n        }\n        // Pledge's bond.min_sats is the floor it commits to; the delegation\n        // permits up to max_bond_sats. A pledge with min_sats > max_bond_sats\n        // exceeds the delegation's authorisation.\n        if (pledge.bond.min_sats > max) {\n            return `pledge.bond.min_sats (${pledge.bond.min_sats}) exceeds delegation's max_bond_sats (${max})`;\n        }\n    }\n    if ('mechanism' in constraints) {\n        if (pledge.resolution.mechanism !== constraints['mechanism']) {\n            return `pledge.resolution.mechanism=\"${pledge.resolution.mechanism}\" does not match delegation's mechanism=\"${constraints['mechanism']}\"`;\n        }\n    }\n    if ('counterparty' in constraints) {\n        const want = constraints['counterparty'];\n        if (pledge.counterparty !== want) {\n            return `pledge.counterparty=${pledge.counterparty === null ? 'null' : `\"${pledge.counterparty}\"`} does not match delegation's counterparty=\"${want}\"`;\n        }\n    }\n    return null;\n}\n\n/**\n * Compare two strict ISO 8601 UTC timestamps (YYYY-MM-DDTHH:MM:SSZ).\n * Returns true iff `a` is strictly later than `b`. Lexicographic compare\n * works because the format is fixed-width.\n */\nexport function isoUtcGreaterThan(a: string, b: string): boolean {\n    return a > b;\n}\n","// createPledge() + verifyPledge() — SPEC §3 + §9.\n\nimport {\n    canonicalPledgeMessage,\n    canonicalPledgeMessageBytes,\n    computePledgeId,\n    generateNonce,\n    hexEncode,\n    validatePledgeInput,\n} from './canonical.js';\nimport { checkPledgeCreateScope, isoUtcGreaterThan } from './delegation.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport {\n    ENVELOPE_VERSION,\n    type CreatePledgeInput,\n    type PledgeCanonicalInput,\n    type PledgeEnvelope,\n    type PledgeErrorCode,\n    type VerifyErr,\n    type VerifyPledgeInput,\n    type VerifyPledgeOk,\n    type VerifyPledgeResult,\n} from './types.js';\n\nexport class PledgeError extends Error {\n    code: PledgeErrorCode;\n    constructor(code: PledgeErrorCode, message: string) {\n        super(message);\n        this.code = code;\n        this.name = 'PledgeError';\n    }\n}\n\n/**\n * Build, validate, and sign a pledge envelope.\n *\n * Two signing paths:\n *   - Direct (most common): swearer signs themselves. Pass `swearerSigner`\n *     whose `address` matches the canonical message's swearer.\n *   - Agent (SPEC §7.3): an agent signs on behalf of a principal under an\n *     OC Agent delegation. Pass `viaDelegation` with the delegation id and\n *     the agent's signer. The envelope carries `via_delegation` and\n *     `agent_address` but those fields are NOT in the canonical message —\n *     they're verifier-checked claims, not signed bytes.\n *\n * Returns the fully-formed envelope. Throws PledgeError on validation\n * failure, never on signature failure (signing is the caller's adapter).\n */\nexport async function createPledge(input: CreatePledgeInput): Promise<PledgeEnvelope> {\n    const swornAt = isoSecondsZ(input.swornAt ?? new Date());\n    const nonce = input.nonce ?? generateNonce();\n    const remediation = input.remediation ?? 'breach_recorded';\n\n    const canon: PledgeCanonicalInput = {\n        swearer: input.swearer,\n        proposition: input.proposition,\n        resolution: input.resolution,\n        resolves_at: input.resolves_at,\n        expires_at: input.expires_at,\n        bond: input.bond,\n        counterparty: input.counterparty,\n        dispute: input.dispute,\n        remediation,\n        sworn_at: swornAt,\n        nonce,\n    };\n\n    const v = validatePledgeInput(canon);\n    if (!v.ok) throw new PledgeError('E_PLEDGE_MALFORMED', v.reason);\n\n    // Agent path: signer must be the agent (not the principal). Also enforce\n    // that swearer.address still equals canon.swearer (the principal); the\n    // agent's address goes into agent_address in the envelope.\n    if (input.viaDelegation) {\n        if (input.viaDelegation.delegation_id.length !== 64) {\n            throw new PledgeError(\n                'E_PLEDGE_MALFORMED',\n                'viaDelegation.delegation_id must be 64 hex chars',\n            );\n        }\n        if (input.viaDelegation.agent_signer.address === input.swearerSigner.address) {\n            throw new PledgeError(\n                'E_PLEDGE_MALFORMED',\n                'agent_address must differ from swearer.address (principal-vs-agent invariant)',\n            );\n        }\n    }\n\n    const id = computePledgeId(canon);\n\n    // BIP-322 signs the lowercase hex form of the id. Hex (not raw bytes)\n    // so wallets render something legible to the user before signing.\n    const signer = input.viaDelegation ? input.viaDelegation.agent_signer : input.swearerSigner;\n    const sigValue = await signer.signMessage(id);\n\n    const envelope: PledgeEnvelope = {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge',\n        id,\n        swearer: { address: input.swearer, alg: 'bip322' },\n        proposition: input.proposition,\n        resolution: input.resolution,\n        resolves_at: input.resolves_at,\n        expires_at: input.expires_at,\n        bond: input.bond,\n        counterparty: input.counterparty,\n        dispute: input.dispute,\n        remediation,\n        sworn_at: swornAt,\n        nonce,\n        sig: {\n            alg: 'bip322',\n            pubkey: signer.address,\n            value: sigValue,\n        },\n    };\n\n    if (input.viaDelegation) {\n        envelope.via_delegation = input.viaDelegation.delegation_id;\n        envelope.agent_address = input.viaDelegation.agent_signer.address;\n    }\n\n    return envelope;\n}\n\n/**\n * Build a pledge envelope from a canonical input + an externally-obtained\n * BIP-322 signature. Companion to ``createPledge`` for callers who sign\n * outside the SDK — typically web apps that use a wallet-extension's\n * ``signMessage`` API directly rather than wrapping it as a Bip322Signer.\n *\n * The caller is responsible for:\n *   - Producing ``sigValue`` over the lowercase-hex pledge id (SPEC §3.5).\n *     Compute the id via ``computePledgeId(input)`` first; pass that exact\n *     hex string to the wallet's signMessage.\n *   - Identifying which address signed (``sigPubkey``). For non-agent\n *     pledges this MUST equal ``input.swearer``. For agent pledges\n *     (viaDelegation set), ``sigPubkey`` SHOULD equal ``viaDelegation.agentAddress``\n *     since that's the cryptographic signer; verifiers under SPEC §7.3 use\n *     ``agent_address`` from the envelope as the BIP-322 verification key\n *     regardless of what's in ``sig.pubkey``.\n *\n * Throws ``PledgeError`` if the canonical input is invalid (same gates as\n * ``createPledge``).\n */\nexport function wrapPledgeEnvelope(\n    input: PledgeCanonicalInput,\n    sigValue: string,\n    opts?: {\n        sigPubkey?: string;\n        viaDelegation?: { delegationId: string; agentAddress: string };\n    },\n): PledgeEnvelope {\n    const v = validatePledgeInput(input);\n    if (!v.ok) throw new PledgeError('E_PLEDGE_MALFORMED', v.reason);\n\n    if (opts?.viaDelegation) {\n        if (opts.viaDelegation.delegationId.length !== 64) {\n            throw new PledgeError(\n                'E_PLEDGE_MALFORMED',\n                'viaDelegation.delegationId must be 64 hex chars',\n            );\n        }\n        if (opts.viaDelegation.agentAddress === input.swearer) {\n            throw new PledgeError(\n                'E_PLEDGE_MALFORMED',\n                'agent_address must differ from swearer.address (principal-vs-agent invariant)',\n            );\n        }\n    }\n\n    const id = computePledgeId(input);\n    const sigPubkey = opts?.sigPubkey ?? input.swearer;\n\n    const envelope: PledgeEnvelope = {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge',\n        id,\n        swearer: { address: input.swearer, alg: 'bip322' },\n        proposition: input.proposition,\n        resolution: input.resolution,\n        resolves_at: input.resolves_at,\n        expires_at: input.expires_at,\n        bond: input.bond,\n        counterparty: input.counterparty,\n        dispute: input.dispute,\n        remediation: input.remediation,\n        sworn_at: input.sworn_at,\n        nonce: input.nonce,\n        sig: { alg: 'bip322', pubkey: sigPubkey, value: sigValue },\n    };\n\n    if (opts?.viaDelegation) {\n        envelope.via_delegation = opts.viaDelegation.delegationId;\n        envelope.agent_address = opts.viaDelegation.agentAddress;\n    }\n\n    return envelope;\n}\n\n/**\n * Verify a pledge envelope per SPEC §9.1 steps 1–4 (envelope-only checks).\n *\n * What this does cover:\n *   - Version check (§9.1.1)\n *   - Shape check (§9.1.2)\n *   - Canonical-message reconstruction + id check (§9.1.3)\n *   - BIP-322 signature verify (§9.1.4) — when verifyBip322 is supplied\n *\n * What this does NOT cover (delegated to other functions / caller hooks):\n *   - Bond verification (§9.1.5) — see verifyBond()\n *   - Outcome / abandonment side-channel verification — see verifyOutcome()\n *     and verifyAbandonment()\n *   - Mechanism re-evaluation against public state (§9.1.8) — out of scope\n *     for the envelope-only SDK; consumers wire their chain/relay/dns clients\n *   - State classification (§9.1.9) — see classifyState()\n *\n * skipSignatureVerification = true is the test-vector path (placeholder\n * sigs); production callers MUST supply verifyBip322.\n */\nexport async function verifyPledge(input: VerifyPledgeInput): Promise<VerifyPledgeResult> {\n    const env = input.envelope;\n\n    // 1. Version\n    if (env.v !== ENVELOPE_VERSION) {\n        return err('E_UNSUPPORTED_VERSION', `pledge envelope v=${env.v} not supported`);\n    }\n\n    // 2. Shape\n    const shape = checkPledgeShape(env);\n    if (shape) return shape;\n\n    // 3. Canonical-message reconstruction + id\n    const canon: PledgeCanonicalInput = {\n        swearer: env.swearer.address,\n        proposition: env.proposition,\n        resolution: env.resolution,\n        resolves_at: env.resolves_at,\n        expires_at: env.expires_at,\n        bond: env.bond,\n        counterparty: env.counterparty,\n        dispute: env.dispute,\n        remediation: env.remediation,\n        sworn_at: env.sworn_at,\n        nonce: env.nonce,\n    };\n    // Field-validity check before trusting the declared id — catches malformed\n    // inputs that would silently produce a non-conforming canonical message.\n    const fieldCheck = validatePledgeInput(canon);\n    if (!fieldCheck.ok) return err('E_PLEDGE_MALFORMED', fieldCheck.reason);\n\n    const reconstructed = canonicalPledgeMessage(canon);\n    const reconstructedId = hexEncode(sha256(canonicalPledgeMessageBytes(canon)));\n    if (reconstructedId !== env.id) {\n        return err(\n            'E_PLEDGE_BAD_ID',\n            `reconstructed id ${reconstructedId} != envelope.id ${env.id}`,\n        );\n    }\n\n    // 4. Signature.\n    //\n    // Verification key precedence:\n    //   - via_delegation present → agent_address (SPEC §7.3 step 6)\n    //   - via_delegation absent  → sig.pubkey (== swearer.address by §3.6)\n    if (!input.skipSignatureVerification) {\n        if (!input.verifyBip322) {\n            return err('E_PLEDGE_BAD_SIG', 'no BIP-322 verifier supplied');\n        }\n        const verifyKey = env.via_delegation && env.agent_address\n            ? env.agent_address\n            : env.sig.pubkey;\n        const ok = await input.verifyBip322(env.id, env.sig.value, verifyKey);\n        if (!ok) return err('E_PLEDGE_BAD_SIG', 'BIP-322 signature did not verify');\n    }\n\n    // 5. Delegation lookup (SPEC §7.3 steps 1–5) when via_delegation is\n    // present AND a delegationLookup adapter was supplied. Without an\n    // adapter the agent path is shape-and-signature-only — the verifier\n    // accepts the envelope but doesn't enforce the principal/agent/scope\n    // chain. Documented as an implementation note in oc-pledge-protocol/\n    // SECURITY.md scenarios 15 + 16.\n    if (env.via_delegation && env.agent_address && input.delegationLookup) {\n        const delegation = await input.delegationLookup(env.via_delegation, env.sworn_at);\n        if (delegation === null) {\n            return err(\n                'E_DELEGATION_NOT_FOUND',\n                `delegation ${env.via_delegation} could not be resolved`,\n            );\n        }\n        if (delegation.principal !== env.swearer.address) {\n            return err(\n                'E_DELEGATION_SCOPE_VIOLATED',\n                `delegation.principal (${delegation.principal}) != envelope.swearer.address (${env.swearer.address})`,\n            );\n        }\n        if (delegation.agent !== env.agent_address) {\n            return err(\n                'E_DELEGATION_SCOPE_VIOLATED',\n                `delegation.agent (${delegation.agent}) != envelope.agent_address (${env.agent_address})`,\n            );\n        }\n        if (!isoUtcGreaterThan(delegation.expires_at, env.sworn_at)) {\n            return err(\n                'E_DELEGATION_EXPIRED',\n                `delegation.expires_at (${delegation.expires_at}) <= pledge.sworn_at (${env.sworn_at})`,\n            );\n        }\n        const scopeCheck = checkPledgeCreateScope(env, delegation);\n        if (!scopeCheck.ok) {\n            return err(scopeCheck.code, scopeCheck.reason);\n        }\n    }\n\n    const result: VerifyPledgeOk = {\n        ok: true,\n        envelope: env,\n        canonicalMessage: reconstructed,\n        id: env.id,\n    };\n    return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction checkPledgeShape(env: PledgeEnvelope): VerifyErr | null {\n    if (env.kind !== 'pledge') return err('E_PLEDGE_MALFORMED', 'envelope.kind must be \"pledge\"');\n    if (typeof env.id !== 'string' || !/^[0-9a-f]{64}$/.test(env.id)) {\n        return err('E_PLEDGE_MALFORMED', 'envelope.id must be 64 lowercase hex chars');\n    }\n    if (!env.swearer || typeof env.swearer.address !== 'string' || env.swearer.alg !== 'bip322') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.swearer invalid');\n    }\n    if (!env.resolution || typeof env.resolution.mechanism !== 'string') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.resolution invalid');\n    }\n    if (!env.resolves_at || typeof env.resolves_at !== 'object') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.resolves_at must be an object');\n    }\n    const rkeys = Object.keys(env.resolves_at);\n    if (rkeys.length !== 1 || (rkeys[0] !== 'time' && rkeys[0] !== 'block')) {\n        return err(\n            'E_PLEDGE_MALFORMED',\n            'envelope.resolves_at must contain exactly one of {time} or {block}',\n        );\n    }\n    if (!env.bond || typeof env.bond.attestation_id !== 'string') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.bond invalid');\n    }\n    if (!env.dispute || typeof env.dispute !== 'object') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.dispute must be an object');\n    }\n    if (env.remediation !== 'breach_recorded') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.remediation must equal \"breach_recorded\" in v0.1');\n    }\n    if (!env.sig || env.sig.alg !== 'bip322' || typeof env.sig.value !== 'string') {\n        return err('E_PLEDGE_MALFORMED', 'envelope.sig invalid');\n    }\n    if (env.via_delegation !== undefined) {\n        if (typeof env.via_delegation !== 'string' || !/^[0-9a-f]{64}$/.test(env.via_delegation)) {\n            return err('E_PLEDGE_MALFORMED', 'envelope.via_delegation must be 64 hex chars');\n        }\n        if (typeof env.agent_address !== 'string') {\n            return err(\n                'E_PLEDGE_MALFORMED',\n                'envelope.agent_address required when via_delegation present',\n            );\n        }\n        // SPEC §3.6 says sig.pubkey MUST equal agent_address; SPEC §7.3 step 6\n        // says \"verify sig.value under agent_address\" which treats sig.pubkey\n        // as informational. The test-vector authors followed §7.3 and set\n        // sig.pubkey = swearer.address (the principal — i.e. the logical\n        // signer of the pledge). We accept either reading: sig.pubkey may be\n        // the agent address (cryptographic signer) OR the swearer address\n        // (logical signer). Verification uses agent_address as the BIP-322\n        // verification key regardless. See the verifyPledge() signature-check\n        // branch below.\n    } else {\n        if (env.sig.pubkey !== env.swearer.address) {\n            return err(\n                'E_PLEDGE_MALFORMED',\n                'envelope.sig.pubkey must equal swearer.address when via_delegation absent',\n            );\n        }\n        if (env.agent_address !== undefined) {\n            return err(\n                'E_PLEDGE_MALFORMED',\n                'envelope.agent_address must be absent when via_delegation absent',\n            );\n        }\n    }\n    return null;\n}\n\nfunction err(code: PledgeErrorCode, message: string): VerifyErr {\n    return { ok: false, code, message };\n}\n\nfunction isoSecondsZ(d: Date | string): string {\n    if (typeof d === 'string') {\n        // Trust caller; validation happens downstream.\n        return d;\n    }\n    return d.toISOString().replace(/\\.\\d+Z$/, 'Z');\n}\n","// createOutcome() + verifyOutcome() — SPEC §4.\n\nimport { sha256 } from '@noble/hashes/sha256';\n\nimport {\n    canonicalOutcomeMessage,\n    canonicalOutcomeMessageBytes,\n    computeOutcomeId,\n    hexEncode,\n    validateOutcomeInput,\n} from './canonical.js';\nimport {\n    ENVELOPE_VERSION,\n    type CreateOutcomeInput,\n    type OutcomeCanonicalInput,\n    type OutcomeEnvelope,\n    type PledgeErrorCode,\n    type VerifyErr,\n    type VerifyOutcomeInput,\n    type VerifyOutcomeOk,\n    type VerifyOutcomeResult,\n} from './types.js';\nimport { PledgeError } from './pledge.js';\n\n/**\n * SPEC §4.3 — does this outcome envelope require a BIP-322 signature?\n *\n * Discriminator is `resolved_by`, not `mechanism`. The five deterministic\n * mechanisms always have resolved_by=\"deterministic\" and sig=null.\n * counterparty_signs normally has resolved_by=<counterparty.address> and a\n * signature — UNLESS the outcome is `expired_unresolved`, in which case the\n * verifier deterministically classifies the deadline passing without a\n * counterparty signature, so resolved_by=\"deterministic\" and sig=null\n * (test vector v16 pins this nuance).\n */\nexport function outcomeRequiresSignature(input: { resolved_by: string }): boolean {\n    return input.resolved_by !== 'deterministic';\n}\n\n/**\n * Build, validate, and (when required) sign an outcome envelope.\n *\n * For deterministic mechanisms (chain_state, nostr_event_exists,\n * stamp_published, http_get_hash, dns_record, vote_resolves), pass no signer\n * — the SDK leaves sig === null per §4.3.\n *\n * For counterparty_signs, pass the counterparty's signer (whose `address`\n * equals input.resolved_by). The signature commits to the lowercase hex of\n * the outcome id.\n */\nexport async function createOutcome(input: CreateOutcomeInput): Promise<OutcomeEnvelope> {\n    const v = validateOutcomeInput(input);\n    if (!v.ok) throw new PledgeError('E_OUTCOME_MALFORMED', v.reason);\n\n    const requiresSig = outcomeRequiresSignature(input);\n\n    if (requiresSig) {\n        if (!input.signer) {\n            throw new PledgeError(\n                'E_OUTCOME_BAD_SIG',\n                `resolved_by=\"${input.resolved_by}\" requires a signer (only resolved_by=\"deterministic\" outcomes leave sig=null)`,\n            );\n        }\n        if (input.signer.address !== input.resolved_by) {\n            throw new PledgeError(\n                'E_OUTCOME_RESOLVER_UNAUTHORIZED',\n                `signer.address (${input.signer.address}) must equal resolved_by (${input.resolved_by})`,\n            );\n        }\n    }\n    // Inverse case (resolved_by=\"deterministic\", sig=null) is the default —\n    // any of the five deterministic mechanisms or a counterparty_signs\n    // expired_unresolved fall here. No additional gate needed; the SDK simply\n    // emits sig=null below.\n\n    const canon: OutcomeCanonicalInput = {\n        pledge_id: input.pledge_id,\n        outcome: input.outcome,\n        resolved_at: input.resolved_at,\n        resolved_by: input.resolved_by,\n        evidence: input.evidence,\n        dispute_window_ends_at: input.dispute_window_ends_at,\n    };\n\n    const id = computeOutcomeId(canon);\n\n    const envelope: OutcomeEnvelope = {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge-outcome',\n        id,\n        pledge_id: input.pledge_id,\n        outcome: input.outcome,\n        resolved_at: input.resolved_at,\n        resolved_by: input.resolved_by,\n        evidence: input.evidence,\n        dispute_window_ends_at: input.dispute_window_ends_at,\n        sig: null,\n    };\n\n    if (requiresSig) {\n        const sigValue = await input.signer!.signMessage(id);\n        envelope.sig = {\n            alg: 'bip322',\n            pubkey: input.signer!.address,\n            value: sigValue,\n        };\n    }\n\n    return envelope;\n}\n\n/**\n * Build an outcome envelope from a canonical input + an optional externally-\n * obtained BIP-322 signature. Companion to ``createOutcome`` for external-sig\n * flows.\n *\n * Discriminator (SPEC §4.3):\n *   - resolved_by === \"deterministic\": pass ``sigValue=undefined``.\n *     Envelope.sig will be null.\n *   - resolved_by === <address>: pass ``sigValue`` (the BIP-322 over the\n *     lowercase-hex outcome id). Envelope.sig.pubkey defaults to\n *     ``resolved_by``.\n *\n * Throws PledgeError on invalid input or sig/no-sig mismatch with the\n * deterministic discriminator.\n */\nexport function wrapOutcomeEnvelope(\n    input: OutcomeCanonicalInput,\n    sigValue?: string,\n): OutcomeEnvelope {\n    const v = validateOutcomeInput(input);\n    if (!v.ok) throw new PledgeError('E_OUTCOME_MALFORMED', v.reason);\n\n    const requiresSig = input.resolved_by !== 'deterministic';\n    if (requiresSig && sigValue === undefined) {\n        throw new PledgeError(\n            'E_OUTCOME_BAD_SIG',\n            `resolved_by=\"${input.resolved_by}\" requires a signature; pass sigValue or use createOutcome with a signer`,\n        );\n    }\n    if (!requiresSig && sigValue !== undefined) {\n        throw new PledgeError(\n            'E_OUTCOME_MALFORMED',\n            'resolved_by=\"deterministic\" outcomes MUST have envelope.sig = null; do not pass sigValue',\n        );\n    }\n\n    const id = computeOutcomeId(input);\n\n    return {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge-outcome',\n        id,\n        pledge_id: input.pledge_id,\n        outcome: input.outcome,\n        resolved_at: input.resolved_at,\n        resolved_by: input.resolved_by,\n        evidence: input.evidence,\n        dispute_window_ends_at: input.dispute_window_ends_at,\n        sig: requiresSig\n            ? { alg: 'bip322', pubkey: input.resolved_by, value: sigValue! }\n            : null,\n    };\n}\n\nexport async function verifyOutcome(input: VerifyOutcomeInput): Promise<VerifyOutcomeResult> {\n    const env = input.envelope;\n\n    if (env.v !== ENVELOPE_VERSION) {\n        return err('E_UNSUPPORTED_VERSION', `outcome envelope v=${env.v} not supported`);\n    }\n\n    const shape = checkOutcomeShape(env);\n    if (shape) return shape;\n\n    const canon: OutcomeCanonicalInput = {\n        pledge_id: env.pledge_id,\n        outcome: env.outcome,\n        resolved_at: env.resolved_at,\n        resolved_by: env.resolved_by,\n        evidence: env.evidence,\n        dispute_window_ends_at: env.dispute_window_ends_at,\n    };\n    const fieldCheck = validateOutcomeInput(canon);\n    if (!fieldCheck.ok) return err('E_OUTCOME_MALFORMED', fieldCheck.reason);\n\n    const reconstructed = canonicalOutcomeMessage(canon);\n    const reconstructedId = hexEncode(sha256(canonicalOutcomeMessageBytes(canon)));\n    if (reconstructedId !== env.id) {\n        return err(\n            'E_OUTCOME_BAD_ID',\n            `reconstructed id ${reconstructedId} != envelope.id ${env.id}`,\n        );\n    }\n\n    // Signature requirement keys off resolved_by per SPEC §4.3 (see\n    // outcomeRequiresSignature() for the nuance around expired_unresolved).\n    const requiresSig = outcomeRequiresSignature(env);\n\n    if (requiresSig) {\n        if (!env.sig) {\n            return err(\n                'E_OUTCOME_BAD_SIG',\n                `resolved_by=\"${env.resolved_by}\" requires a signature but envelope.sig is null`,\n            );\n        }\n        if (env.sig.pubkey !== env.resolved_by) {\n            return err(\n                'E_OUTCOME_RESOLVER_UNAUTHORIZED',\n                `sig.pubkey (${env.sig.pubkey}) must equal resolved_by (${env.resolved_by})`,\n            );\n        }\n        if (!input.skipSignatureVerification) {\n            if (!input.verifyBip322) {\n                return err('E_OUTCOME_BAD_SIG', 'no BIP-322 verifier supplied');\n            }\n            const ok = await input.verifyBip322(env.id, env.sig.value, env.sig.pubkey);\n            if (!ok) return err('E_OUTCOME_BAD_SIG', 'BIP-322 signature did not verify');\n        }\n    } else {\n        if (env.sig !== null) {\n            return err(\n                'E_OUTCOME_MALFORMED',\n                'resolved_by=\"deterministic\" outcomes MUST have envelope.sig = null',\n            );\n        }\n    }\n\n    const result: VerifyOutcomeOk = {\n        ok: true,\n        envelope: env,\n        canonicalMessage: reconstructed,\n        id: env.id,\n    };\n    return result;\n}\n\nfunction checkOutcomeShape(env: OutcomeEnvelope): VerifyErr | null {\n    if (env.kind !== 'pledge-outcome') {\n        return err('E_OUTCOME_MALFORMED', 'envelope.kind must be \"pledge-outcome\"');\n    }\n    if (typeof env.id !== 'string' || !/^[0-9a-f]{64}$/.test(env.id)) {\n        return err('E_OUTCOME_MALFORMED', 'envelope.id must be 64 lowercase hex chars');\n    }\n    if (typeof env.pledge_id !== 'string' || !/^[0-9a-f]{64}$/.test(env.pledge_id)) {\n        return err('E_OUTCOME_MALFORMED', 'envelope.pledge_id must be 64 lowercase hex chars');\n    }\n    if (!env.evidence || typeof env.evidence.mechanism !== 'string') {\n        return err('E_OUTCOME_MALFORMED', 'envelope.evidence invalid');\n    }\n    return null;\n}\n\nfunction err(code: PledgeErrorCode, message: string): VerifyErr {\n    return { ok: false, code, message };\n}\n","// createAbandonment() + verifyAbandonment() — SPEC §5.\n\nimport { sha256 } from '@noble/hashes/sha256';\n\nimport {\n    canonicalAbandonmentMessage,\n    canonicalAbandonmentMessageBytes,\n    computeAbandonmentId,\n    hexEncode,\n    validateAbandonmentInput,\n} from './canonical.js';\nimport {\n    ENVELOPE_VERSION,\n    type AbandonmentCanonicalInput,\n    type AbandonmentEnvelope,\n    type CreateAbandonmentInput,\n    type PledgeErrorCode,\n    type VerifyAbandonmentInput,\n    type VerifyAbandonmentOk,\n    type VerifyAbandonmentResult,\n    type VerifyErr,\n} from './types.js';\nimport { PledgeError } from './pledge.js';\n\n/**\n * Build, validate, and sign an abandonment envelope.\n *\n * SPEC §5: abandonment counts as `broken` in the public ledger. Agents MUST\n * NOT publish abandonments in v0.1 — only the original swearer (principal)\n * may sign. The SDK enforces this by requiring `swearerSigner.address` to\n * equal the address that signed the original pledge, but it cannot verify\n * cross-envelope reference here (the original pledge isn't an input). Callers\n * MUST cross-check against the referenced pledge before relying on the\n * resulting envelope.\n */\nexport async function createAbandonment(\n    input: CreateAbandonmentInput,\n): Promise<AbandonmentEnvelope> {\n    const v = validateAbandonmentInput(input);\n    if (!v.ok) throw new PledgeError('E_ABANDONMENT_MALFORMED', v.reason);\n\n    const canon: AbandonmentCanonicalInput = {\n        pledge_id: input.pledge_id,\n        abandoned_at: input.abandoned_at,\n        reason: input.reason,\n    };\n\n    const id = computeAbandonmentId(canon);\n    const sigValue = await input.swearerSigner.signMessage(id);\n\n    return {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge-abandonment',\n        id,\n        pledge_id: input.pledge_id,\n        abandoned_at: input.abandoned_at,\n        reason: input.reason,\n        sig: {\n            alg: 'bip322',\n            pubkey: input.swearerSigner.address,\n            value: sigValue,\n        },\n    };\n}\n\n/**\n * Build an abandonment envelope from a canonical input + an externally-\n * obtained BIP-322 signature. Companion to ``createAbandonment`` for\n * external-sig flows.\n *\n * The caller must:\n *   - Compute the id via ``computeAbandonmentId(input)`` first.\n *   - Sign the lowercase-hex id with the original pledge's swearer key\n *     (SPEC §5.3 — abandonments are principal-only; agents MUST NOT sign).\n *   - Pass ``swearerAddress`` as the address that signed.\n */\nexport function wrapAbandonmentEnvelope(\n    input: AbandonmentCanonicalInput,\n    sigValue: string,\n    swearerAddress: string,\n): AbandonmentEnvelope {\n    const v = validateAbandonmentInput(input);\n    if (!v.ok) throw new PledgeError('E_ABANDONMENT_MALFORMED', v.reason);\n\n    const id = computeAbandonmentId(input);\n\n    return {\n        v: ENVELOPE_VERSION,\n        kind: 'pledge-abandonment',\n        id,\n        pledge_id: input.pledge_id,\n        abandoned_at: input.abandoned_at,\n        reason: input.reason,\n        sig: { alg: 'bip322', pubkey: swearerAddress, value: sigValue },\n    };\n}\n\nexport async function verifyAbandonment(\n    input: VerifyAbandonmentInput,\n): Promise<VerifyAbandonmentResult> {\n    const env = input.envelope;\n\n    if (env.v !== ENVELOPE_VERSION) {\n        return err('E_UNSUPPORTED_VERSION', `abandonment envelope v=${env.v} not supported`);\n    }\n\n    const shape = checkAbandonmentShape(env);\n    if (shape) return shape;\n\n    const canon: AbandonmentCanonicalInput = {\n        pledge_id: env.pledge_id,\n        abandoned_at: env.abandoned_at,\n        reason: env.reason,\n    };\n    const fieldCheck = validateAbandonmentInput(canon);\n    if (!fieldCheck.ok) return err('E_ABANDONMENT_MALFORMED', fieldCheck.reason);\n\n    const reconstructed = canonicalAbandonmentMessage(canon);\n    const reconstructedId = hexEncode(sha256(canonicalAbandonmentMessageBytes(canon)));\n    if (reconstructedId !== env.id) {\n        return err(\n            'E_ABANDONMENT_BAD_ID',\n            `reconstructed id ${reconstructedId} != envelope.id ${env.id}`,\n        );\n    }\n\n    if (!input.skipSignatureVerification) {\n        if (!input.verifyBip322) {\n            return err('E_ABANDONMENT_BAD_SIG', 'no BIP-322 verifier supplied');\n        }\n        const ok = await input.verifyBip322(env.id, env.sig.value, env.sig.pubkey);\n        if (!ok) return err('E_ABANDONMENT_BAD_SIG', 'BIP-322 signature did not verify');\n    }\n\n    const result: VerifyAbandonmentOk = {\n        ok: true,\n        envelope: env,\n        canonicalMessage: reconstructed,\n        id: env.id,\n    };\n    return result;\n}\n\nfunction checkAbandonmentShape(env: AbandonmentEnvelope): VerifyErr | null {\n    if (env.kind !== 'pledge-abandonment') {\n        return err('E_ABANDONMENT_MALFORMED', 'envelope.kind must be \"pledge-abandonment\"');\n    }\n    if (typeof env.id !== 'string' || !/^[0-9a-f]{64}$/.test(env.id)) {\n        return err('E_ABANDONMENT_MALFORMED', 'envelope.id must be 64 lowercase hex chars');\n    }\n    if (typeof env.pledge_id !== 'string' || !/^[0-9a-f]{64}$/.test(env.pledge_id)) {\n        return err(\n            'E_ABANDONMENT_MALFORMED',\n            'envelope.pledge_id must be 64 lowercase hex chars',\n        );\n    }\n    if (!env.sig || env.sig.alg !== 'bip322' || typeof env.sig.value !== 'string') {\n        return err('E_ABANDONMENT_MALFORMED', 'envelope.sig invalid');\n    }\n    return null;\n}\n\nfunction err(code: PledgeErrorCode, message: string): VerifyErr {\n    return { ok: false, code, message };\n}\n","// Pure-function state machine — SPEC §4.4.\n//\n// Transition table (paraphrased):\n//\n//   abandonment present      → broken (always; no honorable exit, §5.4)\n//   contradictory outcomes   → disputed (§4.5)\n//   outcome present          → outcome.outcome   (after dispute window passes)\n//   now >= expires_at        → expired_unresolved\n//   now >= resolves_at       → resolvable\n//   else                     → pending\n//\n// `resolves_at` normalization (§4.4):\n//   - time-typed: use the wall-clock timestamp directly.\n//   - block-typed: use the wall-clock time of that block. If chain.blockTimes\n//     names it, use that. Else if chain.tip_height >= block, conservatively\n//     use chain.tip_time (the block has been mined). Else +infinity (the\n//     block hasn't been mined yet → still pending).\n\nimport type {\n    ClassifyStateInput,\n    OutcomeEnvelope,\n    PledgeEnvelope,\n    PledgeState,\n} from './types.js';\n\nexport function classifyState(input: ClassifyStateInput): PledgeState {\n    const { pledge, outcome, abandonment, now, contradictoryOutcomes } = input;\n    const nowMs = parseUtc(now);\n\n    // Abandonment trumps everything: SPEC §5.4 — no honorable-exit path.\n    if (abandonment !== null) {\n        // Trust the caller to have signature-verified the abandonment via\n        // verifyAbandonment(); state classification is a pure function of\n        // valid inputs.\n        return 'broken';\n    }\n\n    // Contradictory outcome envelopes from authorized resolvers → disputed.\n    if (outcome !== null && contradictoryOutcomes && contradictoryOutcomes.length > 0) {\n        for (const other of contradictoryOutcomes) {\n            if (other.pledge_id === outcome.pledge_id && other.outcome !== outcome.outcome) {\n                return 'disputed';\n            }\n        }\n    }\n\n    if (outcome !== null) {\n        // Note: outcome.outcome can be 'expired_unresolved' or 'disputed' too;\n        // the state machine just returns whatever the resolver classified.\n        // The dispute_window_ends_at gate is informational here — verifiers\n        // wanting \"provisional vs final\" distinction should branch on it\n        // themselves; we return the eventual classification.\n        return outcome.outcome;\n    }\n\n    const expiresAtMs = parseUtc(pledge.expires_at);\n    if (nowMs >= expiresAtMs) {\n        return 'expired_unresolved';\n    }\n\n    const resolvesAtMs = normalizeResolvesAt(pledge, input.chain);\n    if (resolvesAtMs !== null && nowMs >= resolvesAtMs) {\n        return 'resolvable';\n    }\n\n    return 'pending';\n}\n\nfunction normalizeResolvesAt(\n    pledge: PledgeEnvelope,\n    chain?: ClassifyStateInput['chain'],\n): number | null {\n    const r = pledge.resolves_at;\n    if ('time' in r) return parseUtc(r.time);\n    if ('block' in r) {\n        if (!chain) return null; // +infinity — pledge stays pending without chain context\n        if (chain.blockTimes && chain.blockTimes[r.block]) {\n            return parseUtc(chain.blockTimes[r.block]!);\n        }\n        if (chain.tip_height >= r.block) {\n            // Block has been mined; we don't know its exact time but we know\n            // it's been mined by `tip_time`. Conservative: use tip_time as an\n            // upper bound on the resolves moment. Verifiers wanting a precise\n            // wall-clock SHOULD inject blockTimes[r.block].\n            return parseUtc(chain.tip_time);\n        }\n        return null; // not yet mined\n    }\n    return null;\n}\n\n/**\n * Parse a strict ISO 8601 UTC timestamp (YYYY-MM-DDTHH:MM:SSZ) into epoch ms.\n * No fractional seconds, no offsets other than `Z` — SPEC §0.\n */\nfunction parseUtc(s: string): number {\n    const m = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})Z$/.exec(s);\n    if (!m) throw new Error(`invalid ISO 8601 UTC string: ${s}`);\n    const [, y, mo, d, h, mi, se] = m;\n    return Date.UTC(\n        Number(y),\n        Number(mo) - 1,\n        Number(d),\n        Number(h),\n        Number(mi),\n        Number(se),\n    );\n}\n\n/**\n * Detect whether two outcome envelopes for the same pledge are contradictory.\n * Two outcomes contradict when they reference the same pledge_id AND classify\n * to different outcome values (kept vs broken etc).\n */\nexport function outcomesContradict(a: OutcomeEnvelope, b: OutcomeEnvelope): boolean {\n    if (a.pledge_id !== b.pledge_id) return false;\n    return a.outcome !== b.outcome;\n}\n","// Bond verification — SPEC §8.\n//\n// The SDK ships the algorithm; the chain accessor is injected by the caller.\n// This is the same shape as @orangecheck/stamp-core's verifyOtsAnchor: the\n// SDK can't bundle a Bitcoin RPC client without imposing an opinion on every\n// consumer (browser vs Node vs CLI vs mobile).\n\nimport type {\n    PledgeEnvelope,\n    VerifyBondInput,\n    VerifyBondResult,\n} from './types.js';\n\n/**\n * Run §8 verifyBond against a caller-supplied attestation lookup.\n *\n * Returns:\n *   { ok: true, sats_bonded, days_unspent } when the bond clears all gates.\n *\n *   { ok: false, code, message } with one of:\n *     - E_BOND_NOT_FOUND          attestation lookup returned null\n *     - E_BOND_ADDRESS_MISMATCH   attestation.address != pledge.swearer\n *     - E_BOND_SPENT              utxo spent at or before `now`\n *     - E_BOND_INSUFFICIENT_SATS  sats_bonded < pledge.bond.min_sats\n *     - E_BOND_INSUFFICIENT_DAYS  days_unspent < pledge.bond.min_days\n *\n * Note that bond verification is a *live* check — the result depends on\n * chain state at `now`, not at the moment the pledge was sworn. SPEC §8\n * mandates this for any consequential decision.\n */\nexport async function verifyBond(input: VerifyBondInput): Promise<VerifyBondResult> {\n    const { pledge, now, lookup } = input;\n\n    const attestation = await lookup(pledge.bond.attestation_id, now);\n    if (attestation === null) {\n        return {\n            ok: false,\n            code: 'E_BOND_NOT_FOUND',\n            message: `attestation ${pledge.bond.attestation_id} not found`,\n        };\n    }\n\n    if (attestation.address !== pledge.swearer.address) {\n        return {\n            ok: false,\n            code: 'E_BOND_ADDRESS_MISMATCH',\n            message: `attestation.address (${attestation.address}) != pledge.swearer.address (${pledge.swearer.address})`,\n        };\n    }\n\n    if (attestation.utxo_spent_at_or_before_now) {\n        return {\n            ok: false,\n            code: 'E_BOND_SPENT',\n            message: 'bonded UTXO spent at or before verifier now',\n        };\n    }\n\n    if (attestation.sats_bonded < pledge.bond.min_sats) {\n        return {\n            ok: false,\n            code: 'E_BOND_INSUFFICIENT_SATS',\n            message: `sats_bonded (${attestation.sats_bonded}) < min_sats (${pledge.bond.min_sats})`,\n        };\n    }\n\n    if (attestation.days_unspent < pledge.bond.min_days) {\n        return {\n            ok: false,\n            code: 'E_BOND_INSUFFICIENT_DAYS',\n            message: `days_unspent (${attestation.days_unspent}) < min_days (${pledge.bond.min_days})`,\n        };\n    }\n\n    return {\n        ok: true,\n        sats_bonded: attestation.sats_bonded,\n        days_unspent: attestation.days_unspent,\n    };\n}\n\n/**\n * Convenience: pull the bond constraints out of a pledge envelope as a flat\n * { min_sats, min_days, attestation_id } record. Equivalent to reading\n * `pledge.bond` directly; exported for callers that want the explicit shape.\n */\nexport function bondConstraints(pledge: PledgeEnvelope): {\n    attestation_id: string;\n    min_sats: number;\n    min_days: number;\n} {\n    return {\n        attestation_id: pledge.bond.attestation_id,\n        min_sats: pledge.bond.min_sats,\n        min_days: pledge.bond.min_days,\n    };\n}\n","// Resolution-grammar validation — SPEC §3.4.\n//\n// The seven mechanisms each have a fixed-shape query string. This module\n// validates that a query string conforms to its mechanism's grammar at the\n// regex level. Full evaluation against public state (querying chain RPC,\n// fetching HTTP, resolving DNS-over-HTTPS) is out of scope here — pledge-core\n// stays a pure SDK; consumers wire I/O.\n//\n// The grammars are loose on purpose — SPEC §3.4 describes the canonical\n// forms but allows mechanism-specific extensions through REGISTRY.md. The\n// regexes accept the canonical forms documented in the SPEC plus their\n// straightforward combinations (e.g. `chain_state` AND-joined predicates).\n//\n// `self_proof` is explicitly refused (§3.4.8); validateResolutionQuery returns\n// an error code for any attempt.\n\nimport type { ResolutionMechanism } from './types.js';\n\nexport type ResolutionValidateResult =\n    | { ok: true; mechanism: ResolutionMechanism }\n    | { ok: false; code: 'E_RESOLUTION_UNKNOWN' | 'E_RESOLUTION_NONDETERMINISTIC'; reason: string };\n\nconst ALLOWED_MECHANISMS: ResolutionMechanism[] = [\n    'chain_state',\n    'counterparty_signs',\n    'nostr_event_exists',\n    'stamp_published',\n    'http_get_hash',\n    'dns_record',\n    'vote_resolves',\n];\n\nconst REFUSED_MECHANISMS = ['self_proof'];\n\n// Regexes for each mechanism's canonical query grammar (SPEC §3.4.1–§3.4.7).\nconst CHAIN_STATE_ATOM = new RegExp(\n    [\n        // block(N).hash.startsWith(hex_prefix)\n        /block\\(\\d+\\)\\.hash\\.startsWith\\([0-9a-fA-F]+\\)/.source,\n        // block(N).exists\n        /block\\(\\d+\\)\\.exists/.source,\n        // tx(txid).confirmed\n        /tx\\([0-9a-fA-F]{64}\\)\\.confirmed/.source,\n        // tx(txid).confirmations >= N\n        /tx\\([0-9a-fA-F]{64}\\)\\.confirmations\\s*>=\\s*\\d+/.source,\n        // address(addr).balance OP <sats>\n        /address\\([^)]+\\)\\.balance\\s*(?:>=|<=|<|>|==)\\s*\\d+(?:\\s+AT\\s+block\\(\\d+\\))?/.source,\n        // address(addr).utxo_count OP <N>\n        /address\\([^)]+\\)\\.utxo_count\\s*(?:>=|<=|<|>|==)\\s*\\d+/.source,\n    ].join('|'),\n);\n\nconst COUNTERPARTY_SIGNS_RE = /^counterparty\\([^)]+\\)\\s+signs\\s+outcome\\s+over\\s+pledge_id$/;\n\nconst NOSTR_EVENT_EXISTS_RE =\n    /^kind=\\d+\\s+author=\\S+(?:\\s+tag\\([^)]+\\)=\\S+)?\\s+created_at_before=\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/;\n\nconst STAMP_PUBLISHED_RE = /^stamp\\(content_hash=sha256:[0-9a-f]{64},\\s*signer=\\S+\\)$/;\n\nconst HTTP_GET_HASH_RE = /^GET\\s+https:\\/\\/\\S+\\s+body_sha256\\s*==\\s*[0-9a-f]{64}$/;\n\nconst DNS_RECORD_RE = /^(?:A|AAAA|TXT|CAA|MX|CNAME)\\s+\\S+\\s*==\\s*\\S.*$/;\n\nconst VOTE_RESOLVES_RE =\n    /^poll_id=[0-9a-f]{64}\\s+option=\\S+\\s+threshold=(?:0(?:\\.\\d+)?|1(?:\\.0+)?)$/;\n\n/**\n * Validate the (mechanism, query) pair against §3.4.\n *\n * Returns ok+mechanism for the seven legitimate mechanisms with conforming\n * queries; returns error otherwise. The error code matches SPEC §10\n * (E_RESOLUTION_UNKNOWN for unknown mechanisms, E_RESOLUTION_NONDETERMINISTIC\n * for self_proof attempts and malformed query strings).\n */\nexport function validateResolutionQuery(\n    mechanism: string,\n    query: string,\n): ResolutionValidateResult {\n    if (REFUSED_MECHANISMS.includes(mechanism)) {\n        return {\n            ok: false,\n            code: 'E_RESOLUTION_NONDETERMINISTIC',\n            reason: `mechanism \"${mechanism}\" is explicitly refused (SPEC §3.4.8 / WHY §H3)`,\n        };\n    }\n    if (!ALLOWED_MECHANISMS.includes(mechanism as ResolutionMechanism)) {\n        return {\n            ok: false,\n            code: 'E_RESOLUTION_UNKNOWN',\n            reason: `mechanism \"${mechanism}\" is not in the SPEC §3.4 set`,\n        };\n    }\n\n    const m = mechanism as ResolutionMechanism;\n\n    if (/[\\n\\r]/.test(query)) {\n        return {\n            ok: false,\n            code: 'E_RESOLUTION_NONDETERMINISTIC',\n            reason: 'query must be a single line (no LF or CR)',\n        };\n    }\n    if (new TextEncoder().encode(query).byteLength > 1024) {\n        return {\n            ok: false,\n            code: 'E_RESOLUTION_NONDETERMINISTIC',\n            reason: 'query exceeds 1024 UTF-8 bytes',\n        };\n    }\n\n    switch (m) {\n        case 'chain_state': {\n            // Allow `<atom>` and `<atom> AND <atom> AND ...`.\n            const parts = query.split(/\\s+AND\\s+/);\n            for (const p of parts) {\n                if (!new RegExp(`^(?:${CHAIN_STATE_ATOM.source})$`).test(p.trim())) {\n                    return rNonDet(`chain_state predicate not in §3.4.1 grammar: \"${p}\"`);\n                }\n            }\n            return { ok: true, mechanism: m };\n        }\n        case 'counterparty_signs':\n            if (!COUNTERPARTY_SIGNS_RE.test(query)) {\n                return rNonDet('counterparty_signs query must match §3.4.2 canonical form');\n            }\n            return { ok: true, mechanism: m };\n        case 'nostr_event_exists':\n            if (!NOSTR_EVENT_EXISTS_RE.test(query)) {\n                return rNonDet('nostr_event_exists query not in §3.4.3 grammar');\n            }\n            return { ok: true, mechanism: m };\n        case 'stamp_published':\n            if (!STAMP_PUBLISHED_RE.test(query)) {\n                return rNonDet('stamp_published query not in §3.4.4 grammar');\n            }\n            return { ok: true, mechanism: m };\n        case 'http_get_hash':\n            if (!HTTP_GET_HASH_RE.test(query)) {\n                return rNonDet('http_get_hash query not in §3.4.5 grammar');\n            }\n            return { ok: true, mechanism: m };\n        case 'dns_record':\n            if (!DNS_RECORD_RE.test(query)) {\n                return rNonDet('dns_record query not in §3.4.6 grammar');\n            }\n            return { ok: true, mechanism: m };\n        case 'vote_resolves':\n            if (!VOTE_RESOLVES_RE.test(query)) {\n                return rNonDet('vote_resolves query not in §3.4.7 grammar');\n            }\n            return { ok: true, mechanism: m };\n    }\n}\n\nfunction rNonDet(reason: string): ResolutionValidateResult {\n    return { ok: false, code: 'E_RESOLUTION_NONDETERMINISTIC', reason };\n}\n"]}