@dignetwork/dig-sdk 0.0.1-alpha.99 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSE +21 -7
  2. package/README.md +267 -0
  3. package/dist/adapters.cjs +315 -0
  4. package/dist/adapters.cjs.map +1 -0
  5. package/dist/adapters.d.cts +20 -0
  6. package/dist/adapters.d.ts +20 -0
  7. package/dist/adapters.js +306 -0
  8. package/dist/adapters.js.map +1 -0
  9. package/dist/dev-shim-Bgw8X2E9.d.cts +118 -0
  10. package/dist/dev-shim-Bgw8X2E9.d.ts +118 -0
  11. package/dist/dig-client-entry-BIzuZ7Rs.d.cts +263 -0
  12. package/dist/dig-client-entry-BIzuZ7Rs.d.ts +263 -0
  13. package/dist/dig-client.cjs +330 -0
  14. package/dist/dig-client.cjs.map +1 -0
  15. package/dist/dig-client.d.cts +1 -0
  16. package/dist/dig-client.d.ts +1 -0
  17. package/dist/dig-client.js +319 -0
  18. package/dist/dig-client.js.map +1 -0
  19. package/dist/index.cjs +754 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +192 -0
  22. package/dist/index.d.ts +192 -5
  23. package/dist/index.js +731 -19
  24. package/dist/index.js.map +1 -0
  25. package/dist/next.cjs +326 -0
  26. package/dist/next.cjs.map +1 -0
  27. package/dist/next.d.cts +23 -0
  28. package/dist/next.d.ts +23 -0
  29. package/dist/next.js +319 -0
  30. package/dist/next.js.map +1 -0
  31. package/dist/spend.cjs +14 -0
  32. package/dist/spend.cjs.map +1 -0
  33. package/dist/spend.d.cts +1 -0
  34. package/dist/spend.d.ts +1 -0
  35. package/dist/spend.js +3 -0
  36. package/dist/spend.js.map +1 -0
  37. package/dist/vite.cjs +338 -0
  38. package/dist/vite.cjs.map +1 -0
  39. package/dist/vite.d.cts +35 -0
  40. package/dist/vite.d.ts +35 -0
  41. package/dist/vite.js +332 -0
  42. package/dist/vite.js.map +1 -0
  43. package/package.json +87 -59
  44. package/vendor/PROVENANCE.md +102 -0
  45. package/vendor/dig_client.d.ts +150 -0
  46. package/vendor/dig_client.mjs +805 -0
  47. package/vendor/dig_client_bg.wasm +0 -0
  48. package/dist/DataIntegrityTree/DataIntegrityTree.d.ts +0 -163
  49. package/dist/DataIntegrityTree/DataIntegrityTree.d.ts.map +0 -1
  50. package/dist/DataIntegrityTree/DataIntegrityTree.js +0 -707
  51. package/dist/DataIntegrityTree/DataLayerError.d.ts +0 -6
  52. package/dist/DataIntegrityTree/DataLayerError.d.ts.map +0 -1
  53. package/dist/DataIntegrityTree/DataLayerError.js +0 -17
  54. package/dist/DataIntegrityTree/index.d.ts +0 -2
  55. package/dist/DataIntegrityTree/index.d.ts.map +0 -1
  56. package/dist/DataIntegrityTree/index.js +0 -17
  57. package/dist/DigNetwork/ContentServer.d.ts +0 -31
  58. package/dist/DigNetwork/ContentServer.d.ts.map +0 -1
  59. package/dist/DigNetwork/ContentServer.js +0 -176
  60. package/dist/DigNetwork/DigChallenge.d.ts +0 -82
  61. package/dist/DigNetwork/DigChallenge.d.ts.map +0 -1
  62. package/dist/DigNetwork/DigChallenge.js +0 -144
  63. package/dist/DigNetwork/DigNetwork.d.ts +0 -14
  64. package/dist/DigNetwork/DigNetwork.d.ts.map +0 -1
  65. package/dist/DigNetwork/DigNetwork.js +0 -169
  66. package/dist/DigNetwork/DigPeer.d.ts +0 -24
  67. package/dist/DigNetwork/DigPeer.d.ts.map +0 -1
  68. package/dist/DigNetwork/DigPeer.js +0 -118
  69. package/dist/DigNetwork/IncentiveServer.d.ts +0 -13
  70. package/dist/DigNetwork/IncentiveServer.d.ts.map +0 -1
  71. package/dist/DigNetwork/IncentiveServer.js +0 -76
  72. package/dist/DigNetwork/PropagationServer.d.ts +0 -81
  73. package/dist/DigNetwork/PropagationServer.d.ts.map +0 -1
  74. package/dist/DigNetwork/PropagationServer.js +0 -563
  75. package/dist/DigNetwork/index.d.ts +0 -4
  76. package/dist/DigNetwork/index.d.ts.map +0 -1
  77. package/dist/DigNetwork/index.js +0 -19
  78. package/dist/blockchain/DataStore.d.ts +0 -67
  79. package/dist/blockchain/DataStore.d.ts.map +0 -1
  80. package/dist/blockchain/DataStore.js +0 -413
  81. package/dist/blockchain/DataStoreSerializer.d.ts +0 -52
  82. package/dist/blockchain/DataStoreSerializer.d.ts.map +0 -1
  83. package/dist/blockchain/DataStoreSerializer.js +0 -109
  84. package/dist/blockchain/FullNodePeer.d.ts +0 -31
  85. package/dist/blockchain/FullNodePeer.d.ts.map +0 -1
  86. package/dist/blockchain/FullNodePeer.js +0 -295
  87. package/dist/blockchain/ServerCoin.d.ts +0 -29
  88. package/dist/blockchain/ServerCoin.d.ts.map +0 -1
  89. package/dist/blockchain/ServerCoin.js +0 -324
  90. package/dist/blockchain/Wallet.d.ts +0 -28
  91. package/dist/blockchain/Wallet.d.ts.map +0 -1
  92. package/dist/blockchain/Wallet.js +0 -253
  93. package/dist/blockchain/coins.d.ts +0 -6
  94. package/dist/blockchain/coins.d.ts.map +0 -1
  95. package/dist/blockchain/coins.js +0 -102
  96. package/dist/blockchain/index.d.ts +0 -8
  97. package/dist/blockchain/index.d.ts.map +0 -1
  98. package/dist/blockchain/index.js +0 -36
  99. package/dist/index.d.ts.map +0 -1
  100. package/dist/prompts.d.ts +0 -21
  101. package/dist/prompts.d.ts.map +0 -1
  102. package/dist/prompts.js +0 -149
  103. package/dist/types.d.ts +0 -64
  104. package/dist/types.d.ts.map +0 -1
  105. package/dist/types.js +0 -2
  106. package/dist/utils/ContentScanner.d.ts +0 -63
  107. package/dist/utils/ContentScanner.d.ts.map +0 -1
  108. package/dist/utils/ContentScanner.js +0 -175
  109. package/dist/utils/Environment.d.ts +0 -18
  110. package/dist/utils/Environment.d.ts.map +0 -1
  111. package/dist/utils/Environment.js +0 -85
  112. package/dist/utils/FileCache.d.ts +0 -11
  113. package/dist/utils/FileCache.d.ts.map +0 -1
  114. package/dist/utils/FileCache.js +0 -58
  115. package/dist/utils/FileTransfer.d.ts +0 -47
  116. package/dist/utils/FileTransfer.d.ts.map +0 -1
  117. package/dist/utils/FileTransfer.js +0 -209
  118. package/dist/utils/NconfManager.d.ts +0 -11
  119. package/dist/utils/NconfManager.d.ts.map +0 -1
  120. package/dist/utils/NconfManager.js +0 -56
  121. package/dist/utils/StoreArchiveManager.d.ts +0 -45
  122. package/dist/utils/StoreArchiveManager.d.ts.map +0 -1
  123. package/dist/utils/StoreArchiveManager.js +0 -153
  124. package/dist/utils/asyncPool.d.ts +0 -9
  125. package/dist/utils/asyncPool.d.ts.map +0 -1
  126. package/dist/utils/asyncPool.js +0 -23
  127. package/dist/utils/config.d.ts +0 -68
  128. package/dist/utils/config.d.ts.map +0 -1
  129. package/dist/utils/config.js +0 -223
  130. package/dist/utils/connectionUtils.d.ts +0 -10
  131. package/dist/utils/connectionUtils.d.ts.map +0 -1
  132. package/dist/utils/connectionUtils.js +0 -18
  133. package/dist/utils/credentialsUtils.d.ts +0 -8
  134. package/dist/utils/credentialsUtils.d.ts.map +0 -1
  135. package/dist/utils/credentialsUtils.js +0 -122
  136. package/dist/utils/directoryUtils.d.ts +0 -9
  137. package/dist/utils/directoryUtils.d.ts.map +0 -1
  138. package/dist/utils/directoryUtils.js +0 -110
  139. package/dist/utils/encryption.d.ts +0 -8
  140. package/dist/utils/encryption.d.ts.map +0 -1
  141. package/dist/utils/encryption.js +0 -55
  142. package/dist/utils/hashUtils.d.ts +0 -8
  143. package/dist/utils/hashUtils.d.ts.map +0 -1
  144. package/dist/utils/hashUtils.js +0 -44
  145. package/dist/utils/index.d.ts +0 -14
  146. package/dist/utils/index.d.ts.map +0 -1
  147. package/dist/utils/index.js +0 -29
  148. package/dist/utils/merkle.d.ts +0 -2
  149. package/dist/utils/merkle.d.ts.map +0 -1
  150. package/dist/utils/merkle.js +0 -28
  151. package/dist/utils/network.d.ts +0 -2
  152. package/dist/utils/network.d.ts.map +0 -1
  153. package/dist/utils/network.js +0 -54
  154. package/dist/utils/spinnerUtils.d.ts +0 -2
  155. package/dist/utils/spinnerUtils.d.ts.map +0 -1
  156. package/dist/utils/spinnerUtils.js +0 -47
  157. package/dist/utils/ssl.d.ts +0 -5
  158. package/dist/utils/ssl.d.ts.map +0 -1
  159. package/dist/utils/ssl.js +0 -50
  160. package/dist/utils/validationUtils.d.ts +0 -9
  161. package/dist/utils/validationUtils.d.ts.map +0 -1
  162. package/dist/utils/validationUtils.js +0 -55
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/methods.ts","../src/provider/injected.ts","../src/provider/wc-retry.ts","../src/provider/walletconnect.ts","../src/provider/methods.ts","../src/provider/chia-provider.ts","../src/loader.ts","../src/urn.ts","../src/dig-client.ts"],"names":[],"mappings":"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","file":"index.js","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","// 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\";\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 Error(`The DIG Browser wallet does not support \"${method}\".`);\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\";\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 Error(\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 );\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 () => rej(new Error(\"Sage did not respond — open the Sage app and try again.\")),\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 {\n throw new Error(\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 }\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\";\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) throw new Error(\"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 Error(\"Your wallet session does not support taking offers. Reconnect your wallet.\");\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\";\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 absent.\n * • \"injected\" — require the injected wallet (throws if absent).\n * • \"walletconnect\" — force the WalletConnect→Sage pairing.\n */\n mode?: \"auto\" | WalletBackend;\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 const mode = options.mode ?? \"auto\";\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 Error(\n \"WalletConnect options are required to connect via WalletConnect \" +\n \"(pass { walletConnect: { projectId, metadata, onUri } }).\",\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 Error(\n \"No injected DIG wallet found. Open this page in the DIG Browser, or use mode 'auto'.\",\n );\n }\n return injected;\n }\n if (mode === \"walletconnect\") return tryWalletConnect();\n // auto\n return (await tryInjected()) ?? (await tryWalletConnect());\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","// Cross-target loader for the vendored `dig_client` read-crypto WASM.\n//\n// The wasm is the SAME artifact the DIG Browser, extension, companion, and hub all run — vendored\n// under vendor/ with a PROVENANCE note and pinned SRI (see vendor/PROVENANCE.md). We NEVER run it\n// unverified: we obtain the raw bytes, SHA-256 them, compare against the pinned digest, and only\n// then hand the verified bytes to wasm-bindgen's init. A mismatch (tampered / wrong artifact)\n// throws — the reader FAILS CLOSED rather than running unverified crypto.\n//\n// Three runtimes are supported, auto-detected, with an escape hatch (`configureWasm`):\n// • Node / Bun — read vendor/ files from the package directory (fs + node:crypto).\n// • Browser (bundled) — the consumer's bundler can resolve the vendor files; if it can't, the\n// consumer supplies bytes via `configureWasm({ wasmBytes, glueUrl })`.\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\";\n\n/** SHA-256 (lowercase hex) of vendor/dig_client_bg.wasm — the SRI digest. Fail closed on mismatch. */\nexport const DIG_CLIENT_WASM_SHA256 =\n \"ff486be806f908a2a90780e499a04dbd34e10e3b97be0470cb9ee841a1e49e77\";\n\n/** Optional explicit wasm inputs, for environments where auto-resolution can't find vendor/. */\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 glue module (vendor/dig_client.mjs) for browser dynamic import. When\n * omitted in a browser, the loader tries to import the glue relative to this module.\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.\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 Error(\n \"dig-client wasm integrity check failed — refusing to run unverified crypto \" +\n `(expected ${DIG_CLIENT_WASM_SHA256}, got ${hex}).`,\n );\n }\n}\n\n// Read the vendored glue URL + wasm bytes for Node from the package's vendor/ directory.\nasync function loadNode(): Promise<{ glueHref: string; bytes: BufferSource }> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath, pathToFileURL } = await import(\"node:url\");\n const path = await import(\"node:path\");\n // This module lives in dist/; vendor/ sits at the package root, one level up.\n const here = path.dirname(fileURLToPath(import.meta.url));\n const vendorDir = path.resolve(here, \"..\", \"vendor\");\n const wasmPath = path.join(vendorDir, \"dig_client_bg.wasm\");\n const gluePath = path.join(vendorDir, \"dig_client.mjs\");\n const buf = await readFile(wasmPath);\n // Copy into a fresh ArrayBuffer-backed view so the type is a plain BufferSource (not the\n // ArrayBufferLike/SharedArrayBuffer union the Node Buffer type widens to).\n const bytes = new Uint8Array(buf.byteLength);\n bytes.set(buf);\n return { glueHref: pathToFileURL(gluePath).href, bytes };\n}\n\n// Resolve the glue URL + wasm bytes for a browser. Prefers explicit config; otherwise resolves\n// the vendored files relative to this module (works when the bundler copies vendor/ alongside).\nasync function loadBrowser(): Promise<{ glueHref: string; bytes: BufferSource }> {\n const glueHref =\n _config.glueUrl ?? new URL(\"../vendor/dig_client.mjs\", import.meta.url).href;\n let bytes: BufferSource;\n if (_config.wasmBytes) {\n bytes = _config.wasmBytes;\n } else {\n const wasmUrl =\n _config.wasmUrl ?? new URL(\"../vendor/dig_client_bg.wasm\", import.meta.url).href;\n const res = await fetch(wasmUrl);\n if (!res.ok) throw new Error(`dig-client wasm fetch failed (${res.status})`);\n bytes = await res.arrayBuffer();\n }\n return { glueHref, bytes };\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 = (async () => {\n const { glueHref, bytes } = isNode ? await loadNode() : await loadBrowser();\n assertIntegrity(await sha256Hex(bytes));\n const mod = (await import(/* @vite-ignore */ glueHref)) as {\n default: (input: { module_or_path: BufferSource }) => Promise<unknown>;\n } & Partial<DigClientWasm>;\n // wasm-bindgen default export = async init; accepts raw bytes via { module_or_path }.\n await mod.default({ module_or_path: bytes });\n return mod as unknown as DigClientWasm;\n })().catch((e) => {\n _ready = null; // allow a retry on transient load failure\n throw e;\n });\n return _ready;\n}\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\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 Error(\n \"Not a valid dig URN (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 { ReadOptions, ReadResult, UrnKeys } from \"./types.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 Error(\n \"a confirmed on-chain root is required to read content (pass { root } or use a root-pinned 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 Error(\n \"resource did not decrypt under this URN — wrong store/key/salt, or a decoy response\",\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 // 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) throw new Error(\"The content network returned no data for this request.\");\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 on transport failure or a JSON-RPC error; 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 {\n throw new Error(\"Could not reach the content network. Check your connection and try again.\");\n }\n if (!res.ok) throw new Error(`dig RPC ${method} failed (${res.status})`);\n const json = (await res.json()) as { result?: T; error?: { message?: string } };\n if (json && json.error) throw new Error(`dig RPC ${method}: ${json.error.message ?? \"error\"}`);\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 Error(\"served ciphertext length does not match chunk lengths\");\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 Error(\n \"No global fetch available. Pass { fetch } to DigClient (Node < 18 needs a fetch polyfill).\",\n );\n }) as unknown as typeof fetch;\n}\n"]}
package/dist/next.cjs ADDED
@@ -0,0 +1,326 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // src/provider/injected.ts
6
+ var INJECTED_TOPIC = "injected";
7
+
8
+ // src/adapters/dev-shim.ts
9
+ var DEV_SHIM_MARKER = "dig-sdk:dev-wallet-shim";
10
+ var DEFAULT_DEV_ADDRESS = "xch1dev0000000000000000000000000000000000000000000000000000devshim";
11
+ function lit(s) {
12
+ return JSON.stringify(s);
13
+ }
14
+ function devShimScript(options = {}) {
15
+ const address = options.address ?? DEFAULT_DEV_ADDRESS;
16
+ return [
17
+ `/* ${DEV_SHIM_MARKER} \u2014 DEV ONLY. A stub wallet for local development; NOT a real wallet. */`,
18
+ `(function () {`,
19
+ ` "use strict";`,
20
+ ` if (typeof window === "undefined") return;`,
21
+ ` // A real injected wallet (DIG Browser / extension) always wins \u2014 never clobber it.`,
22
+ ` if (window.chia) return;`,
23
+ ` var DEV_ADDRESS = ${lit(address)};`,
24
+ ` var TOPIC = ${lit(INJECTED_TOPIC)};`,
25
+ ` function ok(data) { return Promise.resolve({ data: data }); }`,
26
+ ` function nope(method) {`,
27
+ ` return Promise.reject(new Error(`,
28
+ ` "[" + ${lit(DEV_SHIM_MARKER)} + "] '" + method + "' needs a real wallet; the dev shim does not sign. " +`,
29
+ ` "Open in the DIG Browser or connect a wallet to sign for real."));`,
30
+ ` }`,
31
+ ` window.chia = {`,
32
+ ` isDIG: true, // detected by the SDK's injected-provider check`,
33
+ ` isDevShim: true, // so the app can tell it is the dev stub`,
34
+ ` topic: TOPIC,`,
35
+ ` connect: function () { return Promise.resolve(true); },`,
36
+ ` request: function (args) {`,
37
+ ` var method = args && args.method ? String(args.method) : "";`,
38
+ ` switch (method) {`,
39
+ ` case "chip0002_connect": return ok(true);`,
40
+ ` case "chip0002_getPublicKeys": return ok([]);`,
41
+ ` case "getAddress":`,
42
+ ` case "chia_getAddress": return ok(DEV_ADDRESS);`,
43
+ ` default:`,
44
+ ` // Signing / spend methods must not be faked.`,
45
+ ` return nope(method);`,
46
+ ` }`,
47
+ ` },`,
48
+ ` on: function () {},`,
49
+ ` off: function () {},`,
50
+ ` };`,
51
+ ` if (window.console && window.console.info) {`,
52
+ ` window.console.info("[" + ${lit(DEV_SHIM_MARKER)} + "] installed a DEV window.chia (mock address " + DEV_ADDRESS + ").");`,
53
+ ` }`,
54
+ `})();`
55
+ ].join("\n");
56
+ }
57
+
58
+ // src/adapters/config.ts
59
+ function envVal(env, key) {
60
+ const v = env[key];
61
+ if (v == null) return void 0;
62
+ const t = v.trim();
63
+ return t === "" ? void 0 : t;
64
+ }
65
+ function pick(...candidates) {
66
+ for (const c of candidates) if (c !== void 0) return c;
67
+ return void 0;
68
+ }
69
+ function resolveDeployConfig(input) {
70
+ const { options, digToml, env } = input;
71
+ const storeId = pick(
72
+ options.storeId,
73
+ envVal(env, "DIGSTORE_STORE_ID"),
74
+ digToml.storeId
75
+ );
76
+ const outputDir = pick(options.outputDir, envVal(env, "DIGSTORE_OUTPUT_DIR"), digToml.outputDir) ?? "dist";
77
+ const buildCommand = pick(
78
+ options.buildCommand,
79
+ envVal(env, "DIGSTORE_BUILD_COMMAND"),
80
+ digToml.buildCommand
81
+ );
82
+ const message = pick(options.message, envVal(env, "DIGSTORE_MESSAGE"), digToml.message);
83
+ const network = pick(options.network, envVal(env, "DIGSTORE_NETWORK"), digToml.network) ?? "mainnet";
84
+ const remote = pick(options.remote, envVal(env, "DIGSTORE_REMOTE"), digToml.remote);
85
+ const waitFromEnv = envVal(env, "DIGSTORE_WAIT_TIMEOUT");
86
+ const waitTimeout = pick(
87
+ options.waitTimeout,
88
+ waitFromEnv != null ? Number.parseInt(waitFromEnv, 10) : void 0,
89
+ digToml.waitTimeout
90
+ );
91
+ return {
92
+ storeId,
93
+ outputDir,
94
+ buildCommand,
95
+ message,
96
+ network,
97
+ remote,
98
+ waitTimeout: Number.isFinite(waitTimeout) ? waitTimeout : void 0,
99
+ // SECRETS — env only.
100
+ deployKey: envVal(env, "DIGSTORE_DEPLOY_KEY"),
101
+ salt: envVal(env, "DIGSTORE_STORE_SALT")
102
+ };
103
+ }
104
+
105
+ // src/adapters/dig-toml.ts
106
+ var KEY_MAP = {
107
+ store_id: "storeId",
108
+ "store-id": "storeId",
109
+ output_dir: "outputDir",
110
+ "output-dir": "outputDir",
111
+ build_command: "buildCommand",
112
+ "build-command": "buildCommand",
113
+ message: "message",
114
+ network: "network",
115
+ remote: "remote",
116
+ wait_timeout: "waitTimeout",
117
+ "wait-timeout": "waitTimeout"
118
+ };
119
+ var APPLY_ORDER = Object.keys(KEY_MAP).sort(
120
+ (a) => a.includes("-") ? 1 : -1
121
+ );
122
+ function stripComment(line) {
123
+ let inSingle = false;
124
+ let inDouble = false;
125
+ for (let i = 0; i < line.length; i++) {
126
+ const ch = line[i];
127
+ if (ch === "'" && !inDouble) inSingle = !inSingle;
128
+ else if (ch === '"' && !inSingle) inDouble = !inDouble;
129
+ else if (ch === "#" && !inSingle && !inDouble) return line.slice(0, i);
130
+ }
131
+ return line;
132
+ }
133
+ function unquote(raw) {
134
+ const v = raw.trim();
135
+ if (v.startsWith('"') && v.endsWith('"') && v.length >= 2 || v.startsWith("'") && v.endsWith("'") && v.length >= 2) {
136
+ return v.slice(1, -1);
137
+ }
138
+ return v;
139
+ }
140
+ function parseDigToml(text) {
141
+ const raw = {};
142
+ for (const lineRaw of text.split(/\r?\n/)) {
143
+ const line = stripComment(lineRaw).trim();
144
+ if (!line || line.startsWith("[")) continue;
145
+ const eq = line.indexOf("=");
146
+ if (eq <= 0) continue;
147
+ const key = line.slice(0, eq).trim();
148
+ if (!(key in KEY_MAP)) continue;
149
+ raw[key] = unquote(line.slice(eq + 1));
150
+ }
151
+ const out = {};
152
+ for (const key of APPLY_ORDER) {
153
+ const value = raw[key];
154
+ const field = KEY_MAP[key];
155
+ if (value === void 0 || field === void 0) continue;
156
+ if (field === "waitTimeout") {
157
+ const n = Number.parseInt(value, 10);
158
+ if (Number.isFinite(n)) out.waitTimeout = n;
159
+ } else {
160
+ out[field] = value;
161
+ }
162
+ }
163
+ return out;
164
+ }
165
+
166
+ // src/adapters/deploy.ts
167
+ function buildDeployArgs(cfg, opts = {}) {
168
+ const argv = ["deploy", "--json"];
169
+ if (cfg.storeId) argv.push("--store-id", cfg.storeId);
170
+ if (cfg.outputDir) argv.push("--output-dir", cfg.outputDir);
171
+ if (!opts.skipBuild && cfg.buildCommand) argv.push("--build-command", cfg.buildCommand);
172
+ if (cfg.message) argv.push("--message", cfg.message);
173
+ if (cfg.network) argv.push("--network", cfg.network);
174
+ if (cfg.remote) argv.push("--remote", cfg.remote);
175
+ if (cfg.waitTimeout != null) argv.push("--wait-timeout", String(cfg.waitTimeout));
176
+ return argv;
177
+ }
178
+ function buildDeployEnv(cfg) {
179
+ const env = {};
180
+ if (cfg.deployKey) env.DIGSTORE_DEPLOY_KEY = cfg.deployKey;
181
+ if (cfg.salt) env.DIGSTORE_STORE_SALT = cfg.salt;
182
+ return env;
183
+ }
184
+ var CAPSULE_RE = /^([0-9a-f]{64}):([0-9a-f]{64})$/i;
185
+ function parseDeployResult(stdout) {
186
+ const lines = stdout.split(/\r?\n/).map((l) => l.trim()).filter((l) => l.startsWith("{") && l.endsWith("}"));
187
+ if (lines.length === 0) {
188
+ throw new Error(
189
+ `could not parse digstore deploy output (no JSON object found). Output was:
190
+ ${stdout.slice(0, 500)}`
191
+ );
192
+ }
193
+ let obj;
194
+ let fallback;
195
+ for (let i = lines.length - 1; i >= 0; i--) {
196
+ const line = lines[i];
197
+ if (line === void 0) continue;
198
+ let parsed;
199
+ try {
200
+ parsed = JSON.parse(line);
201
+ } catch {
202
+ continue;
203
+ }
204
+ if (typeof parsed.capsule === "string") {
205
+ obj = parsed;
206
+ break;
207
+ }
208
+ if (!fallback) fallback = parsed;
209
+ }
210
+ if (!obj) {
211
+ if (fallback) {
212
+ throw new Error(
213
+ `digstore deploy did not report a capsule (deploy may have failed). Output:
214
+ ${JSON.stringify(fallback)}`
215
+ );
216
+ }
217
+ throw new Error(`could not parse digstore deploy output as JSON:
218
+ ${stdout.slice(0, 500)}`);
219
+ }
220
+ const capsule = obj.capsule;
221
+ const m = CAPSULE_RE.exec(capsule);
222
+ if (!m || m[1] === void 0 || m[2] === void 0) {
223
+ throw new Error(`digstore deploy reported a malformed capsule "${capsule}" (expected storeId:root)`);
224
+ }
225
+ const storeId = m[1].toLowerCase();
226
+ const root = (typeof obj.root === "string" ? obj.root : m[2]).toLowerCase();
227
+ return {
228
+ capsule,
229
+ storeId,
230
+ root,
231
+ // dig:// names the store on the network (resolves to its latest published version).
232
+ digUrl: `dig://${storeId}`,
233
+ // Mirrors digstore deploy.rs::hub_url — the public DIGHub view of an owned store.
234
+ hubUrl: `https://hub.dig.net/stores/${storeId}`,
235
+ pushed: typeof obj.pushed === "boolean" ? obj.pushed : void 0
236
+ };
237
+ }
238
+
239
+ // src/adapters/run.ts
240
+ async function readDigToml(cwd) {
241
+ const { readFile } = await import('fs/promises');
242
+ const path = await import('path');
243
+ try {
244
+ const text = await readFile(path.join(cwd, "dig.toml"), "utf8");
245
+ return parseDigToml(text);
246
+ } catch {
247
+ return {};
248
+ }
249
+ }
250
+ async function runDeploy(options = {}) {
251
+ const cwd = options.cwd ?? process.cwd();
252
+ const bin = options.digstoreBin ?? "digstore";
253
+ const log = options.logger ?? ((l) => console.log(l));
254
+ const digToml = await readDigToml(cwd);
255
+ const cfg = resolveDeployConfig({
256
+ options: {
257
+ storeId: options.storeId,
258
+ outputDir: options.outputDir,
259
+ buildCommand: options.buildCommand,
260
+ message: options.message,
261
+ network: options.network,
262
+ remote: options.remote,
263
+ waitTimeout: options.waitTimeout
264
+ },
265
+ digToml,
266
+ env: process.env
267
+ });
268
+ const argv = buildDeployArgs(cfg, { skipBuild: options.skipBuild });
269
+ const childEnv = { ...process.env, ...buildDeployEnv(cfg) };
270
+ log(`\u25B6 digstore ${argv.filter((a) => a !== cfg.deployKey && a !== cfg.salt).join(" ")}`);
271
+ const { spawn } = await import('child_process');
272
+ const stdout = await new Promise((resolve, reject) => {
273
+ const child = spawn(bin, argv, {
274
+ cwd,
275
+ env: childEnv,
276
+ // digstore reads no stdin here; capture stdout (the JSON) and stream stderr through.
277
+ stdio: ["ignore", "pipe", "pipe"],
278
+ shell: false
279
+ });
280
+ let out = "";
281
+ let err = "";
282
+ child.stdout.on("data", (d) => {
283
+ out += d.toString();
284
+ });
285
+ child.stderr.on("data", (d) => {
286
+ err += d.toString();
287
+ });
288
+ child.on("error", (e) => {
289
+ reject(
290
+ new Error(
291
+ `could not run "${bin}" \u2014 is digstore installed and on PATH? (${e.message})`
292
+ )
293
+ );
294
+ });
295
+ child.on("close", (code) => {
296
+ if (code === 0) resolve(out);
297
+ else reject(new Error(`digstore deploy failed (exit ${code}).
298
+ ${err || out}`));
299
+ });
300
+ });
301
+ const result = parseDeployResult(stdout);
302
+ log(`\u2713 deployed capsule ${result.capsule}`);
303
+ log(` dig:// ${result.digUrl}`);
304
+ log(` view ${result.hubUrl}`);
305
+ return result;
306
+ }
307
+
308
+ // src/next.ts
309
+ var NEXT_EXPORT_DIR = "out";
310
+ function digNextDevShimScript(options = {}) {
311
+ return devShimScript(options);
312
+ }
313
+ function digNextDevShimTag(options = {}) {
314
+ return `<script>${devShimScript(options)}</script>`;
315
+ }
316
+ function digDeploy(options = {}) {
317
+ return runDeploy({ ...options, outputDir: options.outputDir ?? NEXT_EXPORT_DIR, skipBuild: true });
318
+ }
319
+ var next_default = digDeploy;
320
+
321
+ exports.default = next_default;
322
+ exports.digDeploy = digDeploy;
323
+ exports.digNextDevShimScript = digNextDevShimScript;
324
+ exports.digNextDevShimTag = digNextDevShimTag;
325
+ //# sourceMappingURL=next.cjs.map
326
+ //# sourceMappingURL=next.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/injected.ts","../src/adapters/dev-shim.ts","../src/adapters/config.ts","../src/adapters/dig-toml.ts","../src/adapters/deploy.ts","../src/adapters/run.ts","../src/next.ts"],"names":[],"mappings":"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","file":"next.cjs","sourcesContent":["// 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\";\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 Error(`The DIG Browser wallet does not support \"${method}\".`);\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 `window.chia` DEV shim the adapters inject during `dev`.\n//\n// In production a dapp's wallet is the REAL injected provider — the DIG Browser's in-process wallet\n// (or a CHIP-0002 extension) — which the SDK's ChiaProvider detects on `window.chia` via the\n// `isDIG` marker (see src/provider/injected.ts). During local `vite dev` / `next dev` there is no\n// such wallet, so calling `ChiaProvider.connect({ mode: \"injected\" })` would fail and the developer\n// couldn't exercise the wallet path at all.\n//\n// This shim installs a MINIMAL, clearly-labelled stub that satisfies the SAME injected-provider\n// contract the SDK detects (`isDIG`, `request({method,params})`, `connect()`), so the wallet code\n// path runs end-to-end in dev. It is a STUB, not a wallet: it returns a configurable mock address\n// and otherwise throws on methods that would need real signing, so a developer is never misled into\n// thinking a signature is real. It is generated as a self-contained, eval-free `<script>` body\n// (CSP-safe) that GUARDS on an existing `window.chia`, so a real wallet always wins.\n//\n// The shim's method names + response envelope mirror src/provider/injected.ts and\n// src/provider/methods.ts (the native provider returns `{ data }`), so the SAME normalizers run in\n// dev as in production — only the values are mocked.\n\nimport { INJECTED_TOPIC } from \"../provider/injected.js\";\n\n/** A literal substring stamped into the shim so it is unmistakably a dev stub (asserted in tests). */\nexport const DEV_SHIM_MARKER = \"dig-sdk:dev-wallet-shim\";\n\n/** Options for the generated dev shim. */\nexport interface DevShimOptions {\n /** Mock receive address the shim returns from `getAddress`. A clearly-fake default is used. */\n address?: string;\n}\n\n/** A clearly-fake default dev address (so it is obvious in the UI this is not a real wallet). */\nconst DEFAULT_DEV_ADDRESS = \"xch1dev0000000000000000000000000000000000000000000000000000devshim\";\n\n/** JSON-encode a string for safe inlining into a script literal. */\nfunction lit(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Generate the dev-shim `<script>` body (no surrounding `<script>` tags). Inline it into the dev\n * server's served HTML. It is an IIFE that installs `window.chia` ONLY if one is not already\n * present, so the DIG Browser / a real extension always takes precedence. Eval-free and\n * dependency-free — safe under a strict CSP.\n */\nexport function devShimScript(options: DevShimOptions = {}): string {\n const address = options.address ?? DEFAULT_DEV_ADDRESS;\n // The shim mirrors the injected-provider contract the SDK detects. `request` resolves a small set\n // of read methods with mock data and rejects signing methods (a dev stub must not fake a\n // signature). Method names are the bare CHIP-0002 names the SDK normalizes.\n return [\n `/* ${DEV_SHIM_MARKER} — DEV ONLY. A stub wallet for local development; NOT a real wallet. */`,\n `(function () {`,\n ` \"use strict\";`,\n ` if (typeof window === \"undefined\") return;`,\n ` // A real injected wallet (DIG Browser / extension) always wins — never clobber it.`,\n ` if (window.chia) return;`,\n ` var DEV_ADDRESS = ${lit(address)};`,\n ` var TOPIC = ${lit(INJECTED_TOPIC)};`,\n ` function ok(data) { return Promise.resolve({ data: data }); }`,\n ` function nope(method) {`,\n ` return Promise.reject(new Error(`,\n ` \"[\" + ${lit(DEV_SHIM_MARKER)} + \"] '\" + method + \"' needs a real wallet; the dev shim does not sign. \" +`,\n ` \"Open in the DIG Browser or connect a wallet to sign for real.\"));`,\n ` }`,\n ` window.chia = {`,\n ` isDIG: true, // detected by the SDK's injected-provider check`,\n ` isDevShim: true, // so the app can tell it is the dev stub`,\n ` topic: TOPIC,`,\n ` connect: function () { return Promise.resolve(true); },`,\n ` request: function (args) {`,\n ` var method = args && args.method ? String(args.method) : \"\";`,\n ` switch (method) {`,\n ` case \"chip0002_connect\": return ok(true);`,\n ` case \"chip0002_getPublicKeys\": return ok([]);`,\n ` case \"getAddress\":`,\n ` case \"chia_getAddress\": return ok(DEV_ADDRESS);`,\n ` default:`,\n ` // Signing / spend methods must not be faked.`,\n ` return nope(method);`,\n ` }`,\n ` },`,\n ` on: function () {},`,\n ` off: function () {},`,\n ` };`,\n ` if (window.console && window.console.info) {`,\n ` window.console.info(\"[\" + ${lit(DEV_SHIM_MARKER)} + \"] installed a DEV window.chia (mock address \" + DEV_ADDRESS + \").\");`,\n ` }`,\n `})();`,\n ].join(\"\\n\");\n}\n","// Deploy-config resolution for the framework adapters.\n//\n// The final config a deploy runs with is composed from three layers, highest precedence first:\n// 1. plugin options — what the developer wrote in vite.config / the Next adapter call\n// 2. environment vars — what CI injects (DIGSTORE_*), incl. the SECRETS (deploy key, salt)\n// 3. dig.toml — the project's checked-in defaults\n// 4. built-in defaults — outputDir=\"dist\", network=\"mainnet\" (mirrors deploy.rs::resolve_config)\n//\n// This mirrors `digstore deploy`'s own resolution order (flag/env > dig.toml > default) so the\n// adapters never disagree with the CLI about what a project deploys. SECRETS are resolved ONLY from\n// env — never from options or dig.toml — so they can't end up checked into a repo or a config file.\n\nimport type { DigTomlConfig } from \"./dig-toml.js\";\n\n/** Per-call options a developer passes to the Vite plugin / Next adapter. */\nexport interface AdapterOptions {\n /** On-chain store id (64-hex) to advance. Usually set in dig.toml instead. */\n storeId?: string;\n /** Built-output directory to publish. Defaults to the framework's output (or \"dist\"). */\n outputDir?: string;\n /** Shell build command for `digstore` to run. Omit when the adapter builds itself. */\n buildCommand?: string;\n /** Commit message for the new capsule. */\n message?: string;\n /** Chain network. Defaults to \"mainnet\". */\n network?: string;\n /** The `origin` remote to publish to (e.g. `dig://<storeId>`). */\n remote?: string;\n /** Seconds to wait for on-chain confirmation. */\n waitTimeout?: number;\n}\n\n/** The fully resolved config a deploy runs with. Secrets are present only if env supplied them. */\nexport interface ResolvedDeployConfig {\n storeId?: string;\n outputDir: string;\n buildCommand?: string;\n message?: string;\n network: string;\n remote?: string;\n waitTimeout?: number;\n /** Publisher deploy key (64-hex). From env only. */\n deployKey?: string;\n /** Private-store secret salt (64-hex). From env only. */\n salt?: string;\n}\n\n/** Inputs to resolution — kept explicit so it is a pure function (no process.env read inside). */\nexport interface ResolveInput {\n options: AdapterOptions;\n digToml: DigTomlConfig;\n env: Record<string, string | undefined>;\n}\n\n/** A non-empty, trimmed env value, or undefined. Empty/whitespace env vars count as unset. */\nfunction envVal(env: Record<string, string | undefined>, key: string): string | undefined {\n const v = env[key];\n if (v == null) return undefined;\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\n/** First defined of the candidates (treating \"\" the caller already filtered as undefined). */\nfunction pick<T>(...candidates: (T | undefined)[]): T | undefined {\n for (const c of candidates) if (c !== undefined) return c;\n return undefined;\n}\n\n/**\n * Resolve the final deploy config. Precedence per field: options > env (DIGSTORE_*) > dig.toml >\n * default. Secrets (deployKey, salt) are taken from env ONLY.\n */\nexport function resolveDeployConfig(input: ResolveInput): ResolvedDeployConfig {\n const { options, digToml, env } = input;\n\n const storeId = pick(\n options.storeId,\n envVal(env, \"DIGSTORE_STORE_ID\"),\n digToml.storeId,\n );\n const outputDir =\n pick(options.outputDir, envVal(env, \"DIGSTORE_OUTPUT_DIR\"), digToml.outputDir) ?? \"dist\";\n const buildCommand = pick(\n options.buildCommand,\n envVal(env, \"DIGSTORE_BUILD_COMMAND\"),\n digToml.buildCommand,\n );\n const message = pick(options.message, envVal(env, \"DIGSTORE_MESSAGE\"), digToml.message);\n const network =\n pick(options.network, envVal(env, \"DIGSTORE_NETWORK\"), digToml.network) ?? \"mainnet\";\n const remote = pick(options.remote, envVal(env, \"DIGSTORE_REMOTE\"), digToml.remote);\n\n const waitFromEnv = envVal(env, \"DIGSTORE_WAIT_TIMEOUT\");\n const waitTimeout = pick(\n options.waitTimeout,\n waitFromEnv != null ? Number.parseInt(waitFromEnv, 10) : undefined,\n digToml.waitTimeout,\n );\n\n return {\n storeId,\n outputDir,\n buildCommand,\n message,\n network,\n remote,\n waitTimeout: Number.isFinite(waitTimeout) ? waitTimeout : undefined,\n // SECRETS — env only.\n deployKey: envVal(env, \"DIGSTORE_DEPLOY_KEY\"),\n salt: envVal(env, \"DIGSTORE_STORE_SALT\"),\n };\n}\n","// Minimal `dig.toml` reader for the framework adapters.\n//\n// `digstore deploy` reads its config from a project's `dig.toml` (digstore-cli/src/dig_toml.rs).\n// The adapters need the SAME few top-level keys so a project's `dig.toml` is the single source of\n// truth across the CLI and the plugins. Rather than pull in a TOML parser dependency for ~7 flat\n// `key = \"value\"` lines, we parse just those keys ourselves. We accept BOTH the canonical\n// kebab-case key and the snake_case alias, exactly like digstore's `#[serde(rename/alias)]`.\n//\n// Anything beyond these keys (tables, arrays, nested values) is intentionally ignored — the\n// adapters only forward the deploy-relevant scalars to `digstore deploy`, which re-reads the full\n// file authoritatively.\n\n/** The deploy-relevant subset of `dig.toml`, in the adapters' camelCase shape. */\nexport interface DigTomlConfig {\n storeId?: string;\n outputDir?: string;\n buildCommand?: string;\n message?: string;\n network?: string;\n remote?: string;\n waitTimeout?: number;\n}\n\n// Map each canonical/alias TOML key onto the camelCase field. kebab-case is canonical (it is what\n// `digstore new` writes); snake_case is the tolerated alias. When both appear, the canonical\n// kebab-case key wins (it is applied last).\nconst KEY_MAP: Record<string, keyof DigTomlConfig> = {\n store_id: \"storeId\",\n \"store-id\": \"storeId\",\n output_dir: \"outputDir\",\n \"output-dir\": \"outputDir\",\n build_command: \"buildCommand\",\n \"build-command\": \"buildCommand\",\n message: \"message\",\n network: \"network\",\n remote: \"remote\",\n wait_timeout: \"waitTimeout\",\n \"wait-timeout\": \"waitTimeout\",\n};\n\n// Apply snake_case first then kebab-case so the canonical kebab form overrides the alias.\nconst APPLY_ORDER = Object.keys(KEY_MAP).sort((a) =>\n a.includes(\"-\") ? 1 : -1,\n);\n\n/** Strip a `# comment` that is not inside a quoted value. */\nfunction stripComment(line: string): string {\n let inSingle = false;\n let inDouble = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === \"'\" && !inDouble) inSingle = !inSingle;\n else if (ch === '\"' && !inSingle) inDouble = !inDouble;\n else if (ch === \"#\" && !inSingle && !inDouble) return line.slice(0, i);\n }\n return line;\n}\n\n/** Unquote a TOML scalar: `\"x\"` / `'x'` → `x`; a bare token is returned trimmed. */\nfunction unquote(raw: string): string {\n const v = raw.trim();\n if (\n (v.startsWith('\"') && v.endsWith('\"') && v.length >= 2) ||\n (v.startsWith(\"'\") && v.endsWith(\"'\") && v.length >= 2)\n ) {\n return v.slice(1, -1);\n }\n return v;\n}\n\n/**\n * Parse the deploy-relevant keys out of a `dig.toml` string. Unknown keys, tables, and nested\n * structures are ignored. Returns only the keys actually present (so it composes cleanly under the\n * precedence rules in resolveDeployConfig).\n */\nexport function parseDigToml(text: string): DigTomlConfig {\n // Collect raw (canonical-or-alias) string values keyed by the TOML key as written.\n const raw: Record<string, string> = {};\n for (const lineRaw of text.split(/\\r?\\n/)) {\n const line = stripComment(lineRaw).trim();\n if (!line || line.startsWith(\"[\")) continue; // skip blanks + table headers\n const eq = line.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = line.slice(0, eq).trim();\n if (!(key in KEY_MAP)) continue;\n raw[key] = unquote(line.slice(eq + 1));\n }\n\n const out: DigTomlConfig = {};\n for (const key of APPLY_ORDER) {\n const value = raw[key];\n const field = KEY_MAP[key];\n if (value === undefined || field === undefined) continue;\n if (field === \"waitTimeout\") {\n const n = Number.parseInt(value, 10);\n if (Number.isFinite(n)) out.waitTimeout = n;\n } else {\n out[field] = value;\n }\n }\n return out;\n}\n","// The pure glue around `digstore deploy --json`: build the child argv + env, and parse the result.\n//\n// The adapters SHELL OUT to the installed `digstore` binary (the canonical deployer — it advances\n// the on-chain root, stages the build dir, and pushes the new capsule to DIGHub). They never\n// re-implement deploy. These helpers are the deterministic, side-effect-free pieces:\n//\n// • buildDeployArgs — resolved config → argv (always `deploy --json`, only set flags).\n// • buildDeployEnv — resolved config → the env overlay carrying the SECRETS to the child, so the\n// deploy key / salt are NEVER on the argv (process-table leak), matching\n// digstore-cli's own guidance (deploy.rs).\n// • parseDeployResult— `digstore deploy --json` stdout → { capsule, storeId, root, digUrl, hubUrl,\n// pushed }, deriving the URLs exactly as digstore does (capsule = storeId:root;\n// hub view = https://hub.dig.net/stores/<id>; dig:// names the store).\n\nimport type { ResolvedDeployConfig } from \"./config.js\";\n\n/** Knobs for argv construction. */\nexport interface DeployArgsOptions {\n /**\n * The adapter already ran the framework build, so don't hand `--build-command` to digstore (it\n * would rebuild). The output dir is staged as-is.\n */\n skipBuild?: boolean;\n}\n\n/**\n * Build the argv for `digstore <argv>` from a resolved config. Always `deploy --json`. Only flags\n * whose values are set are emitted. SECRETS (deployKey, salt) are intentionally excluded — they go\n * through the env (buildDeployEnv) so they never appear in the process table.\n */\nexport function buildDeployArgs(\n cfg: ResolvedDeployConfig,\n opts: DeployArgsOptions = {},\n): string[] {\n const argv: string[] = [\"deploy\", \"--json\"];\n if (cfg.storeId) argv.push(\"--store-id\", cfg.storeId);\n if (cfg.outputDir) argv.push(\"--output-dir\", cfg.outputDir);\n if (!opts.skipBuild && cfg.buildCommand) argv.push(\"--build-command\", cfg.buildCommand);\n if (cfg.message) argv.push(\"--message\", cfg.message);\n if (cfg.network) argv.push(\"--network\", cfg.network);\n if (cfg.remote) argv.push(\"--remote\", cfg.remote);\n if (cfg.waitTimeout != null) argv.push(\"--wait-timeout\", String(cfg.waitTimeout));\n return argv;\n}\n\n/**\n * The env overlay to merge onto the child process env: the SECRETS, passed out-of-band so they are\n * never visible on the command line. Returns only the keys that have a value.\n */\nexport function buildDeployEnv(cfg: ResolvedDeployConfig): Record<string, string> {\n const env: Record<string, string> = {};\n if (cfg.deployKey) env.DIGSTORE_DEPLOY_KEY = cfg.deployKey;\n if (cfg.salt) env.DIGSTORE_STORE_SALT = cfg.salt;\n return env;\n}\n\n/** The friendly, parsed outcome of a deploy. */\nexport interface DeployResult {\n /** `storeId:rootHash` — the capsule identity (the ecosystem-vocabulary id the user shares). */\n capsule: string;\n /** Store identity (64-hex). */\n storeId: string;\n /** The new on-chain root (64-hex). */\n root: string;\n /** The dig:// URL naming this store (resolves through the network to the latest version). */\n digUrl: string;\n /** The human \"view it\" URL on DIGHub (the same one `digstore deploy` prints). */\n hubUrl: string;\n /** Whether the capsule was pushed to DIGHub (when the JSON reported it). */\n pushed?: boolean;\n}\n\nconst CAPSULE_RE = /^([0-9a-f]{64}):([0-9a-f]{64})$/i;\n\n/**\n * Parse `digstore deploy --json` stdout into a DeployResult. digstore emits a single JSON object\n * (with at least `capsule` and `root`); we also tolerate extra JSON log lines by scanning lines\n * bottom-up for the first object that carries a `capsule`. Throws a clear error if none is found or\n * the output isn't JSON at all.\n */\nexport function parseDeployResult(stdout: string): DeployResult {\n const lines = stdout\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.startsWith(\"{\") && l.endsWith(\"}\"));\n\n if (lines.length === 0) {\n throw new Error(\n `could not parse digstore deploy output (no JSON object found). Output was:\\n${stdout.slice(0, 500)}`,\n );\n }\n\n // Prefer the LAST JSON object that has a capsule (deploy emits one final result object). Keep the\n // first parseable object as a fallback so the error message can show what digstore DID return.\n let obj: Record<string, unknown> | undefined;\n let fallback: Record<string, unknown> | undefined;\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i];\n if (line === undefined) continue;\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue; // not JSON — skip this line\n }\n if (typeof parsed.capsule === \"string\") {\n obj = parsed;\n break;\n }\n if (!fallback) fallback = parsed;\n }\n\n if (!obj) {\n if (fallback) {\n throw new Error(\n `digstore deploy did not report a capsule (deploy may have failed). Output:\\n${JSON.stringify(fallback)}`,\n );\n }\n throw new Error(`could not parse digstore deploy output as JSON:\\n${stdout.slice(0, 500)}`);\n }\n\n const capsule = obj.capsule as string;\n const m = CAPSULE_RE.exec(capsule);\n if (!m || m[1] === undefined || m[2] === undefined) {\n throw new Error(`digstore deploy reported a malformed capsule \"${capsule}\" (expected storeId:root)`);\n }\n const storeId = m[1].toLowerCase();\n const root = (typeof obj.root === \"string\" ? obj.root : m[2]).toLowerCase();\n\n return {\n capsule,\n storeId,\n root,\n // dig:// names the store on the network (resolves to its latest published version).\n digUrl: `dig://${storeId}`,\n // Mirrors digstore deploy.rs::hub_url — the public DIGHub view of an owned store.\n hubUrl: `https://hub.dig.net/stores/${storeId}`,\n pushed: typeof obj.pushed === \"boolean\" ? obj.pushed : undefined,\n };\n}\n","// The shared, Node-only deploy runner both framework adapters call on their `publish` step.\n//\n// It composes the pure pieces (load dig.toml → resolve config → build argv + env), spawns the\n// installed `digstore` binary with `deploy --json`, and parses the result into a friendly\n// DeployResult ({ capsule, digUrl, hubUrl }). It is intentionally thin: ALL deploy logic lives in\n// `digstore deploy` (the canonical deployer — advances the on-chain root, stages, pushes the\n// capsule); this only marshals config in and the result out.\n//\n// Node-only: it uses node:child_process / node:fs. The framework entrypoints import it lazily on\n// the publish path so importing the plugin in a browser/config context never pulls Node APIs.\n\nimport { resolveDeployConfig, type AdapterOptions } from \"./config.js\";\nimport { parseDigToml, type DigTomlConfig } from \"./dig-toml.js\";\nimport {\n buildDeployArgs,\n buildDeployEnv,\n parseDeployResult,\n type DeployArgsOptions,\n type DeployResult,\n} from \"./deploy.js\";\n\n/** Options for {@link runDeploy}. */\nexport interface RunDeployOptions extends AdapterOptions, DeployArgsOptions {\n /** Project root that holds `dig.toml` and the build output. Defaults to `process.cwd()`. */\n cwd?: string;\n /** The `digstore` executable. Defaults to `\"digstore\"` (must be on PATH). */\n digstoreBin?: string;\n /** Sink for human-readable progress. Defaults to `console.log`. */\n logger?: (line: string) => void;\n}\n\n/** Read `dig.toml` from `cwd` (returns {} when absent). */\nasync function readDigToml(cwd: string): Promise<DigTomlConfig> {\n const { readFile } = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n try {\n const text = await readFile(path.join(cwd, \"dig.toml\"), \"utf8\");\n return parseDigToml(text);\n } catch {\n return {}; // no dig.toml — rely on options + env\n }\n}\n\n/**\n * Resolve config, run `digstore deploy --json`, and parse the capsule. Spawns `digstore` with the\n * SECRETS injected through the child env (never the argv). Rejects with digstore's stderr on\n * non-zero exit. Returns the parsed {@link DeployResult}.\n */\nexport async function runDeploy(options: RunDeployOptions = {}): Promise<DeployResult> {\n const cwd = options.cwd ?? process.cwd();\n const bin = options.digstoreBin ?? \"digstore\";\n const log = options.logger ?? ((l: string) => console.log(l));\n\n const digToml = await readDigToml(cwd);\n const cfg = resolveDeployConfig({\n options: {\n storeId: options.storeId,\n outputDir: options.outputDir,\n buildCommand: options.buildCommand,\n message: options.message,\n network: options.network,\n remote: options.remote,\n waitTimeout: options.waitTimeout,\n },\n digToml,\n env: process.env,\n });\n\n const argv = buildDeployArgs(cfg, { skipBuild: options.skipBuild });\n const childEnv = { ...process.env, ...buildDeployEnv(cfg) };\n\n log(`▶ digstore ${argv.filter((a) => a !== cfg.deployKey && a !== cfg.salt).join(\" \")}`);\n\n const { spawn } = await import(\"node:child_process\");\n const stdout = await new Promise<string>((resolve, reject) => {\n const child = spawn(bin, argv, {\n cwd,\n env: childEnv,\n // digstore reads no stdin here; capture stdout (the JSON) and stream stderr through.\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: false,\n });\n let out = \"\";\n let err = \"\";\n child.stdout.on(\"data\", (d: Buffer) => {\n out += d.toString();\n });\n child.stderr.on(\"data\", (d: Buffer) => {\n err += d.toString();\n });\n child.on(\"error\", (e: Error) => {\n reject(\n new Error(\n `could not run \"${bin}\" — is digstore installed and on PATH? (${e.message})`,\n ),\n );\n });\n child.on(\"close\", (code: number | null) => {\n if (code === 0) resolve(out);\n else reject(new Error(`digstore deploy failed (exit ${code}).\\n${err || out}`));\n });\n });\n\n const result = parseDeployResult(stdout);\n log(`✓ deployed capsule ${result.capsule}`);\n log(` dig:// ${result.digUrl}`);\n log(` view ${result.hubUrl}`);\n return result;\n}\n","// `@dignetwork/dig-sdk/next` — a Next.js static-export adapter for shipping to DIG.\n//\n// Next has no Vite-style `transformIndexHtml` hook, so the two jobs are surfaced as helpers a Next\n// project wires in:\n// 1. DEV: `digNextDevShimTag()` returns a ready `<script …>` string to drop into the app's\n// `<head>` (e.g. in `app/layout.tsx` or `_document`) so `next dev` has the SDK's `window.chia`\n// dev shim — the SAME injected-provider contract production uses. It guards on a real wallet\n// and is eval-free. Gate it on `process.env.NODE_ENV !== \"production\"` in your layout so it\n// ships only in dev.\n// 2. PUBLISH: `digDeploy()` ships the static-export output (`out/` by default — what\n// `next build` writes with `output: \"export\"`) to a DIG capsule via `digstore deploy --json`,\n// printing the dig:// + DIGHub URL. Call it from a `publish` script after the build.\n//\n// Next is an OPTIONAL peer: this module imports nothing from \"next\". The publish runner is the\n// shared Node-only `runDeploy`.\n\nimport { devShimScript, type DevShimOptions } from \"./adapters/dev-shim.js\";\nimport type { AdapterOptions } from \"./adapters/config.js\";\nimport type { DeployResult } from \"./adapters/deploy.js\";\nimport { runDeploy } from \"./adapters/run.js\";\n\n/** Next static-export writes here by default (`output: \"export\"`). */\nconst NEXT_EXPORT_DIR = \"out\";\n\n/**\n * The raw dev-shim script BODY (no `<script>` tags) — for callers that inject it themselves (e.g.\n * via Next's `<Script id=… dangerouslySetInnerHTML>` or a custom `_document`).\n */\nexport function digNextDevShimScript(options: DevShimOptions = {}): string {\n return devShimScript(options);\n}\n\n/**\n * A ready-to-inline `<script>…</script>` tag carrying the dev shim. Drop into the app `<head>`\n * (guard on dev): e.g. in `app/layout.tsx`\n * `{process.env.NODE_ENV !== \"production\" && <head dangerouslySetInnerHTML={{ __html: digNextDevShimTag() }} />}`.\n * Prefer `digNextDevShimScript()` with Next's `<Script>` component when you can.\n */\nexport function digNextDevShimTag(options: DevShimOptions = {}): string {\n return `<script>${devShimScript(options)}</script>`;\n}\n\n/**\n * Deploy the Next static export to a DIG capsule. Call from a `publish` script AFTER\n * `next build` (with `output: \"export\"`). Defaults `outputDir` to `out` (Next's export dir); reads\n * `dig.toml` + env (DIGSTORE_*) for the rest. The adapter has already built, so digstore stages the\n * existing `out/` rather than rebuilding.\n */\nexport function digDeploy(options: AdapterOptions = {}): Promise<DeployResult> {\n return runDeploy({ ...options, outputDir: options.outputDir ?? NEXT_EXPORT_DIR, skipBuild: true });\n}\n\nexport default digDeploy;\n"]}
@@ -0,0 +1,23 @@
1
+ import { A as AdapterOptions, a as DeployResult, c as DevShimOptions } from './dev-shim-Bgw8X2E9.cjs';
2
+
3
+ /**
4
+ * The raw dev-shim script BODY (no `<script>` tags) — for callers that inject it themselves (e.g.
5
+ * via Next's `<Script id=… dangerouslySetInnerHTML>` or a custom `_document`).
6
+ */
7
+ declare function digNextDevShimScript(options?: DevShimOptions): string;
8
+ /**
9
+ * A ready-to-inline `<script>…</script>` tag carrying the dev shim. Drop into the app `<head>`
10
+ * (guard on dev): e.g. in `app/layout.tsx`
11
+ * `{process.env.NODE_ENV !== "production" && <head dangerouslySetInnerHTML={{ __html: digNextDevShimTag() }} />}`.
12
+ * Prefer `digNextDevShimScript()` with Next's `<Script>` component when you can.
13
+ */
14
+ declare function digNextDevShimTag(options?: DevShimOptions): string;
15
+ /**
16
+ * Deploy the Next static export to a DIG capsule. Call from a `publish` script AFTER
17
+ * `next build` (with `output: "export"`). Defaults `outputDir` to `out` (Next's export dir); reads
18
+ * `dig.toml` + env (DIGSTORE_*) for the rest. The adapter has already built, so digstore stages the
19
+ * existing `out/` rather than rebuilding.
20
+ */
21
+ declare function digDeploy(options?: AdapterOptions): Promise<DeployResult>;
22
+
23
+ export { digDeploy as default, digDeploy, digNextDevShimScript, digNextDevShimTag };