@bitgo-beta/utxo-descriptors 0.0.1-beta.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 (37) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +36 -0
  3. package/dist/cjs/src/index.d.ts +2 -0
  4. package/dist/cjs/src/index.d.ts.map +1 -0
  5. package/dist/cjs/src/index.js +38 -0
  6. package/dist/cjs/src/sbtc/constants.d.ts +29 -0
  7. package/dist/cjs/src/sbtc/constants.d.ts.map +1 -0
  8. package/dist/cjs/src/sbtc/constants.js +32 -0
  9. package/dist/cjs/src/sbtc/depositAddress.d.ts +28 -0
  10. package/dist/cjs/src/sbtc/depositAddress.d.ts.map +1 -0
  11. package/dist/cjs/src/sbtc/depositAddress.js +44 -0
  12. package/dist/cjs/src/sbtc/descriptor.d.ts +67 -0
  13. package/dist/cjs/src/sbtc/descriptor.d.ts.map +1 -0
  14. package/dist/cjs/src/sbtc/descriptor.js +79 -0
  15. package/dist/cjs/src/sbtc/index.d.ts +4 -0
  16. package/dist/cjs/src/sbtc/index.d.ts.map +1 -0
  17. package/dist/cjs/src/sbtc/index.js +20 -0
  18. package/dist/cjs/test/unit/sbtc/descriptor.d.ts +2 -0
  19. package/dist/cjs/test/unit/sbtc/descriptor.d.ts.map +1 -0
  20. package/dist/cjs/test/unit/sbtc/descriptor.js +249 -0
  21. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  22. package/dist/esm/index.d.ts +2 -0
  23. package/dist/esm/index.d.ts.map +1 -0
  24. package/dist/esm/index.js +2 -0
  25. package/dist/esm/sbtc/constants.d.ts +29 -0
  26. package/dist/esm/sbtc/constants.d.ts.map +1 -0
  27. package/dist/esm/sbtc/constants.js +29 -0
  28. package/dist/esm/sbtc/depositAddress.d.ts +28 -0
  29. package/dist/esm/sbtc/depositAddress.d.ts.map +1 -0
  30. package/dist/esm/sbtc/depositAddress.js +40 -0
  31. package/dist/esm/sbtc/descriptor.d.ts +67 -0
  32. package/dist/esm/sbtc/descriptor.d.ts.map +1 -0
  33. package/dist/esm/sbtc/descriptor.js +75 -0
  34. package/dist/esm/sbtc/index.d.ts +4 -0
  35. package/dist/esm/sbtc/index.d.ts.map +1 -0
  36. package/dist/esm/sbtc/index.js +4 -0
  37. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/sbtc/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,qEAAqE,CAAC;AAE3G;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,KAAK,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Well-known unspendable Taproot internal key.
