From d44dd5b5ae06e7855b829cd17f2a4dbcda0cf915 Mon Sep 17 00:00:00 2001 From: Rushil Kapoor Date: Wed, 7 Aug 2024 14:11:59 +0530 Subject: [PATCH] feat: expose `script_pubkey` function within `WrapDescriptor` BTC-1349 --- packages/wasm-miniscript/js/index.ts | 1 + packages/wasm-miniscript/src/lib.rs | 12 +++++++++++- packages/wasm-miniscript/test/test.ts | 14 +++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/wasm-miniscript/js/index.ts b/packages/wasm-miniscript/js/index.ts index d64782c..fb05739 100644 --- a/packages/wasm-miniscript/js/index.ts +++ b/packages/wasm-miniscript/js/index.ts @@ -39,6 +39,7 @@ export type Descriptor = { atDerivationIndex(index: number): Descriptor; encode(): Uint8Array; toAsmString(): string; + scriptPubkey(): Uint8Array; }; export function isDescriptor(obj: unknown): obj is Descriptor { diff --git a/packages/wasm-miniscript/src/lib.rs b/packages/wasm-miniscript/src/lib.rs index 4f457e0..848e88d 100644 --- a/packages/wasm-miniscript/src/lib.rs +++ b/packages/wasm-miniscript/src/lib.rs @@ -196,6 +196,16 @@ impl WrapDescriptor { } } + #[wasm_bindgen(js_name = scriptPubkey)] + pub fn script_pubkey(&self) -> Result, JsError> { + match &self.0 { + WrapDescriptorEnum::Definite(desc) => { + Ok(desc.script_pubkey().to_bytes()) + } + _ => Err(JsError::new("Cannot derive from a non-definite descriptor")), + } + } + fn explicit_script(&self) -> Result { match &self.0 { WrapDescriptorEnum::Definite(desc) => { @@ -250,4 +260,4 @@ pub fn panic_xprv() { let dd = d.at_derivation_index(0).unwrap(); let _ = dd.explicit_script().unwrap(); -} \ No newline at end of file +} diff --git a/packages/wasm-miniscript/test/test.ts b/packages/wasm-miniscript/test/test.ts index 7938056..f611cf0 100644 --- a/packages/wasm-miniscript/test/test.ts +++ b/packages/wasm-miniscript/test/test.ts @@ -28,7 +28,7 @@ describe("Descriptor fixtures", function () { } let expected = fixture.descriptor; if (i === 56 || i === 57) { - // for reasons I do not really understand, teh `a:and_n` gets converted into `a:and_b` for these + // for reasons I do not really understand, the `a:and_n` gets converted into `a:and_b` for these expected = expected.replace("and_n", "and_b"); } assert.strictEqual(descriptorString, expected); @@ -45,6 +45,18 @@ describe("Descriptor fixtures", function () { assert.doesNotThrow(() => descriptorFromString(fixture.descriptor, "derivable").atDerivationIndex(0).encode(), ); + + let descriptorString = fixture.descriptor; + if (fixture.checksumRequired === false) { + descriptorString = removeChecksum(descriptorString); + } + const descriptor = descriptorFromString(descriptorString, "derivable"); + assert.strictEqual( + Buffer.from(descriptor.atDerivationIndex(fixture.index ?? 0).scriptPubkey()).toString( + "hex", + ), + fixture.script, + ); } }); });