@radiant-core/sdk 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.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/index.cjs +1064 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +693 -0
- package/dist/index.d.ts +693 -0
- package/dist/index.js +1015 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/constants.ts","../src/units.ts","../src/radiantjs.ts","../src/script.ts","../src/client.ts","../src/wallet.ts","../src/utxo.ts","../src/tx.ts","../src/tokens.ts","../src/wave.ts"],"names":["cborEncode"],"mappings":"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","file":"index.js","sourcesContent":["/** Typed error classes so callers can branch on failure modes. */\n\n/** Base class for every error thrown by the SDK. */\nexport class RadiantSdkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\n/** Thrown when a request cannot be funded from the available UTXO set. */\nexport class InsufficientFundsError extends RadiantSdkError {\n constructor(\n readonly requiredPhotons: bigint,\n readonly availablePhotons: bigint,\n ) {\n super(\n `Insufficient funds: need ${requiredPhotons} photons (incl. fee) but only ${availablePhotons} available in token-free UTXOs`,\n );\n }\n}\n\n/**\n * Thrown when a token-bearing UTXO is about to be spent as discretionary RXD\n * funding — doing so would silently burn the token. This is the SDK's primary\n * safety backstop.\n */\nexport class TokenBurnGuardError extends RadiantSdkError {\n constructor(readonly txid: string, readonly vout: number) {\n super(\n `Refusing token-bearing UTXO ${txid}:${vout} as RXD funding (would burn the token)`,\n );\n }\n}\n\n/** Thrown for ElectrumX transport/protocol failures. */\nexport class ElectrumError extends RadiantSdkError {\n constructor(message: string, readonly code?: number) {\n super(message);\n }\n}\n\n/** Thrown when an input/argument is malformed. */\nexport class ValidationError extends RadiantSdkError {}\n","/**\n * Network constants, default endpoints, and protocol parameters.\n *\n * Sources of truth (verified against the Radiant ecosystem, 2026-06):\n * - Min-relay fee: 10,000 photons/byte on mainnet since the V2 upgrade\n * (block 410,000). Testnet/regtest use 1,000. Pin these; do not \"tune\" them.\n * - HD coin type: SLIP-0044 512 (Radiant), default since radiantjs v3.0.0.\n * - Public ElectrumX is reachable on :443 only (Caddy TLS terminates to the\n * indexer). 50010-50012 are firewalled off the public host.\n * - WAVE/Glyph REST lives behind https://radiantcore.org/api.\n */\n\nimport type { NetworkName } from \"./types.js\";\n\n/** Base unit of Radiant. 1 RXD = 100,000,000 photons. */\nexport const PHOTONS_PER_RXD = 100_000_000n;\n\n/** SLIP-0044 registered coin type for Radiant. */\nexport const RADIANT_COIN_TYPE = 512;\n\n/**\n * Min-relay fee rate in photons per byte, keyed by network.\n * Mainnet = 10,000 since the V2 upgrade (block 410,000).\n */\nexport const MIN_RELAY_FEE_RATE: Record<NetworkName, bigint> = {\n mainnet: 10_000n,\n testnet: 1_000n,\n regtest: 1_000n,\n};\n\n/**\n * Dust limit in photons. Outputs below this are non-standard. Token-carrying\n * outputs typically ride at exactly the dust value.\n */\nexport const DUST_LIMIT = 1_000n;\n\n/** Default value (photons) assigned to a Glyph commit/reveal carrier output. */\nexport const TOKEN_OUTPUT_VALUE = 1n;\n\n/** Default public ElectrumX WebSocket endpoints, keyed by network. */\nexport const DEFAULT_ELECTRUM_ENDPOINT: Record<NetworkName, string> = {\n mainnet: \"wss://electrumx.radiantcore.org:443\",\n // Adjust to your own infra; no canonical public testnet/regtest endpoint.\n testnet: \"wss://electrumx.radiantcore.org:443\",\n regtest: \"ws://localhost:50011\",\n};\n\n/** Default RXinDexer REST base used for WAVE name resolution. */\nexport const DEFAULT_REST_BASE = \"https://radiantcore.org/api\";\n\n/** Glyph protocol magic bytes (\"gly\") that prefix every payload envelope. */\nexport const GLYPH_MAGIC_BYTES = Uint8Array.from([0x67, 0x6c, 0x79]);\n\n/** Glyph protocol identifiers (the `p` field of a payload). */\nexport const GLYPH_PROTOCOL = {\n FT: 1,\n NFT: 2,\n MUTABLE: 5,\n CONTAINER: 7,\n ENCRYPTED: 8,\n WAVE: 11,\n} as const;\n\n/**\n * OP_PUSHINPUTREF family opcode range (0xd0-0xd8). The presence of any of these\n * in opcode position is what makes a UTXO \"token-bearing\" — see isTokenBearing.\n */\nexport const INPUT_REF_OP_MIN = 0xd0;\nexport const INPUT_REF_OP_MAX = 0xd8;\n\n/** WebSocket reconnect backoff bounds (milliseconds). */\nexport const RECONNECT_BASE_MS = 1_000;\nexport const RECONNECT_MAX_MS = 30_000;\n\n/** Default per-request timeout for ElectrumX JSON-RPC calls (milliseconds). */\nexport const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;\n","/**\n * Photon <-> RXD conversion helpers.\n *\n * Internally the SDK uses photons as BigInt everywhere (1 RXD = 100,000,000\n * photons). These helpers exist for display/input at the application edge.\n * Never do balance math in floating point — use the BigInt photon value.\n */\n\nimport { PHOTONS_PER_RXD } from \"./constants.js\";\nimport { ValidationError } from \"./errors.js\";\n\n/** Number of decimal places in a whole RXD (8). */\nexport const RXD_DECIMALS = 8;\n\n/**\n * Convert an RXD amount to photons (BigInt). Accepts a number or a decimal\n * string; the string form avoids float rounding for large/precise amounts.\n *\n * @example rxdToPhotons(\"1.5\") === 150_000_000n\n */\nexport function rxdToPhotons(rxd: string | number): bigint {\n const str = typeof rxd === \"number\" ? formatNumber(rxd) : rxd.trim();\n if (!/^-?\\d*(\\.\\d*)?$/.test(str) || str === \"\" || str === \".\" || str === \"-\") {\n throw new ValidationError(`Invalid RXD amount: ${JSON.stringify(rxd)}`);\n }\n const negative = str.startsWith(\"-\");\n const [whole, frac = \"\"] = (negative ? str.slice(1) : str).split(\".\");\n if (frac.length > RXD_DECIMALS) {\n throw new ValidationError(\n `RXD amount has more than ${RXD_DECIMALS} decimal places: ${str}`,\n );\n }\n const padded = frac.padEnd(RXD_DECIMALS, \"0\");\n const photons = BigInt(whole || \"0\") * PHOTONS_PER_RXD + BigInt(padded || \"0\");\n return negative ? -photons : photons;\n}\n\n/**\n * Convert photons (BigInt) to a fixed-point RXD string with 8 decimals,\n * trailing zeros trimmed (but at least one decimal kept).\n *\n * @example photonsToRxd(150_000_000n) === \"1.5\"\n */\nexport function photonsToRxd(photons: bigint): string {\n const negative = photons < 0n;\n const abs = negative ? -photons : photons;\n const whole = abs / PHOTONS_PER_RXD;\n const frac = abs % PHOTONS_PER_RXD;\n const fracStr = frac.toString().padStart(RXD_DECIMALS, \"0\").replace(/0+$/, \"\");\n const body = fracStr.length ? `${whole}.${fracStr}` : `${whole}.0`;\n return negative ? `-${body}` : body;\n}\n\n/** Format a JS number without scientific notation for parsing. */\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) {\n throw new ValidationError(`Invalid RXD amount: ${n}`);\n }\n // toFixed caps at RXD precision and avoids 1e-7 style output.\n return n.toFixed(RXD_DECIMALS);\n}\n","/**\n * Single, centralised access point to `@radiant-core/radiantjs`.\n *\n * radiantjs is the low-level tx/script/key library (a Radiant fork of\n * bitcore-lib). We wrap it — never duplicate it. Every other module imports the\n * classes it needs from here so there is exactly one place that knows about the\n * underlying library's loose runtime shape.\n */\n\nimport rjs from \"@radiant-core/radiantjs\";\nimport type { NetworkName } from \"./types.js\";\n\n// radiantjs attaches everything onto its single default export object.\nexport const Address = rjs.Address;\nexport const HDPrivateKey = rjs.HDPrivateKey;\nexport const HDPublicKey = rjs.HDPublicKey;\nexport const PrivateKey = rjs.PrivateKey;\nexport const PublicKey = rjs.PublicKey;\nexport const Script = rjs.Script;\nexport const Opcode = rjs.Opcode;\nexport const Transaction = rjs.Transaction;\nexport const Mnemonic = rjs.Mnemonic;\nexport const Networks = rjs.Networks;\nexport const crypto = rjs.crypto;\n\n/** The raw radiantjs namespace, for advanced callers that need an escape hatch. */\nexport const radiantjs = rjs;\n\n/** Map our network name to the radiantjs Networks object. */\nexport function toRjsNetwork(network: NetworkName): unknown {\n switch (network) {\n case \"mainnet\":\n return Networks.livenet;\n case \"testnet\":\n return Networks.testnet;\n case \"regtest\":\n // radiantjs gates regtest behind an enable flag; turn it on lazily.\n Networks.enableRegtest?.();\n return Networks.regtest;\n }\n}\n\n/** sha256(data) -> Buffer, via radiantjs crypto (isomorphic, no extra dep). */\nexport function sha256(data: Buffer): Buffer {\n return crypto.Hash.sha256(data);\n}\n\n/** sha256d(data) -> Buffer. */\nexport function sha256d(data: Buffer): Buffer {\n return crypto.Hash.sha256sha256(data);\n}\n\n/** The SIGHASH flag the SDK signs with: ALL | FORKID (always enforce fork id). */\nexport const SIGHASH_FORKID_ALL: number =\n crypto.Signature.SIGHASH_ALL | crypto.Signature.SIGHASH_FORKID;\n","/**\n * Script-level primitives: scripthash computation (ElectrumX convention),\n * token-bearing detection, zero-ref normalisation, and ref packing.\n *\n * These mirror the proven Photonic-Wallet implementations. They are pure and\n * dependency-light (only radiantjs for hashing / address->script).\n */\n\nimport { Script, sha256 } from \"./radiantjs.js\";\nimport {\n INPUT_REF_OP_MIN,\n INPUT_REF_OP_MAX,\n} from \"./constants.js\";\nimport { ValidationError } from \"./errors.js\";\nimport type { NetworkName } from \"./types.js\";\n\n/** OP codes that consume a signature (used by zeroRefs to detect covenants). */\nconst CHECKSIG_OPS = new Set<number>([\n 0xac, // OP_CHECKSIG\n 0xad, // OP_CHECKSIGVERIFY\n 0xae, // OP_CHECKMULTISIG\n 0xaf, // OP_CHECKMULTISIGVERIFY\n]);\n\n/**\n * ElectrumX scripthash: sha256(scriptBytes) reversed, hex.\n * This is the key ElectrumX uses to index an output; it is NOT a txid order.\n */\nexport function scriptHash(scriptHex: string): string {\n if (!scriptHex) {\n // Hashing the empty script yields a constant that has historically masked\n // upstream bugs (a swallowed exception returning \"\"). Fail loudly instead.\n throw new ValidationError(\"scriptHash: cannot hash an empty script\");\n }\n return Buffer.from(sha256(Buffer.from(scriptHex, \"hex\")))\n .reverse()\n .toString(\"hex\");\n}\n\n/**\n * Build a P2PKH output script (hex) for an address. The script is\n * network-independent — only the 20-byte pubkey hash matters — so the address\n * is decoded by its version byte without imposing a network (this also avoids\n * the testnet/regtest ambiguity, where both share version byte 0x6f). The\n * `network` parameter is accepted for call-site symmetry but not required.\n */\nexport function p2pkhScript(address: string, _network?: NetworkName): string {\n try {\n return Script.buildPublicKeyHashOut(address).toHex();\n } catch (err) {\n throw new ValidationError(\n `p2pkhScript: invalid address ${JSON.stringify(address)}: ${String(err)}`,\n );\n }\n}\n\n/** Convenience: ElectrumX scripthash for a plain (P2PKH) address. */\nexport function addressToScriptHash(\n address: string,\n network?: NetworkName,\n): string {\n return scriptHash(p2pkhScript(address, network));\n}\n\n/**\n * Returns true if a script carries a Glyph token, i.e. it contains an\n * OP_PUSHINPUTREF-family opcode (0xd0-0xd8) in *opcode position*.\n *\n * Critically, this walks the script as an opcode stream and skips push\n * payloads, so a 0xd0-0xd8 byte that merely appears inside a pubkey hash or a\n * data push does NOT trigger a false positive. Spending such a UTXO as\n * discretionary RXD funding would burn the token, so funding selection relies\n * on this check.\n */\nexport function isTokenBearing(scriptHex: string): boolean {\n if (!scriptHex) return false;\n let bytes: Buffer;\n try {\n bytes = Buffer.from(scriptHex, \"hex\");\n } catch {\n return false;\n }\n const n = bytes.length;\n let pos = 0;\n while (pos < n) {\n const op = bytes[pos]!;\n if (op >= INPUT_REF_OP_MIN && op <= INPUT_REF_OP_MAX) return true;\n let next: number;\n if (op >= 0x01 && op <= 0x4b) {\n next = pos + 1 + op; // direct push of `op` bytes\n } else if (op === 0x4c) {\n if (pos + 1 >= n) return false; // OP_PUSHDATA1, truncated\n next = pos + 2 + bytes[pos + 1]!;\n } else if (op === 0x4d) {\n if (pos + 2 >= n) return false; // OP_PUSHDATA2 (LE), truncated\n next = pos + 3 + (bytes[pos + 1]! | (bytes[pos + 2]! << 8));\n } else if (op === 0x4e) {\n if (pos + 4 >= n) return false; // OP_PUSHDATA4 (LE), truncated\n next =\n pos +\n 5 +\n ((bytes[pos + 1]! |\n (bytes[pos + 2]! << 8) |\n (bytes[pos + 3]! << 16) |\n (bytes[pos + 4]! << 24)) >>>\n 0);\n } else {\n next = pos + 1; // non-push opcode, no operand\n }\n if (next <= pos || next > n) return false; // truncated/overrun push\n pos = next;\n }\n return false;\n}\n\n/**\n * Zero out the 36-byte operands of OP_PUSHINPUTREF-family opcodes, but only if\n * the script also requires a signature (CHECKSIG). This reproduces how the\n * indexer keys token-gated covenant scripts: a covenant is indexed under its\n * zeroed-ref form, so to look up its UTXOs you must hash scriptHash(zeroRefs(s))\n * rather than the raw script. Plain (non-checksig) ref scripts are returned\n * unchanged.\n */\nexport function zeroRefs(scriptHex: string): string {\n const script = Buffer.from(scriptHex, \"hex\");\n const out = Buffer.from(script);\n let requiresSig = false;\n let n = 0;\n while (n < script.length) {\n const op = script[n]!;\n n += 1;\n if (CHECKSIG_OPS.has(op)) {\n requiresSig = true;\n } else if (op >= INPUT_REF_OP_MIN && op <= INPUT_REF_OP_MAX) {\n out.fill(0, n, n + 36); // zero the 36-byte ref operand\n n += 36;\n } else if (op <= 0x4e && op >= 0x01) {\n // Push opcode: skip its data payload.\n let dlen = op;\n if (op === 0x4c) {\n dlen = script[n]!;\n n += 1;\n } else if (op === 0x4d) {\n dlen = script.readUInt16LE(n);\n n += 2;\n } else if (op === 0x4e) {\n dlen = script.readUInt32LE(n);\n n += 4;\n }\n n += dlen;\n }\n }\n return (requiresSig ? out : script).toString(\"hex\");\n}\n\n/**\n * Pack an outpoint into a 36-byte Glyph ref (72 hex chars): 32-byte txid in\n * internal (little-endian) order followed by a 4-byte little-endian vout.\n * This is the form consumed by OP_PUSHINPUTREF <ref>.\n */\nexport function packRef(txid: string, vout: number): string {\n if (!/^[0-9a-fA-F]{64}$/.test(txid)) {\n throw new ValidationError(`packRef: invalid txid ${JSON.stringify(txid)}`);\n }\n const txidLE = Buffer.from(txid, \"hex\").reverse(); // display -> internal order\n const voutLE = Buffer.alloc(4);\n voutLE.writeUInt32LE(vout >>> 0, 0);\n return Buffer.concat([txidLE, voutLE]).toString(\"hex\");\n}\n\n/** Inverse of packRef: unpack a 72-hex ref into display \"txid:vout\". */\nexport function unpackRef(ref: string): { txid: string; vout: number } {\n if (!/^[0-9a-fA-F]{72}$/.test(ref)) {\n throw new ValidationError(`unpackRef: invalid ref ${JSON.stringify(ref)}`);\n }\n const buf = Buffer.from(ref, \"hex\");\n const txid = Buffer.from(buf.subarray(0, 32)).reverse().toString(\"hex\");\n const vout = buf.readUInt32LE(32);\n return { txid, vout };\n}\n","/**\n * ElectrumX WebSocket client.\n *\n * Speaks JSON-RPC 2.0 over a single wss connection, with automatic reconnect\n * (exponential backoff + jitter), per-request timeouts, and scripthash\n * subscriptions. Isomorphic: uses the global `WebSocket` in browsers / modern\n * Node, and lazily imports the `ws` package on older Node.\n *\n * High-level helpers return SDK types (photons as BigInt). All scripthash\n * methods also accept a plain address for convenience.\n */\n\nimport {\n DEFAULT_ELECTRUM_ENDPOINT,\n DEFAULT_REQUEST_TIMEOUT_MS,\n RECONNECT_BASE_MS,\n RECONNECT_MAX_MS,\n} from \"./constants.js\";\nimport { ElectrumError } from \"./errors.js\";\nimport { addressToScriptHash, p2pkhScript } from \"./script.js\";\nimport type {\n NetworkName,\n ScriptHashBalance,\n Utxo,\n} from \"./types.js\";\n\n/** A minimal structural type for the WebSocket implementations we accept. */\ninterface MinimalWebSocket {\n send(data: string): void;\n close(): void;\n addEventListener(type: string, listener: (ev: any) => void): void;\n readonly readyState: number;\n}\ntype WebSocketCtor = new (url: string) => MinimalWebSocket;\n\n/** Raw `listunspent` entry as returned by ElectrumX. */\ninterface RawUnspent {\n tx_hash: string;\n tx_pos: number;\n height: number;\n value: number;\n refs?: { ref: string; type: string }[];\n}\n\n/** Options for {@link ElectrumClient}. */\nexport interface ElectrumClientOptions {\n /** Full wss/ws endpoint. Overrides `network`'s default if given. */\n endpoint?: string;\n /** Network whose default endpoint to use when `endpoint` is omitted. */\n network?: NetworkName;\n /** Per-request timeout in ms. Default 15,000. */\n requestTimeoutMs?: number;\n /** Auto-reconnect on close. Default true. */\n reconnect?: boolean;\n /** Inject a WebSocket constructor (tests, custom transports). */\n webSocketCtor?: WebSocketCtor;\n}\n\ntype Pending = {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n};\n\ntype SubscriptionHandler = (params: unknown[]) => void;\n\nconst WS_OPEN = 1;\n\n/**\n * Connect-on-demand ElectrumX client.\n *\n * @example\n * const client = new ElectrumClient({ network: \"mainnet\" });\n * await client.connect();\n * const bal = await client.getBalance(address);\n */\nexport class ElectrumClient {\n readonly endpoint: string;\n private readonly requestTimeoutMs: number;\n private readonly autoReconnect: boolean;\n private readonly injectedCtor?: WebSocketCtor;\n\n private ws?: MinimalWebSocket;\n private ctor?: WebSocketCtor;\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly subscriptions = new Map<string, SubscriptionHandler>();\n private connectPromise?: Promise<void>;\n private reconnectAttempts = 0;\n private closedByUser = false;\n\n constructor(options: ElectrumClientOptions = {}) {\n const network = options.network ?? \"mainnet\";\n this.endpoint = options.endpoint ?? DEFAULT_ELECTRUM_ENDPOINT[network];\n this.requestTimeoutMs =\n options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.autoReconnect = options.reconnect ?? true;\n this.injectedCtor = options.webSocketCtor;\n }\n\n /** True if the socket is open and ready. */\n get connected(): boolean {\n return this.ws?.readyState === WS_OPEN;\n }\n\n /** Open the connection (idempotent). Resolves once the socket is ready. */\n async connect(): Promise<void> {\n if (this.connected) return;\n if (this.connectPromise) return this.connectPromise;\n this.closedByUser = false;\n this.connectPromise = this.openSocket();\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = undefined;\n }\n }\n\n private async resolveCtor(): Promise<WebSocketCtor> {\n if (this.ctor) return this.ctor;\n if (this.injectedCtor) return (this.ctor = this.injectedCtor);\n const g = globalThis as { WebSocket?: WebSocketCtor };\n if (typeof g.WebSocket !== \"undefined\") {\n return (this.ctor = g.WebSocket);\n }\n // Node without a global WebSocket: fall back to the `ws` package.\n try {\n const mod: any = await import(\"ws\");\n return (this.ctor = (mod.default ?? mod) as WebSocketCtor);\n } catch {\n throw new ElectrumError(\n \"No WebSocket implementation available. On Node <22, install the optional `ws` dependency.\",\n );\n }\n }\n\n private async openSocket(): Promise<void> {\n const Ctor = await this.resolveCtor();\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const ws = new Ctor(this.endpoint);\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempts = 0;\n settled = true;\n resolve();\n });\n ws.addEventListener(\"message\", (ev: { data: unknown }) =>\n this.onMessage(ev.data),\n );\n ws.addEventListener(\"error\", (ev: unknown) => {\n if (!settled) {\n settled = true;\n reject(new ElectrumError(`WebSocket error connecting to ${this.endpoint}`));\n }\n });\n ws.addEventListener(\"close\", () => this.onClose());\n });\n }\n\n private onMessage(data: unknown): void {\n let msg: any;\n try {\n msg = JSON.parse(typeof data === \"string\" ? data : String(data));\n } catch {\n return; // ignore non-JSON frames\n }\n const handle = (m: any) => {\n if (m && typeof m.id === \"number\") {\n const p = this.pending.get(m.id);\n if (!p) return;\n this.pending.delete(m.id);\n clearTimeout(p.timer);\n if (m.error) {\n const e = m.error;\n p.reject(new ElectrumError(e?.message ?? String(e), e?.code));\n } else {\n p.resolve(m.result);\n }\n } else if (m && typeof m.method === \"string\") {\n // Subscription notification: dispatch to the matching handler.\n const handler = this.subscriptions.get(m.method);\n if (handler) handler(Array.isArray(m.params) ? m.params : []);\n }\n };\n if (Array.isArray(msg)) msg.forEach(handle);\n else handle(msg);\n }\n\n private onClose(): void {\n // Fail all in-flight requests; they can be retried after reconnect.\n for (const [, p] of this.pending) {\n clearTimeout(p.timer);\n p.reject(new ElectrumError(\"Connection closed\"));\n }\n this.pending.clear();\n this.ws = undefined;\n if (this.closedByUser || !this.autoReconnect) return;\n const delay = this.nextReconnectDelay();\n setTimeout(() => {\n this.connect().catch(() => {\n /* next close will schedule another attempt */\n });\n }, delay);\n }\n\n /** Exponential backoff with full jitter, capped at RECONNECT_MAX_MS. */\n private nextReconnectDelay(): number {\n const capped = Math.min(\n RECONNECT_MAX_MS,\n RECONNECT_BASE_MS * 2 ** this.reconnectAttempts,\n );\n this.reconnectAttempts++;\n return capped / 2 + Math.random() * (capped / 2);\n }\n\n /** Send a JSON-RPC request and await its result. */\n async request<T = unknown>(method: string, ...params: unknown[]): Promise<T> {\n if (!this.connected) await this.connect();\n const id = this.nextId++;\n const payload = JSON.stringify({ jsonrpc: \"2.0\", id, method, params });\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new ElectrumError(`Request timed out: ${method}`));\n }, this.requestTimeoutMs);\n this.pending.set(id, {\n resolve: resolve as (v: unknown) => void,\n reject,\n timer,\n });\n try {\n this.ws!.send(payload);\n } catch (err) {\n clearTimeout(timer);\n this.pending.delete(id);\n reject(new ElectrumError(`Failed to send ${method}: ${String(err)}`));\n }\n });\n }\n\n // ---- Server info ----------------------------------------------------------\n\n /** Negotiate protocol version. */\n async serverVersion(\n client = \"@radiant-core/sdk\",\n protocol: [string, string] | string = [\"1.4\", \"1.4.3\"],\n ): Promise<unknown> {\n return this.request(\"server.version\", client, protocol);\n }\n\n // ---- Scripthash queries ---------------------------------------------------\n\n private toScriptHash(addressOrScriptHash: string): string {\n // A 64-hex string is already a scripthash; otherwise treat it as an address.\n return /^[0-9a-fA-F]{64}$/.test(addressOrScriptHash)\n ? addressOrScriptHash.toLowerCase()\n : addressToScriptHash(addressOrScriptHash);\n }\n\n /** Confirmed + unconfirmed balance (photons) for an address or scripthash. */\n async getBalance(addressOrScriptHash: string): Promise<ScriptHashBalance> {\n const sh = this.toScriptHash(addressOrScriptHash);\n const r = await this.request<{ confirmed: number; unconfirmed: number }>(\n \"blockchain.scripthash.get_balance\",\n sh,\n );\n return {\n confirmed: BigInt(r.confirmed ?? 0),\n unconfirmed: BigInt(r.unconfirmed ?? 0),\n };\n }\n\n /**\n * Unspent outputs for an address or scripthash, as SDK {@link Utxo}s.\n *\n * NOTE: ElectrumX `listunspent` does not return the output script. When you\n * pass a plain address we fill `script` with that address's P2PKH script\n * (correct for ordinary wallet UTXOs). When you pass a raw scripthash we\n * cannot reconstruct the script, so `script` is left empty — provide the\n * address form if you intend to fund/sign from the result.\n */\n async listUnspent(addressOrScriptHash: string): Promise<Utxo[]> {\n const isAddress = !/^[0-9a-fA-F]{64}$/.test(addressOrScriptHash);\n const sh = this.toScriptHash(addressOrScriptHash);\n const rows = await this.request<RawUnspent[]>(\n \"blockchain.scripthash.listunspent\",\n sh,\n );\n const script = isAddress ? p2pkhScript(addressOrScriptHash) : \"\";\n return rows.map((r) => ({\n txid: r.tx_hash,\n vout: r.tx_pos,\n value: BigInt(r.value),\n height: r.height,\n script,\n refs: r.refs,\n }));\n }\n\n /** Raw transaction history for an address or scripthash. */\n async getHistory(addressOrScriptHash: string): Promise<unknown[]> {\n const sh = this.toScriptHash(addressOrScriptHash);\n return this.request(\"blockchain.scripthash.get_history\", sh);\n }\n\n /** Fetch a raw transaction (hex, or verbose object when verbose=true). */\n async getTransaction(txid: string, verbose = false): Promise<unknown> {\n return this.request(\"blockchain.transaction.get\", txid, verbose);\n }\n\n /**\n * Subscribe to an address/scripthash; `onUpdate` fires with the new status\n * hash whenever the set of outputs changes. Returns the current status.\n */\n async subscribe(\n addressOrScriptHash: string,\n onUpdate: (status: string | null) => void,\n ): Promise<string | null> {\n const sh = this.toScriptHash(addressOrScriptHash);\n this.subscriptions.set(\"blockchain.scripthash.subscribe\", (params) => {\n // params = [scripthash, status]\n if (params[0] === sh) onUpdate((params[1] as string) ?? null);\n });\n return this.request(\"blockchain.scripthash.subscribe\", sh);\n }\n\n /** Stop receiving updates for a scripthash/address. */\n async unsubscribe(addressOrScriptHash: string): Promise<unknown> {\n const sh = this.toScriptHash(addressOrScriptHash);\n this.subscriptions.delete(\"blockchain.scripthash.subscribe\");\n return this.request(\"blockchain.scripthash.unsubscribe\", sh);\n }\n\n // ---- Broadcast ------------------------------------------------------------\n\n /**\n * Broadcast a raw transaction (hex). Returns the txid. Treats the node's\n * \"transaction already in blockchain\" as success (returns the computed txid\n * is the caller's job; here we surface the node's reply).\n */\n async broadcastTx(rawHex: string): Promise<string> {\n try {\n return await this.request<string>(\n \"blockchain.transaction.broadcast\",\n rawHex,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.toLowerCase().includes(\"transactionalreadyinblockchain\")) {\n return \"\";\n }\n throw err;\n }\n }\n\n // ---- Lifecycle ------------------------------------------------------------\n\n /** Close the connection and stop reconnecting. */\n close(): void {\n this.closedByUser = true;\n this.subscriptions.clear();\n try {\n this.ws?.close();\n } catch {\n /* ignore */\n }\n this.ws = undefined;\n }\n}\n","/**\n * HD key derivation for Radiant.\n *\n * Default path: m/44'/512'/account'/change/index — SLIP-0044 coin type 512,\n * the radiantjs v3.0.0+ default. The legacy coin-type-0 path is opt-in.\n *\n * The wallet derives keys; it never talks to the network. Combine it with\n * {@link ElectrumClient} and the tx builders to move funds.\n */\n\nimport {\n Mnemonic,\n HDPrivateKey,\n PrivateKey,\n toRjsNetwork,\n} from \"./radiantjs.js\";\nimport { RADIANT_COIN_TYPE } from \"./constants.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { addressToScriptHash } from \"./script.js\";\nimport type { NetworkName } from \"./types.js\";\n\n/** Options when constructing an {@link HDWallet}. */\nexport interface HDWalletOptions {\n /** Network for address encoding. Default \"mainnet\". */\n network?: NetworkName;\n /** BIP39 passphrase (\"25th word\"). Default \"\". */\n passphrase?: string;\n /** Hardened account index. Default 0. */\n account?: number;\n /**\n * SLIP-0044 coin type. Default 512 (Radiant). Pass 0 only to recover legacy\n * wallets created before the coin-type-512 default.\n */\n coinType?: number;\n}\n\n/** A derived key bundle for one address index. */\nexport interface DerivedKey {\n index: number;\n change: number;\n path: string;\n /** WIF private key. */\n wif: string;\n /** Compressed public key, hex. */\n publicKey: string;\n /** Base58Check address. */\n address: string;\n /** ElectrumX scripthash for this address. */\n scriptHash: string;\n}\n\n/**\n * BIP44 HD wallet over a single account.\n *\n * @example\n * const wallet = HDWallet.fromMnemonic(mnemonic, { network: \"mainnet\" });\n * const { address, wif } = wallet.deriveKey(0);\n */\nexport class HDWallet {\n private readonly root: any; // radiantjs HDPrivateKey (account node)\n readonly network: NetworkName;\n readonly account: number;\n readonly coinType: number;\n\n private constructor(\n accountNode: any,\n network: NetworkName,\n account: number,\n coinType: number,\n ) {\n this.root = accountNode;\n this.network = network;\n this.account = account;\n this.coinType = coinType;\n }\n\n /** Create a wallet from a BIP39 mnemonic phrase. */\n static fromMnemonic(\n phrase: string,\n options: HDWalletOptions = {},\n ): HDWallet {\n if (!Mnemonic.isValid(phrase)) {\n throw new ValidationError(\"fromMnemonic: invalid BIP39 mnemonic\");\n }\n const mnemonic = new Mnemonic(phrase);\n const network = options.network ?? \"mainnet\";\n const rjsNet = toRjsNetwork(network);\n const seed = mnemonic.toSeed(options.passphrase ?? \"\");\n const master = HDPrivateKey.fromSeed(seed, rjsNet);\n return HDWallet.fromMaster(master, network, options);\n }\n\n /** Create a wallet from a raw seed (Buffer or hex string). */\n static fromSeed(\n seed: Buffer | string,\n options: HDWalletOptions = {},\n ): HDWallet {\n const network = options.network ?? \"mainnet\";\n const buf = typeof seed === \"string\" ? Buffer.from(seed, \"hex\") : seed;\n const master = HDPrivateKey.fromSeed(buf, toRjsNetwork(network));\n return HDWallet.fromMaster(master, network, options);\n }\n\n /** Create a wallet from an extended private key (xprv). */\n static fromXprv(xprv: string, options: HDWalletOptions = {}): HDWallet {\n const network = options.network ?? \"mainnet\";\n const master = new HDPrivateKey(xprv);\n return HDWallet.fromMaster(master, network, options);\n }\n\n /** Generate a fresh random mnemonic phrase (BIP39, 12 words). */\n static generateMnemonic(): string {\n return Mnemonic.fromRandom().toString();\n }\n\n private static fromMaster(\n master: any,\n network: NetworkName,\n options: HDWalletOptions,\n ): HDWallet {\n const account = options.account ?? 0;\n const coinType = options.coinType ?? RADIANT_COIN_TYPE;\n // Derive down to the account node: m/44'/coin'/account'\n const accountNode = master.deriveChild(\n `m/44'/${coinType}'/${account}'`,\n );\n return new HDWallet(accountNode, network, account, coinType);\n }\n\n /** Full derivation path for a given change/index under this account. */\n pathFor(index: number, change = 0): string {\n return `m/44'/${this.coinType}'/${this.account}'/${change}/${index}`;\n }\n\n /** radiantjs PrivateKey at the given index (default external chain). */\n privateKey(index: number, change = 0): any {\n const node = this.root.deriveChild(change).deriveChild(index);\n return node.privateKey;\n }\n\n /** Derive a full key bundle (WIF, pubkey, address, scripthash) at an index. */\n deriveKey(index: number, change = 0): DerivedKey {\n const priv: any = this.privateKey(index, change);\n const address: string = priv.toAddress(toRjsNetwork(this.network)).toString();\n return {\n index,\n change,\n path: this.pathFor(index, change),\n wif: priv.toWIF(),\n publicKey: priv.toPublicKey().toString(),\n address,\n scriptHash: addressToScriptHash(address),\n };\n }\n\n /** Address at an index (external chain by default). */\n address(index = 0, change = 0): string {\n return this.deriveKey(index, change).address;\n }\n\n /** WIF private key at an index. */\n wif(index = 0, change = 0): string {\n return this.privateKey(index, change).toWIF();\n }\n\n /** Derive a batch of key bundles [start, start+count). */\n deriveRange(start: number, count: number, change = 0): DerivedKey[] {\n const out: DerivedKey[] = [];\n for (let i = 0; i < count; i++) out.push(this.deriveKey(start + i, change));\n return out;\n }\n}\n\n/**\n * Low-level WIF helpers for callers who already manage their own keys and do\n * not need HD derivation.\n */\nexport const Keys = {\n /** Address (Base58Check) for a WIF private key. */\n addressFromWif(wif: string, network: NetworkName = \"mainnet\"): string {\n return PrivateKey.fromWIF(wif).toAddress(toRjsNetwork(network)).toString();\n },\n /** Compressed public key hex for a WIF private key. */\n publicKeyFromWif(wif: string): string {\n return PrivateKey.fromWIF(wif).toPublicKey().toString();\n },\n /** ElectrumX scripthash for a WIF private key's P2PKH address. */\n scriptHashFromWif(wif: string, network: NetworkName = \"mainnet\"): string {\n return addressToScriptHash(this.addressFromWif(wif, network));\n },\n};\n","/**\n * Ref-safe UTXO selection.\n *\n * THE invariant of this module (and the whole reason it exists): RXD funding is\n * NEVER gathered by a pure value heuristic. A UTXO that carries a token ref\n * (FT/NFT/dMint) looks like ordinary value to a naive selector, but spending it\n * as discretionary funding silently and irreversibly BURNS the token. So every\n * candidate is screened two ways — indexer-reported `refs`, and a local script\n * scan (isTokenBearing) — before it can fund a transaction.\n *\n * Mirrors Photonic-Wallet's `selectRxdFunding` / `fundTx` behaviour.\n */\n\nimport { isTokenBearing } from \"./script.js\";\nimport { InsufficientFundsError, TokenBurnGuardError } from \"./errors.js\";\nimport type { FundingSelection, Utxo } from \"./types.js\";\n\n/** Rough byte sizes for fee estimation (P2PKH). */\nconst TX_OVERHEAD_BYTES = 10n; // version + locktime + in/out counts\nconst P2PKH_INPUT_BYTES = 148n; // prevout(36) + seq(4) + scriptSig(~107) + len\nconst P2PKH_OUTPUT_BYTES = 34n; // value(8) + script(25) + len\n\n/**\n * Extra bytes added when *reserving* funding, so the selected inputs always\n * cover what the builder actually pays. The builder sets the real fee from the\n * measured signed size (+ headroom); token output scripts are also larger than\n * the P2PKH assumption above. This margin only widens input selection — the\n * surplus returns as change, so it costs the user nothing.\n */\nconst SELECTION_HEADROOM_BYTES = 160n;\n\n/** Options for {@link selectRxdFunding}. */\nexport interface SelectRxdFundingOptions {\n /**\n * Number of non-funding outputs the final tx will already have (e.g. the\n * recipient/token output). Used for fee estimation. Default 1.\n */\n baseOutputCount?: number;\n /**\n * Bytes contributed by inputs the caller has already committed (e.g. a token\n * input being spent deliberately). Added to the fee estimate. Default 0.\n */\n extraInputBytes?: bigint;\n /** Whether a change output will be added (affects fee estimate). Default true. */\n withChange?: boolean;\n}\n\n/**\n * Is this UTXO safe to spend as plain RXD funding? It must carry no indexer\n * refs and no OP_PUSHINPUTREF opcodes in its script.\n */\nexport function isFundingSafe(utxo: Utxo): boolean {\n if (utxo.refs && utxo.refs.length > 0) return false;\n if (isTokenBearing(utxo.script)) return false;\n return true;\n}\n\n/**\n * Filter a UTXO set down to token-free funding candidates.\n * Use this any time you need \"spendable RXD\" rather than \"all my UTXOs\".\n */\nexport function filterFundingCandidates(utxos: Utxo[]): Utxo[] {\n return utxos.filter(isFundingSafe);\n}\n\n/**\n * Strict guard: throw {@link TokenBurnGuardError} on the first token-bearing\n * UTXO. Use this when you have *already* segregated funding and want to assert\n * the invariant loudly (e.g. before signing a hand-built transaction).\n * {@link selectRxdFunding} does not need this — it excludes token UTXOs itself.\n */\nexport function assertFundingSafe(utxos: Utxo[]): void {\n for (const u of utxos) {\n if (!isFundingSafe(u)) throw new TokenBurnGuardError(u.txid, u.vout);\n }\n}\n\n/** Estimate the fee (photons) for a tx with the given input/output counts. */\nexport function estimateFee(\n inputCount: number,\n outputCount: number,\n feeRate: bigint,\n extraInputBytes = 0n,\n): bigint {\n const bytes =\n TX_OVERHEAD_BYTES +\n P2PKH_INPUT_BYTES * BigInt(inputCount) +\n P2PKH_OUTPUT_BYTES * BigInt(outputCount) +\n extraInputBytes;\n return bytes * feeRate;\n}\n\n/**\n * Select RXD funding inputs to cover `target` photons plus fees, **excluding\n * every token-bearing UTXO** (the ref-safe guarantee). You can hand this the\n * raw output of `listUnspent` — token UTXOs are dropped, never spent. Greedy:\n * largest token-free UTXOs first, accumulating until target + fee is met. The\n * fee grows with each input added.\n *\n * @throws {InsufficientFundsError} if token-free UTXOs cannot cover the target.\n */\nexport function selectRxdFunding(\n utxos: Utxo[],\n target: bigint,\n feeRate: bigint,\n options: SelectRxdFundingOptions = {},\n): FundingSelection {\n const baseOutputCount = options.baseOutputCount ?? 1;\n const extraInputBytes = options.extraInputBytes ?? 0n;\n const withChange = options.withChange ?? true;\n\n // Drop token-bearing UTXOs up front — spending one as funding burns it.\n // Largest first — fewest inputs, lowest fee for typical funding.\n const candidates = filterFundingCandidates(utxos).sort((a, b) =>\n a.value < b.value ? 1 : a.value > b.value ? -1 : 0,\n );\n\n const reserveBytes = extraInputBytes + SELECTION_HEADROOM_BYTES;\n const selected: Utxo[] = [];\n let total = 0n;\n for (const u of candidates) {\n selected.push(u);\n total += u.value;\n const outputs = baseOutputCount + (withChange ? 1 : 0);\n const fee = estimateFee(selected.length, outputs, feeRate, reserveBytes);\n if (total >= target + fee) {\n return { inputs: selected, fee, total, change: total - target - fee };\n }\n }\n\n const available = candidates.reduce((s, u) => s + u.value, 0n);\n const finalFee = estimateFee(\n Math.max(selected.length, 1),\n baseOutputCount + (withChange ? 1 : 0),\n feeRate,\n reserveBytes,\n );\n throw new InsufficientFundsError(target + finalFee, available);\n}\n\n/** Sum the photon value of a UTXO list. */\nexport function sumValue(utxos: Utxo[]): bigint {\n return utxos.reduce((s, u) => s + u.value, 0n);\n}\n","/**\n * Transaction building primitive.\n *\n * A thin, faithful port of Photonic-Wallet's `buildTx`: it wraps radiantjs\n * (which does the real script/sighash work) and adds two things the SDK needs —\n * BigInt photon values and a per-input scriptSig hook used by the Glyph\n * commit/reveal flow. Everything signs with SIGHASH_ALL | FORKID.\n */\n\nimport {\n Transaction,\n Script,\n PrivateKey,\n crypto,\n SIGHASH_FORKID_ALL,\n} from \"./radiantjs.js\";\nimport { selectRxdFunding } from \"./utxo.js\";\nimport { p2pkhScript } from \"./script.js\";\nimport { ValidationError } from \"./errors.js\";\nimport type { NetworkName, TxOutput, Utxo } from \"./types.js\";\n\n/** An input to {@link buildTx}. Provide `script` for non-default (token) inputs. */\nexport interface BuildTxInput {\n txid: string;\n vout: number;\n value: bigint;\n /** Prevout scriptPubKey hex. If omitted, treated as P2PKH for `address`. */\n script?: string;\n}\n\n/** Per-input scriptSig override, called after the default sig+pubkey is built. */\nexport type SetInputScript = (\n index: number,\n defaultScript: any,\n) => any | string | void;\n\nexport interface BuildTxParams {\n /** Change address and default signer/owner address. */\n address: string;\n /** Signing key(s) as WIF. A single WIF signs all inputs. */\n wif: string | string[];\n inputs: BuildTxInput[];\n outputs: TxOutput[];\n /** Append a change output back to `address`. Default true. */\n addChange?: boolean;\n /** Fee rate, photons/byte. */\n feeRate: bigint;\n /** Network (for address/change encoding). Default \"mainnet\". */\n network?: NetworkName;\n /** Override the scriptSig for specific inputs (Glyph reveal uses this). */\n setInputScript?: SetInputScript;\n}\n\n/** A signed transaction ready to broadcast. */\nexport interface BuiltTx {\n /** The radiantjs Transaction object (escape hatch). */\n tx: any;\n /** Serialised raw transaction hex. */\n hex: string;\n /** Transaction id (display order). */\n txid: string;\n /** Outputs, with resolved photon values (includes any change). */\n outputs: { script: string; value: bigint }[];\n}\n\n/** BN from a (possibly large) photon value, avoiding JS number precision loss. */\nfunction bn(value: bigint): any {\n return new crypto.BN(value.toString());\n}\n\n/** Apply a photons/byte fee rate to a radiantjs tx (feature-detected). */\nfunction applyFeeRate(tx: any, feeRate: bigint): void {\n const rate = Number(feeRate);\n if (typeof tx.feePerByte === \"function\") {\n tx.feePerByte(rate);\n } else if (typeof tx.feePerKb === \"function\") {\n tx.feePerKb(rate * 1000);\n }\n}\n\n/**\n * Build and sign a transaction. Inputs with a `script` are added manually and\n * signed via a scriptSig callback; inputs without are added as standard P2PKH.\n */\nexport function buildTx(params: BuildTxParams): BuiltTx {\n const {\n address,\n inputs,\n outputs,\n feeRate,\n addChange = true,\n network = \"mainnet\",\n } = params;\n\n const wifs = Array.isArray(params.wif) ? params.wif : [params.wif];\n const privKeys = wifs.map((w) => PrivateKey.fromWIF(w));\n const ownerP2pkh = p2pkhScript(address, network);\n\n const tx = new Transaction();\n applyFeeRate(tx, feeRate);\n\n inputs.forEach((input, index) => {\n const prevScript = input.script ?? ownerP2pkh;\n tx.addInput(\n new Transaction.Input({\n prevTxId: input.txid,\n outputIndex: input.vout,\n script: new Script(),\n output: new Transaction.Output({\n script: Script.fromHex(prevScript),\n satoshis: bn(input.value),\n }),\n }),\n );\n tx.setInputScript(index, (_tx: any, output: any) => {\n const privKey = privKeys[index] ?? privKeys[0];\n const sigType = SIGHASH_FORKID_ALL;\n const sig = Transaction.Sighash.sign(\n tx,\n privKey,\n sigType,\n index,\n output.script,\n bn(input.value),\n );\n const spend = Script.empty()\n .add(Buffer.concat([sig.toBuffer(), Buffer.from([sigType])]))\n .add(privKey.toPublicKey().toBuffer());\n if (params.setInputScript) {\n const overridden = params.setInputScript(index, spend);\n if (overridden) {\n return typeof overridden === \"string\"\n ? overridden\n : overridden.toString();\n }\n }\n return spend.toString();\n });\n });\n\n outputs.forEach(({ script, value }) => {\n tx.addOutput(\n new Transaction.Output({ script: Script.fromHex(script), satoshis: bn(value) }),\n );\n });\n\n // Every input is signed by its setInputScript hook during serialisation, so\n // `tx.toString()` yields a fully signed tx. radiantjs's own change-based fee\n // estimator under-sizes non-standard token inputs (the reveal carrier's\n // scriptSig holds the whole CBOR envelope) and otherwise sits exactly on the\n // min-relay boundary. So when there is a change output we measure the REAL\n // signed size and set an explicit fee of (size + headroom) * feeRate, which\n // guarantees the tx clears the node's min-relay floor.\n if (addChange) {\n tx.change(address);\n const probe: string = tx.toString();\n const sizeBytes = BigInt(probe.length / 2);\n const fee = (sizeBytes + 20n) * feeRate; // +20 bytes of headroom\n tx.fee(Number(fee));\n tx.change(address); // recompute change against the explicit fee\n }\n\n // Sign standard (from-style) inputs; manual inputs are handled by the hooks.\n tx.sign(privKeys[0]);\n if (typeof tx.seal === \"function\") tx.seal();\n\n const hex: string = tx.toString();\n const resolvedOutputs = tx.outputs.map((o: any) => ({\n script: o.script.toHex(),\n value: BigInt(o.satoshis?.toString?.() ?? o.satoshis),\n }));\n\n return { tx, hex, txid: tx.id, outputs: resolvedOutputs };\n}\n\n/**\n * Build a simple RXD payment: pay `amount` photons to `to`, funded ref-safely\n * from `utxos`, change back to `address`.\n */\nexport function buildRxdTransfer(params: {\n address: string;\n wif: string;\n to: string;\n amount: bigint;\n utxos: Utxo[];\n feeRate: bigint;\n network?: NetworkName;\n}): BuiltTx {\n const { address, wif, to, amount, utxos, feeRate, network = \"mainnet\" } = params;\n if (amount <= 0n) throw new ValidationError(\"buildRxdTransfer: amount must be > 0\");\n\n const selection = selectRxdFunding(utxos, amount, feeRate, {\n baseOutputCount: 1, // the recipient output\n withChange: true,\n });\n\n const inputs: BuildTxInput[] = selection.inputs.map((u) => ({\n txid: u.txid,\n vout: u.vout,\n value: u.value,\n script: u.script || undefined,\n }));\n\n return buildTx({\n address,\n wif,\n inputs,\n outputs: [{ script: p2pkhScript(to, network), value: amount }],\n addChange: true,\n feeRate,\n network,\n });\n}\n","/**\n * Glyph token operations: mint (FT/NFT) and transfer.\n *\n * Glyph uses a commit/reveal two-transaction pattern. The COMMIT output locks\n * to a script that checks the payload hash and the Glyph magic; the REVEAL\n * spends it, carrying the CBOR envelope in its input scriptSig, and produces\n * the token output whose ref equals the commit outpoint. We reproduce the\n * proven Photonic-Wallet on-chain templates here and drive them with the SDK's\n * ref-safe funding selection.\n *\n * IMPORTANT: these are real consensus-level scripts. Validate any new mint flow\n * on regtest/testnet before mainnet — see README.\n */\n\nimport { encode as cborEncode } from \"cbor-x\";\nimport { Script, Opcode, Address, sha256d } from \"./radiantjs.js\";\nimport {\n GLYPH_MAGIC_BYTES,\n GLYPH_PROTOCOL,\n TOKEN_OUTPUT_VALUE,\n DUST_LIMIT,\n MIN_RELAY_FEE_RATE,\n INPUT_REF_OP_MIN,\n INPUT_REF_OP_MAX,\n} from \"./constants.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { selectRxdFunding } from \"./utxo.js\";\nimport { packRef, p2pkhScript } from \"./script.js\";\nimport { buildTx, type BuildTxInput } from \"./tx.js\";\nimport type { ElectrumClient } from \"./client.js\";\nimport type { NetworkName, Utxo } from \"./types.js\";\n\nconst MAGIC = Buffer.from(GLYPH_MAGIC_BYTES);\n\n/** A Glyph payload: `p` is the protocol id list, plus free-form metadata. */\nexport interface GlyphPayload {\n /** Glyph version. Default 2. */\n v?: number;\n /** Protocol ids, e.g. [1]=FT, [2]=NFT, [2,5]=mutable NFT. */\n p: number[];\n [key: string]: unknown;\n}\n\n/** Result of a mint: the token ref plus both transaction ids. */\nexport interface MintResult {\n /** Packed 72-hex token ref (the commit outpoint). */\n ref: string;\n /** Display ref \"txid:vout\". */\n refDisplay: string;\n commitTxid: string;\n revealTxid: string;\n}\n\n/**\n * Encode a Glyph payload into its reveal scriptSig and commit payload hash.\n * revealScriptSig = `<gly> <cbor(payload)>`; payloadHash = sha256d(cbor).\n */\nexport function encodeGlyph(payload: GlyphPayload): {\n revealScriptSig: string;\n payloadHash: string;\n} {\n const encoded = Buffer.from(cborEncode(payload));\n const revealScriptSig = new Script().add(MAGIC).add(encoded).toHex();\n const payloadHash = Buffer.from(sha256d(encoded)).toString(\"hex\");\n return { revealScriptSig, payloadHash };\n}\n\n// ---- Script templates (mirrors Photonic-Wallet) -----------------------------\n\n/** Commit script that gates a mint by payload hash + Glyph magic + ref type. */\nfunction commitScript(\n address: string,\n payloadHash: string,\n refType: 1 | 2,\n network: NetworkName,\n): string {\n // P2PKH is network-independent; decode by version byte (avoids the\n // testnet/regtest 0x6f ambiguity). `network` is kept for call-site symmetry.\n void network;\n const addr = Address.fromString(address);\n const refOp = refType === 1 ? \"OP_1\" : \"OP_2\";\n const script = new Script();\n script\n .add(Opcode.OP_HASH256)\n .add(Buffer.from(payloadHash, \"hex\"))\n .add(Opcode.OP_EQUALVERIFY)\n .add(MAGIC)\n .add(Opcode.OP_EQUALVERIFY)\n .add(\n Script.fromASM(\n `OP_INPUTINDEX OP_OUTPOINTTXHASH OP_INPUTINDEX OP_OUTPOINTINDEX OP_4 OP_NUM2BIN OP_CAT OP_REFTYPE_OUTPUT ${refOp} OP_NUMEQUALVERIFY`,\n ),\n )\n .add(Script.buildPublicKeyHashOut(addr));\n return script.toHex();\n}\n\n/** FT output script: a value-summed ref bound to an owner P2PKH. */\nexport function ftScript(address: string, ref: string, network: NetworkName = \"mainnet\"): string {\n // P2PKH is network-independent; decode by version byte (avoids the\n // testnet/regtest 0x6f ambiguity). `network` is kept for call-site symmetry.\n void network;\n const addr = Address.fromString(address);\n const script = Script.buildPublicKeyHashOut(addr).add(\n Script.fromASM(\n `OP_STATESEPARATOR OP_PUSHINPUTREF ${ref} OP_REFOUTPUTCOUNT_OUTPUTS OP_INPUTINDEX OP_CODESCRIPTBYTECODE_UTXO OP_HASH256 OP_DUP OP_CODESCRIPTHASHVALUESUM_UTXOS OP_OVER OP_CODESCRIPTHASHVALUESUM_OUTPUTS OP_GREATERTHANOREQUAL OP_VERIFY OP_CODESCRIPTHASHOUTPUTCOUNT_OUTPUTS OP_NUMEQUALVERIFY`,\n ),\n );\n return script.toHex();\n}\n\n/** NFT output script: a singleton ref bound to an owner P2PKH. */\nexport function nftScript(address: string, ref: string, network: NetworkName = \"mainnet\"): string {\n // P2PKH is network-independent; decode by version byte (avoids the\n // testnet/regtest 0x6f ambiguity). `network` is kept for call-site symmetry.\n void network;\n const addr = Address.fromString(address);\n const script = Script.fromASM(`OP_PUSHINPUTREFSINGLETON ${ref} OP_DROP`).add(\n Script.buildPublicKeyHashOut(addr),\n );\n return script.toHex();\n}\n\n// ---- Ref / owner parsing ----------------------------------------------------\n\n/** Extract the 72-hex packed ref carried by a token script (FT or NFT). */\nexport function parseTokenRef(scriptHex: string): string | null {\n const bytes = Buffer.from(scriptHex, \"hex\");\n let pos = 0;\n while (pos < bytes.length) {\n const op = bytes[pos]!;\n if (op >= INPUT_REF_OP_MIN && op <= INPUT_REF_OP_MAX) {\n // The 36-byte ref operand immediately follows the ref opcode.\n if (pos + 1 + 36 > bytes.length) return null;\n return bytes.subarray(pos + 1, pos + 1 + 36).toString(\"hex\");\n }\n // Skip push payloads so a 0xd0-0xd8 inside data isn't misread.\n if (op >= 0x01 && op <= 0x4b) pos += 1 + op;\n else if (op === 0x4c) pos += 2 + (bytes[pos + 1] ?? 0);\n else if (op === 0x4d) pos += 3 + ((bytes[pos + 1] ?? 0) | ((bytes[pos + 2] ?? 0) << 8));\n else if (op === 0x4e)\n pos +=\n 5 +\n (((bytes[pos + 1] ?? 0) |\n ((bytes[pos + 2] ?? 0) << 8) |\n ((bytes[pos + 3] ?? 0) << 16) |\n ((bytes[pos + 4] ?? 0) << 24)) >>>\n 0);\n else pos += 1;\n }\n return null;\n}\n\n/**\n * Re-bind a token script to a new owner by swapping the embedded owner P2PKH\n * (`76a914 <20-byte hash> 88ac`). Kind-agnostic: preserves any covenant\n * preamble exactly, which is the safest way to transfer a token output.\n */\nfunction rebindOwner(scriptHex: string, toAddress: string, network: NetworkName): string {\n void network; // P2PKH hash is network-independent (see p2pkhScript).\n const newPkh = Address.fromString(toAddress).hashBuffer.toString(\"hex\");\n const re = /76a914[0-9a-f]{40}88ac/i;\n const matches = scriptHex.match(new RegExp(re, \"gi\"));\n if (!matches || matches.length !== 1) {\n throw new ValidationError(\n \"rebindOwner: expected exactly one owner P2PKH in the token script\",\n );\n }\n return scriptHex.replace(re, `76a914${newPkh}88ac`);\n}\n\n// ---- Mint orchestration -----------------------------------------------------\n\ninterface BaseMintParams {\n client: ElectrumClient;\n /** Owner address (receives the token; pays the fees). */\n address: string;\n /** Owner WIF. */\n wif: string;\n /** Token-free RXD funding UTXOs for `address`. */\n fundingUtxos: Utxo[];\n /** Fee rate, photons/byte. Defaults to the network min-relay rate. */\n feeRate?: bigint;\n network?: NetworkName;\n /** Extra metadata merged into the Glyph payload (name, desc, attrs, ...). */\n metadata?: Record<string, unknown>;\n}\n\nexport interface MintFtParams extends BaseMintParams {\n ticker: string;\n /** Token supply in base units. In Glyph FT, amount == output photons. */\n supply: bigint;\n}\n\nexport interface MintNftParams extends BaseMintParams {\n /** Mark the NFT mutable (p:[2,5]). Default false (immutable singleton). */\n mutable?: boolean;\n /** Carrier value (photons) for the NFT output. Default dust. */\n outputValue?: bigint;\n}\n\n/**\n * Run a commit then a reveal, chaining the commit's change output into the\n * reveal so a single funding selection covers both. Returns both txids + ref.\n */\nasync function commitReveal(\n base: BaseMintParams,\n payload: GlyphPayload,\n refType: 1 | 2,\n buildRevealOutputScript: (ref: string) => string,\n tokenOutputValue: bigint,\n): Promise<MintResult> {\n const network = base.network ?? \"mainnet\";\n const feeRate = base.feeRate ?? MIN_RELAY_FEE_RATE[network];\n const { revealScriptSig, payloadHash } = encodeGlyph(payload);\n const commit = commitScript(base.address, payloadHash, refType, network);\n\n // Fund the commit so its change output also covers the reveal. The reveal\n // needs: token output value + its own fee. The fee must include the CBOR\n // envelope bytes that ride the reveal input's scriptSig (metadata can be\n // large). We reserve generously; leftover returns as reveal change.\n const envelopeBytes = BigInt(revealScriptSig.length / 2);\n const revealReserve = tokenOutputValue + estimateRevealFee(feeRate, envelopeBytes);\n const commitTarget = TOKEN_OUTPUT_VALUE + revealReserve;\n\n const selection = selectRxdFunding(base.fundingUtxos, commitTarget, feeRate, {\n baseOutputCount: 1, // the commit carrier output\n withChange: true,\n });\n\n const commitInputs: BuildTxInput[] = selection.inputs.map((u) => ({\n txid: u.txid,\n vout: u.vout,\n value: u.value,\n script: u.script || undefined,\n }));\n\n const commitTx = buildTx({\n address: base.address,\n wif: base.wif,\n inputs: commitInputs,\n outputs: [{ script: commit, value: TOKEN_OUTPUT_VALUE }],\n addChange: true,\n feeRate,\n network,\n });\n\n // Reveal input 1 is the commit's change output (last output, P2PKH to owner).\n const changeIndex = commitTx.outputs.length - 1;\n const change = commitTx.outputs[changeIndex]!;\n if (change.value <= 0n) {\n throw new ValidationError(\n \"commitReveal: commit produced no change to fund the reveal\",\n );\n }\n\n await base.client.broadcastTx(commitTx.hex);\n\n const ref = packRef(commitTx.txid, 0);\n const tokenScript = buildRevealOutputScript(ref);\n\n const revealTx = buildTx({\n address: base.address,\n wif: base.wif,\n inputs: [\n // input 0: the commit carrier — its scriptSig carries the envelope.\n { txid: commitTx.txid, vout: 0, value: TOKEN_OUTPUT_VALUE, script: commit },\n // input 1: the commit change, funds the token output + fee.\n {\n txid: commitTx.txid,\n vout: changeIndex,\n value: change.value,\n script: change.script,\n },\n ],\n outputs: [{ script: tokenScript, value: tokenOutputValue }],\n addChange: true,\n feeRate,\n network,\n setInputScript: (index, defaultScript) => {\n if (index === 0) {\n // <sig> <pubkey> <gly> <cbor> — append the envelope pushes.\n return defaultScript.toHex() + revealScriptSig;\n }\n return undefined;\n },\n });\n\n await base.client.broadcastTx(revealTx.hex);\n\n return {\n ref,\n refDisplay: `${commitTx.txid}:0`,\n commitTxid: commitTx.txid,\n revealTxid: revealTx.txid,\n };\n}\n\n/** Rough reveal fee: 2 inputs, 2 outputs, token-script + envelope overhead. */\nfunction estimateRevealFee(feeRate: bigint, envelopeBytes = 0n): bigint {\n // ~10 overhead + 2*148 inputs + 2*200 token/p2pkh outputs (generous) plus the\n // CBOR envelope bytes carried in the reveal input scriptSig.\n return (10n + 2n * 148n + 2n * 200n + envelopeBytes) * feeRate;\n}\n\n/** Mint a fungible token (Glyph FT). */\nexport async function mintFT(params: MintFtParams): Promise<MintResult> {\n if (!params.ticker) throw new ValidationError(\"mintFT: ticker is required\");\n if (params.supply <= 0n) throw new ValidationError(\"mintFT: supply must be > 0\");\n const payload: GlyphPayload = {\n v: 2,\n p: [GLYPH_PROTOCOL.FT],\n ticker: params.ticker,\n ...params.metadata,\n };\n return commitReveal(\n params,\n payload,\n 1,\n (ref) => ftScript(params.address, ref, params.network ?? \"mainnet\"),\n params.supply,\n );\n}\n\n/** Mint a non-fungible token (Glyph NFT singleton). */\nexport async function mintNFT(params: MintNftParams): Promise<MintResult> {\n const p = params.mutable\n ? [GLYPH_PROTOCOL.NFT, GLYPH_PROTOCOL.MUTABLE]\n : [GLYPH_PROTOCOL.NFT];\n const payload: GlyphPayload = { v: 2, p, ...params.metadata };\n const value = params.outputValue ?? DUST_LIMIT;\n return commitReveal(\n params,\n payload,\n 2,\n (ref) => nftScript(params.address, ref, params.network ?? \"mainnet\"),\n value,\n );\n}\n\n// ---- Transfer ---------------------------------------------------------------\n\nexport interface TransferTokenParams {\n client: ElectrumClient;\n /** Current owner address (signs the token input, pays the fee). */\n address: string;\n /** Current owner WIF. */\n wif: string;\n /** The token UTXO to move (its `script` must be the on-chain token script). */\n tokenUtxo: Utxo;\n /** Recipient address. */\n toAddress: string;\n /** Token-free RXD funding UTXOs for `address` to cover the fee. */\n fundingUtxos: Utxo[];\n feeRate?: bigint;\n network?: NetworkName;\n}\n\n/**\n * Transfer a Glyph token (FT or NFT) to a new owner. The token output's value\n * is preserved (for FT this preserves the amount); the covenant preamble is\n * carried forward unchanged and only the owner P2PKH is re-bound.\n */\nexport async function transferToken(\n params: TransferTokenParams,\n): Promise<{ txid: string; hex: string; ref: string | null }> {\n const network = params.network ?? \"mainnet\";\n const feeRate = params.feeRate ?? MIN_RELAY_FEE_RATE[network];\n const { tokenUtxo } = params;\n\n if (!tokenUtxo.script) {\n throw new ValidationError(\n \"transferToken: tokenUtxo.script is required to rebuild the token output\",\n );\n }\n const newScript = rebindOwner(tokenUtxo.script, params.toAddress, network);\n const ref = parseTokenRef(tokenUtxo.script);\n\n // Fund just the fee; the token value is conserved input -> output.\n const selection = selectRxdFunding(params.fundingUtxos, 0n, feeRate, {\n baseOutputCount: 1, // the token output\n extraInputBytes: 148n, // the token input we add below\n withChange: true,\n });\n\n const inputs: BuildTxInput[] = [\n {\n txid: tokenUtxo.txid,\n vout: tokenUtxo.vout,\n value: tokenUtxo.value,\n script: tokenUtxo.script,\n },\n ...selection.inputs.map((u) => ({\n txid: u.txid,\n vout: u.vout,\n value: u.value,\n script: u.script || undefined,\n })),\n ];\n\n const built = buildTx({\n address: params.address,\n wif: params.wif,\n inputs,\n outputs: [{ script: newScript, value: tokenUtxo.value }],\n addChange: true,\n feeRate,\n network,\n });\n\n await params.client.broadcastTx(built.hex);\n return { txid: built.txid, hex: built.hex, ref };\n}\n","/**\n * WAVE name resolution.\n *\n * WAVE names resolve through the RXinDexer REST API:\n * GET {base}/wave/resolve/{name}\n * The indexer keys on the BARE label (no domain suffix), so \"alice.rxd\" is\n * normalised to \"alice\" before the request. The canonical (first) registration\n * is always returned; later duplicates are tracked but not used for resolution.\n */\n\nimport { DEFAULT_REST_BASE } from \"./constants.js\";\nimport { ValidationError } from \"./errors.js\";\nimport type { WaveResolution } from \"./types.js\";\n\n/** Options for WAVE resolution. */\nexport interface WaveResolveOptions {\n /** REST base URL. Default https://radiantcore.org/api */\n restBase?: string;\n /** Inject a fetch implementation (tests / non-global-fetch runtimes). */\n fetchImpl?: typeof fetch;\n /** AbortSignal to cancel the request. */\n signal?: AbortSignal;\n}\n\n/**\n * Normalise a WAVE name to the label the indexer resolves on: lowercase,\n * trimmed, with a single trailing suffix (e.g. \".rxd\") stripped — mirroring the\n * REST endpoint's `rfind('.')` behaviour, so subdomains like \"mail.alice.rxd\"\n * become \"mail.alice\". Rejects empty names and leading/trailing dots.\n */\nexport function waveLabel(name: string): string {\n const trimmed = name.trim().toLowerCase();\n if (!trimmed || trimmed.startsWith(\".\") || trimmed.endsWith(\".\")) {\n throw new ValidationError(`waveLabel: invalid WAVE name ${JSON.stringify(name)}`);\n }\n const lastDot = trimmed.lastIndexOf(\".\");\n const label = lastDot > 0 ? trimmed.slice(0, lastDot) : trimmed;\n if (!label || label.length > 253) {\n throw new ValidationError(`waveLabel: invalid WAVE name ${JSON.stringify(name)}`);\n }\n return label;\n}\n\n/**\n * Resolve a WAVE name to its full record. Returns `registered: false` when the\n * name is available (unregistered) rather than throwing.\n */\nexport async function waveResolve(\n name: string,\n options: WaveResolveOptions = {},\n): Promise<WaveResolution> {\n const label = waveLabel(name);\n const base = (options.restBase ?? DEFAULT_REST_BASE).replace(/\\/+$/, \"\");\n const doFetch = options.fetchImpl ?? globalThis.fetch;\n if (typeof doFetch !== \"function\") {\n throw new ValidationError(\n \"waveResolve: no fetch implementation available; pass options.fetchImpl\",\n );\n }\n\n const url = `${base}/wave/resolve/${encodeURIComponent(label)}`;\n const res = await doFetch(url, { signal: options.signal });\n if (!res.ok) {\n throw new ValidationError(\n `waveResolve: ${label} -> HTTP ${res.status} ${res.statusText}`,\n );\n }\n const data: any = await res.json();\n\n // Unregistered: indexer returns { name, available: true, resolved: false }.\n const registered = data?.available !== true && data?.resolved !== false;\n const zone = data?.zone ?? {};\n return {\n name: data?.name ?? label,\n registered,\n address: data?.target ?? zone?.address ?? undefined,\n ref: data?.ref ?? undefined,\n owner: data?.owner ?? undefined,\n expires: zone?.expires ?? undefined,\n records: zone?.records ?? undefined,\n raw: data,\n };\n}\n\n/**\n * Convenience: resolve a WAVE name straight to its target address, or null if\n * the name is unregistered or has no target.\n */\nexport async function waveResolveAddress(\n name: string,\n options: WaveResolveOptions = {},\n): Promise<string | null> {\n const r = await waveResolve(name, options);\n return r.registered ? r.address ?? null : null;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@radiant-core/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for building Radiant (RXD) dapps: ElectrumX WebSocket client, ref-safe UTXO selection, Glyph token ops, WAVE name resolution, and SLIP-0044 HD wallets. Wraps @radiant-core/radiantjs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Radiant Core",
|
|
8
|
+
"homepage": "https://radiantcore.org",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Radiant-Core/radiant-sdk.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Radiant-Core/radiant-sdk/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"radiant",
|
|
18
|
+
"rxd",
|
|
19
|
+
"blockchain",
|
|
20
|
+
"electrumx",
|
|
21
|
+
"glyph",
|
|
22
|
+
"wave",
|
|
23
|
+
"utxo",
|
|
24
|
+
"bitcoin",
|
|
25
|
+
"sdk"
|
|
26
|
+
],
|
|
27
|
+
"main": "./dist/index.cjs",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"require": "./dist/index.cjs"
|
|
35
|
+
},
|
|
36
|
+
"./package.json": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"sideEffects": false,
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsup",
|
|
46
|
+
"dev": "tsup --watch",
|
|
47
|
+
"typecheck": "tsc --noEmit",
|
|
48
|
+
"test": "node --test test/*.test.mjs",
|
|
49
|
+
"clean": "rm -rf dist",
|
|
50
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@radiant-core/radiantjs": "^2.0.6",
|
|
54
|
+
"cbor-x": "^1.6.4"
|
|
55
|
+
},
|
|
56
|
+
"optionalDependencies": {
|
|
57
|
+
"ws": "^8.18.0"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/node": "^20.19.43",
|
|
61
|
+
"@types/ws": "^8.18.1",
|
|
62
|
+
"tsup": "^8.5.1",
|
|
63
|
+
"typescript": "^5.9.3"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=20.19.0"
|
|
67
|
+
},
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public"
|
|
70
|
+
}
|
|
71
|
+
}
|