@dignetwork/dig-sdk 0.3.3 → 0.4.1
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 +2 -2
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/methods.ts","../src/errors.ts","../src/provider/injected.ts","../src/provider/wc-retry.ts","../src/provider/walletconnect.ts","../src/provider/methods.ts","../src/provider/chia-provider.ts","../src/paywall.ts","../src/loader.ts","../src/urn.ts","../src/dig-client.ts","../src/capabilities.ts"],"names":["strip0x","require"],"mappings":"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","file":"index.cjs","sourcesContent":["// The canonical CHIP-0002 / chia wallet method surface — the SINGLE source of truth shared by both\n// transports (injected window.chia and WalletConnect→Sage) so they can never drift. Extracted +\n// genericized from hub.dig.net's apps/web/lib/wallet-methods.js (the hub's \"#40\" parity list),\n// with the hub-app specifics removed.\n//\n// A method present in one transport but not the other is a real bug: a WalletConnect session that\n// omits (say) `chia_takeOffer` rejects the offer flow LOCALLY (SignClient never sends it), while\n// the same flow works against an injected wallet — an asymmetry the user experiences as \"works in\n// one place, silently fails in the other\". Keeping ONE list shared makes parity structural.\n\n/** The canonical CHIP-0002 / chia method names the SDK negotiates with the wallet. */\nexport const WALLET_METHODS = [\n \"chip0002_connect\",\n \"chip0002_chainId\",\n \"chip0002_getPublicKeys\",\n \"chip0002_getAssetCoins\",\n \"chip0002_getAssetBalance\",\n \"chip0002_signCoinSpends\",\n \"chip0002_signMessage\",\n \"chia_getAddress\",\n \"chia_signMessageByAddress\",\n \"chia_takeOffer\",\n] as const;\n\n/** Union of the canonical wallet method names. */\nexport type WalletMethod = (typeof WALLET_METHODS)[number];\n\n/**\n * Message-signing methods in preference order. `signMessage` tries the first one the active\n * session granted: `chia_signMessageByAddress` (sign by address, the login-challenge path) with\n * `chip0002_signMessage` (sign by public key) as the fallback — both are negotiated so a session\n * grants whichever the wallet supports.\n */\nexport const SIGN_METHODS = [\n \"chia_signMessageByAddress\",\n \"chip0002_signMessage\",\n] as const;\n\n/** Default Chia chain id (CAIP-2). Mainnet — there is no testnet flow. */\nexport const DEFAULT_CHAIN = \"chia:mainnet\";\n","// The SDK's typed error taxonomy — the machine-readable failure contract.\n//\n// Every failure the SDK surfaces is a `DigSdkError` (an `Error` subclass) carrying a STABLE,\n// documented `.code` (UPPER_SNAKE) plus structured context fields. An agent (or a UI) can branch on\n// `err.code` instead of string-matching the human `.message`, and the catalogue is discoverable from\n// the `.d.ts` via the exported `DIG_SDK_ERROR_CODES` const and the `DigSdkErrorCode` union.\n//\n// The codes are symbolic and never derived from the human message — the message is for humans, the\n// code is for machines. Keep this catalogue and the README \"Error codes\" table in lockstep.\n\n/**\n * The stable error-code catalogue. Each value is an UPPER_SNAKE symbolic string that callers may\n * branch on. Frozen so it can't be mutated at runtime; the README documents each meaning.\n */\nexport const DIG_SDK_ERROR_CODES = Object.freeze({\n // ---- provider / connect (provider/chia-provider.ts, provider/*) ----\n /** WalletConnect was requested/needed but no `walletConnect` options were supplied. */\n WC_OPTIONS_REQUIRED: \"WC_OPTIONS_REQUIRED\",\n /** `mode: \"injected\"` (or the injected leg of `auto`) found no usable `window.chia`. */\n NO_INJECTED_WALLET: \"NO_INJECTED_WALLET\",\n /** The optional `@walletconnect/sign-client` peer dependency is not installed/usable. */\n WC_DEPENDENCY_MISSING: \"WC_DEPENDENCY_MISSING\",\n /** The active wallet session/transport does not grant the requested method. */\n METHOD_NOT_SUPPORTED: \"METHOD_NOT_SUPPORTED\",\n /** A wallet RPC timed out (e.g. Sage did not respond within the per-request timeout). */\n WALLET_TIMEOUT: \"WALLET_TIMEOUT\",\n /** The wallet returned no public keys / no key to sign with. */\n WALLET_NO_KEYS: \"WALLET_NO_KEYS\",\n\n // ---- read-crypto / RPC (dig-client.ts, loader.ts) ----\n /** A content read needs a confirmed on-chain root and none was supplied/derivable. */\n ROOT_REQUIRED: \"ROOT_REQUIRED\",\n /** The resource did not decrypt+authenticate under this URN (wrong key/salt, or a decoy). */\n DECRYPT_FAILED: \"DECRYPT_FAILED\",\n /** The dig RPC could not be reached (network/transport failure). */\n RPC_TRANSPORT: \"RPC_TRANSPORT\",\n /** The dig RPC responded with an HTTP error or a JSON-RPC `error` object. */\n RPC_ERROR: \"RPC_ERROR\",\n /** The dig RPC returned a malformed / inconsistent payload (e.g. chunk-length mismatch). */\n RPC_MALFORMED_RESPONSE: \"RPC_MALFORMED_RESPONSE\",\n /** The read-crypto wasm failed its SRI integrity check — fail closed. */\n WASM_INTEGRITY: \"WASM_INTEGRITY\",\n /** The read-crypto wasm could not be loaded (fetch/resolve failure). */\n WASM_LOAD_FAILED: \"WASM_LOAD_FAILED\",\n\n // ---- paywall / spends (paywall.ts) ----\n /** The canonical chip35 wasm builder for this operation is unavailable (never hand-rolled). */\n SPEND_BUILDER_UNAVAILABLE: \"SPEND_BUILDER_UNAVAILABLE\",\n /** No secure random source was available to generate a payment nonce. */\n NO_SECURE_RANDOM: \"NO_SECURE_RANDOM\",\n\n // ---- deploy / adapters (adapters/run.ts, adapters/deploy.ts) ----\n /** The `digstore` binary could not be spawned (not installed / not on PATH). */\n DIGSTORE_NOT_FOUND: \"DIGSTORE_NOT_FOUND\",\n /** `digstore deploy` exited non-zero. */\n DEPLOY_FAILED: \"DEPLOY_FAILED\",\n /** `digstore deploy --json` output could not be parsed into a capsule result. */\n DEPLOY_OUTPUT_UNPARSEABLE: \"DEPLOY_OUTPUT_UNPARSEABLE\",\n\n // ---- argument validation (shared) ----\n /** An argument was malformed (e.g. a non-hex string, a bad URN, mutually-exclusive options). */\n INVALID_ARGUMENT: \"INVALID_ARGUMENT\",\n} as const);\n\n/** The union of every stable SDK error code. Branch on `err.code` against these. */\nexport type DigSdkErrorCode = (typeof DIG_SDK_ERROR_CODES)[keyof typeof DIG_SDK_ERROR_CODES];\n\n/** Structured, code-specific context attached to a {@link DigSdkError}. All fields optional. */\nexport interface DigSdkErrorContext {\n /** The dig RPC method involved (RPC_* errors). */\n rpcMethod?: string;\n /** The HTTP status returned (RPC_ERROR on a non-2xx). */\n httpStatus?: number;\n /** The JSON-RPC error code returned by the server (RPC_ERROR). */\n rpcCode?: number;\n /** The `digstore` process exit code (DEPLOY_FAILED). */\n exitCode?: number | null;\n /** The wallet method that was unsupported (METHOD_NOT_SUPPORTED). */\n method?: string;\n /** The connection mode in play (provider errors). */\n mode?: string;\n /** The offending value (INVALID_ARGUMENT — e.g. the bad hex / URN). */\n value?: string;\n /** The expected vs actual SRI digest (WASM_INTEGRITY). */\n expected?: string;\n actual?: string;\n /** Any further structured detail; kept open so codes can carry extra fields. */\n [key: string]: unknown;\n}\n\n/**\n * The SDK's typed error. Always thrown (never a bare `Error`) so consumers can branch on `.code`.\n *\n * @example\n * try {\n * await dig.read({ urn });\n * } catch (e) {\n * if (e instanceof DigSdkError && e.code === \"ROOT_REQUIRED\") promptForRoot();\n * else throw e;\n * }\n */\n/**\n * A brand stamped on every {@link DigSdkError}. The SDK ships several independently-bundled entry\n * points (index, adapters, vite, next, dig-client), each of which inlines its own copy of this\n * module — so two `DigSdkError`s can have DIFFERENT class identities across bundles and a plain\n * `instanceof` would miss one. {@link isDigSdkError} brand-checks instead, so a coded error thrown\n * from `@dignetwork/dig-sdk/adapters` is still recognized by `isDigSdkError` imported from the main\n * entry. Non-enumerable so it never shows up in `toJSON()` / spreads.\n */\nconst DIG_SDK_ERROR_BRAND = \"__dignetwork_dig_sdk_error__\";\n\nexport class DigSdkError extends Error {\n /** The stable machine code (UPPER_SNAKE). Branch on this, not the message. */\n readonly code: DigSdkErrorCode;\n /** Structured, code-specific context (rpcMethod, httpStatus, exitCode, …). */\n readonly context: DigSdkErrorContext;\n\n constructor(\n code: DigSdkErrorCode,\n message: string,\n context: DigSdkErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message);\n this.name = \"DigSdkError\";\n this.code = code;\n this.context = context;\n // Set `cause` directly (rather than via the ES2022 Error options arg) so the lib target stays\n // ES2020 while still preserving the underlying error for diagnostics.\n if (options.cause !== undefined) {\n (this as { cause?: unknown }).cause = options.cause;\n }\n // Brand the instance (non-enumerable) so isDigSdkError recognizes it across bundle boundaries.\n Object.defineProperty(this, DIG_SDK_ERROR_BRAND, { value: true, enumerable: false });\n // Preserve a correct prototype chain when compiled to ES5-ish targets / across realms.\n Object.setPrototypeOf(this, DigSdkError.prototype);\n }\n\n /** A JSON-friendly view of the error: `{ code, message, context }`. */\n toJSON(): { code: DigSdkErrorCode; message: string; context: DigSdkErrorContext } {\n return { code: this.code, message: this.message, context: this.context };\n }\n}\n\n/**\n * True iff `e` is a {@link DigSdkError} (optionally with a specific `code`). Uses a non-enumerable\n * BRAND rather than `instanceof` so it recognizes coded errors thrown from any of the SDK's\n * separately-bundled entry points (the main entry and `/adapters` inline distinct class identities).\n */\nexport function isDigSdkError(e: unknown, code?: DigSdkErrorCode): e is DigSdkError {\n const branded =\n e instanceof DigSdkError ||\n (typeof e === \"object\" && e !== null && (e as Record<string, unknown>)[DIG_SDK_ERROR_BRAND] === true);\n return branded && (code === undefined || (e as DigSdkError).code === code);\n}\n","// Injected-provider transport — the DIG Browser's in-process wallet (and compatible CHIP-0002\n// extensions), exposed on every page as `window.chia`. When present the SDK PREFERS it over\n// WalletConnect: no QR, no relay, no pairing. The native provider returns the SAME response shapes\n// Sage returns over WalletConnect, so the normalizers in provider/methods.ts are unchanged — only\n// the TRANSPORT differs. Genericized from hub.dig.net/apps/web/lib/injected-wallet.js.\n//\n// Detection: we key on the explicit, unspoofable `isDIG` marker the DIG Browser provider sets, not\n// merely the presence of `window.chia` (a different Chia provider could also define that).\n\nimport type { InjectedChiaProvider, WalletBackend } from \"../types.js\";\nimport { WALLET_METHODS, DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** The injected provider on the current global, or undefined when not running in a DIG Browser. */\nexport function getInjectedProvider(): InjectedChiaProvider | undefined {\n const g = globalThis as { chia?: InjectedChiaProvider };\n return typeof g !== \"undefined\" ? g.chia : undefined;\n}\n\n/**\n * True iff an injected DIG wallet is available. Detects on the unspoofable `isDIG` marker. Pass\n * `{ anyChia: true }` to accept any `window.chia` that implements `request` (e.g. a non-DIG\n * CHIP-0002 extension).\n */\nexport function isInjectedAvailable(opts: { anyChia?: boolean } = {}): boolean {\n const p = getInjectedProvider();\n if (!p) return false;\n if (opts.anyChia) return typeof p.request === \"function\";\n return !!p.isDIG;\n}\n\n/** Sentinel topic for the injected backend (it has no per-session relay topic). */\nexport const INJECTED_TOPIC = \"injected\";\n\n/** A WalletTransport backed by the injected window.chia provider. */\nexport class InjectedTransport implements WalletTransport {\n readonly backend: WalletBackend = \"injected\";\n readonly topic = INJECTED_TOPIC;\n readonly chain: string;\n private readonly provider: InjectedChiaProvider;\n\n constructor(provider: InjectedChiaProvider, chain: string = DEFAULT_CHAIN) {\n this.provider = provider;\n this.chain = chain;\n }\n\n /** Connect: ask the native wallet to approve this origin. Blocks until approved/rejected. */\n async connect(eager = false): Promise<void> {\n if (typeof this.provider.connect === \"function\") {\n await this.provider.connect(eager);\n }\n // A provider without connect() (older build) is tolerated — request() will gate per-method.\n }\n\n // The native wallet implements the full canonical set (it returns Sage-shaped responses), so\n // support is a static allowlist — no per-session negotiation as with WalletConnect.\n supports(method: string): boolean {\n return (WALLET_METHODS as readonly string[]).includes(method);\n }\n\n async request(method: string, params: unknown): Promise<unknown> {\n if (!this.supports(method)) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n `The DIG Browser wallet does not support \"${method}\".`,\n { method },\n );\n }\n return this.provider.request({ method, params });\n }\n\n async disconnect(): Promise<void> {\n // The injected wallet has no per-session teardown; per-origin consent is managed in the wallet.\n }\n}\n","// The transient-relay-publish detector — the double-prompt safety boundary. Lives in its own\n// dependency-free module (no @walletconnect/sign-client) so it can be unit-tested under\n// `node --test`. Ported verbatim in spirit from hub.dig.net/apps/web/lib/wc-retry.js.\n//\n// A WalletConnect request can fail in two very different ways:\n// • the relay failed to PUBLISH the request (it never reached the wallet) — safe to retry, the\n// wallet never saw it, so a retry can't double-prompt or double-sign; OR\n// • the wallet/user rejected, or the response timed out — NOT safe to retry.\n// Only the first is transient. This predicate decides which.\n\n/** True iff `err` looks like a transient relay-publish failure (request never reached the wallet). */\nexport function isTransientPublishError(err: unknown): boolean {\n const msg = (\n err instanceof Error ? err.message : typeof err === \"string\" ? err : \"\"\n ).toLowerCase();\n if (!msg) return false;\n return (\n msg.includes(\"publish\") ||\n msg.includes(\"failed or timed out to publish\") ||\n msg.includes(\"websocket connection failed\") ||\n msg.includes(\"connection closed\") ||\n msg.includes(\"socket stalled\") ||\n msg.includes(\"request reset\")\n );\n}\n","// WalletConnect v2 → Sage transport. Genericized from hub.dig.net/apps/web/lib/walletconnect.js,\n// keeping the production-proven patterns and removing the hub-app specifics:\n// • optionalNamespaces ONLY (Sage rejects requiredNamespaces),\n// • the canonical CHIP-0002 method set (src/methods.ts),\n// • a per-request response timeout (a backgrounded mobile Sage can hang forever),\n// • bounded retries for transient relay-PUBLISH failures only (never double-prompts),\n// • session restore gated on a sign method being granted.\n//\n// `@walletconnect/sign-client` is an OPTIONAL peer dependency — it's imported dynamically so the\n// rest of the SDK (DigClient, injected transport) loads without it. Apps that use the WC fallback\n// install it; apps that only target the DIG Browser don't pay for it.\n\nimport { WALLET_METHODS, SIGN_METHODS, DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletBackend } from \"../types.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport { isTransientPublishError } from \"./wc-retry.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** App metadata shown to the wallet during pairing. */\nexport interface WalletConnectMetadata {\n name: string;\n description: string;\n url: string;\n icons: string[];\n}\n\n/** Options to start a WalletConnect connection. */\nexport interface WalletConnectOptions {\n /** WalletConnect Cloud project id (required by the relay). */\n projectId: string;\n /** App metadata shown in the wallet. */\n metadata: WalletConnectMetadata;\n /** CAIP-2 chain id. Defaults to \"chia:mainnet\". */\n chain?: string;\n /** Per-request response timeout (ms). Default 60_000. */\n requestTimeoutMs?: number;\n /**\n * Called with the pairing URI so the app can render a QR / copy-link. The returned/awaited\n * approval resolves to the session once the user approves in the wallet.\n */\n onUri?: (uri: string) => void;\n}\n\n// Minimal structural types for the parts of SignClient we use (avoids a hard type dependency).\ninterface WcSession {\n topic: string;\n namespaces?: { chia?: { methods?: string[] } };\n}\ninterface WcSignClient {\n connect(args: {\n optionalNamespaces: Record<string, { methods: string[]; chains: string[]; events: string[] }>;\n }): Promise<{ uri?: string; approval: () => Promise<WcSession> }>;\n request(args: {\n topic: string;\n chainId: string;\n request: { method: string; params: unknown };\n }): Promise<unknown>;\n disconnect(args: { topic: string; reason: { code: number; message: string } }): Promise<void>;\n session: {\n get(topic: string): WcSession | undefined;\n getAll(): WcSession[];\n };\n}\n\n/** A WalletTransport backed by WalletConnect → Sage. */\nexport class WalletConnectTransport implements WalletTransport {\n readonly backend: WalletBackend = \"walletconnect\";\n readonly chain: string;\n readonly topic: string;\n private readonly client: WcSignClient;\n private readonly requestTimeoutMs: number;\n\n private constructor(\n client: WcSignClient,\n session: WcSession,\n chain: string,\n requestTimeoutMs: number,\n ) {\n this.client = client;\n this.topic = session.topic;\n this.chain = chain;\n this.requestTimeoutMs = requestTimeoutMs;\n }\n\n /**\n * Initialize SignClient, open a pairing (emitting the URI via `onUri`), and resolve to a\n * connected transport once the user approves in Sage. Requires `@walletconnect/sign-client`.\n */\n static async connect(options: WalletConnectOptions): Promise<WalletConnectTransport> {\n const chain = options.chain ?? DEFAULT_CHAIN;\n const timeout = options.requestTimeoutMs ?? 60_000;\n const SignClient = await loadSignClient();\n const client = (await SignClient.init({\n logger: \"error\",\n projectId: options.projectId,\n metadata: options.metadata,\n })) as unknown as WcSignClient;\n const { uri, approval } = await client.connect({\n // optionalNamespaces ONLY — Sage rejects requiredNamespaces.\n optionalNamespaces: {\n chia: { methods: WALLET_METHODS as unknown as string[], chains: [chain], events: [] },\n },\n });\n if (uri && options.onUri) options.onUri(uri);\n const session = await approval();\n return new WalletConnectTransport(client, session, chain, timeout);\n }\n\n /**\n * Restore an existing session that grants a sign method (so message signing actually reaches\n * Sage). Returns a transport or null if none qualifies. Requires `@walletconnect/sign-client`.\n */\n static async restore(options: {\n projectId: string;\n metadata: WalletConnectMetadata;\n chain?: string;\n requestTimeoutMs?: number;\n }): Promise<WalletConnectTransport | null> {\n const chain = options.chain ?? DEFAULT_CHAIN;\n const timeout = options.requestTimeoutMs ?? 60_000;\n const SignClient = await loadSignClient();\n const client = (await SignClient.init({\n logger: \"error\",\n projectId: options.projectId,\n metadata: options.metadata,\n })) as unknown as WcSignClient;\n const sessions = client.session.getAll();\n for (let i = sessions.length - 1; i >= 0; i--) {\n const s = sessions[i]!;\n const methods = s.namespaces?.chia?.methods ?? [];\n if ((SIGN_METHODS as readonly string[]).some((m) => methods.includes(m))) {\n return new WalletConnectTransport(client, s, chain, timeout);\n }\n }\n return null;\n }\n\n private sessionMethods(): string[] {\n try {\n return this.client.session.get(this.topic)?.namespaces?.chia?.methods ?? [];\n } catch {\n return [];\n }\n }\n\n // True iff the active session granted `method` (empty list = unknown ⇒ treated as granted).\n supports(method: string): boolean {\n const m = this.sessionMethods();\n return m.length === 0 || m.includes(method);\n }\n\n async request(method: string, params: unknown): Promise<unknown> {\n if (!this.supports(method)) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n `Your wallet session does not grant \"${method}\". Disconnect and reconnect your wallet ` +\n \"to refresh the session (and make sure Sage is up to date).\",\n { method },\n );\n }\n const MAX_ATTEMPTS = 3;\n let lastErr: unknown;\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n try {\n return await this.attempt(method, params);\n } catch (e) {\n lastErr = e;\n // Only retry transient relay-publish failures (request never reached Sage). Timeouts and\n // wallet/user rejections fall through and throw immediately.\n if (i < MAX_ATTEMPTS - 1 && isTransientPublishError(e)) {\n await sleep(1200 * (i + 1));\n continue;\n }\n throw e;\n }\n }\n throw lastErr;\n }\n\n private attempt(method: string, params: unknown): Promise<unknown> {\n let t: ReturnType<typeof setTimeout>;\n const timeout = new Promise<never>((_, rej) => {\n t = setTimeout(\n () =>\n rej(\n new DigSdkError(\n \"WALLET_TIMEOUT\",\n \"Sage did not respond — open the Sage app and try again.\",\n { method, timeoutMs: this.requestTimeoutMs },\n ),\n ),\n this.requestTimeoutMs,\n );\n });\n return Promise.race([\n this.client.request({ topic: this.topic, chainId: this.chain, request: { method, params } }),\n timeout,\n ]).finally(() => clearTimeout(t));\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.client.disconnect({\n topic: this.topic,\n reason: { code: 6000, message: \"bye\" },\n });\n } catch {\n /* best-effort */\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n// Dynamically import the optional peer dep, with a clear error if it isn't installed.\nasync function loadSignClient(): Promise<{ init(opts: unknown): Promise<unknown> }> {\n try {\n // Optional peer dependency — may not be installed (e.g. an injected-only dapp). The dynamic\n // import is wrapped so a missing module surfaces as the actionable error below, and the\n // specifier is suppressed for type resolution since the package is not a hard dependency.\n // @ts-ignore -- optional peer dependency, not resolvable when uninstalled\n const mod = (await import(\"@walletconnect/sign-client\")) as {\n default?: { init(opts: unknown): Promise<unknown> };\n init?(opts: unknown): Promise<unknown>;\n };\n const SignClient = mod.default ?? (mod as { init(opts: unknown): Promise<unknown> });\n if (!SignClient || typeof SignClient.init !== \"function\") {\n throw new Error(\"unexpected @walletconnect/sign-client shape\");\n }\n return SignClient;\n } catch (e) {\n throw new DigSdkError(\n \"WC_DEPENDENCY_MISSING\",\n \"WalletConnect fallback requires the optional peer dependency '@walletconnect/sign-client'. \" +\n \"Install it (npm i @walletconnect/sign-client) to use the WalletConnect→Sage transport.\",\n {},\n { cause: e },\n );\n }\n}\n","// CHIP-0002 response-shape normalizers — the tolerant adapters that turn wallet-specific casing\n// (with/without 0x, snake_case/camelCase, string-vs-object) into one canonical shape. Extracted\n// from hub.dig.net/apps/web/lib/sage.js and made transport-agnostic: each takes a `request`\n// function and a `supports` predicate, so the SAME normalizers serve both the injected and\n// WalletConnect transports.\n\nimport type { SignResult } from \"../types.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** A function that issues one CHIP-0002 RPC through some transport. */\nexport type RequestFn = (method: string, params: unknown) => Promise<unknown>;\n/** A predicate: does the active session grant `method`? */\nexport type SupportsFn = (method: string) => boolean;\n\n/** Ensure a hex string is `0x`-prefixed (or pass through null/empty). */\nexport function with0x(hex: string | null | undefined): string | null {\n if (!hex) return hex ?? null;\n return hex.startsWith(\"0x\") ? hex : `0x${hex}`;\n}\n\nfunction strip0x(h: unknown): string {\n return String(h ?? \"\").replace(/^0x/i, \"\").toLowerCase();\n}\n\n/** The wallet's receive address (tolerant of string / {address} / {data:{address}}). */\nexport async function getAddress(request: RequestFn): Promise<string | null> {\n const resp = await request(\"chia_getAddress\", {});\n if (typeof resp === \"string\") return resp;\n const r = resp as { address?: string; data?: { address?: string } } | null;\n return r?.address ?? r?.data?.address ?? null;\n}\n\n/** The wallet's (synthetic) public keys. */\nexport async function getPublicKeys(request: RequestFn): Promise<string[]> {\n const resp = await request(\"chip0002_getPublicKeys\", { limit: 500, offset: 0 });\n if (Array.isArray(resp)) return resp as string[];\n const r = resp as { publicKeys?: string[]; public_keys?: string[]; keys?: string[] } | null;\n return r?.publicKeys ?? r?.public_keys ?? r?.keys ?? [];\n}\n\n/** Normalize a wallet sign response into `{ publicKey, signature }` (0x-normalized). */\nfunction normalizeSig(resp: unknown): SignResult {\n const r = resp as\n | { publicKey?: string; public_key?: string; pubkey?: string;\n signature?: string; aggregatedSignature?: string; aggregated_signature?: string }\n | string\n | null;\n const publicKey =\n typeof r === \"object\" && r ? (r.publicKey ?? r.public_key ?? r.pubkey ?? null) : null;\n const signature =\n typeof r === \"string\"\n ? r\n : r\n ? (r.signature ?? r.aggregatedSignature ?? r.aggregated_signature ?? null)\n : null;\n return { publicKey: with0x(publicKey), signature };\n}\n\n/**\n * Sign a UTF-8 message with the wallet BLS key. Prefers `chia_signMessageByAddress` (sign by\n * address — the login-challenge path); falls back to `chip0002_signMessage` (sign by public key)\n * when the active session didn't grant the by-address method, so a real signature request still\n * reaches the wallet. Returns `{ publicKey, signature }`.\n */\nexport async function signMessage(\n request: RequestFn,\n supports: SupportsFn,\n message: string,\n address: string,\n): Promise<SignResult> {\n if (supports(\"chia_signMessageByAddress\")) {\n return normalizeSig(await request(\"chia_signMessageByAddress\", { message, address }));\n }\n const keys = await getPublicKeys(request);\n const publicKey = keys[0];\n if (!publicKey)\n throw new DigSdkError(\"WALLET_NO_KEYS\", \"Wallet returned no keys to sign with.\");\n const sig = normalizeSig(await request(\"chip0002_signMessage\", { message, publicKey }));\n return { publicKey: sig.publicKey ?? with0x(publicKey), signature: sig.signature };\n}\n\n/** Sign raw CHIP-0035 coin spends (partialSign) — the mint/commit/update path. Returns hex sig. */\nexport async function signCoinSpends(\n request: RequestFn,\n coinSpends: unknown,\n): Promise<string> {\n const resp = await request(\"chip0002_signCoinSpends\", { coinSpends, partialSign: true });\n if (typeof resp === \"string\") return resp;\n const r = resp as\n | { signature?: string; aggregatedSignature?: string; aggregated_signature?: string }\n | null;\n return r?.signature ?? r?.aggregatedSignature ?? r?.aggregated_signature ?? \"\";\n}\n\n/** Accept a Chia offer string (e.g. a MintGarden NFT offer). Returns whatever the wallet returns. */\nexport async function takeOffer(\n request: RequestFn,\n supports: SupportsFn,\n offer: string,\n fee = 0,\n): Promise<unknown> {\n if (!supports(\"chia_takeOffer\")) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n \"Your wallet session does not support taking offers. Reconnect your wallet.\",\n { method: \"chia_takeOffer\" },\n );\n }\n return request(\"chia_takeOffer\", { offer, fee });\n}\n\n/** A mojo balance string, tolerant of the common casing shapes; null if unsupported. */\nfunction balanceFrom(resp: unknown): string | null {\n const raw =\n resp == null\n ? null\n : typeof resp === \"object\"\n ? ((resp as Record<string, unknown>).confirmed ??\n (resp as Record<string, unknown>).spendable ??\n (resp as Record<string, unknown>).confirmedWalletBalance ??\n (resp as Record<string, unknown>).confirmed_wallet_balance ??\n (resp as Record<string, unknown>).balance ??\n (resp as { data?: { confirmed?: unknown } }).data?.confirmed ??\n null)\n : resp;\n if (raw == null) return null;\n try {\n return BigInt(raw as string | number | bigint).toString();\n } catch {\n return null;\n }\n}\n\n/** The wallet's spendable XCH balance (mojos, string). Null if the wallet doesn't surface it. */\nexport async function getXchBalance(request: RequestFn): Promise<string | null> {\n return balanceFrom(await request(\"chip0002_getAssetBalance\", { type: null, assetId: null }));\n}\n\n/** The wallet's spendable balance (base units, string) for a CAT `assetIdHex`. */\nexport async function getCatBalance(\n request: RequestFn,\n assetIdHex: string,\n): Promise<string | null> {\n return balanceFrom(\n await request(\"chip0002_getAssetBalance\", { type: \"cat\", assetId: strip0x(assetIdHex) }),\n );\n}\n\n/** Unspent XCH coins for funding a spend. */\nexport async function getXchCoins(request: RequestFn, limit = 100): Promise<unknown[]> {\n const resp = await request(\"chip0002_getAssetCoins\", {\n type: null,\n assetId: null,\n includedLocked: false,\n offset: 0,\n limit,\n });\n return Array.isArray(resp) ? resp : ((resp as { coins?: unknown[] })?.coins ?? []);\n}\n\n/** Unspent CAT coins for `assetIdHex` (the tail hash, plain hex). */\nexport async function getCatCoins(\n request: RequestFn,\n assetIdHex: string,\n limit = 200,\n): Promise<unknown[]> {\n const resp = await request(\"chip0002_getAssetCoins\", {\n type: \"cat\",\n assetId: strip0x(assetIdHex),\n includedLocked: false,\n offset: 0,\n limit,\n });\n return Array.isArray(resp) ? resp : ((resp as { coins?: unknown[] })?.coins ?? []);\n}\n","// ChiaProvider — the wallet abstraction at the front of the SDK. It owns ONE WalletTransport\n// (injected window.chia, or WalletConnect→Sage) and exposes the normalized CHIP-0002 surface on\n// top of it, so a dapp writes the same `provider.signMessage(...)` regardless of how the user's\n// wallet is connected.\n//\n// Selection policy (the \"wallet your dapp gets for free\"): PREFER the injected DIG Browser wallet\n// when present (no QR, no relay, instant), and FALL BACK to WalletConnect→Sage otherwise. This is\n// exactly the dual-transport policy hub.dig.net runs (apps/web/lib/wallet-transport.js +\n// walletconnect.js), packaged so any dapp gets it in a few lines.\n\nimport type { SignResult, WalletBackend, WalletSession } from \"../types.js\";\nimport { DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport {\n InjectedTransport,\n getInjectedProvider,\n isInjectedAvailable,\n} from \"./injected.js\";\nimport {\n WalletConnectTransport,\n type WalletConnectOptions,\n} from \"./walletconnect.js\";\nimport * as M from \"./methods.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/**\n * A connector id for the 'Browser Wallet vs WalletConnect' chooser (#63) — the discoverable,\n * user-facing counterpart of the lower-level {@link WalletBackend}. `\"browser-wallet\"` is an alias\n * for the `\"injected\"` backend, named to match the chooser UI label every DIG frontend uses.\n */\nexport type ConnectorId = \"browser-wallet\" | \"walletconnect\";\n\n/**\n * One entry in {@link ChiaProvider.listConnectors}: a connector a chooser UI can offer, and\n * whether it's currently usable.\n */\nexport interface ConnectorInfo {\n /** The id to pass as `ConnectOptions.mode` once the user picks this connector. */\n id: ConnectorId;\n /** The underlying transport backend this connector selects. */\n backend: WalletBackend;\n /** Human-facing label (\"Browser Wallet\" / \"WalletConnect\") — the canonical chooser copy. */\n label: string;\n /**\n * True iff this connector can be connected right now. Browser Wallet requires a detected\n * injected `window.chia`; WalletConnect is always offered (its relay has no presence to detect).\n */\n available: boolean;\n}\n\n/** Options for `ChiaProvider.connect()`. */\nexport interface ConnectOptions {\n /**\n * Connection mode:\n * • \"auto\" (default) — prefer the injected DIG wallet; fall back to WalletConnect if\n * absent. A convenience for callers that don't want to present a\n * chooser; it never asks the user, so if BOTH a Browser Wallet and\n * WalletConnect are viable it silently picks Browser Wallet — kept\n * for backward compatibility with existing single-shot integrations.\n * • \"browser-wallet\" — require the injected Browser Wallet (throws if absent). The\n * explicit-preference value for a Connect chooser (see\n * {@link ChiaProvider.listConnectors}); an alias of \"injected\".\n * • \"injected\" — same as \"browser-wallet\" (kept for backward compatibility).\n * • \"walletconnect\" — force the WalletConnect→Sage pairing.\n *\n * To offer the user a real choice — never auto-binding to whichever wallet happens to be\n * injected — call {@link ChiaProvider.listConnectors} to enumerate what's available, let the\n * user pick, then pass their pick's `id` (`\"browser-wallet\"` or `\"walletconnect\"`) as `mode`.\n */\n mode?: \"auto\" | WalletBackend | ConnectorId;\n /**\n * WalletConnect options, required for the WalletConnect fallback/force path (projectId +\n * metadata + onUri). Omit if you only target the injected DIG Browser wallet.\n */\n walletConnect?: WalletConnectOptions;\n /** CAIP-2 chain id. Defaults to \"chia:mainnet\". */\n chain?: string;\n /** Accept any `window.chia` (not just the DIG Browser's `isDIG` provider) for the injected path. */\n acceptAnyInjected?: boolean;\n}\n\n/**\n * A connected Chia wallet. Construct it via `ChiaProvider.connect(...)` (or the convenience\n * `connectWallet(...)`), then call the normalized methods.\n *\n * @example\n * const provider = await ChiaProvider.connect({\n * mode: \"auto\",\n * walletConnect: { projectId, metadata, onUri: (uri) => showQr(uri) },\n * });\n * const { signature } = await provider.signMessage(\"Login to my dapp\", await provider.getAddress());\n */\nexport class ChiaProvider {\n private readonly transport: WalletTransport;\n private cachedAddress: string | null | undefined;\n\n private constructor(transport: WalletTransport) {\n this.transport = transport;\n }\n\n /** Which transport is backing this provider. */\n get backend(): WalletBackend {\n return this.transport.backend;\n }\n\n /** The connected session descriptor. */\n get session(): WalletSession {\n return {\n backend: this.transport.backend,\n chain: this.transport.chain,\n topic: this.transport.topic,\n address: this.cachedAddress ?? null,\n };\n }\n\n /** True iff a method is granted by the active session/transport. */\n supports(method: string): boolean {\n return this.transport.supports(method);\n }\n\n /** Escape hatch: issue a raw CHIP-0002 request through the active transport. */\n request(method: string, params: unknown = {}): Promise<unknown> {\n return this.transport.request(method, params);\n }\n\n /**\n * Connect a wallet using the selection policy. With `mode: \"auto\"` (default) it prefers an\n * injected DIG wallet and falls back to WalletConnect.\n */\n static async connect(options: ConnectOptions = {}): Promise<ChiaProvider> {\n // \"browser-wallet\" (the chooser-facing connector id, #63) is an alias of \"injected\" (the\n // transport/backend id) — normalize once so the rest of this method has one code path.\n const rawMode = options.mode ?? \"auto\";\n const mode = rawMode === \"browser-wallet\" ? \"injected\" : rawMode;\n const chain = options.chain ?? DEFAULT_CHAIN;\n\n const tryInjected = async (): Promise<ChiaProvider | null> => {\n if (!isInjectedAvailable({ anyChia: options.acceptAnyInjected })) return null;\n const provider = getInjectedProvider()!;\n const transport = new InjectedTransport(provider, chain);\n await transport.connect();\n return new ChiaProvider(transport);\n };\n\n const tryWalletConnect = async (): Promise<ChiaProvider> => {\n if (!options.walletConnect) {\n throw new DigSdkError(\n \"WC_OPTIONS_REQUIRED\",\n \"WalletConnect options are required to connect via WalletConnect \" +\n \"(pass { walletConnect: { projectId, metadata, onUri } }).\",\n { mode: rawMode },\n );\n }\n const transport = await WalletConnectTransport.connect({\n ...options.walletConnect,\n chain,\n });\n return new ChiaProvider(transport);\n };\n\n if (mode === \"injected\") {\n const injected = await tryInjected();\n if (!injected) {\n throw new DigSdkError(\n \"NO_INJECTED_WALLET\",\n \"No injected DIG wallet found. Open this page in the DIG Browser, or use mode 'auto'.\",\n { mode: rawMode, acceptAnyInjected: !!options.acceptAnyInjected },\n );\n }\n return injected;\n }\n if (mode === \"walletconnect\") return tryWalletConnect();\n // auto\n return (await tryInjected()) ?? (await tryWalletConnect());\n }\n\n /**\n * Enumerate the connectors a 'Browser Wallet vs WalletConnect' Connect chooser can offer (#63).\n * Pure and side-effect-free — it only DETECTS what's usable right now, it never connects to\n * anything — so a chooser UI built around it always surfaces the choice instead of silently\n * auto-binding to whichever wallet happens to be injected.\n *\n * @example\n * const connectors = ChiaProvider.listConnectors();\n * // render a button per connector, disabling any with `available: false`\n * const chosen = connectors.find((c) => c.id === userPick)!;\n * const provider = await ChiaProvider.connect({ mode: chosen.id, walletConnect });\n */\n static listConnectors(options: { acceptAnyInjected?: boolean } = {}): ConnectorInfo[] {\n return [\n {\n id: \"browser-wallet\",\n backend: \"injected\",\n label: \"Browser Wallet\",\n available: isInjectedAvailable({ anyChia: options.acceptAnyInjected }),\n },\n {\n id: \"walletconnect\",\n backend: \"walletconnect\",\n label: \"WalletConnect\",\n available: true,\n },\n ];\n }\n\n /** Wrap an already-constructed transport (advanced / restored sessions). */\n static fromTransport(transport: WalletTransport): ChiaProvider {\n return new ChiaProvider(transport);\n }\n\n // ---- normalized CHIP-0002 surface -------------------------------------------------------------\n\n /** The wallet's receive address (cached after first read). */\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress === undefined) {\n this.cachedAddress = await M.getAddress((m, p) => this.transport.request(m, p));\n }\n return this.cachedAddress;\n }\n\n /** The wallet's (synthetic) public keys. */\n getPublicKeys(): Promise<string[]> {\n return M.getPublicKeys((m, p) => this.transport.request(m, p));\n }\n\n /**\n * Sign a UTF-8 message with the wallet BLS key. `address` defaults to the wallet's own address.\n * Returns `{ publicKey, signature }`.\n */\n async signMessage(message: string, address?: string): Promise<SignResult> {\n const addr = address ?? (await this.getAddress()) ?? \"\";\n return M.signMessage(\n (m, p) => this.transport.request(m, p),\n (m) => this.transport.supports(m),\n message,\n addr,\n );\n }\n\n /** Sign raw CHIP-0035 coin spends (partialSign). Returns the aggregated signature hex. */\n signCoinSpends(coinSpends: unknown): Promise<string> {\n return M.signCoinSpends((m, p) => this.transport.request(m, p), coinSpends);\n }\n\n /** Accept a Chia offer string (e.g. an NFT offer). */\n takeOffer(offer: string, fee = 0): Promise<unknown> {\n return M.takeOffer(\n (m, p) => this.transport.request(m, p),\n (m) => this.transport.supports(m),\n offer,\n fee,\n );\n }\n\n /** Spendable XCH balance (mojos, string) or null. */\n getXchBalance(): Promise<string | null> {\n return M.getXchBalance((m, p) => this.transport.request(m, p));\n }\n\n /** Spendable balance (base units, string) for a CAT `assetIdHex` (the tail hash), or null. */\n getCatBalance(assetIdHex: string): Promise<string | null> {\n return M.getCatBalance((m, p) => this.transport.request(m, p), assetIdHex);\n }\n\n /** Unspent XCH coins for funding a spend. */\n getXchCoins(limit?: number): Promise<unknown[]> {\n return M.getXchCoins((m, p) => this.transport.request(m, p), limit);\n }\n\n /** Unspent CAT coins for `assetIdHex`. */\n getCatCoins(assetIdHex: string, limit?: number): Promise<unknown[]> {\n return M.getCatCoins((m, p) => this.transport.request(m, p), assetIdHex, limit);\n }\n\n /** Disconnect the wallet (best-effort). */\n disconnect(): Promise<void> {\n return this.transport.disconnect();\n }\n}\n\n/** Convenience wrapper: `connectWallet(opts)` === `ChiaProvider.connect(opts)`. */\nexport function connectWallet(options?: ConnectOptions): Promise<ChiaProvider> {\n return ChiaProvider.connect(options);\n}\n","// Paywall — the high-level monetization helper (#46). It composes a connected `ChiaProvider` (the\n// user's wallet) with the CANONICAL chip35 monetization spends so a dapp can charge for access in a\n// few lines: `await paywall.requestPayment({ amount, owner })` pays the dapp owner and returns a\n// receipt; `paywall.verifyReceipt(...)` and `paywall.proveAccess({ nft | collection })` gate access.\n//\n// HARD RULE (SYSTEM.md → Change-impact guide): spend bundles are NEVER hand-rolled. Every coin spend\n// is built by `@dignetwork/chip35-dl-coin-wasm` (the single source of truth for CHIP-0035 spends).\n// The Paywall only ORCHESTRATES: it sources the buyer's coins from the wallet, asks the wasm to build\n// the coin spends, and pushes those exact coin spends back to the wallet for signing\n// (`ChiaProvider.signCoinSpends`). It contains zero spend-assembly logic of its own — if the wasm\n// builder is unavailable, it throws rather than fabricate a spend.\n//\n// The chip35 wasm is wasm-bindgen \"bundler\"-target glue (a top-level `import * as wasm from\n// \"./..._bg.wasm\"`), which bundlers/browsers load but plain Node's ESM loader cannot. So the spends\n// are obtained via an injectable `spends` provider that defaults to a lazy\n// `import(\"@dignetwork/chip35-dl-coin-wasm\")` — apps in a bundler get it for free; tests (and exotic\n// runtimes) inject the builder. Either way the builder is the canonical wasm, never a reimplementation.\n\nimport type { ChiaProvider } from \"./provider/chia-provider.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/** A payment asset: XCH, or a CAT identified by its tail hash (e.g. $DIG). */\nexport type PaymentAssetSpec =\n | { xch: true; assetId?: undefined }\n | { xch?: false; assetId: string };\n\n/**\n * The subset of `@dignetwork/chip35-dl-coin-wasm` the Paywall drives. The full wasm module satisfies\n * this shape, so `import(\"@dignetwork/chip35-dl-coin-wasm\")` (or the SDK's \"./spend\" re-export) can\n * be passed directly. Declared as a structural type so the SDK does not statically import the\n * (bundler-only) wasm and tests can inject a spy.\n */\nexport interface MonetizationSpends {\n /** wasm-bindgen init. Called once before building spends (a no-op if the runtime needs none). */\n init?: () => unknown;\n /** SHA-256-derive a 32-byte unlock nonce from request bytes. */\n paymentNonce?: (requestBytes: Uint8Array) => Uint8Array;\n /** Build the coin spends for an XCH payment. Returns `{ coinSpends, receipt }`. */\n buildPayment?: (\n buyerSyntheticKey: Uint8Array,\n selectedCoins: unknown,\n ownerPuzzleHash: Uint8Array,\n amount: bigint,\n nonce: Uint8Array,\n fee: bigint,\n ) => { coinSpends: unknown; receipt: unknown };\n /** Build the coin spends for a CAT (incl. DIG) payment. Returns `{ coinSpends, receipt }`. */\n buildCatPayment?: (\n buyerSyntheticKey: Uint8Array,\n selectedCats: unknown,\n ownerPuzzleHash: Uint8Array,\n amount: bigint,\n nonce: Uint8Array,\n ) => { coinSpends: unknown; receipt: unknown };\n /** Verify an observed payment unlocks the paywall. Returns `{ ok, error? }`. */\n verifyPaymentReceipt?: (\n observed: unknown,\n ownerPuzzleHash: Uint8Array,\n minAmount: bigint,\n requiredAsset: unknown,\n requireNonce?: Uint8Array | null,\n ) => { ok: boolean; error?: string };\n /** Prove NFT ownership (optionally gating on a launcher id). Returns `{ ok, proof?, error? }`. */\n proveNftOwnership?: (\n parentSpend: unknown,\n claimedOwnerPuzzleHash: Uint8Array,\n requiredNft?: Uint8Array | null,\n ) => { ok: boolean; proof?: unknown; error?: string };\n /** Prove collection/creator membership for an owner. Returns `{ ok, proof?, error? }`. */\n proveCollectionMembership?: (\n parentSpend: unknown,\n claimedOwnerPuzzleHash: Uint8Array,\n requiredDid: Uint8Array,\n ) => { ok: boolean; proof?: unknown; error?: string };\n}\n\n/** Options for constructing a `Paywall`. */\nexport interface PaywallOptions {\n /**\n * The canonical chip35 monetization spends. Defaults to a lazy\n * `import(\"@dignetwork/chip35-dl-coin-wasm\")` (and calls its `init()`), so a bundled dapp needs to\n * pass nothing. Inject a builder for non-bundler runtimes or tests.\n */\n spends?: MonetizationSpends;\n}\n\n/** Arguments for `Paywall.requestPayment`. */\nexport interface RequestPaymentArgs {\n /** Amount to pay, in mojos (XCH) or base units (CAT). Number or bigint. */\n amount: number | bigint;\n /** The dapp owner's puzzle hash to pay (hex, with or without `0x`). */\n owner: string;\n /** Pay in this CAT (tail hash hex). Omit for XCH. */\n assetId?: string;\n /**\n * A free-form unlock identifier (e.g. `dappId|resource|user`). When given without an explicit\n * `nonce`, the Paywall derives the 32-byte nonce from it via the wasm `paymentNonce` (deterministic\n * convenience). Ignored when `nonce` is supplied.\n */\n memo?: string;\n /** An explicit 32-byte unlock nonce (hex). Overrides `memo`. Random 32 bytes are used if neither. */\n nonce?: string;\n /** Network fee in mojos (XCH payments only; CAT rings net to zero). Defaults to 0. */\n fee?: number | bigint;\n /** Cap on the number of buyer coins to source from the wallet. */\n coinLimit?: number;\n}\n\n/** The result of a successful `requestPayment`: the wallet signature + the wasm receipt + spends. */\nexport interface PaymentResult {\n /** The aggregated BLS signature the wallet returned for the coin spends. */\n signature: string;\n /** The `PaymentReceipt` the wasm produced — persist it; `verifyReceipt` later checks the chain. */\n receipt: unknown;\n /** The exact coin spends the wasm built and the wallet signed. */\n coinSpends: unknown;\n /** The 32-byte unlock nonce embedded in the payment (hex). */\n nonce: string;\n}\n\n/** Arguments for `Paywall.verifyReceipt`. */\nexport interface VerifyReceiptArgs {\n /** The `ObservedPayment` the dapp filled in after reading the owner's coin from the chain. */\n observed: unknown;\n /** The owner puzzle hash that must have been paid (hex). */\n owner: string;\n /** The minimum amount that must have been paid (mojos / base units). */\n minAmount: number | bigint;\n /** The required asset. Defaults to XCH; pass `{ assetId }` to require a CAT. */\n asset?: PaymentAssetSpec;\n /** Require this exact 32-byte nonce (hex) to be present in the payment. */\n nonce?: string;\n}\n\n/** Arguments for `Paywall.proveAccess` — gate on NFT ownership XOR collection membership. */\nexport interface ProveAccessArgs {\n /** The coin spend that created the NFT's current coin (the wasm `CoinSpend` shape). */\n parentSpend: unknown;\n /** The puzzle hash claiming ownership (hex). */\n owner: string;\n /** Gate on this specific NFT launcher id (hex). Mutually exclusive with `collection`. */\n nft?: string;\n /** Gate on membership of this collection/creator DID (hex). Mutually exclusive with `nft`. */\n collection?: string;\n}\n\n/** Strip a leading `0x`/`0X` and lowercase a hex string. */\nfunction strip0x(hex: string): string {\n return hex.replace(/^0x/i, \"\").toLowerCase();\n}\n\n/** Hex (with or without `0x`) → bytes. Throws on odd-length / non-hex input. */\nfunction hexToBytes(hex: string): Uint8Array {\n const h = strip0x(hex);\n if (h.length % 2 !== 0 || /[^0-9a-f]/.test(h)) {\n throw new DigSdkError(\"INVALID_ARGUMENT\", `invalid hex string: ${hex}`, { value: hex });\n }\n const out = new Uint8Array(h.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** Bytes → lowercase hex (no `0x`). */\nfunction bytesToHex(bytes: Uint8Array): string {\n let s = \"\";\n for (const b of bytes) s += b.toString(16).padStart(2, \"0\");\n return s;\n}\n\n/**\n * 32 cryptographically-random bytes. Prefers the global WebCrypto (browsers, Node 20+); falls back\n * to `node:crypto`'s `webcrypto` on Node 18, where `globalThis.crypto` is not exposed by default.\n * Async because the Node fallback dynamically imports `node:crypto` (keeps the browser bundle from\n * pulling in a Node builtin).\n */\nasync function randomNonce(): Promise<Uint8Array> {\n const out = new Uint8Array(32);\n const webcrypto = (globalThis as { crypto?: Crypto }).crypto;\n if (webcrypto?.getRandomValues) {\n webcrypto.getRandomValues(out);\n return out;\n }\n // Node 18: no global `crypto`. Use the node:crypto WebCrypto implementation.\n const nodeCrypto = (await import(\"node:crypto\")) as { webcrypto?: Crypto };\n if (!nodeCrypto.webcrypto?.getRandomValues) {\n throw new DigSdkError(\n \"NO_SECURE_RANDOM\",\n \"No secure random source available to generate a payment nonce.\",\n );\n }\n nodeCrypto.webcrypto.getRandomValues(out);\n return out;\n}\n\n/**\n * High-level pay-to-unlock helper. Construct it from a connected `ChiaProvider`; it builds payment\n * spends via the canonical chip35 wasm and pushes them to the wallet for signing.\n *\n * @example\n * const provider = await ChiaProvider.connect({ mode: \"auto\", walletConnect });\n * const paywall = new Paywall(provider); // chip35 wasm loaded lazily under a bundler\n * // Charge 0.25 XCH to unlock a resource:\n * const { receipt } = await paywall.requestPayment({\n * amount: 250_000_000_000n,\n * owner: dappOwnerPuzzleHashHex,\n * memo: `unlock:${resourceId}:${userId}`,\n * });\n * // Later, gate access by re-checking the receipt against the chain:\n * const { ok } = await paywall.verifyReceipt({ observed, owner: dappOwnerPuzzleHashHex, minAmount: 250_000_000_000n });\n */\nexport class Paywall {\n private readonly provider: ChiaProvider;\n private readonly injectedSpends?: MonetizationSpends;\n private spendsReady?: Promise<MonetizationSpends>;\n\n constructor(provider: ChiaProvider, options: PaywallOptions = {}) {\n this.provider = provider;\n this.injectedSpends = options.spends;\n }\n\n /**\n * Resolve the canonical monetization spends (injected, or lazily imported + `init()`ed). Memoized.\n * This is the ONLY source of coin-spend construction in the Paywall — there is no fallback that\n * hand-rolls a spend.\n */\n private spends(): Promise<MonetizationSpends> {\n if (this.injectedSpends) {\n if (typeof this.injectedSpends.init === \"function\") this.injectedSpends.init();\n return Promise.resolve(this.injectedSpends);\n }\n if (!this.spendsReady) {\n this.spendsReady = (async () => {\n const mod = (await import(\n /* @vite-ignore */ \"@dignetwork/chip35-dl-coin-wasm\"\n )) as unknown as MonetizationSpends;\n if (typeof mod.init === \"function\") mod.init();\n return mod;\n })().catch((e) => {\n this.spendsReady = undefined; // allow retry on transient load failure\n throw e;\n });\n }\n return this.spendsReady;\n }\n\n /** The wallet's first synthetic public key, as bytes (the buyer key the spends are built against). */\n private async buyerKey(): Promise<Uint8Array> {\n const keys = await this.provider.getPublicKeys();\n const key = keys?.[0];\n if (!key)\n throw new DigSdkError(\n \"WALLET_NO_KEYS\",\n \"Wallet returned no public keys to build the payment against.\",\n );\n return hexToBytes(key);\n }\n\n /** Resolve the 32-byte unlock nonce: explicit hex, else derived from `memo`, else random. */\n private async resolveNonce(spends: MonetizationSpends, args: RequestPaymentArgs): Promise<Uint8Array> {\n if (args.nonce) return hexToBytes(args.nonce);\n if (args.memo) {\n if (typeof spends.paymentNonce !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"Cannot derive a nonce from `memo`: the chip35 wasm `paymentNonce` is unavailable.\",\n { builder: \"paymentNonce\" },\n );\n }\n return spends.paymentNonce(new TextEncoder().encode(args.memo));\n }\n return randomNonce();\n }\n\n /**\n * Charge the buyer (the connected wallet) `amount` to pay the dapp `owner`, then push the\n * wasm-built coin spends to the wallet for signing. Returns the wallet signature + the receipt.\n * Builds via the canonical wasm `buildPayment` (XCH) or `buildCatPayment` (CAT) — never hand-rolled.\n */\n async requestPayment(args: RequestPaymentArgs): Promise<PaymentResult> {\n const spends = await this.spends();\n const ownerPh = hexToBytes(args.owner);\n const amount = BigInt(args.amount);\n const nonce = await this.resolveNonce(spends, args);\n const buyerKey = await this.buyerKey();\n\n let built: { coinSpends: unknown; receipt: unknown };\n if (args.assetId) {\n if (typeof spends.buildCatPayment !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `buildCatPayment` is unavailable — cannot build a CAT payment \" +\n \"(the Paywall never hand-rolls spends).\",\n { builder: \"buildCatPayment\" },\n );\n }\n const cats = await this.provider.getCatCoins(strip0x(args.assetId), args.coinLimit);\n built = spends.buildCatPayment(buyerKey, cats, ownerPh, amount, nonce);\n } else {\n if (typeof spends.buildPayment !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `buildPayment` is unavailable — cannot build an XCH payment \" +\n \"(the Paywall never hand-rolls spends).\",\n { builder: \"buildPayment\" },\n );\n }\n const coins = await this.provider.getXchCoins(args.coinLimit);\n built = spends.buildPayment(buyerKey, coins, ownerPh, amount, nonce, BigInt(args.fee ?? 0));\n }\n\n // Push the EXACT coin spends the wasm produced to the wallet for signing — unchanged.\n const signature = await this.provider.signCoinSpends(built.coinSpends);\n return {\n signature,\n receipt: built.receipt,\n coinSpends: built.coinSpends,\n nonce: bytesToHex(nonce),\n };\n }\n\n /**\n * Verify an observed on-chain payment unlocks the paywall (pay-to-unlock). Delegates to the wasm\n * `verifyPaymentReceipt`; returns its `{ ok, error? }` verdict. `ok:true` grants access.\n */\n async verifyReceipt(args: VerifyReceiptArgs): Promise<{ ok: boolean; error?: string }> {\n const spends = await this.spends();\n if (typeof spends.verifyPaymentReceipt !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `verifyPaymentReceipt` is unavailable.\",\n { builder: \"verifyPaymentReceipt\" },\n );\n }\n const asset = args.asset ?? { xch: true };\n const requiredAsset =\n \"assetId\" in asset && asset.assetId\n ? { assetId: hexToBytes(asset.assetId) }\n : { xch: true };\n const requireNonce = args.nonce ? hexToBytes(args.nonce) : null;\n return spends.verifyPaymentReceipt(\n args.observed,\n hexToBytes(args.owner),\n BigInt(args.minAmount),\n requiredAsset,\n requireNonce,\n );\n }\n\n /**\n * Prove the `owner` holds access: gate on a specific NFT (`nft` launcher id) via the wasm\n * `proveNftOwnership`, or on collection/creator membership (`collection` DID) via\n * `proveCollectionMembership`. Returns `{ ok, proof?, error? }`. The caller still confirms the\n * proof's coin is unspent on-chain for liveness.\n */\n async proveAccess(args: ProveAccessArgs): Promise<{ ok: boolean; proof?: unknown; error?: string }> {\n if (args.nft && args.collection) {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"proveAccess: pass either `nft` or `collection`, not both.\",\n { value: \"nft+collection\" },\n );\n }\n const spends = await this.spends();\n const owner = hexToBytes(args.owner);\n if (args.collection) {\n if (typeof spends.proveCollectionMembership !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `proveCollectionMembership` is unavailable.\",\n { builder: \"proveCollectionMembership\" },\n );\n }\n return spends.proveCollectionMembership(args.parentSpend, owner, hexToBytes(args.collection));\n }\n if (typeof spends.proveNftOwnership !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `proveNftOwnership` is unavailable.\",\n { builder: \"proveNftOwnership\" },\n );\n }\n const requiredNft = args.nft ? hexToBytes(args.nft) : null;\n return spends.proveNftOwnership(args.parentSpend, owner, requiredNft);\n }\n}\n","// Cross-target loader for the `dig_client` read-crypto WASM.\n//\n// The wasm is consumed from the published `@dignetwork/dig-capsule-wasm` package (the installable form of\n// digstore's dig-client-wasm crate) — the SAME artifact the DIG Browser, extension, node, and hub\n// run. We NEVER run it unverified: we obtain the package's raw wasm bytes, SHA-256 them, compare\n// against the pinned digest, and only then let the module's crypto run. A mismatch (tampered / wrong\n// artifact) throws — the reader FAILS CLOSED rather than running unverified crypto.\n//\n// Two targets are consumed from the one package, auto-detected, with an escape hatch\n// (`configureWasm`):\n// • Node / Bun — `@dignetwork/dig-capsule-wasm/node`, the wasm-bindgen `nodejs` build. It reads\n// + instantiates the wasm synchronously on import; we independently\n// SHA-256-verify the shipped `dig_client_bg.wasm` and fail closed on a\n// mismatch.\n// • Browser (bundler) — `@dignetwork/dig-capsule-wasm/web`, the `--target web` build. We fetch the\n// package's `dig_client_bg.wasm`, SRI-verify the bytes, and hand them to\n// the module's async init.\n// • Browser (no bundler) — `configureWasm` with a URL/bytes you serve yourself.\n//\n// Memoized: the wasm initializes at most once per process/page.\n\nimport type { DigClientWasm } from \"./wasm.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/**\n * SHA-256 (lowercase hex) of `@dignetwork/dig-capsule-wasm`'s `dig_client_bg.wasm` — the SRI digest. It\n * is the canonical trust anchor (pinned regardless of the npm semver), mirrored by the package's\n * `integrity.json` `sha256`. Fail closed on a mismatch.\n */\nexport const DIG_CLIENT_WASM_SHA256 =\n \"a186fd2d6b348a7caa3112c51b666a6618fe7cf8bb56ad395a1fab4323f6ae7e\";\n\n/** Optional explicit wasm inputs, for environments where package resolution can't reach the wasm. */\nexport interface WasmConfig {\n /**\n * The wasm bytes (already loaded). When provided, SRI is still enforced unless `skipIntegrity`.\n * Pass this in CSP-strict browsers where you fetch + verify the bytes yourself.\n */\n wasmBytes?: BufferSource;\n /**\n * URL to the wasm-bindgen `web` glue module for browser dynamic import. When omitted in a browser,\n * the loader imports `@dignetwork/dig-capsule-wasm/web` (the bundler resolves it).\n */\n glueUrl?: string;\n /**\n * URL to fetch the wasm bytes from (browser) when `wasmBytes` is not supplied. The fetched bytes\n * are SRI-verified before init. Defaults to the package's `dig_client_bg.wasm`.\n */\n wasmUrl?: string;\n /** Skip the SRI check. Only for tests / trusted custom builds — NOT recommended. */\n skipIntegrity?: boolean;\n}\n\nlet _config: WasmConfig = {};\nlet _ready: Promise<DigClientWasm> | null = null;\n\n/**\n * Override how the read-crypto wasm is located/loaded. Call BEFORE the first `DigClient` read.\n * Mainly for browsers without a bundler that resolves package files, or CSP-strict apps that fetch\n * + verify the wasm bytes themselves and hand them in. Resets any cached instance.\n */\nexport function configureWasm(config: WasmConfig): void {\n _config = { ...config };\n _ready = null;\n}\n\nconst isNode =\n typeof process !== \"undefined\" &&\n !!(process as { versions?: { node?: string } }).versions?.node;\n\n/** SHA-256 a buffer to lowercase hex, using node:crypto or WebCrypto. */\nasync function sha256Hex(bytes: BufferSource): Promise<string> {\n if (isNode) {\n const { createHash } = await import(\"node:crypto\");\n const view =\n bytes instanceof ArrayBuffer\n ? new Uint8Array(bytes)\n : new Uint8Array(\n (bytes as ArrayBufferView).buffer,\n (bytes as ArrayBufferView).byteOffset,\n (bytes as ArrayBufferView).byteLength,\n );\n return createHash(\"sha256\").update(view).digest(\"hex\");\n }\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes as BufferSource);\n return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction assertIntegrity(hex: string): void {\n if (_config.skipIntegrity) return;\n if (hex !== DIG_CLIENT_WASM_SHA256) {\n throw new DigSdkError(\n \"WASM_INTEGRITY\",\n \"dig-client wasm integrity check failed — refusing to run unverified crypto \" +\n `(expected ${DIG_CLIENT_WASM_SHA256}, got ${hex}).`,\n { expected: DIG_CLIENT_WASM_SHA256, actual: hex },\n );\n }\n}\n\n// The read-crypto function surface the SDK uses (a subset of the package's exports). Both the node\n// and web builds export these camelCase functions at the module top level.\ntype DigClientModule = DigClientWasm & {\n default?: (input: { module_or_path: BufferSource }) => Promise<unknown>;\n};\n\n// Node: consume the `--target nodejs` build. It reads `dig_client_bg.wasm` from the package and\n// instantiates SYNCHRONOUSLY on import, so its functions are ready immediately (no init call). We\n// independently SHA-256-verify the shipped wasm and fail closed on a mismatch — so a tampered\n// package binary refuses to run even though wasm-bindgen already loaded it.\nasync function loadNode(): Promise<DigClientWasm> {\n const { createRequire } = await import(\"node:module\");\n const { readFile } = await import(\"node:fs/promises\");\n const require = createRequire(import.meta.url);\n const wasmPath = require.resolve(\"@dignetwork/dig-capsule-wasm/dig_client_bg.wasm\");\n const buf = await readFile(wasmPath);\n const bytes = new Uint8Array(buf.byteLength);\n bytes.set(buf);\n assertIntegrity(await sha256Hex(bytes));\n const mod = (await import(\"@dignetwork/dig-capsule-wasm/node\")) as unknown as DigClientModule;\n return mod as unknown as DigClientWasm;\n}\n\n// Browser: consume the `--target web` build (`@dignetwork/dig-capsule-wasm/web`).\n//\n// Two modes:\n// • Caller-supplied bytes/URL (`configureWasm`) — the fail-closed path for CSP-strict apps or an\n// untrusted CDN. We fetch (if a URL) the bytes, SHA-256-VERIFY them against the pinned digest,\n// and hand the very bytes we checked to the glue's async init — so nothing runs unverified.\n// • Default — call the glue's `init()` with no args. The `--target web` build resolves its\n// sibling `dig_client_bg.wasm` relative to its OWN module URL (the bundler-correct way to\n// locate a package asset) and instantiates it. Those bytes are the pinned package artifact\n// (the SDK depends on an exact `@dignetwork/dig-capsule-wasm` version). Apps that need byte-level SRI\n// over an untrusted delivery path use `configureWasm({ wasmUrl })` above.\nasync function loadBrowser(): Promise<DigClientWasm> {\n const glueHref = _config.glueUrl ?? \"@dignetwork/dig-capsule-wasm/web\";\n const mod = (await import(/* @vite-ignore */ glueHref)) as unknown as DigClientModule;\n if (typeof mod.default !== \"function\") {\n throw new DigSdkError(\n \"WASM_LOAD_FAILED\",\n \"dig-client web build exposed no init function (unexpected module shape)\",\n {},\n );\n }\n if (_config.wasmBytes || _config.wasmUrl) {\n let bytes: BufferSource;\n if (_config.wasmBytes) {\n bytes = _config.wasmBytes;\n } else {\n const wasmUrl = _config.wasmUrl!;\n const res = await fetch(wasmUrl);\n if (!res.ok)\n throw new DigSdkError(\"WASM_LOAD_FAILED\", `dig-client wasm fetch failed (${res.status})`, {\n httpStatus: res.status,\n wasmUrl,\n });\n bytes = await res.arrayBuffer();\n }\n assertIntegrity(await sha256Hex(bytes));\n await mod.default({ module_or_path: bytes });\n } else {\n // The glue resolves + instantiates its own sibling wasm (the pinned package artifact).\n await (mod.default as unknown as () => Promise<unknown>)();\n }\n return mod as unknown as DigClientWasm;\n}\n\n/**\n * Load, SRI-verify, and instantiate the read-crypto wasm, returning its functions. Memoized — at\n * most one init per process/page. Fails closed on an integrity mismatch.\n */\nexport function loadDigClientWasm(): Promise<DigClientWasm> {\n if (_ready) return _ready;\n _ready = (isNode ? loadNode() : loadBrowser()).catch((e) => {\n _ready = null; // allow a retry on transient load failure\n throw e;\n });\n return _ready;\n}\n\r\n","// DIG URN parsing + canonicalization — PURE, dependency-free, and identical to the parser the\n// hub (apps/web/lib/dig-client.js), the extension, and the companion use. Kept pure (no wasm) so\n// it is trivially unit-testable under `node --test` and usable on any runtime.\n//\n// A DIG URN addresses one resource inside a store:\n//\n// urn:dig:chia:<store_id>[:<root>]/<resource_key>[?salt=<hex>]\n//\n// • <store_id> — 64 hex chars, the singleton launcher id (the store identity).\n// • :<root> — OPTIONAL 64 hex chars, pins a specific on-chain generation. Omit for the\n// canonical, root-INDEPENDENT form. The root is only the trust anchor for\n// inclusion verification; it is NOT a key input (retrieval/decryption keys are\n// root-independent).\n// • <resource_key> — the path within the store (e.g. \"index.html\", \"img/logo.png\"). An empty\n// key resolves to the §8.5 default view \"index.html\".\n// • ?salt=<hex> — OPTIONAL out-of-band secret salt for a PRIVATE store.\n\nimport { DigSdkError } from \"./errors.js\";\n\n/** The parts of a parsed DIG URN. `root`/`salt` are null when absent. */\nexport interface ParsedUrn {\n /** Store identity (64-hex launcher id), lowercased. */\n readonly storeId: string;\n /** Generation root (64-hex), lowercased — or null for the root-independent form. */\n readonly root: string | null;\n /** Resource path within the store (verbatim, not lowercased). */\n readonly resourceKey: string;\n /** Private-store secret salt (hex), lowercased — or null for a public store. */\n readonly salt: string | null;\n}\n\nconst URN_RE =\n /^urn:dig:chia:([0-9a-fA-F]{64})(?::([0-9a-fA-F]{64}))?\\/(.+?)(?:\\?salt=([0-9a-fA-F]+))?$/;\n\n/**\n * Parse a DIG URN into its parts. Throws on a malformed URN.\n *\n * @example\n * parseUrn(\"urn:dig:chia:\" + \"ab\".repeat(32) + \"/index.html\")\n * // → { storeId: \"abab…\", root: null, resourceKey: \"index.html\", salt: null }\n */\nexport function parseUrn(raw: string): ParsedUrn {\n const s = String(raw ?? \"\").trim();\n const m = URN_RE.exec(s);\n if (!m) {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"Not a valid dig URN (expected urn:dig:chia:<store-id>[:<root>]/<path>[?salt=<hex>]).\",\n { value: s, expected: \"urn:dig:chia:<store-id>[:<root>]/<path>[?salt=<hex>]\" },\n );\n }\n return {\n storeId: m[1]!.toLowerCase(),\n root: m[2] ? m[2].toLowerCase() : null,\n resourceKey: m[3]!,\n salt: m[4] ? m[4].toLowerCase() : null,\n };\n}\n\n/** True iff `raw` is a syntactically valid DIG URN. Never throws. */\nexport function isUrn(raw: string): boolean {\n try {\n parseUrn(raw);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reconstruct the canonical, root-INDEPENDENT URN string for a store + resource key:\n * `urn:dig:chia:<store_id>/<resource_key>`. An empty resource key resolves to the default view\n * `index.html`. This is the form whose SHA-256 is the retrieval key and whose bytes seed the AES\n * key — matching the wasm's `reconstructUrn`.\n */\nexport function reconstructUrn(storeId: string, resourceKey: string): string {\n const key = resourceKey && resourceKey.length > 0 ? resourceKey : \"index.html\";\n return `urn:dig:chia:${storeId.toLowerCase()}/${key}`;\n}\n\n/**\n * Reconstruct a root-PINNED display URN: `urn:dig:chia:<store_id>:<root>/<resource_key>`. Useful\n * for sharing a URN bound to a specific generation; the retrieval/AES keys still use the rootless\n * form (`reconstructUrn`).\n */\nexport function reconstructUrnWithRoot(\n storeId: string,\n root: string,\n resourceKey: string,\n): string {\n const key = resourceKey && resourceKey.length > 0 ? resourceKey : \"index.html\";\n return `urn:dig:chia:${storeId.toLowerCase()}:${root.toLowerCase()}/${key}`;\n}\n","// DigClient — the read side of the SDK. It fetches a resource's served ciphertext from the dig RPC,\n// derives the URN's keys CLIENT-SIDE via the read-crypto wasm, verifies inclusion against an\n// on-chain root, and decrypts — so the serving host stays BLIND (it only ever relays opaque\n// ciphertext + proofs). Genericized from hub.dig.net/apps/web/lib/dig-client.js, with the hub-app\n// coupling removed (no Vite import.meta.env, no window.location origin; the RPC endpoint and the\n// trust root are explicit inputs).\n//\n// HARD BOUNDARY (read sources). Everything read from a .dig — ciphertext, inclusion proofs, the\n// public manifest, metadata — comes ONLY from the dig RPC. The trust ROOT it is verified against\n// comes from the chain (the caller resolves it from coinset.org and passes it in). The host can\n// never become the trust anchor: every content read REQUIRES a caller-supplied root.\n//\n// OBLIVIOUS model. The host returns indistinguishable ciphertext for any retrieval key, so\n// presence is UNKNOWABLE. A read therefore NEVER concludes \"not found\": it returns plaintext when\n// the URN key decrypts the bytes, otherwise the raw ciphertext (a decoy is just opaque bytes). The\n// only thrown error is a transport failure.\n\nimport { loadDigClientWasm } from \"./loader.js\";\nimport type { DigClientWasm } from \"./wasm.js\";\nimport { parseUrn } from \"./urn.js\";\nimport type {\n CollectionItemsPage,\n CollectionMeta,\n ReadOptions,\n ReadResult,\n UrnKeys,\n} from \"./types.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/** The default public dig RPC endpoint. */\nexport const DEFAULT_RPC = \"https://rpc.dig.net\";\n\n// The backend caps each dig.getContent chunk at 3 MiB (Lambda/APIGW response ceiling); the client\n// loops chunks until `complete`.\nconst RPC_CHUNK_BYTES = 3 * 1024 * 1024;\n\n/** Options to construct a DigClient. */\nexport interface DigClientOptions {\n /** dig RPC endpoint. Defaults to the public `https://rpc.dig.net`. */\n rpc?: string;\n /** Override `fetch` (e.g. an instrumented one). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n}\n\ninterface GetContentResult {\n total_length: number;\n offset: number;\n next_offset?: number | null;\n complete?: boolean;\n ciphertext?: string;\n inclusion_proof?: string;\n chunk_lens?: number[];\n}\n\n/** Decode a standard-base64 string (the RPC ciphertext encoding) to bytes — no DOM dependency. */\nfunction b64ToBytes(b64: string): Uint8Array {\n // atob exists in browsers and modern Node; fall back to Buffer in older Node.\n if (typeof atob === \"function\") {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Uint8Array((globalThis as any).Buffer.from(b64, \"base64\"));\n}\n\n/**\n * The read-crypto client. Construct once and reuse — the wasm is loaded + SRI-verified lazily on\n * the first read and memoized process/page-wide.\n *\n * @example\n * const dig = new DigClient();\n * const { bytes, decrypted } = await dig.read({\n * urn: \"urn:dig:chia:<storeId>/index.html\",\n * root: \"<onchain-root-hex>\",\n * });\n * if (decrypted) console.log(new TextDecoder().decode(bytes));\n */\nexport class DigClient {\n private readonly rpc: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: DigClientOptions = {}) {\n this.rpc = options.rpc ?? DEFAULT_RPC;\n this.fetchImpl =\n options.fetch ??\n (typeof fetch === \"function\" ? fetch.bind(globalThis) : undefinedFetch());\n }\n\n /** Load (and SRI-verify) the read-crypto wasm. Exposed for callers that want the raw functions. */\n async wasm(): Promise<DigClientWasm> {\n return loadDigClientWasm();\n }\n\n /** `retrieval_key = SHA-256(canonical rootless URN)`, lowercase hex. */\n async retrievalKey(storeId: string, resourceKey: string): Promise<string> {\n return (await this.wasm()).retrievalKey(storeId, resourceKey);\n }\n\n /** Derive the per-URN AES-256-GCM-SIV key, lowercase hex. `salt` for a private store. */\n async deriveKey(\n storeId: string,\n resourceKey: string,\n salt?: string | null,\n ): Promise<string> {\n return (await this.wasm()).deriveKey(storeId, resourceKey, salt ?? undefined);\n }\n\n /** Verify served `ciphertext` is included under `root` via the base64 merkle `proof`. */\n async verifyInclusion(\n ciphertext: Uint8Array,\n proof: string,\n root: string,\n ): Promise<boolean> {\n return (await this.wasm()).verifyInclusion(ciphertext, proof, root);\n }\n\n /** Reconstruct the canonical rootless URN whose SHA-256 is the retrieval key. */\n async reconstructUrn(storeId: string, resourceKey: string): Promise<string> {\n return (await this.wasm()).reconstructUrn(storeId, resourceKey);\n }\n\n /**\n * Derive, client-side, the two root-independent keys a URN maps to (retrieval + decryption).\n * Nothing is sent to the network — pure local derivation via the wasm.\n */\n async deriveUrnKeys(input: { urn: string; salt?: string | null }): Promise<UrnKeys> {\n const parsed = parseUrn(input.urn);\n const wasm = await this.wasm();\n const effSalt = input.salt ?? parsed.salt ?? undefined;\n return {\n storeId: parsed.storeId,\n root: parsed.root,\n resourceKey: parsed.resourceKey,\n salt: effSalt ?? null,\n retrievalKey: wasm.retrievalKey(parsed.storeId, parsed.resourceKey),\n decryptionKey: wasm.deriveKey(parsed.storeId, parsed.resourceKey, effSalt),\n };\n }\n\n /**\n * Fetch + verify + decrypt one resource by URN. `root` is the on-chain generation root to verify\n * against (resolved by the caller from the chain); when omitted, the root embedded in the URN is\n * used. Returns the bytes plus advisory `verified`/`decrypted` flags. NEVER throws \"not found\"\n * (presence is unknowable) — it throws only on a transport failure.\n */\n async read(\n input: { urn: string; root?: string | null; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<ReadResult> {\n const parsed = parseUrn(input.urn);\n const effSalt = input.salt ?? parsed.salt ?? null;\n const effRoot = input.root ?? parsed.root ?? null;\n if (!effRoot) {\n throw new DigSdkError(\n \"ROOT_REQUIRED\",\n \"a confirmed on-chain root is required to read content (pass { root } or use a root-pinned URN)\",\n { urn: input.urn },\n );\n }\n return this.readResource(\n { storeId: parsed.storeId, resourceKey: parsed.resourceKey, root: effRoot, salt: effSalt },\n opts,\n );\n }\n\n /** As `read`, but decoding the plaintext to a UTF-8 string when it decrypts (else throws). */\n async readText(\n input: { urn: string; root?: string | null; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<string> {\n const r = await this.read(input, opts);\n if (!r.decrypted) {\n throw new DigSdkError(\n \"DECRYPT_FAILED\",\n \"resource did not decrypt under this URN — wrong store/key/salt, or a decoy response\",\n { urn: input.urn },\n );\n }\n return new TextDecoder().decode(r.bytes);\n }\n\n /**\n * Read by explicit (storeId, resourceKey, root, salt) rather than a URN string. The oblivious\n * download primitive the URN read is built on.\n */\n async readResource(\n input: { storeId: string; resourceKey: string; root: string; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<ReadResult> {\n const rpc = opts.rpc ?? this.rpc;\n const wasm = await this.wasm();\n const rk = wasm.retrievalKey(input.storeId, input.resourceKey);\n const { ciphertext, proof, chunkLens } = await this.fetchCiphertext(\n input.storeId,\n rk,\n input.root,\n rpc,\n );\n let verified = false;\n try {\n verified = !!wasm.verifyInclusion(ciphertext, proof, input.root);\n } catch {\n verified = false;\n }\n const keyHex = wasm.deriveKey(input.storeId, input.resourceKey, input.salt ?? undefined);\n try {\n const bytes = decryptResourceChunks(wasm, keyHex, ciphertext, chunkLens);\n return {\n storeId: input.storeId,\n root: input.root,\n resourceKey: input.resourceKey,\n salt: input.salt ?? null,\n bytes,\n verified,\n decrypted: true,\n };\n } catch {\n // Not decryptable with this URN/salt — hand back the raw bytes; never a \"not present\" verdict.\n return {\n storeId: input.storeId,\n root: input.root,\n resourceKey: input.resourceKey,\n salt: input.salt ?? null,\n bytes: ciphertext,\n verified,\n decrypted: false,\n };\n }\n }\n\n /**\n * Read a collection's public, owner-independent facts (creator DID, item count, uniform royalty)\n * from the dig RPC (`dig.getCollection`). The collection's item set is its NFT launcher ids — the\n * authoritative, owner-independent anchor the mint produced (a DID-attributed NFT is hinted to its\n * OWNER at mint, not to the creator DID, so launcher ids — not the DID — are the read key). Pass\n * the optional `did` to have it echoed back and recorded as the declared creator.\n *\n * No wallet, no read-crypto wasm — a plain JSON-RPC read. Throws a coded {@link DigSdkError} on a\n * transport/RPC failure (never a \"not found\": an empty/partly-confirmed set just resolves to fewer\n * items).\n *\n * @example\n * const meta = await dig.getCollection({ launcherIds: [\"ab…\", \"cd…\"], did: \"ef…\" });\n * console.log(meta.resolved_count, meta.royalty_basis_points);\n */\n async getCollection(\n input: { launcherIds: string[]; did?: string | null },\n opts: ReadOptions = {},\n ): Promise<CollectionMeta> {\n const rpc = opts.rpc ?? this.rpc;\n const params: Record<string, unknown> = { launcher_ids: input.launcherIds };\n if (input.did) params.did = input.did;\n const r = await this.rpcCall<CollectionMeta>(rpc, \"dig.getCollection\", params);\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no collection facts for this request.\",\n { rpcMethod: \"dig.getCollection\" },\n );\n return r;\n }\n\n /**\n * Read a deterministic, paginated page of a collection's items (`dig.listCollectionItems`), each\n * resolved to its CURRENT on-chain state — current owner, royalty, and CHIP-0007 metadata — by the\n * RPC walking the singleton lineage forward to the live tip (so the owner is never the stale\n * mint-time owner). Items come back in the input launcher-id order. `limit` is clamped to the\n * server cap (200); `offset` defaults to 0.\n *\n * Throws a coded {@link DigSdkError} on a transport/RPC failure.\n *\n * @example\n * let page = await dig.listCollectionItems({ launcherIds, limit: 50 });\n * for (const item of page.items) console.log(item.launcher_id, item.owner_puzzle_hash);\n * // page.next_offset is null on the last page.\n */\n async listCollectionItems(\n input: { launcherIds: string[]; offset?: number; limit?: number },\n opts: ReadOptions = {},\n ): Promise<CollectionItemsPage> {\n const rpc = opts.rpc ?? this.rpc;\n const params: Record<string, unknown> = { launcher_ids: input.launcherIds };\n if (input.offset !== undefined) params.offset = input.offset;\n if (input.limit !== undefined) params.limit = input.limit;\n const r = await this.rpcCall<CollectionItemsPage>(rpc, \"dig.listCollectionItems\", params);\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no collection items for this request.\",\n { rpcMethod: \"dig.listCollectionItems\" },\n );\n return r;\n }\n\n // Stream the FULL ciphertext for a resource from the RPC by retrieval key, reassembling 3-MiB\n // chunks. A null result is a TRANSPORT failure, never a presence judgment.\n private async fetchCiphertext(\n storeId: string,\n rk: string,\n root: string,\n rpc: string,\n ): Promise<{ ciphertext: Uint8Array; proof: string; chunkLens: number[] | null }> {\n let offset = 0;\n let total: number | null = null;\n let buf: Uint8Array | null = null;\n let proof = \"\";\n let chunkLens: number[] | null = null;\n for (;;) {\n const r = await this.rpcCall<GetContentResult>(rpc, \"dig.getContent\", {\n store_id: storeId,\n root,\n retrieval_key: rk,\n offset,\n length: RPC_CHUNK_BYTES,\n });\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no data for this request.\",\n { rpcMethod: \"dig.getContent\" },\n );\n if (total === null) {\n total = r.total_length >>> 0;\n buf = new Uint8Array(total);\n }\n if (chunkLens === null && Array.isArray(r.chunk_lens)) {\n chunkLens = r.chunk_lens.map((n) => n >>> 0);\n }\n const chunk = b64ToBytes(r.ciphertext ?? \"\");\n const at = r.offset >>> 0;\n buf!.set(chunk.subarray(0, Math.max(0, Math.min(chunk.length, total - at))), at);\n if (r.inclusion_proof) proof = r.inclusion_proof;\n if (r.complete || r.next_offset == null) break;\n offset = r.next_offset >>> 0;\n }\n return { ciphertext: buf ?? new Uint8Array(0), proof, chunkLens };\n }\n\n // One JSON-RPC 2.0 call. Throws a coded DigSdkError on transport failure (RPC_TRANSPORT) or a\n // JSON-RPC/HTTP error (RPC_ERROR, carrying rpcMethod/httpStatus/rpcCode context); returns `result`.\n private async rpcCall<T>(rpc: string, method: string, params: unknown): Promise<T | null> {\n let res: Response;\n try {\n res = await this.fetchImpl(rpc, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n });\n } catch (e) {\n throw new DigSdkError(\n \"RPC_TRANSPORT\",\n \"Could not reach the content network. Check your connection and try again.\",\n { rpcMethod: method },\n { cause: e },\n );\n }\n if (!res.ok)\n throw new DigSdkError(\"RPC_ERROR\", `dig RPC ${method} failed (${res.status})`, {\n rpcMethod: method,\n httpStatus: res.status,\n });\n const json = (await res.json()) as {\n result?: T;\n error?: { message?: string; code?: number };\n };\n if (json && json.error)\n throw new DigSdkError(\n \"RPC_ERROR\",\n `dig RPC ${method}: ${json.error.message ?? \"error\"}`,\n { rpcMethod: method, rpcCode: json.error.code },\n );\n return json ? (json.result ?? null) : null;\n }\n}\n\n// AES-256-GCM-SIV-open a resource's served ciphertext under `keyHex`, splitting the PLAIN-\n// concatenated chunk ciphertexts by `chunkLens` (per-chunk CIPHERTEXT byte lengths) and opening\n// each. Empty/absent chunkLens ⇒ single-chunk resource. Throws if any chunk's tag fails.\nfunction decryptResourceChunks(\n wasm: DigClientWasm,\n keyHex: string,\n ciphertext: Uint8Array,\n chunkLens: number[] | null,\n): Uint8Array {\n const lens = chunkLens && chunkLens.length ? chunkLens : [ciphertext.length];\n const total = lens.reduce((a, n) => a + n, 0);\n if (total !== ciphertext.length) {\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"served ciphertext length does not match chunk lengths\",\n { rpcMethod: \"dig.getContent\", expected: String(total), actual: String(ciphertext.length) },\n );\n }\n if (lens.length === 1) return wasm.decryptChunk(keyHex, ciphertext);\n const parts: Uint8Array[] = [];\n let p = 0;\n for (const len of lens) {\n parts.push(wasm.decryptChunk(keyHex, ciphertext.subarray(p, p + len)));\n p += len;\n }\n const out = new Uint8Array(parts.reduce((a, x) => a + x.length, 0));\n let q = 0;\n for (const part of parts) {\n out.set(part, q);\n q += part.length;\n }\n return out;\n}\n\nfunction undefinedFetch(): typeof fetch {\n return (() => {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"No global fetch available. Pass { fetch } to DigClient (Node < 18 needs a fetch polyfill).\",\n );\n }) as unknown as typeof fetch;\n}\n","// Runtime self-description — the SDK's introspection surface, so an agent can discover the SDK's\n// version, modules, methods, supported chains, and error codes WITHOUT reading source.\n//\n// `SDK_VERSION` is replaced at build time by tsup's `define` (see tsup.config.ts) with the value\n// from package.json, so it can never drift from the published version. In a non-built/test context\n// the `declare const` falls back to \"0.0.0-dev\".\n\nimport { WALLET_METHODS, SIGN_METHODS, DEFAULT_CHAIN } from \"./methods.js\";\nimport { DIG_CLIENT_WASM_SHA256 } from \"./loader.js\";\nimport { DEFAULT_RPC } from \"./dig-client.js\";\nimport { DIG_SDK_ERROR_CODES, type DigSdkErrorCode } from \"./errors.js\";\n\n// Injected by tsup `define` ({ __SDK_VERSION__: JSON.stringify(pkg.version) }). The `declare`\n// keeps TypeScript happy; the fallback covers `ts-node`/unbundled execution.\ndeclare const __SDK_VERSION__: string | undefined;\n\n/** The SDK's semver version, from package.json (injected at build time). */\nexport const SDK_VERSION: string =\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\n/** The machine-readable description of one SDK module. */\nexport interface ModuleDescriptor {\n /** The module's public name (the class/helper a consumer imports). */\n readonly name: string;\n /** One-line summary of what it does. */\n readonly summary: string;\n /** The import path it's reachable from (the package subpath). */\n readonly entry: string;\n}\n\n/** The full machine-readable description of the SDK surface — what `capabilities()` returns. */\nexport interface SdkCapabilities {\n /** Always `\"@dignetwork/dig-sdk\"`. */\n readonly name: string;\n /** The SDK semver (= {@link SDK_VERSION}). */\n readonly version: string;\n /** The modules the SDK exposes (ChiaProvider, DigClient, Paywall, spend builders, adapters). */\n readonly modules: readonly ModuleDescriptor[];\n /** The canonical CHIP-0002 wallet method surface both transports negotiate. */\n readonly walletMethods: readonly string[];\n /** The message-signing methods, in preference order. */\n readonly signMethods: readonly string[];\n /** The wallet transports the SDK can connect through. */\n readonly transports: readonly (\"injected\" | \"walletconnect\")[];\n /** The CAIP-2 chains supported (mainnet only — there is no testnet flow). */\n readonly chains: readonly string[];\n /** The default dig RPC endpoint `DigClient` reads from. */\n readonly defaultRpc: string;\n /** The SRI digest of the read-crypto wasm from @dignetwork/dig-capsule-wasm (fail-closed on mismatch). */\n readonly readCryptoWasmSha256: string;\n /** The stable error-code catalogue (UPPER_SNAKE) consumers can branch on. */\n readonly errorCodes: readonly DigSdkErrorCode[];\n}\n\nconst MODULES: readonly ModuleDescriptor[] = Object.freeze([\n {\n name: \"ChiaProvider\",\n summary:\n \"Unified Chia wallet surface — prefers the injected DIG Browser wallet, falls back to WalletConnect→Sage.\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"DigClient\",\n summary:\n \"Read-crypto: derive URN keys, verify inclusion against an on-chain root, and decrypt content from the dig RPC.\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"Paywall\",\n summary:\n \"Pay-to-unlock helper composing ChiaProvider with the canonical chip35 monetization spends (payment / receipt / NFT+collection gating).\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"spend\",\n summary:\n \"The canonical CHIP-0035 spend builder (@dignetwork/chip35-dl-coin-wasm), re-exported verbatim.\",\n entry: \"@dignetwork/dig-sdk/spend\",\n },\n {\n name: \"adapters\",\n summary:\n \"Framework deploy glue (Vite + Next): dev window.chia shim and `digstore deploy` runner.\",\n entry: \"@dignetwork/dig-sdk/adapters\",\n },\n] as const);\n\n/**\n * Describe the SDK's surface as machine-readable data: version, modules, methods, transports,\n * chains, the default RPC, the read-crypto wasm digest, and the error-code catalogue. An agent can\n * call this to introspect the SDK without reading source.\n *\n * @example\n * import { capabilities } from \"@dignetwork/dig-sdk\";\n * const cap = capabilities();\n * cap.version; // \"0.2.0\"\n * cap.walletMethods; // [\"chip0002_connect\", …]\n * cap.errorCodes; // [\"WC_OPTIONS_REQUIRED\", …]\n */\nexport function capabilities(): SdkCapabilities {\n return {\n name: \"@dignetwork/dig-sdk\",\n version: SDK_VERSION,\n modules: MODULES,\n walletMethods: [...WALLET_METHODS],\n signMethods: [...SIGN_METHODS],\n transports: [\"injected\", \"walletconnect\"],\n chains: [DEFAULT_CHAIN],\n defaultRpc: DEFAULT_RPC,\n readCryptoWasmSha256: DIG_CLIENT_WASM_SHA256,\n errorCodes: Object.values(DIG_SDK_ERROR_CODES),\n };\n}\n\n/** Alias for {@link capabilities} — the conventional `describe()` introspection name. */\nexport const describe = capabilities;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/methods.ts","../src/errors.ts","../src/provider/injected.ts","../src/provider/wc-retry.ts","../src/provider/walletconnect.ts","../src/provider/methods.ts","../src/provider/chia-provider.ts","../src/paywall.ts","../src/loader.ts","../src/urn.ts","../src/dig-client.ts","../src/capabilities.ts"],"names":["strip0x","require"],"mappings":"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","file":"index.cjs","sourcesContent":["// The canonical CHIP-0002 / chia wallet method surface — the SINGLE source of truth shared by both\n// transports (injected window.chia and WalletConnect→Sage) so they can never drift. Extracted +\n// genericized from hub.dig.net's apps/web/lib/wallet-methods.js (the hub's \"#40\" parity list),\n// with the hub-app specifics removed.\n//\n// A method present in one transport but not the other is a real bug: a WalletConnect session that\n// omits (say) `chia_takeOffer` rejects the offer flow LOCALLY (SignClient never sends it), while\n// the same flow works against an injected wallet — an asymmetry the user experiences as \"works in\n// one place, silently fails in the other\". Keeping ONE list shared makes parity structural.\n\n/** The canonical CHIP-0002 / chia method names the SDK negotiates with the wallet. */\nexport const WALLET_METHODS = [\n \"chip0002_connect\",\n \"chip0002_chainId\",\n \"chip0002_getPublicKeys\",\n \"chip0002_getAssetCoins\",\n \"chip0002_getAssetBalance\",\n \"chip0002_signCoinSpends\",\n \"chip0002_signMessage\",\n \"chia_getAddress\",\n \"chia_signMessageByAddress\",\n \"chia_takeOffer\",\n] as const;\n\n/** Union of the canonical wallet method names. */\nexport type WalletMethod = (typeof WALLET_METHODS)[number];\n\n/**\n * Message-signing methods in preference order. `signMessage` tries the first one the active\n * session granted: `chia_signMessageByAddress` (sign by address, the login-challenge path) with\n * `chip0002_signMessage` (sign by public key) as the fallback — both are negotiated so a session\n * grants whichever the wallet supports.\n */\nexport const SIGN_METHODS = [\n \"chia_signMessageByAddress\",\n \"chip0002_signMessage\",\n] as const;\n\n/** Default Chia chain id (CAIP-2). Mainnet — there is no testnet flow. */\nexport const DEFAULT_CHAIN = \"chia:mainnet\";\n","// The SDK's typed error taxonomy — the machine-readable failure contract.\n//\n// Every failure the SDK surfaces is a `DigSdkError` (an `Error` subclass) carrying a STABLE,\n// documented `.code` (UPPER_SNAKE) plus structured context fields. An agent (or a UI) can branch on\n// `err.code` instead of string-matching the human `.message`, and the catalogue is discoverable from\n// the `.d.ts` via the exported `DIG_SDK_ERROR_CODES` const and the `DigSdkErrorCode` union.\n//\n// The codes are symbolic and never derived from the human message — the message is for humans, the\n// code is for machines. Keep this catalogue and the README \"Error codes\" table in lockstep.\n\n/**\n * The stable error-code catalogue. Each value is an UPPER_SNAKE symbolic string that callers may\n * branch on. Frozen so it can't be mutated at runtime; the README documents each meaning.\n */\nexport const DIG_SDK_ERROR_CODES = Object.freeze({\n // ---- provider / connect (provider/chia-provider.ts, provider/*) ----\n /** WalletConnect was requested/needed but no `walletConnect` options were supplied. */\n WC_OPTIONS_REQUIRED: \"WC_OPTIONS_REQUIRED\",\n /** `mode: \"injected\"` (or the injected leg of `auto`) found no usable `window.chia`. */\n NO_INJECTED_WALLET: \"NO_INJECTED_WALLET\",\n /** The optional `@walletconnect/sign-client` peer dependency is not installed/usable. */\n WC_DEPENDENCY_MISSING: \"WC_DEPENDENCY_MISSING\",\n /** The active wallet session/transport does not grant the requested method. */\n METHOD_NOT_SUPPORTED: \"METHOD_NOT_SUPPORTED\",\n /** A wallet RPC timed out (e.g. Sage did not respond within the per-request timeout). */\n WALLET_TIMEOUT: \"WALLET_TIMEOUT\",\n /** The wallet returned no public keys / no key to sign with. */\n WALLET_NO_KEYS: \"WALLET_NO_KEYS\",\n\n // ---- read-crypto / RPC (dig-client.ts, loader.ts) ----\n /** A content read needs a confirmed on-chain root and none was supplied/derivable. */\n ROOT_REQUIRED: \"ROOT_REQUIRED\",\n /** The resource did not decrypt+authenticate under this URN (wrong key/salt, or a decoy). */\n DECRYPT_FAILED: \"DECRYPT_FAILED\",\n /** The dig RPC could not be reached (network/transport failure). */\n RPC_TRANSPORT: \"RPC_TRANSPORT\",\n /** The dig RPC responded with an HTTP error or a JSON-RPC `error` object. */\n RPC_ERROR: \"RPC_ERROR\",\n /** The dig RPC returned a malformed / inconsistent payload (e.g. chunk-length mismatch). */\n RPC_MALFORMED_RESPONSE: \"RPC_MALFORMED_RESPONSE\",\n /** The read-crypto wasm failed its SRI integrity check — fail closed. */\n WASM_INTEGRITY: \"WASM_INTEGRITY\",\n /** The read-crypto wasm could not be loaded (fetch/resolve failure). */\n WASM_LOAD_FAILED: \"WASM_LOAD_FAILED\",\n\n // ---- paywall / spends (paywall.ts) ----\n /** The canonical chip35 wasm builder for this operation is unavailable (never hand-rolled). */\n SPEND_BUILDER_UNAVAILABLE: \"SPEND_BUILDER_UNAVAILABLE\",\n /** No secure random source was available to generate a payment nonce. */\n NO_SECURE_RANDOM: \"NO_SECURE_RANDOM\",\n\n // ---- deploy / adapters (adapters/run.ts, adapters/deploy.ts) ----\n /** The `digstore` binary could not be spawned (not installed / not on PATH). */\n DIGSTORE_NOT_FOUND: \"DIGSTORE_NOT_FOUND\",\n /** `digstore deploy` exited non-zero. */\n DEPLOY_FAILED: \"DEPLOY_FAILED\",\n /** `digstore deploy --json` output could not be parsed into a capsule result. */\n DEPLOY_OUTPUT_UNPARSEABLE: \"DEPLOY_OUTPUT_UNPARSEABLE\",\n\n // ---- argument validation (shared) ----\n /** An argument was malformed (e.g. a non-hex string, a bad URN, mutually-exclusive options). */\n INVALID_ARGUMENT: \"INVALID_ARGUMENT\",\n} as const);\n\n/** The union of every stable SDK error code. Branch on `err.code` against these. */\nexport type DigSdkErrorCode = (typeof DIG_SDK_ERROR_CODES)[keyof typeof DIG_SDK_ERROR_CODES];\n\n/** Structured, code-specific context attached to a {@link DigSdkError}. All fields optional. */\nexport interface DigSdkErrorContext {\n /** The dig RPC method involved (RPC_* errors). */\n rpcMethod?: string;\n /** The HTTP status returned (RPC_ERROR on a non-2xx). */\n httpStatus?: number;\n /** The JSON-RPC error code returned by the server (RPC_ERROR). */\n rpcCode?: number;\n /** The `digstore` process exit code (DEPLOY_FAILED). */\n exitCode?: number | null;\n /** The wallet method that was unsupported (METHOD_NOT_SUPPORTED). */\n method?: string;\n /** The connection mode in play (provider errors). */\n mode?: string;\n /** The offending value (INVALID_ARGUMENT — e.g. the bad hex / URN). */\n value?: string;\n /** The expected vs actual SRI digest (WASM_INTEGRITY). */\n expected?: string;\n actual?: string;\n /** Any further structured detail; kept open so codes can carry extra fields. */\n [key: string]: unknown;\n}\n\n/**\n * The SDK's typed error. Always thrown (never a bare `Error`) so consumers can branch on `.code`.\n *\n * @example\n * try {\n * await dig.read({ urn });\n * } catch (e) {\n * if (e instanceof DigSdkError && e.code === \"ROOT_REQUIRED\") promptForRoot();\n * else throw e;\n * }\n */\n/**\n * A brand stamped on every {@link DigSdkError}. The SDK ships several independently-bundled entry\n * points (index, adapters, vite, next, dig-client), each of which inlines its own copy of this\n * module — so two `DigSdkError`s can have DIFFERENT class identities across bundles and a plain\n * `instanceof` would miss one. {@link isDigSdkError} brand-checks instead, so a coded error thrown\n * from `@dignetwork/dig-sdk/adapters` is still recognized by `isDigSdkError` imported from the main\n * entry. Non-enumerable so it never shows up in `toJSON()` / spreads.\n */\nconst DIG_SDK_ERROR_BRAND = \"__dignetwork_dig_sdk_error__\";\n\nexport class DigSdkError extends Error {\n /** The stable machine code (UPPER_SNAKE). Branch on this, not the message. */\n readonly code: DigSdkErrorCode;\n /** Structured, code-specific context (rpcMethod, httpStatus, exitCode, …). */\n readonly context: DigSdkErrorContext;\n\n constructor(\n code: DigSdkErrorCode,\n message: string,\n context: DigSdkErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message);\n this.name = \"DigSdkError\";\n this.code = code;\n this.context = context;\n // Set `cause` directly (rather than via the ES2022 Error options arg) so the lib target stays\n // ES2020 while still preserving the underlying error for diagnostics.\n if (options.cause !== undefined) {\n (this as { cause?: unknown }).cause = options.cause;\n }\n // Brand the instance (non-enumerable) so isDigSdkError recognizes it across bundle boundaries.\n Object.defineProperty(this, DIG_SDK_ERROR_BRAND, { value: true, enumerable: false });\n // Preserve a correct prototype chain when compiled to ES5-ish targets / across realms.\n Object.setPrototypeOf(this, DigSdkError.prototype);\n }\n\n /** A JSON-friendly view of the error: `{ code, message, context }`. */\n toJSON(): { code: DigSdkErrorCode; message: string; context: DigSdkErrorContext } {\n return { code: this.code, message: this.message, context: this.context };\n }\n}\n\n/**\n * True iff `e` is a {@link DigSdkError} (optionally with a specific `code`). Uses a non-enumerable\n * BRAND rather than `instanceof` so it recognizes coded errors thrown from any of the SDK's\n * separately-bundled entry points (the main entry and `/adapters` inline distinct class identities).\n */\nexport function isDigSdkError(e: unknown, code?: DigSdkErrorCode): e is DigSdkError {\n const branded =\n e instanceof DigSdkError ||\n (typeof e === \"object\" && e !== null && (e as Record<string, unknown>)[DIG_SDK_ERROR_BRAND] === true);\n return branded && (code === undefined || (e as DigSdkError).code === code);\n}\n","// Injected-provider transport — the DIG Browser's in-process wallet (and compatible CHIP-0002\n// extensions), exposed on every page as `window.chia`. When present the SDK PREFERS it over\n// WalletConnect: no QR, no relay, no pairing. The native provider returns the SAME response shapes\n// Sage returns over WalletConnect, so the normalizers in provider/methods.ts are unchanged — only\n// the TRANSPORT differs. Genericized from hub.dig.net/apps/web/lib/injected-wallet.js.\n//\n// Detection: we key on the explicit, unspoofable `isDIG` marker the DIG Browser provider sets, not\n// merely the presence of `window.chia` (a different Chia provider could also define that).\n\nimport type { InjectedChiaProvider, WalletBackend } from \"../types.js\";\nimport { WALLET_METHODS, DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** The injected provider on the current global, or undefined when not running in a DIG Browser. */\nexport function getInjectedProvider(): InjectedChiaProvider | undefined {\n const g = globalThis as { chia?: InjectedChiaProvider };\n return typeof g !== \"undefined\" ? g.chia : undefined;\n}\n\n/**\n * True iff an injected DIG wallet is available. Detects on the unspoofable `isDIG` marker. Pass\n * `{ anyChia: true }` to accept any `window.chia` that implements `request` (e.g. a non-DIG\n * CHIP-0002 extension).\n */\nexport function isInjectedAvailable(opts: { anyChia?: boolean } = {}): boolean {\n const p = getInjectedProvider();\n if (!p) return false;\n if (opts.anyChia) return typeof p.request === \"function\";\n return !!p.isDIG;\n}\n\n/** Sentinel topic for the injected backend (it has no per-session relay topic). */\nexport const INJECTED_TOPIC = \"injected\";\n\n/** A WalletTransport backed by the injected window.chia provider. */\nexport class InjectedTransport implements WalletTransport {\n readonly backend: WalletBackend = \"injected\";\n readonly topic = INJECTED_TOPIC;\n readonly chain: string;\n private readonly provider: InjectedChiaProvider;\n\n constructor(provider: InjectedChiaProvider, chain: string = DEFAULT_CHAIN) {\n this.provider = provider;\n this.chain = chain;\n }\n\n /** Connect: ask the native wallet to approve this origin. Blocks until approved/rejected. */\n async connect(eager = false): Promise<void> {\n if (typeof this.provider.connect === \"function\") {\n await this.provider.connect(eager);\n }\n // A provider without connect() (older build) is tolerated — request() will gate per-method.\n }\n\n // The native wallet implements the full canonical set (it returns Sage-shaped responses), so\n // support is a static allowlist — no per-session negotiation as with WalletConnect.\n supports(method: string): boolean {\n return (WALLET_METHODS as readonly string[]).includes(method);\n }\n\n async request(method: string, params: unknown): Promise<unknown> {\n if (!this.supports(method)) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n `The DIG Browser wallet does not support \"${method}\".`,\n { method },\n );\n }\n return this.provider.request({ method, params });\n }\n\n async disconnect(): Promise<void> {\n // The injected wallet has no per-session teardown; per-origin consent is managed in the wallet.\n }\n}\n","// The transient-relay-publish detector — the double-prompt safety boundary. Lives in its own\n// dependency-free module (no @walletconnect/sign-client) so it can be unit-tested under\n// `node --test`. Ported verbatim in spirit from hub.dig.net/apps/web/lib/wc-retry.js.\n//\n// A WalletConnect request can fail in two very different ways:\n// • the relay failed to PUBLISH the request (it never reached the wallet) — safe to retry, the\n// wallet never saw it, so a retry can't double-prompt or double-sign; OR\n// • the wallet/user rejected, or the response timed out — NOT safe to retry.\n// Only the first is transient. This predicate decides which.\n\n/** True iff `err` looks like a transient relay-publish failure (request never reached the wallet). */\nexport function isTransientPublishError(err: unknown): boolean {\n const msg = (\n err instanceof Error ? err.message : typeof err === \"string\" ? err : \"\"\n ).toLowerCase();\n if (!msg) return false;\n return (\n msg.includes(\"publish\") ||\n msg.includes(\"failed or timed out to publish\") ||\n msg.includes(\"websocket connection failed\") ||\n msg.includes(\"connection closed\") ||\n msg.includes(\"socket stalled\") ||\n msg.includes(\"request reset\")\n );\n}\n","// WalletConnect v2 → Sage transport. Genericized from hub.dig.net/apps/web/lib/walletconnect.js,\n// keeping the production-proven patterns and removing the hub-app specifics:\n// • optionalNamespaces ONLY (Sage rejects requiredNamespaces),\n// • the canonical CHIP-0002 method set (src/methods.ts),\n// • a per-request response timeout (a backgrounded mobile Sage can hang forever),\n// • bounded retries for transient relay-PUBLISH failures only (never double-prompts),\n// • session restore gated on a sign method being granted.\n//\n// `@walletconnect/sign-client` is an OPTIONAL peer dependency — it's imported dynamically so the\n// rest of the SDK (DigClient, injected transport) loads without it. Apps that use the WC fallback\n// install it; apps that only target the DIG Browser don't pay for it.\n\nimport { WALLET_METHODS, SIGN_METHODS, DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletBackend } from \"../types.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport { isTransientPublishError } from \"./wc-retry.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** App metadata shown to the wallet during pairing. */\nexport interface WalletConnectMetadata {\n name: string;\n description: string;\n url: string;\n icons: string[];\n}\n\n/** Options to start a WalletConnect connection. */\nexport interface WalletConnectOptions {\n /** WalletConnect Cloud project id (required by the relay). */\n projectId: string;\n /** App metadata shown in the wallet. */\n metadata: WalletConnectMetadata;\n /** CAIP-2 chain id. Defaults to \"chia:mainnet\". */\n chain?: string;\n /** Per-request response timeout (ms). Default 60_000. */\n requestTimeoutMs?: number;\n /**\n * Called with the pairing URI so the app can render a QR / copy-link. The returned/awaited\n * approval resolves to the session once the user approves in the wallet.\n */\n onUri?: (uri: string) => void;\n}\n\n// Minimal structural types for the parts of SignClient we use (avoids a hard type dependency).\ninterface WcSession {\n topic: string;\n namespaces?: { chia?: { methods?: string[] } };\n}\ninterface WcSignClient {\n connect(args: {\n optionalNamespaces: Record<string, { methods: string[]; chains: string[]; events: string[] }>;\n }): Promise<{ uri?: string; approval: () => Promise<WcSession> }>;\n request(args: {\n topic: string;\n chainId: string;\n request: { method: string; params: unknown };\n }): Promise<unknown>;\n disconnect(args: { topic: string; reason: { code: number; message: string } }): Promise<void>;\n session: {\n get(topic: string): WcSession | undefined;\n getAll(): WcSession[];\n };\n}\n\n/** A WalletTransport backed by WalletConnect → Sage. */\nexport class WalletConnectTransport implements WalletTransport {\n readonly backend: WalletBackend = \"walletconnect\";\n readonly chain: string;\n readonly topic: string;\n private readonly client: WcSignClient;\n private readonly requestTimeoutMs: number;\n // Base inter-attempt back-off (ms); attempt N waits `backoffBaseMs * N`. Defaulted to the\n // production value and only overridden by tests (to ~0) to keep the retry suite fast — a private,\n // defaulted test seam that never changes real behaviour.\n private readonly backoffBaseMs: number;\n\n private constructor(\n client: WcSignClient,\n session: WcSession,\n chain: string,\n requestTimeoutMs: number,\n backoffBaseMs = 1200,\n ) {\n this.client = client;\n this.topic = session.topic;\n this.chain = chain;\n this.requestTimeoutMs = requestTimeoutMs;\n this.backoffBaseMs = backoffBaseMs;\n }\n\n /**\n * Initialize SignClient, open a pairing (emitting the URI via `onUri`), and resolve to a\n * connected transport once the user approves in Sage. Requires `@walletconnect/sign-client`.\n */\n static async connect(options: WalletConnectOptions): Promise<WalletConnectTransport> {\n const chain = options.chain ?? DEFAULT_CHAIN;\n const timeout = options.requestTimeoutMs ?? 60_000;\n const SignClient = await loadSignClient();\n const client = (await SignClient.init({\n logger: \"error\",\n projectId: options.projectId,\n metadata: options.metadata,\n })) as unknown as WcSignClient;\n const { uri, approval } = await client.connect({\n // optionalNamespaces ONLY — Sage rejects requiredNamespaces.\n optionalNamespaces: {\n chia: { methods: WALLET_METHODS as unknown as string[], chains: [chain], events: [] },\n },\n });\n if (uri && options.onUri) options.onUri(uri);\n const session = await approval();\n return new WalletConnectTransport(client, session, chain, timeout);\n }\n\n /**\n * Restore an existing session that grants a sign method (so message signing actually reaches\n * Sage). Returns a transport or null if none qualifies. Requires `@walletconnect/sign-client`.\n */\n static async restore(options: {\n projectId: string;\n metadata: WalletConnectMetadata;\n chain?: string;\n requestTimeoutMs?: number;\n }): Promise<WalletConnectTransport | null> {\n const chain = options.chain ?? DEFAULT_CHAIN;\n const timeout = options.requestTimeoutMs ?? 60_000;\n const SignClient = await loadSignClient();\n const client = (await SignClient.init({\n logger: \"error\",\n projectId: options.projectId,\n metadata: options.metadata,\n })) as unknown as WcSignClient;\n const sessions = client.session.getAll();\n for (let i = sessions.length - 1; i >= 0; i--) {\n const s = sessions[i]!;\n const methods = s.namespaces?.chia?.methods ?? [];\n if ((SIGN_METHODS as readonly string[]).some((m) => methods.includes(m))) {\n return new WalletConnectTransport(client, s, chain, timeout);\n }\n }\n return null;\n }\n\n private sessionMethods(): string[] {\n try {\n return this.client.session.get(this.topic)?.namespaces?.chia?.methods ?? [];\n } catch {\n return [];\n }\n }\n\n // True iff the active session granted `method` (empty list = unknown ⇒ treated as granted).\n supports(method: string): boolean {\n const m = this.sessionMethods();\n return m.length === 0 || m.includes(method);\n }\n\n async request(method: string, params: unknown): Promise<unknown> {\n if (!this.supports(method)) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n `Your wallet session does not grant \"${method}\". Disconnect and reconnect your wallet ` +\n \"to refresh the session (and make sure Sage is up to date).\",\n { method },\n );\n }\n const MAX_ATTEMPTS = 3;\n let lastErr: unknown;\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n try {\n return await this.attempt(method, params);\n } catch (e) {\n lastErr = e;\n // Only retry transient relay-publish failures (request never reached Sage). Timeouts and\n // wallet/user rejections fall through and throw immediately.\n if (i < MAX_ATTEMPTS - 1 && isTransientPublishError(e)) {\n await sleep(this.backoffBaseMs * (i + 1));\n continue;\n }\n throw e;\n }\n }\n throw lastErr;\n }\n\n private attempt(method: string, params: unknown): Promise<unknown> {\n let t: ReturnType<typeof setTimeout>;\n const timeout = new Promise<never>((_, rej) => {\n t = setTimeout(\n () =>\n rej(\n new DigSdkError(\n \"WALLET_TIMEOUT\",\n \"Sage did not respond — open the Sage app and try again.\",\n { method, timeoutMs: this.requestTimeoutMs },\n ),\n ),\n this.requestTimeoutMs,\n );\n });\n return Promise.race([\n this.client.request({ topic: this.topic, chainId: this.chain, request: { method, params } }),\n timeout,\n ]).finally(() => clearTimeout(t));\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.client.disconnect({\n topic: this.topic,\n reason: { code: 6000, message: \"bye\" },\n });\n } catch {\n /* best-effort */\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n// Dynamically import the optional peer dep, with a clear error if it isn't installed.\nasync function loadSignClient(): Promise<{ init(opts: unknown): Promise<unknown> }> {\n try {\n // Optional peer dependency — may not be installed (e.g. an injected-only dapp). The dynamic\n // import is wrapped so a missing module surfaces as the actionable error below, and the\n // specifier is suppressed for type resolution since the package is not a hard dependency.\n // @ts-ignore -- optional peer dependency, not resolvable when uninstalled\n const mod = (await import(\"@walletconnect/sign-client\")) as {\n default?: { init(opts: unknown): Promise<unknown> };\n init?(opts: unknown): Promise<unknown>;\n };\n const SignClient = mod.default ?? (mod as { init(opts: unknown): Promise<unknown> });\n if (!SignClient || typeof SignClient.init !== \"function\") {\n throw new Error(\"unexpected @walletconnect/sign-client shape\");\n }\n return SignClient;\n } catch (e) {\n throw new DigSdkError(\n \"WC_DEPENDENCY_MISSING\",\n \"WalletConnect fallback requires the optional peer dependency '@walletconnect/sign-client'. \" +\n \"Install it (npm i @walletconnect/sign-client) to use the WalletConnect→Sage transport.\",\n {},\n { cause: e },\n );\n }\n}\n","// CHIP-0002 response-shape normalizers — the tolerant adapters that turn wallet-specific casing\n// (with/without 0x, snake_case/camelCase, string-vs-object) into one canonical shape. Extracted\n// from hub.dig.net/apps/web/lib/sage.js and made transport-agnostic: each takes a `request`\n// function and a `supports` predicate, so the SAME normalizers serve both the injected and\n// WalletConnect transports.\n\nimport type { SignResult } from \"../types.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/** A function that issues one CHIP-0002 RPC through some transport. */\nexport type RequestFn = (method: string, params: unknown) => Promise<unknown>;\n/** A predicate: does the active session grant `method`? */\nexport type SupportsFn = (method: string) => boolean;\n\n/** Ensure a hex string is `0x`-prefixed (or pass through null/empty). */\nexport function with0x(hex: string | null | undefined): string | null {\n if (!hex) return hex ?? null;\n return hex.startsWith(\"0x\") ? hex : `0x${hex}`;\n}\n\nfunction strip0x(h: unknown): string {\n return String(h ?? \"\").replace(/^0x/i, \"\").toLowerCase();\n}\n\n/** The wallet's receive address (tolerant of string / {address} / {data:{address}}). */\nexport async function getAddress(request: RequestFn): Promise<string | null> {\n const resp = await request(\"chia_getAddress\", {});\n if (typeof resp === \"string\") return resp;\n const r = resp as { address?: string; data?: { address?: string } } | null;\n return r?.address ?? r?.data?.address ?? null;\n}\n\n/** The wallet's (synthetic) public keys. */\nexport async function getPublicKeys(request: RequestFn): Promise<string[]> {\n const resp = await request(\"chip0002_getPublicKeys\", { limit: 500, offset: 0 });\n if (Array.isArray(resp)) return resp as string[];\n const r = resp as { publicKeys?: string[]; public_keys?: string[]; keys?: string[] } | null;\n return r?.publicKeys ?? r?.public_keys ?? r?.keys ?? [];\n}\n\n/** Normalize a wallet sign response into `{ publicKey, signature }` (0x-normalized). */\nfunction normalizeSig(resp: unknown): SignResult {\n const r = resp as\n | { publicKey?: string; public_key?: string; pubkey?: string;\n signature?: string; aggregatedSignature?: string; aggregated_signature?: string }\n | string\n | null;\n const publicKey =\n typeof r === \"object\" && r ? (r.publicKey ?? r.public_key ?? r.pubkey ?? null) : null;\n const signature =\n typeof r === \"string\"\n ? r\n : r\n ? (r.signature ?? r.aggregatedSignature ?? r.aggregated_signature ?? null)\n : null;\n return { publicKey: with0x(publicKey), signature };\n}\n\n/**\n * Sign a UTF-8 message with the wallet BLS key. Prefers `chia_signMessageByAddress` (sign by\n * address — the login-challenge path); falls back to `chip0002_signMessage` (sign by public key)\n * when the active session didn't grant the by-address method, so a real signature request still\n * reaches the wallet. Returns `{ publicKey, signature }`.\n */\nexport async function signMessage(\n request: RequestFn,\n supports: SupportsFn,\n message: string,\n address: string,\n): Promise<SignResult> {\n if (supports(\"chia_signMessageByAddress\")) {\n return normalizeSig(await request(\"chia_signMessageByAddress\", { message, address }));\n }\n const keys = await getPublicKeys(request);\n const publicKey = keys[0];\n if (!publicKey)\n throw new DigSdkError(\"WALLET_NO_KEYS\", \"Wallet returned no keys to sign with.\");\n const sig = normalizeSig(await request(\"chip0002_signMessage\", { message, publicKey }));\n return { publicKey: sig.publicKey ?? with0x(publicKey), signature: sig.signature };\n}\n\n/** Sign raw CHIP-0035 coin spends (partialSign) — the mint/commit/update path. Returns hex sig. */\nexport async function signCoinSpends(\n request: RequestFn,\n coinSpends: unknown,\n): Promise<string> {\n const resp = await request(\"chip0002_signCoinSpends\", { coinSpends, partialSign: true });\n if (typeof resp === \"string\") return resp;\n const r = resp as\n | { signature?: string; aggregatedSignature?: string; aggregated_signature?: string }\n | null;\n return r?.signature ?? r?.aggregatedSignature ?? r?.aggregated_signature ?? \"\";\n}\n\n/** Accept a Chia offer string (e.g. a MintGarden NFT offer). Returns whatever the wallet returns. */\nexport async function takeOffer(\n request: RequestFn,\n supports: SupportsFn,\n offer: string,\n fee = 0,\n): Promise<unknown> {\n if (!supports(\"chia_takeOffer\")) {\n throw new DigSdkError(\n \"METHOD_NOT_SUPPORTED\",\n \"Your wallet session does not support taking offers. Reconnect your wallet.\",\n { method: \"chia_takeOffer\" },\n );\n }\n return request(\"chia_takeOffer\", { offer, fee });\n}\n\n/** A mojo balance string, tolerant of the common casing shapes; null if unsupported. */\nfunction balanceFrom(resp: unknown): string | null {\n const raw =\n resp == null\n ? null\n : typeof resp === \"object\"\n ? ((resp as Record<string, unknown>).confirmed ??\n (resp as Record<string, unknown>).spendable ??\n (resp as Record<string, unknown>).confirmedWalletBalance ??\n (resp as Record<string, unknown>).confirmed_wallet_balance ??\n (resp as Record<string, unknown>).balance ??\n (resp as { data?: { confirmed?: unknown } }).data?.confirmed ??\n null)\n : resp;\n if (raw == null) return null;\n try {\n return BigInt(raw as string | number | bigint).toString();\n } catch {\n return null;\n }\n}\n\n/** The wallet's spendable XCH balance (mojos, string). Null if the wallet doesn't surface it. */\nexport async function getXchBalance(request: RequestFn): Promise<string | null> {\n return balanceFrom(await request(\"chip0002_getAssetBalance\", { type: null, assetId: null }));\n}\n\n/** The wallet's spendable balance (base units, string) for a CAT `assetIdHex`. */\nexport async function getCatBalance(\n request: RequestFn,\n assetIdHex: string,\n): Promise<string | null> {\n return balanceFrom(\n await request(\"chip0002_getAssetBalance\", { type: \"cat\", assetId: strip0x(assetIdHex) }),\n );\n}\n\n/** Unspent XCH coins for funding a spend. */\nexport async function getXchCoins(request: RequestFn, limit = 100): Promise<unknown[]> {\n const resp = await request(\"chip0002_getAssetCoins\", {\n type: null,\n assetId: null,\n includedLocked: false,\n offset: 0,\n limit,\n });\n return Array.isArray(resp) ? resp : ((resp as { coins?: unknown[] })?.coins ?? []);\n}\n\n/** Unspent CAT coins for `assetIdHex` (the tail hash, plain hex). */\nexport async function getCatCoins(\n request: RequestFn,\n assetIdHex: string,\n limit = 200,\n): Promise<unknown[]> {\n const resp = await request(\"chip0002_getAssetCoins\", {\n type: \"cat\",\n assetId: strip0x(assetIdHex),\n includedLocked: false,\n offset: 0,\n limit,\n });\n return Array.isArray(resp) ? resp : ((resp as { coins?: unknown[] })?.coins ?? []);\n}\n","// ChiaProvider — the wallet abstraction at the front of the SDK. It owns ONE WalletTransport\n// (injected window.chia, or WalletConnect→Sage) and exposes the normalized CHIP-0002 surface on\n// top of it, so a dapp writes the same `provider.signMessage(...)` regardless of how the user's\n// wallet is connected.\n//\n// Selection policy (the \"wallet your dapp gets for free\"): PREFER the injected DIG Browser wallet\n// when present (no QR, no relay, instant), and FALL BACK to WalletConnect→Sage otherwise. This is\n// exactly the dual-transport policy hub.dig.net runs (apps/web/lib/wallet-transport.js +\n// walletconnect.js), packaged so any dapp gets it in a few lines.\n\nimport type { SignResult, WalletBackend, WalletSession } from \"../types.js\";\nimport { DEFAULT_CHAIN } from \"../methods.js\";\nimport type { WalletTransport } from \"./transport.js\";\nimport {\n InjectedTransport,\n getInjectedProvider,\n isInjectedAvailable,\n} from \"./injected.js\";\nimport {\n WalletConnectTransport,\n type WalletConnectOptions,\n} from \"./walletconnect.js\";\nimport * as M from \"./methods.js\";\nimport { DigSdkError } from \"../errors.js\";\n\n/**\n * A connector id for the 'Browser Wallet vs WalletConnect' chooser (#63) — the discoverable,\n * user-facing counterpart of the lower-level {@link WalletBackend}. `\"browser-wallet\"` is an alias\n * for the `\"injected\"` backend, named to match the chooser UI label every DIG frontend uses.\n */\nexport type ConnectorId = \"browser-wallet\" | \"walletconnect\";\n\n/**\n * One entry in {@link ChiaProvider.listConnectors}: a connector a chooser UI can offer, and\n * whether it's currently usable.\n */\nexport interface ConnectorInfo {\n /** The id to pass as `ConnectOptions.mode` once the user picks this connector. */\n id: ConnectorId;\n /** The underlying transport backend this connector selects. */\n backend: WalletBackend;\n /** Human-facing label (\"Browser Wallet\" / \"WalletConnect\") — the canonical chooser copy. */\n label: string;\n /**\n * True iff this connector can be connected right now. Browser Wallet requires a detected\n * injected `window.chia`; WalletConnect is always offered (its relay has no presence to detect).\n */\n available: boolean;\n}\n\n/** Options for `ChiaProvider.connect()`. */\nexport interface ConnectOptions {\n /**\n * Connection mode:\n * • \"auto\" (default) — prefer the injected DIG wallet; fall back to WalletConnect if\n * absent. A convenience for callers that don't want to present a\n * chooser; it never asks the user, so if BOTH a Browser Wallet and\n * WalletConnect are viable it silently picks Browser Wallet — kept\n * for backward compatibility with existing single-shot integrations.\n * • \"browser-wallet\" — require the injected Browser Wallet (throws if absent). The\n * explicit-preference value for a Connect chooser (see\n * {@link ChiaProvider.listConnectors}); an alias of \"injected\".\n * • \"injected\" — same as \"browser-wallet\" (kept for backward compatibility).\n * • \"walletconnect\" — force the WalletConnect→Sage pairing.\n *\n * To offer the user a real choice — never auto-binding to whichever wallet happens to be\n * injected — call {@link ChiaProvider.listConnectors} to enumerate what's available, let the\n * user pick, then pass their pick's `id` (`\"browser-wallet\"` or `\"walletconnect\"`) as `mode`.\n */\n mode?: \"auto\" | WalletBackend | ConnectorId;\n /**\n * WalletConnect options, required for the WalletConnect fallback/force path (projectId +\n * metadata + onUri). Omit if you only target the injected DIG Browser wallet.\n */\n walletConnect?: WalletConnectOptions;\n /** CAIP-2 chain id. Defaults to \"chia:mainnet\". */\n chain?: string;\n /** Accept any `window.chia` (not just the DIG Browser's `isDIG` provider) for the injected path. */\n acceptAnyInjected?: boolean;\n}\n\n/**\n * A connected Chia wallet. Construct it via `ChiaProvider.connect(...)` (or the convenience\n * `connectWallet(...)`), then call the normalized methods.\n *\n * @example\n * const provider = await ChiaProvider.connect({\n * mode: \"auto\",\n * walletConnect: { projectId, metadata, onUri: (uri) => showQr(uri) },\n * });\n * const { signature } = await provider.signMessage(\"Login to my dapp\", await provider.getAddress());\n */\nexport class ChiaProvider {\n private readonly transport: WalletTransport;\n private cachedAddress: string | null | undefined;\n\n private constructor(transport: WalletTransport) {\n this.transport = transport;\n }\n\n /** Which transport is backing this provider. */\n get backend(): WalletBackend {\n return this.transport.backend;\n }\n\n /** The connected session descriptor. */\n get session(): WalletSession {\n return {\n backend: this.transport.backend,\n chain: this.transport.chain,\n topic: this.transport.topic,\n address: this.cachedAddress ?? null,\n };\n }\n\n /** True iff a method is granted by the active session/transport. */\n supports(method: string): boolean {\n return this.transport.supports(method);\n }\n\n /** Escape hatch: issue a raw CHIP-0002 request through the active transport. */\n request(method: string, params: unknown = {}): Promise<unknown> {\n return this.transport.request(method, params);\n }\n\n /**\n * Connect a wallet using the selection policy. With `mode: \"auto\"` (default) it prefers an\n * injected DIG wallet and falls back to WalletConnect.\n */\n static async connect(options: ConnectOptions = {}): Promise<ChiaProvider> {\n // \"browser-wallet\" (the chooser-facing connector id, #63) is an alias of \"injected\" (the\n // transport/backend id) — normalize once so the rest of this method has one code path.\n const rawMode = options.mode ?? \"auto\";\n const mode = rawMode === \"browser-wallet\" ? \"injected\" : rawMode;\n const chain = options.chain ?? DEFAULT_CHAIN;\n\n const tryInjected = async (): Promise<ChiaProvider | null> => {\n if (!isInjectedAvailable({ anyChia: options.acceptAnyInjected })) return null;\n const provider = getInjectedProvider()!;\n const transport = new InjectedTransport(provider, chain);\n await transport.connect();\n return new ChiaProvider(transport);\n };\n\n const tryWalletConnect = async (): Promise<ChiaProvider> => {\n if (!options.walletConnect) {\n throw new DigSdkError(\n \"WC_OPTIONS_REQUIRED\",\n \"WalletConnect options are required to connect via WalletConnect \" +\n \"(pass { walletConnect: { projectId, metadata, onUri } }).\",\n { mode: rawMode },\n );\n }\n const transport = await WalletConnectTransport.connect({\n ...options.walletConnect,\n chain,\n });\n return new ChiaProvider(transport);\n };\n\n if (mode === \"injected\") {\n const injected = await tryInjected();\n if (!injected) {\n throw new DigSdkError(\n \"NO_INJECTED_WALLET\",\n \"No injected DIG wallet found. Open this page in the DIG Browser, or use mode 'auto'.\",\n { mode: rawMode, acceptAnyInjected: !!options.acceptAnyInjected },\n );\n }\n return injected;\n }\n if (mode === \"walletconnect\") return tryWalletConnect();\n // auto\n return (await tryInjected()) ?? (await tryWalletConnect());\n }\n\n /**\n * Enumerate the connectors a 'Browser Wallet vs WalletConnect' Connect chooser can offer (#63).\n * Pure and side-effect-free — it only DETECTS what's usable right now, it never connects to\n * anything — so a chooser UI built around it always surfaces the choice instead of silently\n * auto-binding to whichever wallet happens to be injected.\n *\n * @example\n * const connectors = ChiaProvider.listConnectors();\n * // render a button per connector, disabling any with `available: false`\n * const chosen = connectors.find((c) => c.id === userPick)!;\n * const provider = await ChiaProvider.connect({ mode: chosen.id, walletConnect });\n */\n static listConnectors(options: { acceptAnyInjected?: boolean } = {}): ConnectorInfo[] {\n return [\n {\n id: \"browser-wallet\",\n backend: \"injected\",\n label: \"Browser Wallet\",\n available: isInjectedAvailable({ anyChia: options.acceptAnyInjected }),\n },\n {\n id: \"walletconnect\",\n backend: \"walletconnect\",\n label: \"WalletConnect\",\n available: true,\n },\n ];\n }\n\n /** Wrap an already-constructed transport (advanced / restored sessions). */\n static fromTransport(transport: WalletTransport): ChiaProvider {\n return new ChiaProvider(transport);\n }\n\n // ---- normalized CHIP-0002 surface -------------------------------------------------------------\n\n /** The wallet's receive address (cached after first read). */\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress === undefined) {\n this.cachedAddress = await M.getAddress((m, p) => this.transport.request(m, p));\n }\n return this.cachedAddress;\n }\n\n /** The wallet's (synthetic) public keys. */\n getPublicKeys(): Promise<string[]> {\n return M.getPublicKeys((m, p) => this.transport.request(m, p));\n }\n\n /**\n * Sign a UTF-8 message with the wallet BLS key. `address` defaults to the wallet's own address.\n * Returns `{ publicKey, signature }`.\n */\n async signMessage(message: string, address?: string): Promise<SignResult> {\n const addr = address ?? (await this.getAddress()) ?? \"\";\n return M.signMessage(\n (m, p) => this.transport.request(m, p),\n (m) => this.transport.supports(m),\n message,\n addr,\n );\n }\n\n /** Sign raw CHIP-0035 coin spends (partialSign). Returns the aggregated signature hex. */\n signCoinSpends(coinSpends: unknown): Promise<string> {\n return M.signCoinSpends((m, p) => this.transport.request(m, p), coinSpends);\n }\n\n /** Accept a Chia offer string (e.g. an NFT offer). */\n takeOffer(offer: string, fee = 0): Promise<unknown> {\n return M.takeOffer(\n (m, p) => this.transport.request(m, p),\n (m) => this.transport.supports(m),\n offer,\n fee,\n );\n }\n\n /** Spendable XCH balance (mojos, string) or null. */\n getXchBalance(): Promise<string | null> {\n return M.getXchBalance((m, p) => this.transport.request(m, p));\n }\n\n /** Spendable balance (base units, string) for a CAT `assetIdHex` (the tail hash), or null. */\n getCatBalance(assetIdHex: string): Promise<string | null> {\n return M.getCatBalance((m, p) => this.transport.request(m, p), assetIdHex);\n }\n\n /** Unspent XCH coins for funding a spend. */\n getXchCoins(limit?: number): Promise<unknown[]> {\n return M.getXchCoins((m, p) => this.transport.request(m, p), limit);\n }\n\n /** Unspent CAT coins for `assetIdHex`. */\n getCatCoins(assetIdHex: string, limit?: number): Promise<unknown[]> {\n return M.getCatCoins((m, p) => this.transport.request(m, p), assetIdHex, limit);\n }\n\n /** Disconnect the wallet (best-effort). */\n disconnect(): Promise<void> {\n return this.transport.disconnect();\n }\n}\n\n/** Convenience wrapper: `connectWallet(opts)` === `ChiaProvider.connect(opts)`. */\nexport function connectWallet(options?: ConnectOptions): Promise<ChiaProvider> {\n return ChiaProvider.connect(options);\n}\n","// Paywall — the high-level monetization helper (#46). It composes a connected `ChiaProvider` (the\n// user's wallet) with the CANONICAL chip35 monetization spends so a dapp can charge for access in a\n// few lines: `await paywall.requestPayment({ amount, owner })` pays the dapp owner and returns a\n// receipt; `paywall.verifyReceipt(...)` and `paywall.proveAccess({ nft | collection })` gate access.\n//\n// HARD RULE (SYSTEM.md → Change-impact guide): spend bundles are NEVER hand-rolled. Every coin spend\n// is built by `@dignetwork/chip35-dl-coin-wasm` (the single source of truth for CHIP-0035 spends).\n// The Paywall only ORCHESTRATES: it sources the buyer's coins from the wallet, asks the wasm to build\n// the coin spends, and pushes those exact coin spends back to the wallet for signing\n// (`ChiaProvider.signCoinSpends`). It contains zero spend-assembly logic of its own — if the wasm\n// builder is unavailable, it throws rather than fabricate a spend.\n//\n// The chip35 wasm is wasm-bindgen \"bundler\"-target glue (a top-level `import * as wasm from\n// \"./..._bg.wasm\"`), which bundlers/browsers load but plain Node's ESM loader cannot. So the spends\n// are obtained via an injectable `spends` provider that defaults to a lazy\n// `import(\"@dignetwork/chip35-dl-coin-wasm\")` — apps in a bundler get it for free; tests (and exotic\n// runtimes) inject the builder. Either way the builder is the canonical wasm, never a reimplementation.\n\nimport type { ChiaProvider } from \"./provider/chia-provider.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/** A payment asset: XCH, or a CAT identified by its tail hash (e.g. $DIG). */\nexport type PaymentAssetSpec =\n | { xch: true; assetId?: undefined }\n | { xch?: false; assetId: string };\n\n/**\n * The subset of `@dignetwork/chip35-dl-coin-wasm` the Paywall drives. The full wasm module satisfies\n * this shape, so `import(\"@dignetwork/chip35-dl-coin-wasm\")` (or the SDK's \"./spend\" re-export) can\n * be passed directly. Declared as a structural type so the SDK does not statically import the\n * (bundler-only) wasm and tests can inject a spy.\n */\nexport interface MonetizationSpends {\n /** wasm-bindgen init. Called once before building spends (a no-op if the runtime needs none). */\n init?: () => unknown;\n /** SHA-256-derive a 32-byte unlock nonce from request bytes. */\n paymentNonce?: (requestBytes: Uint8Array) => Uint8Array;\n /** Build the coin spends for an XCH payment. Returns `{ coinSpends, receipt }`. */\n buildPayment?: (\n buyerSyntheticKey: Uint8Array,\n selectedCoins: unknown,\n ownerPuzzleHash: Uint8Array,\n amount: bigint,\n nonce: Uint8Array,\n fee: bigint,\n ) => { coinSpends: unknown; receipt: unknown };\n /** Build the coin spends for a CAT (incl. DIG) payment. Returns `{ coinSpends, receipt }`. */\n buildCatPayment?: (\n buyerSyntheticKey: Uint8Array,\n selectedCats: unknown,\n ownerPuzzleHash: Uint8Array,\n amount: bigint,\n nonce: Uint8Array,\n ) => { coinSpends: unknown; receipt: unknown };\n /** Verify an observed payment unlocks the paywall. Returns `{ ok, error? }`. */\n verifyPaymentReceipt?: (\n observed: unknown,\n ownerPuzzleHash: Uint8Array,\n minAmount: bigint,\n requiredAsset: unknown,\n requireNonce?: Uint8Array | null,\n ) => { ok: boolean; error?: string };\n /** Prove NFT ownership (optionally gating on a launcher id). Returns `{ ok, proof?, error? }`. */\n proveNftOwnership?: (\n parentSpend: unknown,\n claimedOwnerPuzzleHash: Uint8Array,\n requiredNft?: Uint8Array | null,\n ) => { ok: boolean; proof?: unknown; error?: string };\n /** Prove collection/creator membership for an owner. Returns `{ ok, proof?, error? }`. */\n proveCollectionMembership?: (\n parentSpend: unknown,\n claimedOwnerPuzzleHash: Uint8Array,\n requiredDid: Uint8Array,\n ) => { ok: boolean; proof?: unknown; error?: string };\n}\n\n/** Options for constructing a `Paywall`. */\nexport interface PaywallOptions {\n /**\n * The canonical chip35 monetization spends. Defaults to a lazy\n * `import(\"@dignetwork/chip35-dl-coin-wasm\")` (and calls its `init()`), so a bundled dapp needs to\n * pass nothing. Inject a builder for non-bundler runtimes or tests.\n */\n spends?: MonetizationSpends;\n}\n\n/** Arguments for `Paywall.requestPayment`. */\nexport interface RequestPaymentArgs {\n /** Amount to pay, in mojos (XCH) or base units (CAT). Number or bigint. */\n amount: number | bigint;\n /** The dapp owner's puzzle hash to pay (hex, with or without `0x`). */\n owner: string;\n /** Pay in this CAT (tail hash hex). Omit for XCH. */\n assetId?: string;\n /**\n * A free-form unlock identifier (e.g. `dappId|resource|user`). When given without an explicit\n * `nonce`, the Paywall derives the 32-byte nonce from it via the wasm `paymentNonce` (deterministic\n * convenience). Ignored when `nonce` is supplied.\n */\n memo?: string;\n /** An explicit 32-byte unlock nonce (hex). Overrides `memo`. Random 32 bytes are used if neither. */\n nonce?: string;\n /** Network fee in mojos (XCH payments only; CAT rings net to zero). Defaults to 0. */\n fee?: number | bigint;\n /** Cap on the number of buyer coins to source from the wallet. */\n coinLimit?: number;\n}\n\n/** The result of a successful `requestPayment`: the wallet signature + the wasm receipt + spends. */\nexport interface PaymentResult {\n /** The aggregated BLS signature the wallet returned for the coin spends. */\n signature: string;\n /** The `PaymentReceipt` the wasm produced — persist it; `verifyReceipt` later checks the chain. */\n receipt: unknown;\n /** The exact coin spends the wasm built and the wallet signed. */\n coinSpends: unknown;\n /** The 32-byte unlock nonce embedded in the payment (hex). */\n nonce: string;\n}\n\n/** Arguments for `Paywall.verifyReceipt`. */\nexport interface VerifyReceiptArgs {\n /** The `ObservedPayment` the dapp filled in after reading the owner's coin from the chain. */\n observed: unknown;\n /** The owner puzzle hash that must have been paid (hex). */\n owner: string;\n /** The minimum amount that must have been paid (mojos / base units). */\n minAmount: number | bigint;\n /** The required asset. Defaults to XCH; pass `{ assetId }` to require a CAT. */\n asset?: PaymentAssetSpec;\n /** Require this exact 32-byte nonce (hex) to be present in the payment. */\n nonce?: string;\n}\n\n/** Arguments for `Paywall.proveAccess` — gate on NFT ownership XOR collection membership. */\nexport interface ProveAccessArgs {\n /** The coin spend that created the NFT's current coin (the wasm `CoinSpend` shape). */\n parentSpend: unknown;\n /** The puzzle hash claiming ownership (hex). */\n owner: string;\n /** Gate on this specific NFT launcher id (hex). Mutually exclusive with `collection`. */\n nft?: string;\n /** Gate on membership of this collection/creator DID (hex). Mutually exclusive with `nft`. */\n collection?: string;\n}\n\n/** Strip a leading `0x`/`0X` and lowercase a hex string. */\nfunction strip0x(hex: string): string {\n return hex.replace(/^0x/i, \"\").toLowerCase();\n}\n\n/** Hex (with or without `0x`) → bytes. Throws on odd-length / non-hex input. */\nfunction hexToBytes(hex: string): Uint8Array {\n const h = strip0x(hex);\n if (h.length % 2 !== 0 || /[^0-9a-f]/.test(h)) {\n throw new DigSdkError(\"INVALID_ARGUMENT\", `invalid hex string: ${hex}`, { value: hex });\n }\n const out = new Uint8Array(h.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(h.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** Bytes → lowercase hex (no `0x`). */\nfunction bytesToHex(bytes: Uint8Array): string {\n let s = \"\";\n for (const b of bytes) s += b.toString(16).padStart(2, \"0\");\n return s;\n}\n\n/**\n * 32 cryptographically-random bytes. Prefers the global WebCrypto (browsers, Node 20+); falls back\n * to `node:crypto`'s `webcrypto` on Node 18, where `globalThis.crypto` is not exposed by default.\n * Async because the Node fallback dynamically imports `node:crypto` (keeps the browser bundle from\n * pulling in a Node builtin).\n */\nasync function randomNonce(): Promise<Uint8Array> {\n const out = new Uint8Array(32);\n const webcrypto = (globalThis as { crypto?: Crypto }).crypto;\n if (webcrypto?.getRandomValues) {\n webcrypto.getRandomValues(out);\n return out;\n }\n // Node 18: no global `crypto`. Use the node:crypto WebCrypto implementation.\n const nodeCrypto = (await import(\"node:crypto\")) as { webcrypto?: Crypto };\n if (!nodeCrypto.webcrypto?.getRandomValues) {\n throw new DigSdkError(\n \"NO_SECURE_RANDOM\",\n \"No secure random source available to generate a payment nonce.\",\n );\n }\n nodeCrypto.webcrypto.getRandomValues(out);\n return out;\n}\n\n/**\n * High-level pay-to-unlock helper. Construct it from a connected `ChiaProvider`; it builds payment\n * spends via the canonical chip35 wasm and pushes them to the wallet for signing.\n *\n * @example\n * const provider = await ChiaProvider.connect({ mode: \"auto\", walletConnect });\n * const paywall = new Paywall(provider); // chip35 wasm loaded lazily under a bundler\n * // Charge 0.25 XCH to unlock a resource:\n * const { receipt } = await paywall.requestPayment({\n * amount: 250_000_000_000n,\n * owner: dappOwnerPuzzleHashHex,\n * memo: `unlock:${resourceId}:${userId}`,\n * });\n * // Later, gate access by re-checking the receipt against the chain:\n * const { ok } = await paywall.verifyReceipt({ observed, owner: dappOwnerPuzzleHashHex, minAmount: 250_000_000_000n });\n */\nexport class Paywall {\n private readonly provider: ChiaProvider;\n private readonly injectedSpends?: MonetizationSpends;\n private spendsReady?: Promise<MonetizationSpends>;\n\n constructor(provider: ChiaProvider, options: PaywallOptions = {}) {\n this.provider = provider;\n this.injectedSpends = options.spends;\n }\n\n /**\n * Resolve the canonical monetization spends (injected, or lazily imported + `init()`ed). Memoized.\n * This is the ONLY source of coin-spend construction in the Paywall — there is no fallback that\n * hand-rolls a spend.\n */\n private spends(): Promise<MonetizationSpends> {\n if (this.injectedSpends) {\n if (typeof this.injectedSpends.init === \"function\") this.injectedSpends.init();\n return Promise.resolve(this.injectedSpends);\n }\n if (!this.spendsReady) {\n this.spendsReady = (async () => {\n const mod = (await import(\n /* @vite-ignore */ \"@dignetwork/chip35-dl-coin-wasm\"\n )) as unknown as MonetizationSpends;\n if (typeof mod.init === \"function\") mod.init();\n return mod;\n })().catch((e) => {\n this.spendsReady = undefined; // allow retry on transient load failure\n throw e;\n });\n }\n return this.spendsReady;\n }\n\n /** The wallet's first synthetic public key, as bytes (the buyer key the spends are built against). */\n private async buyerKey(): Promise<Uint8Array> {\n const keys = await this.provider.getPublicKeys();\n const key = keys?.[0];\n if (!key)\n throw new DigSdkError(\n \"WALLET_NO_KEYS\",\n \"Wallet returned no public keys to build the payment against.\",\n );\n return hexToBytes(key);\n }\n\n /** Resolve the 32-byte unlock nonce: explicit hex, else derived from `memo`, else random. */\n private async resolveNonce(spends: MonetizationSpends, args: RequestPaymentArgs): Promise<Uint8Array> {\n if (args.nonce) return hexToBytes(args.nonce);\n if (args.memo) {\n if (typeof spends.paymentNonce !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"Cannot derive a nonce from `memo`: the chip35 wasm `paymentNonce` is unavailable.\",\n { builder: \"paymentNonce\" },\n );\n }\n return spends.paymentNonce(new TextEncoder().encode(args.memo));\n }\n return randomNonce();\n }\n\n /**\n * Charge the buyer (the connected wallet) `amount` to pay the dapp `owner`, then push the\n * wasm-built coin spends to the wallet for signing. Returns the wallet signature + the receipt.\n * Builds via the canonical wasm `buildPayment` (XCH) or `buildCatPayment` (CAT) — never hand-rolled.\n */\n async requestPayment(args: RequestPaymentArgs): Promise<PaymentResult> {\n const spends = await this.spends();\n const ownerPh = hexToBytes(args.owner);\n const amount = BigInt(args.amount);\n const nonce = await this.resolveNonce(spends, args);\n const buyerKey = await this.buyerKey();\n\n let built: { coinSpends: unknown; receipt: unknown };\n if (args.assetId) {\n if (typeof spends.buildCatPayment !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `buildCatPayment` is unavailable — cannot build a CAT payment \" +\n \"(the Paywall never hand-rolls spends).\",\n { builder: \"buildCatPayment\" },\n );\n }\n const cats = await this.provider.getCatCoins(strip0x(args.assetId), args.coinLimit);\n built = spends.buildCatPayment(buyerKey, cats, ownerPh, amount, nonce);\n } else {\n if (typeof spends.buildPayment !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `buildPayment` is unavailable — cannot build an XCH payment \" +\n \"(the Paywall never hand-rolls spends).\",\n { builder: \"buildPayment\" },\n );\n }\n const coins = await this.provider.getXchCoins(args.coinLimit);\n built = spends.buildPayment(buyerKey, coins, ownerPh, amount, nonce, BigInt(args.fee ?? 0));\n }\n\n // Push the EXACT coin spends the wasm produced to the wallet for signing — unchanged.\n const signature = await this.provider.signCoinSpends(built.coinSpends);\n return {\n signature,\n receipt: built.receipt,\n coinSpends: built.coinSpends,\n nonce: bytesToHex(nonce),\n };\n }\n\n /**\n * Verify an observed on-chain payment unlocks the paywall (pay-to-unlock). Delegates to the wasm\n * `verifyPaymentReceipt`; returns its `{ ok, error? }` verdict. `ok:true` grants access.\n */\n async verifyReceipt(args: VerifyReceiptArgs): Promise<{ ok: boolean; error?: string }> {\n const spends = await this.spends();\n if (typeof spends.verifyPaymentReceipt !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `verifyPaymentReceipt` is unavailable.\",\n { builder: \"verifyPaymentReceipt\" },\n );\n }\n const asset = args.asset ?? { xch: true };\n const requiredAsset =\n \"assetId\" in asset && asset.assetId\n ? { assetId: hexToBytes(asset.assetId) }\n : { xch: true };\n const requireNonce = args.nonce ? hexToBytes(args.nonce) : null;\n return spends.verifyPaymentReceipt(\n args.observed,\n hexToBytes(args.owner),\n BigInt(args.minAmount),\n requiredAsset,\n requireNonce,\n );\n }\n\n /**\n * Prove the `owner` holds access: gate on a specific NFT (`nft` launcher id) via the wasm\n * `proveNftOwnership`, or on collection/creator membership (`collection` DID) via\n * `proveCollectionMembership`. Returns `{ ok, proof?, error? }`. The caller still confirms the\n * proof's coin is unspent on-chain for liveness.\n */\n async proveAccess(args: ProveAccessArgs): Promise<{ ok: boolean; proof?: unknown; error?: string }> {\n if (args.nft && args.collection) {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"proveAccess: pass either `nft` or `collection`, not both.\",\n { value: \"nft+collection\" },\n );\n }\n const spends = await this.spends();\n const owner = hexToBytes(args.owner);\n if (args.collection) {\n if (typeof spends.proveCollectionMembership !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `proveCollectionMembership` is unavailable.\",\n { builder: \"proveCollectionMembership\" },\n );\n }\n return spends.proveCollectionMembership(args.parentSpend, owner, hexToBytes(args.collection));\n }\n if (typeof spends.proveNftOwnership !== \"function\") {\n throw new DigSdkError(\n \"SPEND_BUILDER_UNAVAILABLE\",\n \"chip35 wasm `proveNftOwnership` is unavailable.\",\n { builder: \"proveNftOwnership\" },\n );\n }\n const requiredNft = args.nft ? hexToBytes(args.nft) : null;\n return spends.proveNftOwnership(args.parentSpend, owner, requiredNft);\n }\n}\n","// Cross-target loader for the `dig_client` read-crypto WASM.\n//\n// The wasm is consumed from the published `@dignetwork/dig-capsule-wasm` package (the installable form of\n// digstore's dig-client-wasm crate) — the SAME artifact the DIG Browser, extension, node, and hub\n// run. We NEVER run it unverified: we obtain the package's raw wasm bytes, SHA-256 them, compare\n// against the pinned digest, and only then let the module's crypto run. A mismatch (tampered / wrong\n// artifact) throws — the reader FAILS CLOSED rather than running unverified crypto.\n//\n// Two targets are consumed from the one package, auto-detected, with an escape hatch\n// (`configureWasm`):\n// • Node / Bun — `@dignetwork/dig-capsule-wasm/node`, the wasm-bindgen `nodejs` build. It reads\n// + instantiates the wasm synchronously on import; we independently\n// SHA-256-verify the shipped `dig_client_bg.wasm` and fail closed on a\n// mismatch.\n// • Browser (bundler) — `@dignetwork/dig-capsule-wasm/web`, the `--target web` build. We fetch the\n// package's `dig_client_bg.wasm`, SRI-verify the bytes, and hand them to\n// the module's async init.\n// • Browser (no bundler) — `configureWasm` with a URL/bytes you serve yourself.\n//\n// Memoized: the wasm initializes at most once per process/page.\n\nimport type { DigClientWasm } from \"./wasm.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/**\n * SHA-256 (lowercase hex) of `@dignetwork/dig-capsule-wasm`'s `dig_client_bg.wasm` — the SRI digest. It\n * is the canonical trust anchor (pinned regardless of the npm semver), mirrored by the package's\n * `integrity.json` `sha256`. Fail closed on a mismatch.\n */\nexport const DIG_CLIENT_WASM_SHA256 =\n \"a186fd2d6b348a7caa3112c51b666a6618fe7cf8bb56ad395a1fab4323f6ae7e\";\n\n/** Optional explicit wasm inputs, for environments where package resolution can't reach the wasm. */\nexport interface WasmConfig {\n /**\n * The wasm bytes (already loaded). When provided, SRI is still enforced unless `skipIntegrity`.\n * Pass this in CSP-strict browsers where you fetch + verify the bytes yourself.\n */\n wasmBytes?: BufferSource;\n /**\n * URL to the wasm-bindgen `web` glue module for browser dynamic import. When omitted in a browser,\n * the loader imports `@dignetwork/dig-capsule-wasm/web` (the bundler resolves it).\n */\n glueUrl?: string;\n /**\n * URL to fetch the wasm bytes from (browser) when `wasmBytes` is not supplied. The fetched bytes\n * are SRI-verified before init. Defaults to the package's `dig_client_bg.wasm`.\n */\n wasmUrl?: string;\n /** Skip the SRI check. Only for tests / trusted custom builds — NOT recommended. */\n skipIntegrity?: boolean;\n}\n\nlet _config: WasmConfig = {};\nlet _ready: Promise<DigClientWasm> | null = null;\n\n/**\n * Override how the read-crypto wasm is located/loaded. Call BEFORE the first `DigClient` read.\n * Mainly for browsers without a bundler that resolves package files, or CSP-strict apps that fetch\n * + verify the wasm bytes themselves and hand them in. Resets any cached instance.\n */\nexport function configureWasm(config: WasmConfig): void {\n _config = { ...config };\n _ready = null;\n}\n\nconst isNode =\n typeof process !== \"undefined\" &&\n !!(process as { versions?: { node?: string } }).versions?.node;\n\n/** SHA-256 a buffer to lowercase hex, using node:crypto or WebCrypto. */\nasync function sha256Hex(bytes: BufferSource): Promise<string> {\n if (isNode) {\n const { createHash } = await import(\"node:crypto\");\n const view =\n bytes instanceof ArrayBuffer\n ? new Uint8Array(bytes)\n : new Uint8Array(\n (bytes as ArrayBufferView).buffer,\n (bytes as ArrayBufferView).byteOffset,\n (bytes as ArrayBufferView).byteLength,\n );\n return createHash(\"sha256\").update(view).digest(\"hex\");\n }\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes as BufferSource);\n return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction assertIntegrity(hex: string): void {\n if (_config.skipIntegrity) return;\n if (hex !== DIG_CLIENT_WASM_SHA256) {\n throw new DigSdkError(\n \"WASM_INTEGRITY\",\n \"dig-client wasm integrity check failed — refusing to run unverified crypto \" +\n `(expected ${DIG_CLIENT_WASM_SHA256}, got ${hex}).`,\n { expected: DIG_CLIENT_WASM_SHA256, actual: hex },\n );\n }\n}\n\n// The read-crypto function surface the SDK uses (a subset of the package's exports). Both the node\n// and web builds export these camelCase functions at the module top level.\ntype DigClientModule = DigClientWasm & {\n default?: (input: { module_or_path: BufferSource }) => Promise<unknown>;\n};\n\n// Node: consume the `--target nodejs` build. It reads `dig_client_bg.wasm` from the package and\n// instantiates SYNCHRONOUSLY on import, so its functions are ready immediately (no init call). We\n// independently SHA-256-verify the shipped wasm and fail closed on a mismatch — so a tampered\n// package binary refuses to run even though wasm-bindgen already loaded it.\nasync function loadNode(): Promise<DigClientWasm> {\n const { createRequire } = await import(\"node:module\");\n const { readFile } = await import(\"node:fs/promises\");\n const require = createRequire(import.meta.url);\n const wasmPath = require.resolve(\"@dignetwork/dig-capsule-wasm/dig_client_bg.wasm\");\n const buf = await readFile(wasmPath);\n const bytes = new Uint8Array(buf.byteLength);\n bytes.set(buf);\n assertIntegrity(await sha256Hex(bytes));\n const mod = (await import(\"@dignetwork/dig-capsule-wasm/node\")) as unknown as DigClientModule;\n return mod as unknown as DigClientWasm;\n}\n\n// Browser: consume the `--target web` build (`@dignetwork/dig-capsule-wasm/web`).\n//\n// Two modes:\n// • Caller-supplied bytes/URL (`configureWasm`) — the fail-closed path for CSP-strict apps or an\n// untrusted CDN. We fetch (if a URL) the bytes, SHA-256-VERIFY them against the pinned digest,\n// and hand the very bytes we checked to the glue's async init — so nothing runs unverified.\n// • Default — call the glue's `init()` with no args. The `--target web` build resolves its\n// sibling `dig_client_bg.wasm` relative to its OWN module URL (the bundler-correct way to\n// locate a package asset) and instantiates it. Those bytes are the pinned package artifact\n// (the SDK depends on an exact `@dignetwork/dig-capsule-wasm` version). Apps that need byte-level SRI\n// over an untrusted delivery path use `configureWasm({ wasmUrl })` above.\nasync function loadBrowser(): Promise<DigClientWasm> {\n const glueHref = _config.glueUrl ?? \"@dignetwork/dig-capsule-wasm/web\";\n const mod = (await import(/* @vite-ignore */ glueHref)) as unknown as DigClientModule;\n if (typeof mod.default !== \"function\") {\n throw new DigSdkError(\n \"WASM_LOAD_FAILED\",\n \"dig-client web build exposed no init function (unexpected module shape)\",\n {},\n );\n }\n if (_config.wasmBytes || _config.wasmUrl) {\n let bytes: BufferSource;\n if (_config.wasmBytes) {\n bytes = _config.wasmBytes;\n } else {\n const wasmUrl = _config.wasmUrl!;\n const res = await fetch(wasmUrl);\n if (!res.ok)\n throw new DigSdkError(\"WASM_LOAD_FAILED\", `dig-client wasm fetch failed (${res.status})`, {\n httpStatus: res.status,\n wasmUrl,\n });\n bytes = await res.arrayBuffer();\n }\n assertIntegrity(await sha256Hex(bytes));\n await mod.default({ module_or_path: bytes });\n } else {\n // The glue resolves + instantiates its own sibling wasm (the pinned package artifact).\n await (mod.default as unknown as () => Promise<unknown>)();\n }\n return mod as unknown as DigClientWasm;\n}\n\n/**\n * Load, SRI-verify, and instantiate the read-crypto wasm, returning its functions. Memoized — at\n * most one init per process/page. Fails closed on an integrity mismatch.\n */\nexport function loadDigClientWasm(): Promise<DigClientWasm> {\n if (_ready) return _ready;\n _ready = (isNode ? loadNode() : loadBrowser()).catch((e) => {\n _ready = null; // allow a retry on transient load failure\n throw e;\n });\n return _ready;\n}\n\r\n","// DIG URN parsing + canonicalization — PURE, dependency-free, and identical to the parser the\n// hub (apps/web/lib/dig-client.js), the extension, and the companion use. Kept pure (no wasm) so\n// it is trivially unit-testable under `node --test` and usable on any runtime.\n//\n// A DIG URN addresses one resource inside a store:\n//\n// urn:dig:chia:<store_id>[:<root>]/<resource_key>[?salt=<hex>]\n//\n// • <store_id> — 64 hex chars, the singleton launcher id (the store identity).\n// • :<root> — OPTIONAL 64 hex chars, pins a specific on-chain generation. Omit for the\n// canonical, root-INDEPENDENT form. The root is only the trust anchor for\n// inclusion verification; it is NOT a key input (retrieval/decryption keys are\n// root-independent).\n// • <resource_key> — the path within the store (e.g. \"index.html\", \"img/logo.png\"). An empty\n// key resolves to the §8.5 default view \"index.html\".\n// • ?salt=<hex> — OPTIONAL out-of-band secret salt for a PRIVATE store.\n\nimport { DigSdkError } from \"./errors.js\";\n\n/** The parts of a parsed DIG URN. `root`/`salt` are null when absent. */\nexport interface ParsedUrn {\n /** Store identity (64-hex launcher id), lowercased. */\n readonly storeId: string;\n /** Generation root (64-hex), lowercased — or null for the root-independent form. */\n readonly root: string | null;\n /** Resource path within the store (verbatim, not lowercased). */\n readonly resourceKey: string;\n /** Private-store secret salt (hex), lowercased — or null for a public store. */\n readonly salt: string | null;\n}\n\nconst URN_RE =\n /^urn:dig:chia:([0-9a-fA-F]{64})(?::([0-9a-fA-F]{64}))?\\/(.+?)(?:\\?salt=([0-9a-fA-F]+))?$/;\n\n/**\n * Parse a DIG URN into its parts. Throws on a malformed URN.\n *\n * @example\n * parseUrn(\"urn:dig:chia:\" + \"ab\".repeat(32) + \"/index.html\")\n * // → { storeId: \"abab…\", root: null, resourceKey: \"index.html\", salt: null }\n */\nexport function parseUrn(raw: string): ParsedUrn {\n const s = String(raw ?? \"\").trim();\n const m = URN_RE.exec(s);\n if (!m) {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"Not a valid dig URN (expected urn:dig:chia:<store-id>[:<root>]/<path>[?salt=<hex>]).\",\n { value: s, expected: \"urn:dig:chia:<store-id>[:<root>]/<path>[?salt=<hex>]\" },\n );\n }\n return {\n storeId: m[1]!.toLowerCase(),\n root: m[2] ? m[2].toLowerCase() : null,\n resourceKey: m[3]!,\n salt: m[4] ? m[4].toLowerCase() : null,\n };\n}\n\n/** True iff `raw` is a syntactically valid DIG URN. Never throws. */\nexport function isUrn(raw: string): boolean {\n try {\n parseUrn(raw);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reconstruct the canonical, root-INDEPENDENT URN string for a store + resource key:\n * `urn:dig:chia:<store_id>/<resource_key>`. An empty resource key resolves to the default view\n * `index.html`. This is the form whose SHA-256 is the retrieval key and whose bytes seed the AES\n * key — matching the wasm's `reconstructUrn`.\n */\nexport function reconstructUrn(storeId: string, resourceKey: string): string {\n const key = resourceKey && resourceKey.length > 0 ? resourceKey : \"index.html\";\n return `urn:dig:chia:${storeId.toLowerCase()}/${key}`;\n}\n\n/**\n * Reconstruct a root-PINNED display URN: `urn:dig:chia:<store_id>:<root>/<resource_key>`. Useful\n * for sharing a URN bound to a specific generation; the retrieval/AES keys still use the rootless\n * form (`reconstructUrn`).\n */\nexport function reconstructUrnWithRoot(\n storeId: string,\n root: string,\n resourceKey: string,\n): string {\n const key = resourceKey && resourceKey.length > 0 ? resourceKey : \"index.html\";\n return `urn:dig:chia:${storeId.toLowerCase()}:${root.toLowerCase()}/${key}`;\n}\n","// DigClient — the read side of the SDK. It fetches a resource's served ciphertext from the dig RPC,\n// derives the URN's keys CLIENT-SIDE via the read-crypto wasm, verifies inclusion against an\n// on-chain root, and decrypts — so the serving host stays BLIND (it only ever relays opaque\n// ciphertext + proofs). Genericized from hub.dig.net/apps/web/lib/dig-client.js, with the hub-app\n// coupling removed (no Vite import.meta.env, no window.location origin; the RPC endpoint and the\n// trust root are explicit inputs).\n//\n// HARD BOUNDARY (read sources). Everything read from a .dig — ciphertext, inclusion proofs, the\n// public manifest, metadata — comes ONLY from the dig RPC. The trust ROOT it is verified against\n// comes from the chain (the caller resolves it from coinset.org and passes it in). The host can\n// never become the trust anchor: every content read REQUIRES a caller-supplied root.\n//\n// OBLIVIOUS model. The host returns indistinguishable ciphertext for any retrieval key, so\n// presence is UNKNOWABLE. A read therefore NEVER concludes \"not found\": it returns plaintext when\n// the URN key decrypts the bytes, otherwise the raw ciphertext (a decoy is just opaque bytes). The\n// only thrown error is a transport failure.\n\nimport { loadDigClientWasm } from \"./loader.js\";\nimport type { DigClientWasm } from \"./wasm.js\";\nimport { parseUrn } from \"./urn.js\";\nimport type {\n CollectionItemsPage,\n CollectionMeta,\n ReadOptions,\n ReadResult,\n UrnKeys,\n} from \"./types.js\";\nimport { DigSdkError } from \"./errors.js\";\n\n/** The default public dig RPC endpoint. */\nexport const DEFAULT_RPC = \"https://rpc.dig.net\";\n\n// The backend caps each dig.getContent chunk at 3 MiB (Lambda/APIGW response ceiling); the client\n// loops chunks until `complete`.\nconst RPC_CHUNK_BYTES = 3 * 1024 * 1024;\n\n/** Options to construct a DigClient. */\nexport interface DigClientOptions {\n /** dig RPC endpoint. Defaults to the public `https://rpc.dig.net`. */\n rpc?: string;\n /** Override `fetch` (e.g. an instrumented one). Defaults to the global `fetch`. */\n fetch?: typeof fetch;\n}\n\ninterface GetContentResult {\n total_length: number;\n offset: number;\n next_offset?: number | null;\n complete?: boolean;\n ciphertext?: string;\n inclusion_proof?: string;\n chunk_lens?: number[];\n}\n\n/** Decode a standard-base64 string (the RPC ciphertext encoding) to bytes — no DOM dependency. */\nfunction b64ToBytes(b64: string): Uint8Array {\n // atob exists in browsers and modern Node; fall back to Buffer in older Node.\n if (typeof atob === \"function\") {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Uint8Array((globalThis as any).Buffer.from(b64, \"base64\"));\n}\n\n/**\n * The read-crypto client. Construct once and reuse — the wasm is loaded + SRI-verified lazily on\n * the first read and memoized process/page-wide.\n *\n * @example\n * const dig = new DigClient();\n * const { bytes, decrypted } = await dig.read({\n * urn: \"urn:dig:chia:<storeId>/index.html\",\n * root: \"<onchain-root-hex>\",\n * });\n * if (decrypted) console.log(new TextDecoder().decode(bytes));\n */\nexport class DigClient {\n private readonly rpc: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: DigClientOptions = {}) {\n this.rpc = options.rpc ?? DEFAULT_RPC;\n this.fetchImpl =\n options.fetch ??\n (typeof fetch === \"function\" ? fetch.bind(globalThis) : undefinedFetch());\n }\n\n /** Load (and SRI-verify) the read-crypto wasm. Exposed for callers that want the raw functions. */\n async wasm(): Promise<DigClientWasm> {\n return loadDigClientWasm();\n }\n\n /** `retrieval_key = SHA-256(canonical rootless URN)`, lowercase hex. */\n async retrievalKey(storeId: string, resourceKey: string): Promise<string> {\n return (await this.wasm()).retrievalKey(storeId, resourceKey);\n }\n\n /** Derive the per-URN AES-256-GCM-SIV key, lowercase hex. `salt` for a private store. */\n async deriveKey(\n storeId: string,\n resourceKey: string,\n salt?: string | null,\n ): Promise<string> {\n return (await this.wasm()).deriveKey(storeId, resourceKey, salt ?? undefined);\n }\n\n /** Verify served `ciphertext` is included under `root` via the base64 merkle `proof`. */\n async verifyInclusion(\n ciphertext: Uint8Array,\n proof: string,\n root: string,\n ): Promise<boolean> {\n return (await this.wasm()).verifyInclusion(ciphertext, proof, root);\n }\n\n /** Reconstruct the canonical rootless URN whose SHA-256 is the retrieval key. */\n async reconstructUrn(storeId: string, resourceKey: string): Promise<string> {\n return (await this.wasm()).reconstructUrn(storeId, resourceKey);\n }\n\n /**\n * Derive, client-side, the two root-independent keys a URN maps to (retrieval + decryption).\n * Nothing is sent to the network — pure local derivation via the wasm.\n */\n async deriveUrnKeys(input: { urn: string; salt?: string | null }): Promise<UrnKeys> {\n const parsed = parseUrn(input.urn);\n const wasm = await this.wasm();\n const effSalt = input.salt ?? parsed.salt ?? undefined;\n return {\n storeId: parsed.storeId,\n root: parsed.root,\n resourceKey: parsed.resourceKey,\n salt: effSalt ?? null,\n retrievalKey: wasm.retrievalKey(parsed.storeId, parsed.resourceKey),\n decryptionKey: wasm.deriveKey(parsed.storeId, parsed.resourceKey, effSalt),\n };\n }\n\n /**\n * Fetch + verify + decrypt one resource by URN. `root` is the on-chain generation root to verify\n * against (resolved by the caller from the chain); when omitted, the root embedded in the URN is\n * used. Returns the bytes plus advisory `verified`/`decrypted` flags. NEVER throws \"not found\"\n * (presence is unknowable) — it throws only on a transport failure.\n */\n async read(\n input: { urn: string; root?: string | null; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<ReadResult> {\n const parsed = parseUrn(input.urn);\n const effSalt = input.salt ?? parsed.salt ?? null;\n const effRoot = input.root ?? parsed.root ?? null;\n if (!effRoot) {\n throw new DigSdkError(\n \"ROOT_REQUIRED\",\n \"a confirmed on-chain root is required to read content (pass { root } or use a root-pinned URN)\",\n { urn: input.urn },\n );\n }\n return this.readResource(\n { storeId: parsed.storeId, resourceKey: parsed.resourceKey, root: effRoot, salt: effSalt },\n opts,\n );\n }\n\n /** As `read`, but decoding the plaintext to a UTF-8 string when it decrypts (else throws). */\n async readText(\n input: { urn: string; root?: string | null; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<string> {\n const r = await this.read(input, opts);\n if (!r.decrypted) {\n throw new DigSdkError(\n \"DECRYPT_FAILED\",\n \"resource did not decrypt under this URN — wrong store/key/salt, or a decoy response\",\n { urn: input.urn },\n );\n }\n return new TextDecoder().decode(r.bytes);\n }\n\n /**\n * Read by explicit (storeId, resourceKey, root, salt) rather than a URN string. The oblivious\n * download primitive the URN read is built on.\n */\n async readResource(\n input: { storeId: string; resourceKey: string; root: string; salt?: string | null },\n opts: ReadOptions = {},\n ): Promise<ReadResult> {\n const rpc = opts.rpc ?? this.rpc;\n const wasm = await this.wasm();\n const rk = wasm.retrievalKey(input.storeId, input.resourceKey);\n const { ciphertext, proof, chunkLens } = await this.fetchCiphertext(\n input.storeId,\n rk,\n input.root,\n rpc,\n );\n let verified = false;\n try {\n verified = !!wasm.verifyInclusion(ciphertext, proof, input.root);\n } catch {\n verified = false;\n }\n const keyHex = wasm.deriveKey(input.storeId, input.resourceKey, input.salt ?? undefined);\n try {\n const bytes = decryptResourceChunks(wasm, keyHex, ciphertext, chunkLens);\n return {\n storeId: input.storeId,\n root: input.root,\n resourceKey: input.resourceKey,\n salt: input.salt ?? null,\n bytes,\n verified,\n decrypted: true,\n };\n } catch {\n // Not decryptable with this URN/salt — hand back the raw bytes; never a \"not present\" verdict.\n return {\n storeId: input.storeId,\n root: input.root,\n resourceKey: input.resourceKey,\n salt: input.salt ?? null,\n bytes: ciphertext,\n verified,\n decrypted: false,\n };\n }\n }\n\n /**\n * Read a collection's public, owner-independent facts (creator DID, item count, uniform royalty)\n * from the dig RPC (`dig.getCollection`). The collection's item set is its NFT launcher ids — the\n * authoritative, owner-independent anchor the mint produced (a DID-attributed NFT is hinted to its\n * OWNER at mint, not to the creator DID, so launcher ids — not the DID — are the read key). Pass\n * the optional `did` to have it echoed back and recorded as the declared creator.\n *\n * No wallet, no read-crypto wasm — a plain JSON-RPC read. Throws a coded {@link DigSdkError} on a\n * transport/RPC failure (never a \"not found\": an empty/partly-confirmed set just resolves to fewer\n * items).\n *\n * @example\n * const meta = await dig.getCollection({ launcherIds: [\"ab…\", \"cd…\"], did: \"ef…\" });\n * console.log(meta.resolved_count, meta.royalty_basis_points);\n */\n async getCollection(\n input: { launcherIds: string[]; did?: string | null },\n opts: ReadOptions = {},\n ): Promise<CollectionMeta> {\n const rpc = opts.rpc ?? this.rpc;\n const params: Record<string, unknown> = { launcher_ids: input.launcherIds };\n if (input.did) params.did = input.did;\n const r = await this.rpcCall<CollectionMeta>(rpc, \"dig.getCollection\", params);\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no collection facts for this request.\",\n { rpcMethod: \"dig.getCollection\" },\n );\n return r;\n }\n\n /**\n * Read a deterministic, paginated page of a collection's items (`dig.listCollectionItems`), each\n * resolved to its CURRENT on-chain state — current owner, royalty, and CHIP-0007 metadata — by the\n * RPC walking the singleton lineage forward to the live tip (so the owner is never the stale\n * mint-time owner). Items come back in the input launcher-id order. `limit` is clamped to the\n * server cap (200); `offset` defaults to 0.\n *\n * Throws a coded {@link DigSdkError} on a transport/RPC failure.\n *\n * @example\n * let page = await dig.listCollectionItems({ launcherIds, limit: 50 });\n * for (const item of page.items) console.log(item.launcher_id, item.owner_puzzle_hash);\n * // page.next_offset is null on the last page.\n */\n async listCollectionItems(\n input: { launcherIds: string[]; offset?: number; limit?: number },\n opts: ReadOptions = {},\n ): Promise<CollectionItemsPage> {\n const rpc = opts.rpc ?? this.rpc;\n const params: Record<string, unknown> = { launcher_ids: input.launcherIds };\n if (input.offset !== undefined) params.offset = input.offset;\n if (input.limit !== undefined) params.limit = input.limit;\n const r = await this.rpcCall<CollectionItemsPage>(rpc, \"dig.listCollectionItems\", params);\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no collection items for this request.\",\n { rpcMethod: \"dig.listCollectionItems\" },\n );\n return r;\n }\n\n // Stream the FULL ciphertext for a resource from the RPC by retrieval key, reassembling 3-MiB\n // chunks. A null result is a TRANSPORT failure, never a presence judgment.\n private async fetchCiphertext(\n storeId: string,\n rk: string,\n root: string,\n rpc: string,\n ): Promise<{ ciphertext: Uint8Array; proof: string; chunkLens: number[] | null }> {\n let offset = 0;\n let total: number | null = null;\n let buf: Uint8Array | null = null;\n let proof = \"\";\n let chunkLens: number[] | null = null;\n for (;;) {\n const r = await this.rpcCall<GetContentResult>(rpc, \"dig.getContent\", {\n store_id: storeId,\n root,\n retrieval_key: rk,\n offset,\n length: RPC_CHUNK_BYTES,\n });\n if (!r)\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"The content network returned no data for this request.\",\n { rpcMethod: \"dig.getContent\" },\n );\n if (total === null) {\n total = r.total_length >>> 0;\n buf = new Uint8Array(total);\n }\n if (chunkLens === null && Array.isArray(r.chunk_lens)) {\n chunkLens = r.chunk_lens.map((n) => n >>> 0);\n }\n const chunk = b64ToBytes(r.ciphertext ?? \"\");\n const at = r.offset >>> 0;\n buf!.set(chunk.subarray(0, Math.max(0, Math.min(chunk.length, total - at))), at);\n if (r.inclusion_proof) proof = r.inclusion_proof;\n if (r.complete || r.next_offset == null) break;\n offset = r.next_offset >>> 0;\n }\n return { ciphertext: buf ?? new Uint8Array(0), proof, chunkLens };\n }\n\n // One JSON-RPC 2.0 call. Throws a coded DigSdkError on transport failure (RPC_TRANSPORT) or a\n // JSON-RPC/HTTP error (RPC_ERROR, carrying rpcMethod/httpStatus/rpcCode context); returns `result`.\n private async rpcCall<T>(rpc: string, method: string, params: unknown): Promise<T | null> {\n let res: Response;\n try {\n res = await this.fetchImpl(rpc, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n });\n } catch (e) {\n throw new DigSdkError(\n \"RPC_TRANSPORT\",\n \"Could not reach the content network. Check your connection and try again.\",\n { rpcMethod: method },\n { cause: e },\n );\n }\n if (!res.ok)\n throw new DigSdkError(\"RPC_ERROR\", `dig RPC ${method} failed (${res.status})`, {\n rpcMethod: method,\n httpStatus: res.status,\n });\n const json = (await res.json()) as {\n result?: T;\n error?: { message?: string; code?: number };\n };\n if (json && json.error)\n throw new DigSdkError(\n \"RPC_ERROR\",\n `dig RPC ${method}: ${json.error.message ?? \"error\"}`,\n { rpcMethod: method, rpcCode: json.error.code },\n );\n return json ? (json.result ?? null) : null;\n }\n}\n\n// AES-256-GCM-SIV-open a resource's served ciphertext under `keyHex`, splitting the PLAIN-\n// concatenated chunk ciphertexts by `chunkLens` (per-chunk CIPHERTEXT byte lengths) and opening\n// each. Empty/absent chunkLens ⇒ single-chunk resource. Throws if any chunk's tag fails.\nfunction decryptResourceChunks(\n wasm: DigClientWasm,\n keyHex: string,\n ciphertext: Uint8Array,\n chunkLens: number[] | null,\n): Uint8Array {\n const lens = chunkLens && chunkLens.length ? chunkLens : [ciphertext.length];\n const total = lens.reduce((a, n) => a + n, 0);\n if (total !== ciphertext.length) {\n throw new DigSdkError(\n \"RPC_MALFORMED_RESPONSE\",\n \"served ciphertext length does not match chunk lengths\",\n { rpcMethod: \"dig.getContent\", expected: String(total), actual: String(ciphertext.length) },\n );\n }\n if (lens.length === 1) return wasm.decryptChunk(keyHex, ciphertext);\n const parts: Uint8Array[] = [];\n let p = 0;\n for (const len of lens) {\n parts.push(wasm.decryptChunk(keyHex, ciphertext.subarray(p, p + len)));\n p += len;\n }\n const out = new Uint8Array(parts.reduce((a, x) => a + x.length, 0));\n let q = 0;\n for (const part of parts) {\n out.set(part, q);\n q += part.length;\n }\n return out;\n}\n\nfunction undefinedFetch(): typeof fetch {\n return (() => {\n throw new DigSdkError(\n \"INVALID_ARGUMENT\",\n \"No global fetch available. Pass { fetch } to DigClient (Node < 18 needs a fetch polyfill).\",\n );\n }) as unknown as typeof fetch;\n}\n","// Runtime self-description — the SDK's introspection surface, so an agent can discover the SDK's\n// version, modules, methods, supported chains, and error codes WITHOUT reading source.\n//\n// `SDK_VERSION` is replaced at build time by tsup's `define` (see tsup.config.ts) with the value\n// from package.json, so it can never drift from the published version. In a non-built/test context\n// the `declare const` falls back to \"0.0.0-dev\".\n\nimport { WALLET_METHODS, SIGN_METHODS, DEFAULT_CHAIN } from \"./methods.js\";\nimport { DIG_CLIENT_WASM_SHA256 } from \"./loader.js\";\nimport { DEFAULT_RPC } from \"./dig-client.js\";\nimport { DIG_SDK_ERROR_CODES, type DigSdkErrorCode } from \"./errors.js\";\n\n// Injected by tsup `define` ({ __SDK_VERSION__: JSON.stringify(pkg.version) }). The `declare`\n// keeps TypeScript happy; the fallback covers `ts-node`/unbundled execution.\ndeclare const __SDK_VERSION__: string | undefined;\n\n/** The SDK's semver version, from package.json (injected at build time). */\nexport const SDK_VERSION: string =\n typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\n/** The machine-readable description of one SDK module. */\nexport interface ModuleDescriptor {\n /** The module's public name (the class/helper a consumer imports). */\n readonly name: string;\n /** One-line summary of what it does. */\n readonly summary: string;\n /** The import path it's reachable from (the package subpath). */\n readonly entry: string;\n}\n\n/** The full machine-readable description of the SDK surface — what `capabilities()` returns. */\nexport interface SdkCapabilities {\n /** Always `\"@dignetwork/dig-sdk\"`. */\n readonly name: string;\n /** The SDK semver (= {@link SDK_VERSION}). */\n readonly version: string;\n /** The modules the SDK exposes (ChiaProvider, DigClient, Paywall, spend builders, adapters). */\n readonly modules: readonly ModuleDescriptor[];\n /** The canonical CHIP-0002 wallet method surface both transports negotiate. */\n readonly walletMethods: readonly string[];\n /** The message-signing methods, in preference order. */\n readonly signMethods: readonly string[];\n /** The wallet transports the SDK can connect through. */\n readonly transports: readonly (\"injected\" | \"walletconnect\")[];\n /** The CAIP-2 chains supported (mainnet only — there is no testnet flow). */\n readonly chains: readonly string[];\n /** The default dig RPC endpoint `DigClient` reads from. */\n readonly defaultRpc: string;\n /** The SRI digest of the read-crypto wasm from @dignetwork/dig-capsule-wasm (fail-closed on mismatch). */\n readonly readCryptoWasmSha256: string;\n /** The stable error-code catalogue (UPPER_SNAKE) consumers can branch on. */\n readonly errorCodes: readonly DigSdkErrorCode[];\n}\n\nconst MODULES: readonly ModuleDescriptor[] = Object.freeze([\n {\n name: \"ChiaProvider\",\n summary:\n \"Unified Chia wallet surface — prefers the injected DIG Browser wallet, falls back to WalletConnect→Sage.\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"DigClient\",\n summary:\n \"Read-crypto: derive URN keys, verify inclusion against an on-chain root, and decrypt content from the dig RPC.\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"Paywall\",\n summary:\n \"Pay-to-unlock helper composing ChiaProvider with the canonical chip35 monetization spends (payment / receipt / NFT+collection gating).\",\n entry: \"@dignetwork/dig-sdk\",\n },\n {\n name: \"spend\",\n summary:\n \"The canonical CHIP-0035 spend builder (@dignetwork/chip35-dl-coin-wasm), re-exported verbatim.\",\n entry: \"@dignetwork/dig-sdk/spend\",\n },\n {\n name: \"adapters\",\n summary:\n \"Framework deploy glue (Vite + Next): dev window.chia shim and `digstore deploy` runner.\",\n entry: \"@dignetwork/dig-sdk/adapters\",\n },\n] as const);\n\n/**\n * Describe the SDK's surface as machine-readable data: version, modules, methods, transports,\n * chains, the default RPC, the read-crypto wasm digest, and the error-code catalogue. An agent can\n * call this to introspect the SDK without reading source.\n *\n * @example\n * import { capabilities } from \"@dignetwork/dig-sdk\";\n * const cap = capabilities();\n * cap.version; // \"0.2.0\"\n * cap.walletMethods; // [\"chip0002_connect\", …]\n * cap.errorCodes; // [\"WC_OPTIONS_REQUIRED\", …]\n */\nexport function capabilities(): SdkCapabilities {\n return {\n name: \"@dignetwork/dig-sdk\",\n version: SDK_VERSION,\n modules: MODULES,\n walletMethods: [...WALLET_METHODS],\n signMethods: [...SIGN_METHODS],\n transports: [\"injected\", \"walletconnect\"],\n chains: [DEFAULT_CHAIN],\n defaultRpc: DEFAULT_RPC,\n readCryptoWasmSha256: DIG_CLIENT_WASM_SHA256,\n errorCodes: Object.values(DIG_SDK_ERROR_CODES),\n };\n}\n\n/** Alias for {@link capabilities} — the conventional `describe()` introspection name. */\nexport const describe = capabilities;\n"]}
|