3
+ *
4
+ * Nothing-up-my-sleeve point on secp256k1 with no known private key. Using it
5
+ * as a Taproot internal key guarantees the output cannot be spent via the
6
+ * key path — only via one of the script-path leaves.
7
+ */
8
+ export const UNSPENDABLE_INTERNAL_KEY = '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0';
9
+ /**
10
+ * Default reclaim relative timelock — number of Bitcoin blocks the depositor
11
+ * must wait before they can reclaim their BTC if the sBTC signers fail to
12
+ * process the deposit.
13
+ */
14
+ export const DEFAULT_RECLAIM_LOCK_TIME = 950;
15
+ /**
16
+ * Default max signer fee in satoshis. Encoded as a big-endian u64 (8 bytes)
17
+ * inside the deposit-leaf metadata payload.
18
+ */
19
+ export const DEFAULT_MAX_SIGNER_FEE = 80000;
20
+ /** Length of the encoded sBTC max-fee field, in bytes. */
21
+ export const MAX_FEE_BYTE_LENGTH = 8;
22
+ /**
23
+ * Length of the Stacks recipient field inside the deposit payload — 22 bytes:
24
+ * byte 0 = Clarity principal type (0x05 standard, 0x06 contract)
25
+ * byte 1 = Stacks address version (e.g. 0x16 mainnet, 0x1a testnet)
26
+ * bytes 2..21 = 20-byte hash160 of the principal
27
+ */
28
+ export const STACKS_RECIPIENT_BYTE_LENGTH = 22;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLGtFQUFrRSxDQUFDO0FBRTNHOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFFN0M7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsS0FBTSxDQUFDO0FBRTdDLDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFFckM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlbGwta25vd24gdW5zcGVuZGFibGUgVGFwcm9vdCBpbnRlcm5hbCBrZXkuXG4gKlxuICogTm90aGluZy11cC1teS1zbGVldmUgcG9pbnQgb24gc2VjcDI1NmsxIHdpdGggbm8ga25vd24gcHJpdmF0ZSBrZXkuIFVzaW5nIGl0XG4gKiBhcyBhIFRhcHJvb3QgaW50ZXJuYWwga2V5IGd1YXJhbnRlZXMgdGhlIG91dHB1dCBjYW5ub3QgYmUgc3BlbnQgdmlhIHRoZVxuICoga2V5IHBhdGgg4oCUIG9ubHkgdmlhIG9uZSBvZiB0aGUgc2NyaXB0LXBhdGggbGVhdmVzLlxuICovXG5leHBvcnQgY29uc3QgVU5TUEVOREFCTEVfSU5URVJOQUxfS0VZID0gJzUwOTI5Yjc0YzFhMDQ5NTRiNzhiNGI2MDM1ZTk3YTVlMDc4YTVhMGYyOGVjOTZkNTQ3YmZlZTlhY2U4MDNhYzAnO1xuXG4vKipcbiAqIERlZmF1bHQgcmVjbGFpbSByZWxhdGl2ZSB0aW1lbG9jayDigJQgbnVtYmVyIG9mIEJpdGNvaW4gYmxvY2tzIHRoZSBkZXBvc2l0b3JcbiAqIG11c3Qgd2FpdCBiZWZvcmUgdGhleSBjYW4gcmVjbGFpbSB0aGVpciBCVEMgaWYgdGhlIHNCVEMgc2lnbmVycyBmYWlsIHRvXG4gKiBwcm9jZXNzIHRoZSBkZXBvc2l0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUNMQUlNX0xPQ0tfVElNRSA9IDk1MDtcblxuLyoqXG4gKiBEZWZhdWx0IG1heCBzaWduZXIgZmVlIGluIHNhdG9zaGlzLiBFbmNvZGVkIGFzIGEgYmlnLWVuZGlhbiB1NjQgKDggYnl0ZXMpXG4gKiBpbnNpZGUgdGhlIGRlcG9zaXQtbGVhZiBtZXRhZGF0YSBwYXlsb2FkLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfU0lHTkVSX0ZFRSA9IDgwXzAwMDtcblxuLyoqIExlbmd0aCBvZiB0aGUgZW5jb2RlZCBzQlRDIG1heC1mZWUgZmllbGQsIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9GRUVfQllURV9MRU5HVEggPSA4O1xuXG4vKipcbiAqIExlbmd0aCBvZiB0aGUgU3RhY2tzIHJlY2lwaWVudCBmaWVsZCBpbnNpZGUgdGhlIGRlcG9zaXQgcGF5bG9hZCDigJQgMjIgYnl0ZXM6XG4gKiAgIGJ5dGUgMCAgICAgID0gQ2xhcml0eSBwcmluY2lwYWwgdHlwZSAoMHgwNSBzdGFuZGFyZCwgMHgwNiBjb250cmFjdClcbiAqICAgYnl0ZSAxICAgICAgPSBTdGFja3MgYWRkcmVzcyB2ZXJzaW9uIChlLmcuIDB4MTYgbWFpbm5ldCwgMHgxYSB0ZXN0bmV0KVxuICogICBieXRlcyAyLi4yMSA9IDIwLWJ5dGUgaGFzaDE2MCBvZiB0aGUgcHJpbmNpcGFsXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFDS1NfUkVDSVBJRU5UX0JZVEVfTEVOR1RIID0gMjI7XG4iXX0=
@@ -0,0 +1,28 @@
1
+ import { bip32 } from '@bitgo/wasm-utxo';
2
+ import { SbtcDepositDescriptorParams } from './descriptor';
3
+ type BIP32Interface = bip32.BIP32Interface;
4
+ /**
5
+ * Compile the sBTC deposit Taproot scriptPubKey.
6
+ *
7
+ * If `params.walletKeys` contains BIP32 xpubs, the descriptor is derivable and
8
+ * `derivationIndex` selects which child keys go into the reclaim leaf. If
9
+ * `params.walletKeys` contains raw 32-byte x-only Buffers, the descriptor is
10
+ * definite and `derivationIndex` is ignored.
11
+ *
12
+ * We can't use `Descriptor.fromStringDetectType()` here: that path doesn't
13
+ * enable the `drop` ExtParams flag, so it rejects `r:older` and `payload_drop`
14
+ * fragments. We branch on the input shape instead — that's the same signal
15
+ * the descriptor library would use, just observable to us before parsing.
16
+ */
17
+ export declare function createSbtcDepositScriptPubKey(params: SbtcDepositDescriptorParams, derivationIndex?: number): Buffer;
18
+ /**
19
+ * Derive the three concrete x-only reclaim pubkeys at the given derivation
20
+ * index from a triple of BIP32 xpubs.
21
+ *
22
+ * The descriptor library performs this derivation internally when computing
23
+ * `scriptPubkey()`; this helper exposes the same derivation for callers that
24
+ * need the keys directly (e.g., constructing a witness for the reclaim leaf).
25
+ */
26
+ export declare function deriveReclaimKeys(walletKeys: [BIP32Interface, BIP32Interface, BIP32Interface], index: number): [Buffer, Buffer, Buffer];
27
+ export {};
28
+ //# sourceMappingURL=depositAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depositAddress.d.ts","sourceRoot":"","sources":["../../../src/sbtc/depositAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAA+B,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAExF,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,2BAA2B,EAAE,eAAe,SAAI,GAAG,MAAM,CAQ9G;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,EAC5D,KAAK,EAAE,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAM1B"}
@@ -0,0 +1,40 @@
1
+ import { Descriptor } from '@bitgo/wasm-utxo';
2
+ import { createSbtcDepositDescriptor } from './descriptor';
3
+ /**
4
+ * Compile the sBTC deposit Taproot scriptPubKey.
5
+ *
6
+ * If `params.walletKeys` contains BIP32 xpubs, the descriptor is derivable and
7
+ * `derivationIndex` selects which child keys go into the reclaim leaf. If
8
+ * `params.walletKeys` contains raw 32-byte x-only Buffers, the descriptor is
9
+ * definite and `derivationIndex` is ignored.
10
+ *
11
+ * We can't use `Descriptor.fromStringDetectType()` here: that path doesn't
12
+ * enable the `drop` ExtParams flag, so it rejects `r:older` and `payload_drop`
13
+ * fragments. We branch on the input shape instead — that's the same signal
14
+ * the descriptor library would use, just observable to us before parsing.
15
+ */
16
+ export function createSbtcDepositScriptPubKey(params, derivationIndex = 0) {
17
+ const descString = createSbtcDepositDescriptor(params);
18
+ const isDefinite = params.walletKeys.every(Buffer.isBuffer);
19
+ if (isDefinite) {
20
+ return Buffer.from(Descriptor.fromString(descString, 'definite').scriptPubkey());
21
+ }
22
+ const desc = Descriptor.fromString(descString, 'derivable');
23
+ return Buffer.from(desc.atDerivationIndex(derivationIndex).scriptPubkey());
24
+ }
25
+ /**
26
+ * Derive the three concrete x-only reclaim pubkeys at the given derivation
27
+ * index from a triple of BIP32 xpubs.
28
+ *
29
+ * The descriptor library performs this derivation internally when computing
30
+ * `scriptPubkey()`; this helper exposes the same derivation for callers that
31
+ * need the keys directly (e.g., constructing a witness for the reclaim leaf).
32
+ */
33
+ export function deriveReclaimKeys(walletKeys, index) {
34
+ const [k1, k2, k3] = walletKeys.map((k) => {
35
+ const child = k.derive(index);
36
+ return Buffer.from(child.publicKey.subarray(1));
37
+ });
38
+ return [k1, k2, k3];
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwb3NpdEFkZHJlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2J0Yy9kZXBvc2l0QWRkcmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxFQUFFLDJCQUEyQixFQUErQixNQUFNLGNBQWMsQ0FBQztBQUl4Rjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsTUFBbUMsRUFBRSxlQUFlLEdBQUcsQ0FBQztJQUNwRyxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLFVBQTRELEVBQzVELEtBQWE7SUFFYixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiaXAzMiwgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBjcmVhdGVTYnRjRGVwb3NpdERlc2NyaXB0b3IsIFNidGNEZXBvc2l0RGVzY3JpcHRvclBhcmFtcyB9IGZyb20gJy4vZGVzY3JpcHRvcic7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuLyoqXG4gKiBDb21waWxlIHRoZSBzQlRDIGRlcG9zaXQgVGFwcm9vdCBzY3JpcHRQdWJLZXkuXG4gKlxuICogSWYgYHBhcmFtcy53YWxsZXRLZXlzYCBjb250YWlucyBCSVAzMiB4cHVicywgdGhlIGRlc2NyaXB0b3IgaXMgZGVyaXZhYmxlIGFuZFxuICogYGRlcml2YXRpb25JbmRleGAgc2VsZWN0cyB3aGljaCBjaGlsZCBrZXlzIGdvIGludG8gdGhlIHJlY2xhaW0gbGVhZi4gSWZcbiAqIGBwYXJhbXMud2FsbGV0S2V5c2AgY29udGFpbnMgcmF3IDMyLWJ5dGUgeC1vbmx5IEJ1ZmZlcnMsIHRoZSBkZXNjcmlwdG9yIGlzXG4gKiBkZWZpbml0ZSBhbmQgYGRlcml2YXRpb25JbmRleGAgaXMgaWdub3JlZC5cbiAqXG4gKiBXZSBjYW4ndCB1c2UgYERlc2NyaXB0b3IuZnJvbVN0cmluZ0RldGVjdFR5cGUoKWAgaGVyZTogdGhhdCBwYXRoIGRvZXNuJ3RcbiAqIGVuYWJsZSB0aGUgYGRyb3BgIEV4dFBhcmFtcyBmbGFnLCBzbyBpdCByZWplY3RzIGByOm9sZGVyYCBhbmQgYHBheWxvYWRfZHJvcGBcbiAqIGZyYWdtZW50cy4gV2UgYnJhbmNoIG9uIHRoZSBpbnB1dCBzaGFwZSBpbnN0ZWFkIOKAlCB0aGF0J3MgdGhlIHNhbWUgc2lnbmFsXG4gKiB0aGUgZGVzY3JpcHRvciBsaWJyYXJ5IHdvdWxkIHVzZSwganVzdCBvYnNlcnZhYmxlIHRvIHVzIGJlZm9yZSBwYXJzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2J0Y0RlcG9zaXRTY3JpcHRQdWJLZXkocGFyYW1zOiBTYnRjRGVwb3NpdERlc2NyaXB0b3JQYXJhbXMsIGRlcml2YXRpb25JbmRleCA9IDApOiBCdWZmZXIge1xuICBjb25zdCBkZXNjU3RyaW5nID0gY3JlYXRlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKHBhcmFtcyk7XG4gIGNvbnN0IGlzRGVmaW5pdGUgPSBwYXJhbXMud2FsbGV0S2V5cy5ldmVyeShCdWZmZXIuaXNCdWZmZXIpO1xuICBpZiAoaXNEZWZpbml0ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY1N0cmluZywgJ2RlZmluaXRlJykuc2NyaXB0UHVia2V5KCkpO1xuICB9XG4gIGNvbnN0IGRlc2MgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY1N0cmluZywgJ2Rlcml2YWJsZScpO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGVzYy5hdERlcml2YXRpb25JbmRleChkZXJpdmF0aW9uSW5kZXgpLnNjcmlwdFB1YmtleSgpKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgdGhlIHRocmVlIGNvbmNyZXRlIHgtb25seSByZWNsYWltIHB1YmtleXMgYXQgdGhlIGdpdmVuIGRlcml2YXRpb25cbiAqIGluZGV4IGZyb20gYSB0cmlwbGUgb2YgQklQMzIgeHB1YnMuXG4gKlxuICogVGhlIGRlc2NyaXB0b3IgbGlicmFyeSBwZXJmb3JtcyB0aGlzIGRlcml2YXRpb24gaW50ZXJuYWxseSB3aGVuIGNvbXB1dGluZ1xuICogYHNjcmlwdFB1YmtleSgpYDsgdGhpcyBoZWxwZXIgZXhwb3NlcyB0aGUgc2FtZSBkZXJpdmF0aW9uIGZvciBjYWxsZXJzIHRoYXRcbiAqIG5lZWQgdGhlIGtleXMgZGlyZWN0bHkgKGUuZy4sIGNvbnN0cnVjdGluZyBhIHdpdG5lc3MgZm9yIHRoZSByZWNsYWltIGxlYWYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlUmVjbGFpbUtleXMoXG4gIHdhbGxldEtleXM6IFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSxcbiAgaW5kZXg6IG51bWJlclxuKTogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHtcbiAgY29uc3QgW2sxLCBrMiwgazNdID0gd2FsbGV0S2V5cy5tYXAoKGspID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGsuZGVyaXZlKGluZGV4KTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oY2hpbGQucHVibGljS2V5LnN1YmFycmF5KDEpKTtcbiAgfSk7XG4gIHJldHVybiBbazEsIGsyLCBrM107XG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ import { bip32 } from '@bitgo/wasm-utxo';
2
+ type BIP32Interface = bip32.BIP32Interface;
3
+ /**
4
+ * A reclaim key entry — either a BIP32 xpub/xprv (derivable) or a concrete
5
+ * 32-byte x-only public key (definite).
6
+ */
7
+ export type SbtcReclaimKey = BIP32Interface | Buffer;
8
+ export type SbtcDepositDescriptorParams = {
9
+ /**
10
+ * The three reclaim keys (user, backup, bitgo). Used in the reclaim leaf as
11
+ * a 2-of-3 Tapscript multisig (`multi_a`). If a key is a `BIP32Interface`,
12
+ * it is rendered as `<xpub>/*` and the descriptor is derivable. If a key is
13
+ * a 32-byte `Buffer`, it is rendered as a concrete x-only hex key and the
14
+ * descriptor is definite.
15
+ */
16
+ walletKeys: [SbtcReclaimKey, SbtcReclaimKey, SbtcReclaimKey];
17
+ /**
18
+ * Number of Bitcoin blocks the depositor must wait (relative timelock) before
19
+ * the reclaim leaf becomes spendable.
20
+ */
21
+ lockTime: number;
22
+ /** Max satoshis the sBTC signers may take. Encoded big-endian u64 (8 bytes). */
23
+ maxFee: number | bigint;
24
+ /**
25
+ * Stacks recipient bytes — 22 bytes:
26
+ * byte 0 = Clarity principal type (0x05 standard, 0x06 contract)
27
+ * byte 1 = Stacks address version (e.g. 0x16 mainnet, 0x1a testnet)
28
+ * bytes 2..21 = 20-byte hash160 of the principal
29
+ */
30
+ stacksRecipient: Buffer;
31
+ /** 32-byte x-only sBTC signers' aggregate pubkey. */
32
+ signersAggregateKey: Buffer;
33
+ };
34
+ /**
35
+ * Encode the deposit-leaf metadata that the sBTC signers parse from the
36
+ * witness: max-fee (u64 big-endian, 8 bytes) followed by the 22-byte
37
+ * Stacks recipient. Total: 30 bytes.
38
+ *
39
+ * The result is the single `payload_drop` argument inside the deposit leaf.
40
+ */
41
+ export declare function encodeDepositPayload(maxFee: number | bigint, stacksRecipient: Buffer): Buffer;
42
+ /**
43
+ * Build the sBTC peg-in deposit Taproot descriptor as a single all-miniscript
44
+ * `tr()` with two leaves:
45
+ *
46
+ * tr(<UNSPENDABLE>,
47
+ * {
48
+ * c:and_v(payload_drop(<feeBE||recipient>), pk_k(<signersKey>)),
49
+ * and_v(r:older(<lockTime>), multi_a(2, xpub1/*, xpub2/*, xpub3/*))
50
+ * }
51
+ * )
52
+ *
53
+ * - Deposit leaf compiles to: `<30B-payload> OP_DROP <signersKey> OP_CHECKSIG`
54
+ * - Reclaim leaf compiles to: `<lockTime> OP_CSV OP_DROP <k1> OP_CHECKSIG <k2> OP_CHECKSIGADD <k3> OP_CHECKSIGADD OP_2 OP_NUMEQUAL`
55
+ *
56
+ * Both fragments are valid Bitcoin miniscript via the `payload_drop` and
57
+ * `r:older` extensions added in `@bitgo/wasm-utxo` 4.11.0
58
+ * (BitGoWASM PR #272).
59
+ *
60
+ * The descriptor is derivable: the reclaim xpubs use `/*` and the descriptor
61
+ * library resolves them to concrete x-only keys at each derivation index.
62
+ *
63
+ * @returns descriptor string (without checksum)
64
+ */
65
+ export declare function createSbtcDepositDescriptor(params: SbtcDepositDescriptorParams): string;
66
+ export {};
67
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/sbtc/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAI9C,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAC7D;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAYF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAW7F;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAwBvF"}
@@ -0,0 +1,75 @@
1
+ import { ast } from '@bitgo/wasm-utxo';
2
+ import { MAX_FEE_BYTE_LENGTH, STACKS_RECIPIENT_BYTE_LENGTH, UNSPENDABLE_INTERNAL_KEY } from './constants';
3
+ function asDescriptorKey(key) {
4
+ if (Buffer.isBuffer(key)) {
5
+ if (key.length !== 32) {
6
+ throw new Error(`reclaim key buffer must be 32 bytes x-only (got ${key.length})`);
7
+ }
8
+ return key.toString('hex');
9
+ }
10
+ return key.neutered().toBase58() + '/*';
11
+ }
12
+ /**
13
+ * Encode the deposit-leaf metadata that the sBTC signers parse from the
14
+ * witness: max-fee (u64 big-endian, 8 bytes) followed by the 22-byte
15
+ * Stacks recipient. Total: 30 bytes.
16
+ *
17
+ * The result is the single `payload_drop` argument inside the deposit leaf.
18
+ */
19
+ export function encodeDepositPayload(maxFee, stacksRecipient) {
20
+ if (stacksRecipient.length !== STACKS_RECIPIENT_BYTE_LENGTH) {
21
+ throw new Error(`stacksRecipient must be ${STACKS_RECIPIENT_BYTE_LENGTH} bytes (got ${stacksRecipient.length})`);
22
+ }
23
+ const fee = typeof maxFee === 'bigint' ? maxFee : BigInt(maxFee);
24
+ if (fee < 0n || fee > 0xffffffffffffffffn) {
25
+ throw new Error(`maxFee (${maxFee}) does not fit in unsigned 64 bits`);
26
+ }
27
+ const feeBuf = Buffer.alloc(MAX_FEE_BYTE_LENGTH);
28
+ feeBuf.writeBigUInt64BE(fee);
29
+ return Buffer.concat([feeBuf, stacksRecipient]);
30
+ }
31
+ /**
32
+ * Build the sBTC peg-in deposit Taproot descriptor as a single all-miniscript
33
+ * `tr()` with two leaves:
34
+ *
35
+ * tr(<UNSPENDABLE>,
36
+ * {
37
+ * c:and_v(payload_drop(<feeBE||recipient>), pk_k(<signersKey>)),
38
+ * and_v(r:older(<lockTime>), multi_a(2, xpub1/*, xpub2/*, xpub3/*))
39
+ * }
40
+ * )
41
+ *
42
+ * - Deposit leaf compiles to: `<30B-payload> OP_DROP <signersKey> OP_CHECKSIG`
43
+ * - Reclaim leaf compiles to: `<lockTime> OP_CSV OP_DROP <k1> OP_CHECKSIG <k2> OP_CHECKSIGADD <k3> OP_CHECKSIGADD OP_2 OP_NUMEQUAL`
44
+ *
45
+ * Both fragments are valid Bitcoin miniscript via the `payload_drop` and
46
+ * `r:older` extensions added in `@bitgo/wasm-utxo` 4.11.0
47
+ * (BitGoWASM PR #272).
48
+ *
49
+ * The descriptor is derivable: the reclaim xpubs use `/*` and the descriptor
50
+ * library resolves them to concrete x-only keys at each derivation index.
51
+ *
52
+ * @returns descriptor string (without checksum)
53
+ */
54
+ export function createSbtcDepositDescriptor(params) {
55
+ if (params.lockTime <= 0) {
56
+ throw new Error(`lockTime (${params.lockTime}) must be greater than 0`);
57
+ }
58
+ if (params.signersAggregateKey.length !== 32) {
59
+ throw new Error(`signersAggregateKey must be 32 bytes x-only (got ${params.signersAggregateKey.length})`);
60
+ }
61
+ const payloadHex = encodeDepositPayload(params.maxFee, params.stacksRecipient).toString('hex');
62
+ const reclaimKeys = params.walletKeys.map(asDescriptorKey);
63
+ // `payload_drop` is not yet in the public MiniscriptNode TS union, so cast
64
+ // the deposit leaf — the formatter is generic and renders it correctly.
65
+ const depositLeaf = {
66
+ 'c:and_v': [{ payload_drop: payloadHex }, { pk_k: params.signersAggregateKey.toString('hex') }],
67
+ };
68
+ const reclaimLeaf = {
69
+ and_v: [{ 'r:older': params.lockTime }, { multi_a: [2, ...reclaimKeys] }],
70
+ };
71
+ return ast.formatNode({
72
+ tr: [UNSPENDABLE_INTERNAL_KEY, [depositLeaf, reclaimLeaf]],
73
+ });
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zYnRjL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBUyxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXFDMUcsU0FBUyxlQUFlLENBQUMsR0FBbUI7SUFDMUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQXVCLEVBQUUsZUFBdUI7SUFDbkYsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLDRCQUE0QixFQUFFLENBQUM7UUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsNEJBQTRCLGVBQWUsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbkgsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxNQUFNLG9DQUFvQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLE1BQW1DO0lBQzdFLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsTUFBTSxDQUFDLFFBQVEsMEJBQTBCLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFM0QsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUN4RSxNQUFNLFdBQVcsR0FBRztRQUNsQixTQUFTLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQztJQUVuQyxNQUFNLFdBQVcsR0FBdUI7UUFDdEMsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztLQUMxRSxDQUFDO0lBRUYsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3BCLEVBQUUsRUFBRSxDQUFDLHdCQUF3QixFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzNELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3QsIGJpcDMyIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IE1BWF9GRUVfQllURV9MRU5HVEgsIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEgsIFVOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxudHlwZSBCSVAzMkludGVyZmFjZSA9IGJpcDMyLkJJUDMySW50ZXJmYWNlO1xuXG4vKipcbiAqIEEgcmVjbGFpbSBrZXkgZW50cnkg4oCUIGVpdGhlciBhIEJJUDMyIHhwdWIveHBydiAoZGVyaXZhYmxlKSBvciBhIGNvbmNyZXRlXG4gKiAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5IChkZWZpbml0ZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFNidGNSZWNsYWltS2V5ID0gQklQMzJJbnRlcmZhY2UgfCBCdWZmZXI7XG5cbmV4cG9ydCB0eXBlIFNidGNEZXBvc2l0RGVzY3JpcHRvclBhcmFtcyA9IHtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSByZWNsYWltIGtleXMgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBVc2VkIGluIHRoZSByZWNsYWltIGxlYWYgYXNcbiAgICogYSAyLW9mLTMgVGFwc2NyaXB0IG11bHRpc2lnIChgbXVsdGlfYWApLiBJZiBhIGtleSBpcyBhIGBCSVAzMkludGVyZmFjZWAsXG4gICAqIGl0IGlzIHJlbmRlcmVkIGFzIGA8eHB1Yj4vKmAgYW5kIHRoZSBkZXNjcmlwdG9yIGlzIGRlcml2YWJsZS4gSWYgYSBrZXkgaXNcbiAgICogYSAzMi1ieXRlIGBCdWZmZXJgLCBpdCBpcyByZW5kZXJlZCBhcyBhIGNvbmNyZXRlIHgtb25seSBoZXgga2V5IGFuZCB0aGVcbiAgICogZGVzY3JpcHRvciBpcyBkZWZpbml0ZS5cbiAgICovXG4gIHdhbGxldEtleXM6IFtTYnRjUmVjbGFpbUtleSwgU2J0Y1JlY2xhaW1LZXksIFNidGNSZWNsYWltS2V5XTtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBCaXRjb2luIGJsb2NrcyB0aGUgZGVwb3NpdG9yIG11c3Qgd2FpdCAocmVsYXRpdmUgdGltZWxvY2spIGJlZm9yZVxuICAgKiB0aGUgcmVjbGFpbSBsZWFmIGJlY29tZXMgc3BlbmRhYmxlLlxuICAgKi9cbiAgbG9ja1RpbWU6IG51bWJlcjtcbiAgLyoqIE1heCBzYXRvc2hpcyB0aGUgc0JUQyBzaWduZXJzIG1heSB0YWtlLiBFbmNvZGVkIGJpZy1lbmRpYW4gdTY0ICg4IGJ5dGVzKS4gKi9cbiAgbWF4RmVlOiBudW1iZXIgfCBiaWdpbnQ7XG4gIC8qKlxuICAgKiBTdGFja3MgcmVjaXBpZW50IGJ5dGVzIOKAlCAyMiBieXRlczpcbiAgICogICBieXRlIDAgICAgICA9IENsYXJpdHkgcHJpbmNpcGFsIHR5cGUgKDB4MDUgc3RhbmRhcmQsIDB4MDYgY29udHJhY3QpXG4gICAqICAgYnl0ZSAxICAgICAgPSBTdGFja3MgYWRkcmVzcyB2ZXJzaW9uIChlLmcuIDB4MTYgbWFpbm5ldCwgMHgxYSB0ZXN0bmV0KVxuICAgKiAgIGJ5dGVzIDIuLjIxID0gMjAtYnl0ZSBoYXNoMTYwIG9mIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIHN0YWNrc1JlY2lwaWVudDogQnVmZmVyO1xuICAvKiogMzItYnl0ZSB4LW9ubHkgc0JUQyBzaWduZXJzJyBhZ2dyZWdhdGUgcHVia2V5LiAqL1xuICBzaWduZXJzQWdncmVnYXRlS2V5OiBCdWZmZXI7XG59O1xuXG5mdW5jdGlvbiBhc0Rlc2NyaXB0b3JLZXkoa2V5OiBTYnRjUmVjbGFpbUtleSk6IHN0cmluZyB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIGlmIChrZXkubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIGtleSBidWZmZXIgbXVzdCBiZSAzMiBieXRlcyB4LW9ubHkgKGdvdCAke2tleS5sZW5ndGh9KWApO1xuICAgIH1cbiAgICByZXR1cm4ga2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuICByZXR1cm4ga2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSArICcvKic7XG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBkZXBvc2l0LWxlYWYgbWV0YWRhdGEgdGhhdCB0aGUgc0JUQyBzaWduZXJzIHBhcnNlIGZyb20gdGhlXG4gKiB3aXRuZXNzOiBtYXgtZmVlICh1NjQgYmlnLWVuZGlhbiwgOCBieXRlcykgZm9sbG93ZWQgYnkgdGhlIDIyLWJ5dGVcbiAqIFN0YWNrcyByZWNpcGllbnQuIFRvdGFsOiAzMCBieXRlcy5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIHRoZSBzaW5nbGUgYHBheWxvYWRfZHJvcGAgYXJndW1lbnQgaW5zaWRlIHRoZSBkZXBvc2l0IGxlYWYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVEZXBvc2l0UGF5bG9hZChtYXhGZWU6IG51bWJlciB8IGJpZ2ludCwgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAoc3RhY2tzUmVjaXBpZW50Lmxlbmd0aCAhPT0gU1RBQ0tTX1JFQ0lQSUVOVF9CWVRFX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3RhY2tzUmVjaXBpZW50IG11c3QgYmUgJHtTVEFDS1NfUkVDSVBJRU5UX0JZVEVfTEVOR1RIfSBieXRlcyAoZ290ICR7c3RhY2tzUmVjaXBpZW50Lmxlbmd0aH0pYCk7XG4gIH1cbiAgY29uc3QgZmVlID0gdHlwZW9mIG1heEZlZSA9PT0gJ2JpZ2ludCcgPyBtYXhGZWUgOiBCaWdJbnQobWF4RmVlKTtcbiAgaWYgKGZlZSA8IDBuIHx8IGZlZSA+IDB4ZmZmZmZmZmZmZmZmZmZmZm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG1heEZlZSAoJHttYXhGZWV9KSBkb2VzIG5vdCBmaXQgaW4gdW5zaWduZWQgNjQgYml0c2ApO1xuICB9XG4gIGNvbnN0IGZlZUJ1ZiA9IEJ1ZmZlci5hbGxvYyhNQVhfRkVFX0JZVEVfTEVOR1RIKTtcbiAgZmVlQnVmLndyaXRlQmlnVUludDY0QkUoZmVlKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2ZlZUJ1Ziwgc3RhY2tzUmVjaXBpZW50XSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNCVEMgcGVnLWluIGRlcG9zaXQgVGFwcm9vdCBkZXNjcmlwdG9yIGFzIGEgc2luZ2xlIGFsbC1taW5pc2NyaXB0XG4gKiBgdHIoKWAgd2l0aCB0d28gbGVhdmVzOlxuICpcbiAqICAgdHIoPFVOU1BFTkRBQkxFPixcbiAqICAgICB7XG4gKiAgICAgICBjOmFuZF92KHBheWxvYWRfZHJvcCg8ZmVlQkV8fHJlY2lwaWVudD4pLCBwa19rKDxzaWduZXJzS2V5PikpLFxuICogICAgICAgYW5kX3YocjpvbGRlcig8bG9ja1RpbWU+KSwgbXVsdGlfYSgyLCB4cHViMS8qLCB4cHViMi8qLCB4cHViMy8qKSlcbiAqICAgICB9XG4gKiAgIClcbiAqXG4gKiAtIERlcG9zaXQgbGVhZiBjb21waWxlcyB0bzogYDwzMEItcGF5bG9hZD4gT1BfRFJPUCA8c2lnbmVyc0tleT4gT1BfQ0hFQ0tTSUdgXG4gKiAtIFJlY2xhaW0gbGVhZiBjb21waWxlcyB0bzogYDxsb2NrVGltZT4gT1BfQ1NWIE9QX0RST1AgPGsxPiBPUF9DSEVDS1NJRyA8azI+IE9QX0NIRUNLU0lHQUREIDxrMz4gT1BfQ0hFQ0tTSUdBREQgT1BfMiBPUF9OVU1FUVVBTGBcbiAqXG4gKiBCb3RoIGZyYWdtZW50cyBhcmUgdmFsaWQgQml0Y29pbiBtaW5pc2NyaXB0IHZpYSB0aGUgYHBheWxvYWRfZHJvcGAgYW5kXG4gKiBgcjpvbGRlcmAgZXh0ZW5zaW9ucyBhZGRlZCBpbiBgQGJpdGdvL3dhc20tdXR4b2AgNC4xMS4wXG4gKiAoQml0R29XQVNNIFBSICMyNzIpLlxuICpcbiAqIFRoZSBkZXNjcmlwdG9yIGlzIGRlcml2YWJsZTogdGhlIHJlY2xhaW0geHB1YnMgdXNlIGAvKmAgYW5kIHRoZSBkZXNjcmlwdG9yXG4gKiBsaWJyYXJ5IHJlc29sdmVzIHRoZW0gdG8gY29uY3JldGUgeC1vbmx5IGtleXMgYXQgZWFjaCBkZXJpdmF0aW9uIGluZGV4LlxuICpcbiAqIEByZXR1cm5zIGRlc2NyaXB0b3Igc3RyaW5nICh3aXRob3V0IGNoZWNrc3VtKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKHBhcmFtczogU2J0Y0RlcG9zaXREZXNjcmlwdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgaWYgKHBhcmFtcy5sb2NrVGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2NrVGltZSAoJHtwYXJhbXMubG9ja1RpbWV9KSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwYCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5zaWduZXJzQWdncmVnYXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNpZ25lcnNBZ2dyZWdhdGVLZXkgbXVzdCBiZSAzMiBieXRlcyB4LW9ubHkgKGdvdCAke3BhcmFtcy5zaWduZXJzQWdncmVnYXRlS2V5Lmxlbmd0aH0pYCk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkSGV4ID0gZW5jb2RlRGVwb3NpdFBheWxvYWQocGFyYW1zLm1heEZlZSwgcGFyYW1zLnN0YWNrc1JlY2lwaWVudCkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCByZWNsYWltS2V5cyA9IHBhcmFtcy53YWxsZXRLZXlzLm1hcChhc0Rlc2NyaXB0b3JLZXkpO1xuXG4gIC8vIGBwYXlsb2FkX2Ryb3BgIGlzIG5vdCB5ZXQgaW4gdGhlIHB1YmxpYyBNaW5pc2NyaXB0Tm9kZSBUUyB1bmlvbiwgc28gY2FzdFxuICAvLyB0aGUgZGVwb3NpdCBsZWFmIOKAlCB0aGUgZm9ybWF0dGVyIGlzIGdlbmVyaWMgYW5kIHJlbmRlcnMgaXQgY29ycmVjdGx5LlxuICBjb25zdCBkZXBvc2l0TGVhZiA9IHtcbiAgICAnYzphbmRfdic6IFt7IHBheWxvYWRfZHJvcDogcGF5bG9hZEhleCB9LCB7IHBrX2s6IHBhcmFtcy5zaWduZXJzQWdncmVnYXRlS2V5LnRvU3RyaW5nKCdoZXgnKSB9XSxcbiAgfSBhcyB1bmtub3duIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCByZWNsYWltTGVhZjogYXN0Lk1pbmlzY3JpcHROb2RlID0ge1xuICAgIGFuZF92OiBbeyAncjpvbGRlcic6IHBhcmFtcy5sb2NrVGltZSB9LCB7IG11bHRpX2E6IFsyLCAuLi5yZWNsYWltS2V5c10gfV0sXG4gIH07XG5cbiAgcmV0dXJuIGFzdC5mb3JtYXROb2RlKHtcbiAgICB0cjogW1VOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSwgW2RlcG9zaXRMZWFmLCByZWNsYWltTGVhZl1dLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './constants';
2
+ export * from './descriptor';
3
+ export * from './depositAddress';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sbtc/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './constants';
2
+ export * from './descriptor';
3
+ export * from './depositAddress';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2J0Yy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwb3NpdEFkZHJlc3MnO1xuIl19
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@bitgo-beta/utxo-descriptors",
3
+ "version": "0.0.1-beta.0",
4
+ "description": "BitGo SDK for building UTXO descriptors",
5
+ "main": "./dist/cjs/src/index.js",
6
+ "module": "./dist/esm/index.js",
7
+ "browser": "./dist/esm/index.js",
8
+ "types": "./dist/cjs/src/index.d.ts",
9
+ "files": [
10
+ "dist/cjs",
11
+ "dist/esm"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "import": {
16
+ "types": "./dist/esm/index.d.ts",
17
+ "default": "./dist/esm/index.js"
18
+ },
19
+ "require": {
20
+ "types": "./dist/cjs/src/index.d.ts",
21
+ "default": "./dist/cjs/src/index.js"
22
+ }
23
+ }
24
+ },
25
+ "scripts": {
26
+ "build": "npm run build:cjs && npm run build:esm",
27
+ "build:cjs": "yarn tsc --build --incremental --verbose .",
28
+ "build:esm": "yarn tsc --project tsconfig.esm.json",
29
+ "fmt": "prettier --write .",
30
+ "check-fmt": "prettier --check '**/*.{ts,js,json}'",
31
+ "clean": "rm -r ./dist",
32
+ "lint": "eslint --quiet .",
33
+ "prepare": "npm run build",
34
+ "coverage": "nyc -- npm run unit-test",
35
+ "unit-test": "mocha --recursive \"test/**/*.ts\""
36
+ },
37
+ "author": "BitGo SDK Team <sdkteam@bitgo.com>",
38
+ "license": "MIT",
39
+ "engines": {
40
+ "node": ">=20"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "https://github.com/BitGo/BitGoJS.git",
45
+ "directory": "modules/utxo-descriptors"
46
+ },
47
+ "lint-staged": {
48
+ "*.{js,ts}": [
49
+ "yarn prettier --write",
50
+ "yarn eslint --fix"
51
+ ]
52
+ },
53
+ "publishConfig": {
54
+ "access": "public"
55
+ },
56
+ "nyc": {
57
+ "extension": [
58
+ ".ts"
59
+ ]
60
+ },
61
+ "dependencies": {
62
+ "@bitgo-beta/utxo-core": "1.8.1-beta.861",
63
+ "@bitgo/wasm-utxo": "^4.11.0"
64
+ },
65
+ "gitHead": "bf0b763a30d18e44b2089d98ca8503f02cca0987"
66
+ }