@bitgo-beta/utxo-core 0.0.0-semantic-release-managed

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 (132) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +6 -0
  3. package/dist/src/Output.d.ts +43 -0
  4. package/dist/src/Output.d.ts.map +1 -0
  5. package/dist/src/Output.js +60 -0
  6. package/dist/src/bip322/index.d.ts +5 -0
  7. package/dist/src/bip322/index.d.ts.map +1 -0
  8. package/dist/src/bip322/index.js +21 -0
  9. package/dist/src/bip322/toSign.d.ts +25 -0
  10. package/dist/src/bip322/toSign.d.ts.map +1 -0
  11. package/dist/src/bip322/toSign.js +126 -0
  12. package/dist/src/bip322/toSpend.d.ts +22 -0
  13. package/dist/src/bip322/toSpend.d.ts.map +1 -0
  14. package/dist/src/bip322/toSpend.js +72 -0
  15. package/dist/src/bip322/utils.d.ts +18 -0
  16. package/dist/src/bip322/utils.d.ts.map +1 -0
  17. package/dist/src/bip322/utils.js +115 -0
  18. package/dist/src/bip322/verify.d.ts +12 -0
  19. package/dist/src/bip322/verify.d.ts.map +1 -0
  20. package/dist/src/bip322/verify.js +115 -0
  21. package/dist/src/bip32utils.d.ts +16 -0
  22. package/dist/src/bip32utils.d.ts.map +1 -0
  23. package/dist/src/bip32utils.js +71 -0
  24. package/dist/src/bip65/index.d.ts +2 -0
  25. package/dist/src/bip65/index.d.ts.map +1 -0
  26. package/dist/src/bip65/index.js +18 -0
  27. package/dist/src/bip65/locktime.d.ts +8 -0
  28. package/dist/src/bip65/locktime.d.ts.map +1 -0
  29. package/dist/src/bip65/locktime.js +37 -0
  30. package/dist/src/descriptor/DescriptorMap.d.ts +9 -0
  31. package/dist/src/descriptor/DescriptorMap.d.ts.map +1 -0
  32. package/dist/src/descriptor/DescriptorMap.js +9 -0
  33. package/dist/src/descriptor/Output.d.ts +23 -0
  34. package/dist/src/descriptor/Output.d.ts.map +1 -0
  35. package/dist/src/descriptor/Output.js +41 -0
  36. package/dist/src/descriptor/VirtualSize.d.ts +23 -0
  37. package/dist/src/descriptor/VirtualSize.d.ts.map +1 -0
  38. package/dist/src/descriptor/VirtualSize.js +100 -0
  39. package/dist/src/descriptor/address.d.ts +5 -0
  40. package/dist/src/descriptor/address.d.ts.map +1 -0
  41. package/dist/src/descriptor/address.js +48 -0
  42. package/dist/src/descriptor/derive.d.ts +13 -0
  43. package/dist/src/descriptor/derive.d.ts.map +1 -0
  44. package/dist/src/descriptor/derive.js +45 -0
  45. package/dist/src/descriptor/fromFixedScriptWallet.d.ts +16 -0
  46. package/dist/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
  47. package/dist/src/descriptor/fromFixedScriptWallet.js +88 -0
  48. package/dist/src/descriptor/index.d.ts +11 -0
  49. package/dist/src/descriptor/index.d.ts.map +1 -0
  50. package/dist/src/descriptor/index.js +27 -0
  51. package/dist/src/descriptor/parse/PatternMatcher.d.ts +14 -0
  52. package/dist/src/descriptor/parse/PatternMatcher.d.ts.map +1 -0
  53. package/dist/src/descriptor/parse/PatternMatcher.js +60 -0
  54. package/dist/src/descriptor/psbt/assertSatisfiable.d.ts +20 -0
  55. package/dist/src/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
  56. package/dist/src/descriptor/psbt/assertSatisfiable.js +74 -0
  57. package/dist/src/descriptor/psbt/createPsbt.d.ts +23 -0
  58. package/dist/src/descriptor/psbt/createPsbt.d.ts.map +1 -0
  59. package/dist/src/descriptor/psbt/createPsbt.js +107 -0
  60. package/dist/src/descriptor/psbt/findDescriptors.d.ts +26 -0
  61. package/dist/src/descriptor/psbt/findDescriptors.d.ts.map +1 -0
  62. package/dist/src/descriptor/psbt/findDescriptors.js +98 -0
  63. package/dist/src/descriptor/psbt/index.d.ts +7 -0
  64. package/dist/src/descriptor/psbt/index.d.ts.map +1 -0
  65. package/dist/src/descriptor/psbt/index.js +23 -0
  66. package/dist/src/descriptor/psbt/parse.d.ts +27 -0
  67. package/dist/src/descriptor/psbt/parse.d.ts.map +1 -0
  68. package/dist/src/descriptor/psbt/parse.js +87 -0
  69. package/dist/src/descriptor/psbt/sign.d.ts +26 -0
  70. package/dist/src/descriptor/psbt/sign.d.ts.map +1 -0
  71. package/dist/src/descriptor/psbt/sign.js +42 -0
  72. package/dist/src/descriptor/psbt/wrap.d.ts +12 -0
  73. package/dist/src/descriptor/psbt/wrap.d.ts.map +1 -0
  74. package/dist/src/descriptor/psbt/wrap.js +76 -0
  75. package/dist/src/dustThreshold.d.ts +4 -0
  76. package/dist/src/dustThreshold.d.ts.map +1 -0
  77. package/dist/src/dustThreshold.js +134 -0
  78. package/dist/src/index.d.ts +10 -0
  79. package/dist/src/index.d.ts.map +1 -0
  80. package/dist/src/index.js +49 -0
  81. package/dist/src/paygo/attestation.d.ts +11 -0
  82. package/dist/src/paygo/attestation.d.ts.map +1 -0
  83. package/dist/src/paygo/attestation.js +58 -0
  84. package/dist/src/paygo/index.d.ts +3 -0
  85. package/dist/src/paygo/index.d.ts.map +1 -0
  86. package/dist/src/paygo/index.js +19 -0
  87. package/dist/src/paygo/parsePayGoAttestation.d.ts +16 -0
  88. package/dist/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
  89. package/dist/src/paygo/parsePayGoAttestation.js +50 -0
  90. package/dist/src/paygo/psbt/Errors.d.ts +22 -0
  91. package/dist/src/paygo/psbt/Errors.d.ts.map +1 -0
  92. package/dist/src/paygo/psbt/Errors.js +44 -0
  93. package/dist/src/paygo/psbt/index.d.ts +2 -0
  94. package/dist/src/paygo/psbt/index.d.ts.map +1 -0
  95. package/dist/src/paygo/psbt/index.js +18 -0
  96. package/dist/src/paygo/psbt/payGoAddressProof.d.ts +29 -0
  97. package/dist/src/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
  98. package/dist/src/paygo/psbt/payGoAddressProof.js +124 -0
  99. package/dist/src/testutil/descriptor/descriptors.d.ts +13 -0
  100. package/dist/src/testutil/descriptor/descriptors.d.ts.map +1 -0
  101. package/dist/src/testutil/descriptor/descriptors.js +162 -0
  102. package/dist/src/testutil/descriptor/index.d.ts +4 -0
  103. package/dist/src/testutil/descriptor/index.d.ts.map +1 -0
  104. package/dist/src/testutil/descriptor/index.js +20 -0
  105. package/dist/src/testutil/descriptor/mock.utils.d.ts +36 -0
  106. package/dist/src/testutil/descriptor/mock.utils.d.ts.map +1 -0
  107. package/dist/src/testutil/descriptor/mock.utils.js +92 -0
  108. package/dist/src/testutil/descriptor/psbt.utils.d.ts +4 -0
  109. package/dist/src/testutil/descriptor/psbt.utils.d.ts.map +1 -0
  110. package/dist/src/testutil/descriptor/psbt.utils.js +21 -0
  111. package/dist/src/testutil/fixtures.utils.d.ts +15 -0
  112. package/dist/src/testutil/fixtures.utils.d.ts.map +1 -0
  113. package/dist/src/testutil/fixtures.utils.js +127 -0
  114. package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
  115. package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
  116. package/dist/src/testutil/generatePayGoAttestationProof.utils.js +38 -0
  117. package/dist/src/testutil/index.d.ts +6 -0
  118. package/dist/src/testutil/index.d.ts.map +1 -0
  119. package/dist/src/testutil/index.js +22 -0
  120. package/dist/src/testutil/key.utils.d.ts +16 -0
  121. package/dist/src/testutil/key.utils.d.ts.map +1 -0
  122. package/dist/src/testutil/key.utils.js +59 -0
  123. package/dist/src/testutil/toPlainObject.utils.d.ts +11 -0
  124. package/dist/src/testutil/toPlainObject.utils.d.ts.map +1 -0
  125. package/dist/src/testutil/toPlainObject.utils.js +89 -0
  126. package/dist/src/testutil/trimMessagePrefix.d.ts +11 -0
  127. package/dist/src/testutil/trimMessagePrefix.d.ts.map +1 -0
  128. package/dist/src/testutil/trimMessagePrefix.js +60 -0
  129. package/dist/src/xOnlyPubkey.d.ts +2 -0
  130. package/dist/src/xOnlyPubkey.d.ts.map +1 -0
  131. package/dist/src/xOnlyPubkey.js +18 -0
  132. package/package.json +63 -0
@@ -0,0 +1,23 @@
1
+ import { Descriptor } from '@bitgo/wasm-miniscript';
2
+ import { MaxOutput, Output, PrevOutput } from '../Output';
3
+ import { DescriptorMap } from './DescriptorMap';
4
+ export type WithDescriptor<T> = T & {
5
+ descriptor: Descriptor;
6
+ };
7
+ export type WithOptDescriptor<T> = T & {
8
+ descriptor?: Descriptor;
9
+ };
10
+ export declare function isInternalOutput<T extends object>(output: T | WithDescriptor<T>): output is WithDescriptor<T>;
11
+ export declare function isExternalOutput<T extends object>(output: T | WithDescriptor<T>): output is T;
12
+ /**
13
+ * @return the sum of the external outputs that are not 'max'
14
+ * @param outputs
15
+ */
16
+ export declare function getExternalFixedAmount(outputs: WithOptDescriptor<Output | MaxOutput>[]): bigint;
17
+ export type DescriptorWalletOutput = PrevOutput & {
18
+ descriptorName: string;
19
+ descriptorIndex: number | undefined;
20
+ };
21
+ export type DerivedDescriptorWalletOutput = WithDescriptor<PrevOutput>;
22
+ export declare function toDerivedDescriptorWalletOutput(output: DescriptorWalletOutput, descriptorMap: DescriptorMap): DerivedDescriptorWalletOutput;
23
+ //# sourceMappingURL=Output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Output.d.ts","sourceRoot":"","sources":["../../../src/descriptor/Output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAqB,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG;IAClC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG;IACrC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAE7G;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAE7F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAE/F;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAEvE,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,sBAAsB,EAC9B,aAAa,EAAE,aAAa,GAC3B,6BAA6B,CAkB/B"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isInternalOutput = isInternalOutput;
7
+ exports.isExternalOutput = isExternalOutput;
8
+ exports.getExternalFixedAmount = getExternalFixedAmount;
9
+ exports.toDerivedDescriptorWalletOutput = toDerivedDescriptorWalletOutput;
10
+ const assert_1 = __importDefault(require("assert"));
11
+ const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
12
+ const Output_1 = require("../Output");
13
+ const derive_1 = require("./derive");
14
+ function isInternalOutput(output) {
15
+ return 'descriptor' in output && output.descriptor !== undefined;
16
+ }
17
+ function isExternalOutput(output) {
18
+ return !isInternalOutput(output);
19
+ }
20
+ /**
21
+ * @return the sum of the external outputs that are not 'max'
22
+ * @param outputs
23
+ */
24
+ function getExternalFixedAmount(outputs) {
25
+ return (0, Output_1.getFixedOutputSum)(outputs.filter(isExternalOutput));
26
+ }
27
+ function toDerivedDescriptorWalletOutput(output, descriptorMap) {
28
+ const descriptor = descriptorMap.get(output.descriptorName);
29
+ if (!descriptor) {
30
+ throw new Error(`Descriptor not found: ${output.descriptorName}`);
31
+ }
32
+ (0, assert_1.default)(descriptor instanceof wasm_miniscript_1.Descriptor);
33
+ const descriptorAtIndex = (0, derive_1.getDescriptorAtIndexCheckScript)(descriptor, output.descriptorIndex, output.witnessUtxo.script, output.descriptorName);
34
+ return {
35
+ hash: output.hash,
36
+ index: output.index,
37
+ witnessUtxo: output.witnessUtxo,
38
+ descriptor: descriptorAtIndex,
39
+ };
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3IvT3V0cHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBaUJBLDRDQUVDO0FBRUQsNENBRUM7QUFNRCx3REFFQztBQVNELDBFQXFCQztBQTdERCxvREFBNEI7QUFFNUIsNERBQW9EO0FBRXBELHNDQUE2RTtBQUc3RSxxQ0FBMkQ7QUFVM0QsU0FBZ0IsZ0JBQWdCLENBQW1CLE1BQTZCO0lBQzlFLE9BQU8sWUFBWSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQW1CLE1BQTZCO0lBQzlFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsT0FBZ0Q7SUFDckYsT0FBTyxJQUFBLDBCQUFpQixFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFTRCxTQUFnQiwrQkFBK0IsQ0FDN0MsTUFBOEIsRUFDOUIsYUFBNEI7SUFFNUIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxJQUFBLGdCQUFNLEVBQUMsVUFBVSxZQUFZLDRCQUFVLENBQUMsQ0FBQztJQUN6QyxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0NBQStCLEVBQ3ZELFVBQVUsRUFDVixNQUFNLENBQUMsZUFBZSxFQUN0QixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFDekIsTUFBTSxDQUFDLGNBQWMsQ0FDdEIsQ0FBQztJQUNGLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztRQUMvQixVQUFVLEVBQUUsaUJBQWlCO0tBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tbWluaXNjcmlwdCc7XG5cbmltcG9ydCB7IGdldEZpeGVkT3V0cHV0U3VtLCBNYXhPdXRwdXQsIE91dHB1dCwgUHJldk91dHB1dCB9IGZyb20gJy4uL091dHB1dCc7XG5cbmltcG9ydCB7IERlc2NyaXB0b3JNYXAgfSBmcm9tICcuL0Rlc2NyaXB0b3JNYXAnO1xuaW1wb3J0IHsgZ2V0RGVzY3JpcHRvckF0SW5kZXhDaGVja1NjcmlwdCB9IGZyb20gJy4vZGVyaXZlJztcblxuZXhwb3J0IHR5cGUgV2l0aERlc2NyaXB0b3I8VD4gPSBUICYge1xuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yO1xufTtcblxuZXhwb3J0IHR5cGUgV2l0aE9wdERlc2NyaXB0b3I8VD4gPSBUICYge1xuICBkZXNjcmlwdG9yPzogRGVzY3JpcHRvcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVybmFsT3V0cHV0PFQgZXh0ZW5kcyBvYmplY3Q+KG91dHB1dDogVCB8IFdpdGhEZXNjcmlwdG9yPFQ+KTogb3V0cHV0IGlzIFdpdGhEZXNjcmlwdG9yPFQ+IHtcbiAgcmV0dXJuICdkZXNjcmlwdG9yJyBpbiBvdXRwdXQgJiYgb3V0cHV0LmRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxPdXRwdXQ8VCBleHRlbmRzIG9iamVjdD4ob3V0cHV0OiBUIHwgV2l0aERlc2NyaXB0b3I8VD4pOiBvdXRwdXQgaXMgVCB7XG4gIHJldHVybiAhaXNJbnRlcm5hbE91dHB1dChvdXRwdXQpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdGhlIHN1bSBvZiB0aGUgZXh0ZXJuYWwgb3V0cHV0cyB0aGF0IGFyZSBub3QgJ21heCdcbiAqIEBwYXJhbSBvdXRwdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbEZpeGVkQW1vdW50KG91dHB1dHM6IFdpdGhPcHREZXNjcmlwdG9yPE91dHB1dCB8IE1heE91dHB1dD5bXSk6IGJpZ2ludCB7XG4gIHJldHVybiBnZXRGaXhlZE91dHB1dFN1bShvdXRwdXRzLmZpbHRlcihpc0V4dGVybmFsT3V0cHV0KSk7XG59XG5cbmV4cG9ydCB0eXBlIERlc2NyaXB0b3JXYWxsZXRPdXRwdXQgPSBQcmV2T3V0cHV0ICYge1xuICBkZXNjcmlwdG9yTmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdG9ySW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIERlcml2ZWREZXNjcmlwdG9yV2FsbGV0T3V0cHV0ID0gV2l0aERlc2NyaXB0b3I8UHJldk91dHB1dD47XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rlcml2ZWREZXNjcmlwdG9yV2FsbGV0T3V0cHV0KFxuICBvdXRwdXQ6IERlc2NyaXB0b3JXYWxsZXRPdXRwdXQsXG4gIGRlc2NyaXB0b3JNYXA6IERlc2NyaXB0b3JNYXBcbik6IERlcml2ZWREZXNjcmlwdG9yV2FsbGV0T3V0cHV0IHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JNYXAuZ2V0KG91dHB1dC5kZXNjcmlwdG9yTmFtZSk7XG4gIGlmICghZGVzY3JpcHRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGVzY3JpcHRvciBub3QgZm91bmQ6ICR7b3V0cHV0LmRlc2NyaXB0b3JOYW1lfWApO1xuICB9XG4gIGFzc2VydChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcik7XG4gIGNvbnN0IGRlc2NyaXB0b3JBdEluZGV4ID0gZ2V0RGVzY3JpcHRvckF0SW5kZXhDaGVja1NjcmlwdChcbiAgICBkZXNjcmlwdG9yLFxuICAgIG91dHB1dC5kZXNjcmlwdG9ySW5kZXgsXG4gICAgb3V0cHV0LndpdG5lc3NVdHhvLnNjcmlwdCxcbiAgICBvdXRwdXQuZGVzY3JpcHRvck5hbWVcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBvdXRwdXQuaGFzaCxcbiAgICBpbmRleDogb3V0cHV0LmluZGV4LFxuICAgIHdpdG5lc3NVdHhvOiBvdXRwdXQud2l0bmVzc1V0eG8sXG4gICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvckF0SW5kZXgsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,23 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ import { Descriptor } from '@bitgo/wasm-miniscript';
3
+ import { DescriptorMap } from './DescriptorMap';
4
+ export declare function getInputVSizesForDescriptors(descriptors: DescriptorMap): Record<string, number>;
5
+ export declare function getChangeOutputVSizesForDescriptor(d: Descriptor): {
6
+ inputVSize: number;
7
+ outputVSize: number;
8
+ };
9
+ type InputWithDescriptorName = {
10
+ descriptorName: string;
11
+ };
12
+ type OutputWithScript = {
13
+ script: Buffer;
14
+ };
15
+ type Tx<TInput> = {
16
+ inputs: TInput[];
17
+ outputs: OutputWithScript[];
18
+ };
19
+ export declare function getVirtualSize(tx: Tx<Descriptor>): number;
20
+ export declare function getVirtualSize(tx: Tx<InputWithDescriptorName>, descriptors: DescriptorMap): number;
21
+ export declare function getVirtualSizeEstimateForPsbt(psbt: utxolib.Psbt, descriptorMap: DescriptorMap): number;
22
+ export {};
23
+ //# sourceMappingURL=VirtualSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualSize.d.ts","sourceRoot":"","sources":["../../../src/descriptor/VirtualSize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAkDhD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/F;AAED,wBAAgB,kCAAkC,CAAC,CAAC,EAAE,UAAU,GAAG;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAKA;AAED,KAAK,uBAAuB,GAAG;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,KAAK,gBAAgB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,KAAK,EAAE,CAAC,MAAM,IAAI;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;AAC3D,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,WAAW,EAAE,aAAa,GAAG,MAAM,CAAC;AA6BpG,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CAUtG"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInputVSizesForDescriptors = getInputVSizesForDescriptors;
4
+ exports.getChangeOutputVSizesForDescriptor = getChangeOutputVSizesForDescriptor;
5
+ exports.getVirtualSize = getVirtualSize;
6
+ exports.getVirtualSizeEstimateForPsbt = getVirtualSizeEstimateForPsbt;
7
+ const unspents_1 = require("@bitgo-beta/unspents");
8
+ const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
9
+ const psbt_1 = require("./psbt");
10
+ function getScriptPubKeyLength(descType) {
11
+ // See https://bitcoinops.org/en/tools/calc-size/
12
+ switch (descType) {
13
+ case 'Wpkh':
14
+ // https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#p2wpkh
15
+ return 22;
16
+ case 'Sh':
17
+ case 'ShWsh':
18
+ case 'ShWpkh':
19
+ // https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki#specification
20
+ return 23;
21
+ case 'Pkh':
22
+ return 25;
23
+ case 'Wsh':
24
+ case 'Tr':
25
+ // P2WSH: https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#p2wsh
26
+ // P2TR: https://github.com/bitcoin/bips/blob/58ffd93812ff25e87d53d1f202fbb389fdfb85bb/bip-0341.mediawiki#script-validation-rules
27
+ // > A Taproot output is a native SegWit output (see BIP141) with version number 1, and a 32-byte witness program.
28
+ // 32 bytes for the hash, 1 byte for the version, 1 byte for the push opcode
29
+ return 34;
30
+ case 'Bare':
31
+ throw new Error('cannot determine scriptPubKey length for Bare descriptor');
32
+ default:
33
+ throw new Error('unexpected descriptor type ' + descType);
34
+ }
35
+ }
36
+ function getInputVSizeForDescriptor(descriptor) {
37
+ // FIXME(BTC-1489): this can overestimate the size of the input significantly
38
+ const maxWeight = descriptor.maxWeightToSatisfy();
39
+ const maxVSize = Math.ceil(maxWeight / 4);
40
+ const sizeOpPushdata1 = 1;
41
+ const sizeOpPushdata2 = 2;
42
+ return (
43
+ // inputId
44
+ 32 +
45
+ // vOut
46
+ 4 +
47
+ // nSequence
48
+ 4 +
49
+ // script overhead
50
+ (maxVSize < 255 ? sizeOpPushdata1 : sizeOpPushdata2) +
51
+ // script
52
+ maxVSize);
53
+ }
54
+ function getInputVSizesForDescriptors(descriptors) {
55
+ return Object.fromEntries(Array.from(descriptors.entries()).map(([name, d]) => {
56
+ return [name, getInputVSizeForDescriptor(d)];
57
+ }));
58
+ }
59
+ function getChangeOutputVSizesForDescriptor(d) {
60
+ return {
61
+ inputVSize: getInputVSizeForDescriptor(d),
62
+ outputVSize: getScriptPubKeyLength(d.descType()),
63
+ };
64
+ }
65
+ function getVirtualSize(tx, descriptorMap) {
66
+ const lookup = descriptorMap ? getInputVSizesForDescriptors(descriptorMap) : undefined;
67
+ const inputVSize = tx.inputs.reduce((sum, input) => {
68
+ if (input instanceof wasm_miniscript_1.Descriptor) {
69
+ return sum + getInputVSizeForDescriptor(input);
70
+ }
71
+ if ('descriptorName' in input) {
72
+ if (!lookup) {
73
+ throw new Error('missing descriptorMap');
74
+ }
75
+ const vsize = lookup[input.descriptorName];
76
+ if (!vsize) {
77
+ throw new Error(`Could not find descriptor ${input.descriptorName}`);
78
+ }
79
+ return sum + vsize;
80
+ }
81
+ throw new Error('unexpected input');
82
+ }, 0);
83
+ const outputVSize = tx.outputs.reduce((sum, o) => {
84
+ return sum + unspents_1.Dimensions.getVSizeForOutputWithScriptLength(o.script.length);
85
+ }, 0);
86
+ // we will just assume that we have at least one segwit input
87
+ return inputVSize + outputVSize + unspents_1.VirtualSizes.txSegOverheadVSize;
88
+ }
89
+ function getVirtualSizeEstimateForPsbt(psbt, descriptorMap) {
90
+ const inputs = psbt.data.inputs.map((i) => {
91
+ const result = (0, psbt_1.findDescriptorForInput)(i, descriptorMap);
92
+ if (!result) {
93
+ throw new Error('Could not find descriptor for input');
94
+ }
95
+ return result.descriptor;
96
+ });
97
+ const outputs = psbt.txOutputs.map((o) => ({ script: o.script }));
98
+ return getVirtualSize({ inputs, outputs });
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlydHVhbFNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9WaXJ0dWFsU2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXNEQSxvRUFNQztBQUVELGdGQVFDO0FBWUQsd0NBMEJDO0FBRUQsc0VBVUM7QUF2SEQsbURBQWdFO0FBQ2hFLDREQUFvRDtBQUdwRCxpQ0FBZ0Q7QUFFaEQsU0FBUyxxQkFBcUIsQ0FBQyxRQUFnQjtJQUM3QyxpREFBaUQ7SUFDakQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU07WUFDVCx3RUFBd0U7WUFDeEUsT0FBTyxFQUFFLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxRQUFRO1lBQ1gsK0VBQStFO1lBQy9FLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssSUFBSTtZQUNQLDhFQUE4RTtZQUM5RSxpSUFBaUk7WUFDakksa0hBQWtIO1lBQ2xILDRFQUE0RTtZQUM1RSxPQUFPLEVBQUUsQ0FBQztRQUNaLEtBQUssTUFBTTtZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUM5RTtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDOUQsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLFVBQXNCO0lBQ3hELDZFQUE2RTtJQUM3RSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNsRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDMUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE9BQU87SUFDTCxVQUFVO0lBQ1YsRUFBRTtRQUNGLE9BQU87UUFDUCxDQUFDO1FBQ0QsWUFBWTtRQUNaLENBQUM7UUFDRCxrQkFBa0I7UUFDbEIsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUNwRCxTQUFTO1FBQ1QsUUFBUSxDQUNULENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsNEJBQTRCLENBQUMsV0FBMEI7SUFDckUsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbEQsT0FBTyxDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0Isa0NBQWtDLENBQUMsQ0FBYTtJQUk5RCxPQUFPO1FBQ0wsVUFBVSxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUN6QyxXQUFXLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBWUQsU0FBZ0IsY0FBYyxDQUM1QixFQUFnRCxFQUNoRCxhQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkYsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDakQsSUFBSSxLQUFLLFlBQVksNEJBQVUsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLGdCQUFnQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDTixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxPQUFPLEdBQUcsR0FBRyxxQkFBVSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0UsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ04sNkRBQTZEO0lBQzdELE9BQU8sVUFBVSxHQUFHLFdBQVcsR0FBRyx1QkFBWSxDQUFDLGtCQUFrQixDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFnQiw2QkFBNkIsQ0FBQyxJQUFrQixFQUFFLGFBQTRCO0lBQzVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUEsNkJBQXNCLEVBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMsIFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcbmltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgRGVzY3JpcHRvck1hcCB9IGZyb20gJy4vRGVzY3JpcHRvck1hcCc7XG5pbXBvcnQgeyBmaW5kRGVzY3JpcHRvckZvcklucHV0IH0gZnJvbSAnLi9wc2J0JztcblxuZnVuY3Rpb24gZ2V0U2NyaXB0UHViS2V5TGVuZ3RoKGRlc2NUeXBlOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBTZWUgaHR0cHM6Ly9iaXRjb2lub3BzLm9yZy9lbi90b29scy9jYWxjLXNpemUvXG4gIHN3aXRjaCAoZGVzY1R5cGUpIHtcbiAgICBjYXNlICdXcGtoJzpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNDEubWVkaWF3aWtpI3Ayd3BraFxuICAgICAgcmV0dXJuIDIyO1xuICAgIGNhc2UgJ1NoJzpcbiAgICBjYXNlICdTaFdzaCc6XG4gICAgY2FzZSAnU2hXcGtoJzpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAwMTYubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgICAgIHJldHVybiAyMztcbiAgICBjYXNlICdQa2gnOlxuICAgICAgcmV0dXJuIDI1O1xuICAgIGNhc2UgJ1dzaCc6XG4gICAgY2FzZSAnVHInOlxuICAgICAgLy8gUDJXU0g6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNDEubWVkaWF3aWtpI3Ayd3NoXG4gICAgICAvLyBQMlRSOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvNThmZmQ5MzgxMmZmMjVlODdkNTNkMWYyMDJmYmIzODlmZGZiODViYi9iaXAtMDM0MS5tZWRpYXdpa2kjc2NyaXB0LXZhbGlkYXRpb24tcnVsZXNcbiAgICAgIC8vID4gQSBUYXByb290IG91dHB1dCBpcyBhIG5hdGl2ZSBTZWdXaXQgb3V0cHV0IChzZWUgQklQMTQxKSB3aXRoIHZlcnNpb24gbnVtYmVyIDEsIGFuZCBhIDMyLWJ5dGUgd2l0bmVzcyBwcm9ncmFtLlxuICAgICAgLy8gMzIgYnl0ZXMgZm9yIHRoZSBoYXNoLCAxIGJ5dGUgZm9yIHRoZSB2ZXJzaW9uLCAxIGJ5dGUgZm9yIHRoZSBwdXNoIG9wY29kZVxuICAgICAgcmV0dXJuIDM0O1xuICAgIGNhc2UgJ0JhcmUnOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZGV0ZXJtaW5lIHNjcmlwdFB1YktleSBsZW5ndGggZm9yIEJhcmUgZGVzY3JpcHRvcicpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZGVzY3JpcHRvciB0eXBlICcgKyBkZXNjVHlwZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRWU2l6ZUZvckRlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvcik6IG51bWJlciB7XG4gIC8vIEZJWE1FKEJUQy0xNDg5KTogdGhpcyBjYW4gb3ZlcmVzdGltYXRlIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzaWduaWZpY2FudGx5XG4gIGNvbnN0IG1heFdlaWdodCA9IGRlc2NyaXB0b3IubWF4V2VpZ2h0VG9TYXRpc2Z5KCk7XG4gIGNvbnN0IG1heFZTaXplID0gTWF0aC5jZWlsKG1heFdlaWdodCAvIDQpO1xuICBjb25zdCBzaXplT3BQdXNoZGF0YTEgPSAxO1xuICBjb25zdCBzaXplT3BQdXNoZGF0YTIgPSAyO1xuICByZXR1cm4gKFxuICAgIC8vIGlucHV0SWRcbiAgICAzMiArXG4gICAgLy8gdk91dFxuICAgIDQgK1xuICAgIC8vIG5TZXF1ZW5jZVxuICAgIDQgK1xuICAgIC8vIHNjcmlwdCBvdmVyaGVhZFxuICAgIChtYXhWU2l6ZSA8IDI1NSA/IHNpemVPcFB1c2hkYXRhMSA6IHNpemVPcFB1c2hkYXRhMikgK1xuICAgIC8vIHNjcmlwdFxuICAgIG1heFZTaXplXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnB1dFZTaXplc0ZvckRlc2NyaXB0b3JzKGRlc2NyaXB0b3JzOiBEZXNjcmlwdG9yTWFwKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgQXJyYXkuZnJvbShkZXNjcmlwdG9ycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIGRdKSA9PiB7XG4gICAgICByZXR1cm4gW25hbWUsIGdldElucHV0VlNpemVGb3JEZXNjcmlwdG9yKGQpXTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbmdlT3V0cHV0VlNpemVzRm9yRGVzY3JpcHRvcihkOiBEZXNjcmlwdG9yKToge1xuICBpbnB1dFZTaXplOiBudW1iZXI7XG4gIG91dHB1dFZTaXplOiBudW1iZXI7XG59IHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFZTaXplOiBnZXRJbnB1dFZTaXplRm9yRGVzY3JpcHRvcihkKSxcbiAgICBvdXRwdXRWU2l6ZTogZ2V0U2NyaXB0UHViS2V5TGVuZ3RoKGQuZGVzY1R5cGUoKSksXG4gIH07XG59XG5cbnR5cGUgSW5wdXRXaXRoRGVzY3JpcHRvck5hbWUgPSB7IGRlc2NyaXB0b3JOYW1lOiBzdHJpbmcgfTtcbnR5cGUgT3V0cHV0V2l0aFNjcmlwdCA9IHsgc2NyaXB0OiBCdWZmZXIgfTtcblxudHlwZSBUeDxUSW5wdXQ+ID0ge1xuICBpbnB1dHM6IFRJbnB1dFtdO1xuICBvdXRwdXRzOiBPdXRwdXRXaXRoU2NyaXB0W107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlydHVhbFNpemUodHg6IFR4PERlc2NyaXB0b3I+KTogbnVtYmVyO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpcnR1YWxTaXplKHR4OiBUeDxJbnB1dFdpdGhEZXNjcmlwdG9yTmFtZT4sIGRlc2NyaXB0b3JzOiBEZXNjcmlwdG9yTWFwKTogbnVtYmVyO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpcnR1YWxTaXplKFxuICB0eDogVHg8RGVzY3JpcHRvcj4gfCBUeDxJbnB1dFdpdGhEZXNjcmlwdG9yTmFtZT4sXG4gIGRlc2NyaXB0b3JNYXA/OiBEZXNjcmlwdG9yTWFwXG4pOiBudW1iZXIge1xuICBjb25zdCBsb29rdXAgPSBkZXNjcmlwdG9yTWFwID8gZ2V0SW5wdXRWU2l6ZXNGb3JEZXNjcmlwdG9ycyhkZXNjcmlwdG9yTWFwKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaW5wdXRWU2l6ZSA9IHR4LmlucHV0cy5yZWR1Y2UoKHN1bSwgaW5wdXQpID0+IHtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7XG4gICAgICByZXR1cm4gc3VtICsgZ2V0SW5wdXRWU2l6ZUZvckRlc2NyaXB0b3IoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoJ2Rlc2NyaXB0b3JOYW1lJyBpbiBpbnB1dCkge1xuICAgICAgaWYgKCFsb29rdXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGRlc2NyaXB0b3JNYXAnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZzaXplID0gbG9va3VwW2lucHV0LmRlc2NyaXB0b3JOYW1lXTtcbiAgICAgIGlmICghdnNpemUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBkZXNjcmlwdG9yICR7aW5wdXQuZGVzY3JpcHRvck5hbWV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VtICsgdnNpemU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBpbnB1dCcpO1xuICB9LCAwKTtcbiAgY29uc3Qgb3V0cHV0VlNpemUgPSB0eC5vdXRwdXRzLnJlZHVjZSgoc3VtLCBvKSA9PiB7XG4gICAgcmV0dXJuIHN1bSArIERpbWVuc2lvbnMuZ2V0VlNpemVGb3JPdXRwdXRXaXRoU2NyaXB0TGVuZ3RoKG8uc2NyaXB0Lmxlbmd0aCk7XG4gIH0sIDApO1xuICAvLyB3ZSB3aWxsIGp1c3QgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgc2Vnd2l0IGlucHV0XG4gIHJldHVybiBpbnB1dFZTaXplICsgb3V0cHV0VlNpemUgKyBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmlydHVhbFNpemVFc3RpbWF0ZUZvclBzYnQocHNidDogdXR4b2xpYi5Qc2J0LCBkZXNjcmlwdG9yTWFwOiBEZXNjcmlwdG9yTWFwKTogbnVtYmVyIHtcbiAgY29uc3QgaW5wdXRzID0gcHNidC5kYXRhLmlucHV0cy5tYXAoKGkpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBmaW5kRGVzY3JpcHRvckZvcklucHV0KGksIGRlc2NyaXB0b3JNYXApO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGRlc2NyaXB0b3IgZm9yIGlucHV0Jyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuZGVzY3JpcHRvcjtcbiAgfSk7XG4gIGNvbnN0IG91dHB1dHMgPSBwc2J0LnR4T3V0cHV0cy5tYXAoKG8pID0+ICh7IHNjcmlwdDogby5zY3JpcHQgfSkpO1xuICByZXR1cm4gZ2V0VmlydHVhbFNpemUoeyBpbnB1dHMsIG91dHB1dHMgfSk7XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import { Descriptor } from '@bitgo/wasm-miniscript';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ export declare function createScriptPubKeyFromDescriptor(descriptor: Descriptor, index: number | undefined): Buffer;
4
+ export declare function createAddressFromDescriptor(descriptor: Descriptor, index: number | undefined, network: utxolib.Network): string;
5
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/descriptor/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK1G;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,MAAM,CAER"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createScriptPubKeyFromDescriptor = createScriptPubKeyFromDescriptor;
37
+ exports.createAddressFromDescriptor = createAddressFromDescriptor;
38
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
39
+ function createScriptPubKeyFromDescriptor(descriptor, index) {
40
+ if (index === undefined) {
41
+ return Buffer.from(descriptor.scriptPubkey());
42
+ }
43
+ return createScriptPubKeyFromDescriptor(descriptor.atDerivationIndex(index), undefined);
44
+ }
45
+ function createAddressFromDescriptor(descriptor, index, network) {
46
+ return utxolib.address.fromOutputScript(createScriptPubKeyFromDescriptor(descriptor, index), network);
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNjcmlwdG9yL2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSw0RUFLQztBQUVELGtFQU1DO0FBZkQsOERBQWdEO0FBRWhELFNBQWdCLGdDQUFnQyxDQUFDLFVBQXNCLEVBQUUsS0FBeUI7SUFDaEcsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCLENBQ3pDLFVBQXNCLEVBQ3RCLEtBQXlCLEVBQ3pCLE9BQXdCO0lBRXhCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NyaXB0UHViS2V5RnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvciwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCk6IEJ1ZmZlciB7XG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCkpO1xuICB9XG4gIHJldHVybiBjcmVhdGVTY3JpcHRQdWJLZXlGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KGluZGV4KSwgdW5kZWZpbmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkZHJlc3NGcm9tRGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiBzdHJpbmcge1xuICByZXR1cm4gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoY3JlYXRlU2NyaXB0UHViS2V5RnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvciwgaW5kZXgpLCBuZXR3b3JrKTtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { Descriptor } from '@bitgo/wasm-miniscript';
2
+ /**
3
+ * Get a descriptor at a specific derivation index.
4
+ * For wildcard descriptors (containing '*'), the index is required and used for derivation.
5
+ * For definite descriptors (not containing '*'), no index should be provided.
6
+ * @param descriptor - The descriptor to derive from
7
+ * @param index - The derivation index for wildcard descriptors
8
+ * @returns A new descriptor at the specified index for wildcard descriptors, or the original descriptor for definite ones
9
+ * @throws {Error} If index is undefined for a wildcard descriptor or if index is provided for a definite descriptor
10
+ */
11
+ export declare function getDescriptorAtIndex(descriptor: Descriptor, index: number | undefined): Descriptor;
12
+ export declare function getDescriptorAtIndexCheckScript(descriptor: Descriptor, index: number | undefined, script: Buffer, descriptorString?: string): Descriptor;
13
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../../src/descriptor/derive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAelG;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,EACd,gBAAgB,SAAwB,GACvC,UAAU,CAQZ"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDescriptorAtIndex = getDescriptorAtIndex;
7
+ exports.getDescriptorAtIndexCheckScript = getDescriptorAtIndexCheckScript;
8
+ const assert_1 = __importDefault(require("assert"));
9
+ const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
10
+ /**
11
+ * Get a descriptor at a specific derivation index.
12
+ * For wildcard descriptors (containing '*'), the index is required and used for derivation.
13
+ * For definite descriptors (not containing '*'), no index should be provided.
14
+ * @param descriptor - The descriptor to derive from
15
+ * @param index - The derivation index for wildcard descriptors
16
+ * @returns A new descriptor at the specified index for wildcard descriptors, or the original descriptor for definite ones
17
+ * @throws {Error} If index is undefined for a wildcard descriptor or if index is provided for a definite descriptor
18
+ */
19
+ function getDescriptorAtIndex(descriptor, index) {
20
+ (0, assert_1.default)(descriptor instanceof wasm_miniscript_1.Descriptor);
21
+ wasm_miniscript_1.Descriptor.fromString(descriptor.toString(), 'derivable');
22
+ descriptor = wasm_miniscript_1.Descriptor.fromStringDetectType(descriptor.toString());
23
+ if (descriptor.hasWildcard()) {
24
+ if (index === undefined) {
25
+ throw new Error('Derivable descriptor requires an index');
26
+ }
27
+ return descriptor.atDerivationIndex(index);
28
+ }
29
+ else {
30
+ if (index !== undefined) {
31
+ throw new Error('Definite descriptor cannot be derived with index');
32
+ }
33
+ return descriptor;
34
+ }
35
+ }
36
+ function getDescriptorAtIndexCheckScript(descriptor, index, script, descriptorString = descriptor.toString()) {
37
+ (0, assert_1.default)(descriptor instanceof wasm_miniscript_1.Descriptor);
38
+ const descriptorAtIndex = getDescriptorAtIndex(descriptor, index);
39
+ if (!script.equals(descriptorAtIndex.scriptPubkey())) {
40
+ throw new Error(`Script mismatch: descriptor ${descriptorString} script=${script.toString('hex')}`);
41
+ }
42
+ (0, assert_1.default)(descriptorAtIndex instanceof wasm_miniscript_1.Descriptor);
43
+ return descriptorAtIndex;
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3IvZGVyaXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBYUEsb0RBZUM7QUFFRCwwRUFhQztBQTNDRCxvREFBNEI7QUFFNUIsNERBQW9EO0FBRXBEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsVUFBc0IsRUFBRSxLQUF5QjtJQUNwRixJQUFBLGdCQUFNLEVBQUMsVUFBVSxZQUFZLDRCQUFVLENBQUMsQ0FBQztJQUN6Qyw0QkFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsVUFBVSxHQUFHLDRCQUFVLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEUsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUM3QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLCtCQUErQixDQUM3QyxVQUFzQixFQUN0QixLQUF5QixFQUN6QixNQUFjLEVBQ2QsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRTtJQUV4QyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxZQUFZLDRCQUFVLENBQUMsQ0FBQztJQUN6QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsZ0JBQWdCLFdBQVcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUNELElBQUEsZ0JBQU0sRUFBQyxpQkFBaUIsWUFBWSw0QkFBVSxDQUFDLENBQUM7SUFDaEQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tbWluaXNjcmlwdCc7XG5cbi8qKlxuICogR2V0IGEgZGVzY3JpcHRvciBhdCBhIHNwZWNpZmljIGRlcml2YXRpb24gaW5kZXguXG4gKiBGb3Igd2lsZGNhcmQgZGVzY3JpcHRvcnMgKGNvbnRhaW5pbmcgJyonKSwgdGhlIGluZGV4IGlzIHJlcXVpcmVkIGFuZCB1c2VkIGZvciBkZXJpdmF0aW9uLlxuICogRm9yIGRlZmluaXRlIGRlc2NyaXB0b3JzIChub3QgY29udGFpbmluZyAnKicpLCBubyBpbmRleCBzaG91bGQgYmUgcHJvdmlkZWQuXG4gKiBAcGFyYW0gZGVzY3JpcHRvciAtIFRoZSBkZXNjcmlwdG9yIHRvIGRlcml2ZSBmcm9tXG4gKiBAcGFyYW0gaW5kZXggLSBUaGUgZGVyaXZhdGlvbiBpbmRleCBmb3Igd2lsZGNhcmQgZGVzY3JpcHRvcnNcbiAqIEByZXR1cm5zIEEgbmV3IGRlc2NyaXB0b3IgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmb3Igd2lsZGNhcmQgZGVzY3JpcHRvcnMsIG9yIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIGZvciBkZWZpbml0ZSBvbmVzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaW5kZXggaXMgdW5kZWZpbmVkIGZvciBhIHdpbGRjYXJkIGRlc2NyaXB0b3Igb3IgaWYgaW5kZXggaXMgcHJvdmlkZWQgZm9yIGEgZGVmaW5pdGUgZGVzY3JpcHRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckF0SW5kZXgoZGVzY3JpcHRvcjogRGVzY3JpcHRvciwgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3Ige1xuICBhc3NlcnQoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpO1xuICBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvci50b1N0cmluZygpLCAnZGVyaXZhYmxlJyk7XG4gIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmdEZXRlY3RUeXBlKGRlc2NyaXB0b3IudG9TdHJpbmcoKSk7XG4gIGlmIChkZXNjcmlwdG9yLmhhc1dpbGRjYXJkKCkpIHtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXJpdmFibGUgZGVzY3JpcHRvciByZXF1aXJlcyBhbiBpbmRleCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChpbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVmaW5pdGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgZGVyaXZlZCB3aXRoIGluZGV4Jyk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdG9yQXRJbmRleENoZWNrU2NyaXB0KFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLFxuICBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBzY3JpcHQ6IEJ1ZmZlcixcbiAgZGVzY3JpcHRvclN0cmluZyA9IGRlc2NyaXB0b3IudG9TdHJpbmcoKVxuKTogRGVzY3JpcHRvciB7XG4gIGFzc2VydChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvcik7XG4gIGNvbnN0IGRlc2NyaXB0b3JBdEluZGV4ID0gZ2V0RGVzY3JpcHRvckF0SW5kZXgoZGVzY3JpcHRvciwgaW5kZXgpO1xuICBpZiAoIXNjcmlwdC5lcXVhbHMoZGVzY3JpcHRvckF0SW5kZXguc2NyaXB0UHVia2V5KCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgbWlzbWF0Y2g6IGRlc2NyaXB0b3IgJHtkZXNjcmlwdG9yU3RyaW5nfSBzY3JpcHQ9JHtzY3JpcHQudG9TdHJpbmcoJ2hleCcpfWApO1xuICB9XG4gIGFzc2VydChkZXNjcmlwdG9yQXRJbmRleCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpO1xuICByZXR1cm4gZGVzY3JpcHRvckF0SW5kZXg7XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ import { Descriptor } from '@bitgo/wasm-miniscript';
3
+ /**
4
+ * Get a standard output descriptor that corresponds to the proprietary HD wallet setup
5
+ * used in BitGo wallets.
6
+ * Only supports a subset of script types.
7
+ */
8
+ export declare function getDescriptorForScriptType(rootWalletKeys: utxolib.bitgo.RootWalletKeys, scriptType: 'p2sh' | 'p2shP2wsh' | 'p2wsh', scope: 'internal' | 'external'): Descriptor;
9
+ /**
10
+ * Get a map of named descriptors for the given root wallet keys.
11
+ * Unsupported script types will have a value of null.
12
+ * Currently supports p2sh, p2shP2wsh, and p2wsh script types.
13
+ * @param rootWalletKeys
14
+ */
15
+ export declare function getNamedDescriptorsForRootWalletKeys(rootWalletKeys: utxolib.bitgo.RootWalletKeys): Map<string, Descriptor | null>;
16
+ //# sourceMappingURL=fromFixedScriptWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromFixedScriptWallet.d.ts","sourceRoot":"","sources":["../../../src/descriptor/fromFixedScriptWallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAO,MAAM,wBAAwB,CAAC;AAYzD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAC5C,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,EAC1C,KAAK,EAAE,UAAU,GAAG,UAAU,GAC7B,UAAU,CAkBZ;AAQD;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,GAC3C,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC,CAUhC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getDescriptorForScriptType = getDescriptorForScriptType;
37
+ exports.getNamedDescriptorsForRootWalletKeys = getNamedDescriptorsForRootWalletKeys;
38
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
39
+ const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
40
+ /** Expand a template with the given root wallet keys and chain code */
41
+ function expand(rootWalletKeys, keyIndex, chainCode) {
42
+ if (keyIndex !== 0 && keyIndex !== 1 && keyIndex !== 2) {
43
+ throw new Error('Invalid key index');
44
+ }
45
+ const xpub = rootWalletKeys.triple[keyIndex].neutered().toBase58();
46
+ const prefix = rootWalletKeys.derivationPrefixes[keyIndex];
47
+ return xpub + '/' + prefix + '/' + chainCode + '/*';
48
+ }
49
+ /**
50
+ * Get a standard output descriptor that corresponds to the proprietary HD wallet setup
51
+ * used in BitGo wallets.
52
+ * Only supports a subset of script types.
53
+ */
54
+ function getDescriptorForScriptType(rootWalletKeys, scriptType, scope) {
55
+ const chain = scope === 'external'
56
+ ? utxolib.bitgo.getExternalChainCode(scriptType)
57
+ : utxolib.bitgo.getInternalChainCode(scriptType);
58
+ const multi = {
59
+ multi: [2, ...rootWalletKeys.triple.map((_, i) => expand(rootWalletKeys, i, chain))],
60
+ };
61
+ switch (scriptType) {
62
+ case 'p2sh':
63
+ return wasm_miniscript_1.Descriptor.fromString(wasm_miniscript_1.ast.formatNode({ sh: multi }), 'derivable');
64
+ case 'p2shP2wsh':
65
+ return wasm_miniscript_1.Descriptor.fromString(wasm_miniscript_1.ast.formatNode({ sh: { wsh: multi } }), 'derivable');
66
+ case 'p2wsh':
67
+ return wasm_miniscript_1.Descriptor.fromString(wasm_miniscript_1.ast.formatNode({ wsh: multi }), 'derivable');
68
+ default:
69
+ throw new Error(`Unsupported script type ${scriptType}`);
70
+ }
71
+ }
72
+ function isSupportedScriptType(scriptType) {
73
+ return ['p2sh', 'p2shP2wsh', 'p2wsh'].includes(scriptType);
74
+ }
75
+ /**
76
+ * Get a map of named descriptors for the given root wallet keys.
77
+ * Unsupported script types will have a value of null.
78
+ * Currently supports p2sh, p2shP2wsh, and p2wsh script types.
79
+ * @param rootWalletKeys
80
+ */
81
+ function getNamedDescriptorsForRootWalletKeys(rootWalletKeys) {
82
+ const scopes = ['external', 'internal'];
83
+ return new Map(utxolib.bitgo.outputScripts.scriptTypes2Of3.flatMap((scriptType) => scopes.map((scope) => [
84
+ `${scriptType}/${scope}`,
85
+ isSupportedScriptType(scriptType) ? getDescriptorForScriptType(rootWalletKeys, scriptType, scope) : null,
86
+ ])));
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbUZpeGVkU2NyaXB0V2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Rlc2NyaXB0b3IvZnJvbUZpeGVkU2NyaXB0V2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLGdFQXNCQztBQWNELG9GQVlDO0FBbEVELDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFFekQsdUVBQXVFO0FBQ3ZFLFNBQVMsTUFBTSxDQUFDLGNBQTRDLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtJQUMvRixJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLGNBQTRDLEVBQzVDLFVBQTBDLEVBQzFDLEtBQThCO0lBRTlCLE1BQU0sS0FBSyxHQUNULEtBQUssS0FBSyxVQUFVO1FBQ2xCLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUNoRCxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FBdUI7UUFDaEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ3JGLENBQUM7SUFDRixRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssTUFBTTtZQUNULE9BQU8sNEJBQVUsQ0FBQyxVQUFVLENBQUMscUJBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzRSxLQUFLLFdBQVc7WUFDZCxPQUFPLDRCQUFVLENBQUMsVUFBVSxDQUFDLHFCQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRixLQUFLLE9BQU87WUFDVixPQUFPLDRCQUFVLENBQUMsVUFBVSxDQUFDLHFCQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUU7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsVUFBc0Q7SUFFdEQsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLG9DQUFvQyxDQUNsRCxjQUE0QztJQUU1QyxNQUFNLE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQVUsQ0FBQztJQUNqRCxPQUFPLElBQUksR0FBRyxDQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwQixHQUFHLFVBQVUsSUFBSSxLQUFLLEVBQUU7UUFDeEIscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7S0FDekcsQ0FBQyxDQUNILENBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLW1pbmlzY3JpcHQnO1xuXG4vKiogRXhwYW5kIGEgdGVtcGxhdGUgd2l0aCB0aGUgZ2l2ZW4gcm9vdCB3YWxsZXQga2V5cyBhbmQgY2hhaW4gY29kZSAqL1xuZnVuY3Rpb24gZXhwYW5kKHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLCBrZXlJbmRleDogbnVtYmVyLCBjaGFpbkNvZGU6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChrZXlJbmRleCAhPT0gMCAmJiBrZXlJbmRleCAhPT0gMSAmJiBrZXlJbmRleCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgaW5kZXgnKTtcbiAgfVxuICBjb25zdCB4cHViID0gcm9vdFdhbGxldEtleXMudHJpcGxlW2tleUluZGV4XS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gIGNvbnN0IHByZWZpeCA9IHJvb3RXYWxsZXRLZXlzLmRlcml2YXRpb25QcmVmaXhlc1trZXlJbmRleF07XG4gIHJldHVybiB4cHViICsgJy8nICsgcHJlZml4ICsgJy8nICsgY2hhaW5Db2RlICsgJy8qJztcbn1cblxuLyoqXG4gKiBHZXQgYSBzdGFuZGFyZCBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9wcmlldGFyeSBIRCB3YWxsZXQgc2V0dXBcbiAqIHVzZWQgaW4gQml0R28gd2FsbGV0cy5cbiAqIE9ubHkgc3VwcG9ydHMgYSBzdWJzZXQgb2Ygc2NyaXB0IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvckZvclNjcmlwdFR5cGUoXG4gIHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBzY3JpcHRUeXBlOiAncDJzaCcgfCAncDJzaFAyd3NoJyB8ICdwMndzaCcsXG4gIHNjb3BlOiAnaW50ZXJuYWwnIHwgJ2V4dGVybmFsJ1xuKTogRGVzY3JpcHRvciB7XG4gIGNvbnN0IGNoYWluID1cbiAgICBzY29wZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgPyB1dHhvbGliLmJpdGdvLmdldEV4dGVybmFsQ2hhaW5Db2RlKHNjcmlwdFR5cGUpXG4gICAgICA6IHV0eG9saWIuYml0Z28uZ2V0SW50ZXJuYWxDaGFpbkNvZGUoc2NyaXB0VHlwZSk7XG4gIGNvbnN0IG11bHRpOiBhc3QuTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgbXVsdGk6IFsyLCAuLi5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChfLCBpKSA9PiBleHBhbmQocm9vdFdhbGxldEtleXMsIGksIGNoYWluKSldLFxuICB9O1xuICBzd2l0Y2ggKHNjcmlwdFR5cGUpIHtcbiAgICBjYXNlICdwMnNoJzpcbiAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21TdHJpbmcoYXN0LmZvcm1hdE5vZGUoeyBzaDogbXVsdGkgfSksICdkZXJpdmFibGUnKTtcbiAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbVN0cmluZyhhc3QuZm9ybWF0Tm9kZSh7IHNoOiB7IHdzaDogbXVsdGkgfSB9KSwgJ2Rlcml2YWJsZScpO1xuICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21TdHJpbmcoYXN0LmZvcm1hdE5vZGUoeyB3c2g6IG11bHRpIH0pLCAnZGVyaXZhYmxlJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2NyaXB0IHR5cGUgJHtzY3JpcHRUeXBlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkU2NyaXB0VHlwZShcbiAgc2NyaXB0VHlwZTogdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGUyT2YzXG4pOiBzY3JpcHRUeXBlIGlzICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB7XG4gIHJldHVybiBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ10uaW5jbHVkZXMoc2NyaXB0VHlwZSk7XG59XG5cbi8qKlxuICogR2V0IGEgbWFwIG9mIG5hbWVkIGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4gcm9vdCB3YWxsZXQga2V5cy5cbiAqIFVuc3VwcG9ydGVkIHNjcmlwdCB0eXBlcyB3aWxsIGhhdmUgYSB2YWx1ZSBvZiBudWxsLlxuICogQ3VycmVudGx5IHN1cHBvcnRzIHAyc2gsIHAyc2hQMndzaCwgYW5kIHAyd3NoIHNjcmlwdCB0eXBlcy5cbiAqIEBwYXJhbSByb290V2FsbGV0S2V5c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWREZXNjcmlwdG9yc0ZvclJvb3RXYWxsZXRLZXlzKFxuICByb290V2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5c1xuKTogTWFwPHN0cmluZywgRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgY29uc3Qgc2NvcGVzID0gWydleHRlcm5hbCcsICdpbnRlcm5hbCddIGFzIGNvbnN0O1xuICByZXR1cm4gbmV3IE1hcChcbiAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZsYXRNYXAoKHNjcmlwdFR5cGUpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4gW1xuICAgICAgICBgJHtzY3JpcHRUeXBlfS8ke3Njb3BlfWAsXG4gICAgICAgIGlzU3VwcG9ydGVkU2NyaXB0VHlwZShzY3JpcHRUeXBlKSA/IGdldERlc2NyaXB0b3JGb3JTY3JpcHRUeXBlKHJvb3RXYWxsZXRLZXlzLCBzY3JpcHRUeXBlLCBzY29wZSkgOiBudWxsLFxuICAgICAgXSlcbiAgICApXG4gICk7XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ export * from './psbt';
2
+ export * from './address';
3
+ export * from './DescriptorMap';
4
+ export * from './derive';
5
+ export * from './Output';
6
+ export * from './VirtualSize';
7
+ export * from './fromFixedScriptWallet';
8
+ export * from './parse/PatternMatcher';
9
+ /** @deprecated - import from @bitgo-beta/utxo-core directly instead */
10
+ export * from '../Output';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/descriptor/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,uEAAuE;AACvE,cAAc,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./psbt"), exports);
18
+ __exportStar(require("./address"), exports);
19
+ __exportStar(require("./DescriptorMap"), exports);
20
+ __exportStar(require("./derive"), exports);
21
+ __exportStar(require("./Output"), exports);
22
+ __exportStar(require("./VirtualSize"), exports);
23
+ __exportStar(require("./fromFixedScriptWallet"), exports);
24
+ __exportStar(require("./parse/PatternMatcher"), exports);
25
+ /** @deprecated - import from @bitgo-beta/utxo-core directly instead */
26
+ __exportStar(require("../Output"), exports);
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQXVCO0FBQ3ZCLDRDQUEwQjtBQUMxQixrREFBZ0M7QUFDaEMsMkNBQXlCO0FBQ3pCLDJDQUF5QjtBQUN6QixnREFBOEI7QUFDOUIsMERBQXdDO0FBQ3hDLHlEQUF1QztBQUV2Qyx1RUFBdUU7QUFDdkUsNENBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9wc2J0JztcbmV4cG9ydCAqIGZyb20gJy4vYWRkcmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL0Rlc2NyaXB0b3JNYXAnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXJpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9PdXRwdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9WaXJ0dWFsU2l6ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zyb21GaXhlZFNjcmlwdFdhbGxldCc7XG5leHBvcnQgKiBmcm9tICcuL3BhcnNlL1BhdHRlcm5NYXRjaGVyJztcblxuLyoqIEBkZXByZWNhdGVkIC0gaW1wb3J0IGZyb20gQGJpdGdvLWJldGEvdXR4by1jb3JlIGRpcmVjdGx5IGluc3RlYWQgKi9cbmV4cG9ydCAqIGZyb20gJy4uL091dHB1dCc7XG4iXX0=
@@ -0,0 +1,14 @@
1
+ export type PatternVar = {
2
+ $var: string;
3
+ };
4
+ export type Pattern = PatternVar | string | number | {
5
+ [key: string]: Pattern | Pattern[];
6
+ } | Pattern[];
7
+ export type ExtractedVars = Record<string, unknown>;
8
+ export declare class PatternMatcher {
9
+ match(node: unknown, pattern: Pattern): ExtractedVars | null;
10
+ private matchNode;
11
+ private isPatternVar;
12
+ private deepEqual;
13
+ }
14
+ //# sourceMappingURL=PatternMatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternMatcher.d.ts","sourceRoot":"","sources":["../../../../src/descriptor/parse/PatternMatcher.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1C,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;CAAE,GAAG,OAAO,EAAE,CAAC;AAExG,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,qBAAa,cAAc;IACzB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI;IAK5D,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;CAgBlB"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PatternMatcher = void 0;
4
+ class PatternMatcher {
5
+ match(node, pattern) {
6
+ const vars = {};
7
+ return this.matchNode(node, pattern, vars) ? vars : null;
8
+ }
9
+ matchNode(node, pattern, vars) {
10
+ // Variable placeholder
11
+ if (this.isPatternVar(pattern)) {
12
+ const varName = pattern.$var;
13
+ if (varName in vars) {
14
+ return this.deepEqual(vars[varName], node);
15
+ }
16
+ vars[varName] = node;
17
+ return true;
18
+ }
19
+ // Primitive values
20
+ if (typeof node !== typeof pattern)
21
+ return false;
22
+ if (typeof node === 'string' || typeof node === 'number') {
23
+ return node === pattern;
24
+ }
25
+ // Arrays
26
+ if (Array.isArray(node) && Array.isArray(pattern)) {
27
+ return node.length === pattern.length && node.every((item, i) => this.matchNode(item, pattern[i], vars));
28
+ }
29
+ // Objects
30
+ if (typeof node === 'object' && typeof pattern === 'object' && node !== null && pattern !== null) {
31
+ const nodeKeys = Object.keys(node);
32
+ const patternKeys = Object.keys(pattern);
33
+ return (nodeKeys.length === patternKeys.length &&
34
+ nodeKeys.every((key) => patternKeys.includes(key) &&
35
+ this.matchNode(node[key], pattern[key], vars)));
36
+ }
37
+ return false;
38
+ }
39
+ isPatternVar(value) {
40
+ return value !== null && typeof value === 'object' && '$var' in value;
41
+ }
42
+ deepEqual(a, b) {
43
+ if (a === b)
44
+ return true;
45
+ if (typeof a !== typeof b)
46
+ return false;
47
+ if (Array.isArray(a) && Array.isArray(b)) {
48
+ return a.length === b.length && a.every((item, i) => this.deepEqual(item, b[i]));
49
+ }
50
+ if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {
51
+ const keysA = Object.keys(a);
52
+ const keysB = Object.keys(b);
53
+ return (keysA.length === keysB.length &&
54
+ keysA.every((key) => this.deepEqual(a[key], b[key])));
55
+ }
56
+ return false;
57
+ }
58
+ }
59
+ exports.PatternMatcher = PatternMatcher;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0dGVybk1hdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9wYXJzZS9QYXR0ZXJuTWF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxNQUFhLGNBQWM7SUFDekIsS0FBSyxDQUFDLElBQWEsRUFBRSxPQUFnQjtRQUNuQyxNQUFNLElBQUksR0FBa0IsRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQWEsRUFBRSxPQUFnQixFQUFFLElBQW1CO1FBQ3BFLHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzdCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLE9BQU8sSUFBSSxLQUFLLE9BQU8sT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2pELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pELE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQztRQUMxQixDQUFDO1FBRUQsU0FBUztRQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxVQUFVO1FBQ1YsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pHLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV6QyxPQUFPLENBQ0wsUUFBUSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTTtnQkFDdEMsUUFBUSxDQUFDLEtBQUssQ0FDWixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUUsSUFBZ0MsQ0FBQyxHQUFHLENBQUMsRUFBRyxPQUFtQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUMxRyxDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWM7UUFDakMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBVSxFQUFFLENBQVU7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLElBQUksT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixPQUFPLENBQ0wsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtnQkFDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUE2QixDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQTZCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUMvRyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBbEVELHdDQWtFQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhdHRlcm4gbWF0Y2hpbmcgdHlwZXNcbmV4cG9ydCB0eXBlIFBhdHRlcm5WYXIgPSB7ICR2YXI6IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgUGF0dGVybiA9IFBhdHRlcm5WYXIgfCBzdHJpbmcgfCBudW1iZXIgfCB7IFtrZXk6IHN0cmluZ106IFBhdHRlcm4gfCBQYXR0ZXJuW10gfSB8IFBhdHRlcm5bXTtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdGVkVmFycyA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgY2xhc3MgUGF0dGVybk1hdGNoZXIge1xuICBtYXRjaChub2RlOiB1bmtub3duLCBwYXR0ZXJuOiBQYXR0ZXJuKTogRXh0cmFjdGVkVmFycyB8IG51bGwge1xuICAgIGNvbnN0IHZhcnM6IEV4dHJhY3RlZFZhcnMgPSB7fTtcbiAgICByZXR1cm4gdGhpcy5tYXRjaE5vZGUobm9kZSwgcGF0dGVybiwgdmFycykgPyB2YXJzIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hOb2RlKG5vZGU6IHVua25vd24sIHBhdHRlcm46IFBhdHRlcm4sIHZhcnM6IEV4dHJhY3RlZFZhcnMpOiBib29sZWFuIHtcbiAgICAvLyBWYXJpYWJsZSBwbGFjZWhvbGRlclxuICAgIGlmICh0aGlzLmlzUGF0dGVyblZhcihwYXR0ZXJuKSkge1xuICAgICAgY29uc3QgdmFyTmFtZSA9IHBhdHRlcm4uJHZhcjtcbiAgICAgIGlmICh2YXJOYW1lIGluIHZhcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVlcEVxdWFsKHZhcnNbdmFyTmFtZV0sIG5vZGUpO1xuICAgICAgfVxuICAgICAgdmFyc1t2YXJOYW1lXSA9IG5vZGU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQcmltaXRpdmUgdmFsdWVzXG4gICAgaWYgKHR5cGVvZiBub2RlICE9PSB0eXBlb2YgcGF0dGVybikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5vZGUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gbm9kZSA9PT0gcGF0dGVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSAmJiBBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gbm9kZS5sZW5ndGggPT09IHBhdHRlcm4ubGVuZ3RoICYmIG5vZGUuZXZlcnkoKGl0ZW0sIGkpID0+IHRoaXMubWF0Y2hOb2RlKGl0ZW0sIHBhdHRlcm5baV0sIHZhcnMpKTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3RzXG4gICAgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGF0dGVybiA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPT0gbnVsbCAmJiBwYXR0ZXJuICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBub2RlS2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICAgICAgY29uc3QgcGF0dGVybktleXMgPSBPYmplY3Qua2V5cyhwYXR0ZXJuKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbm9kZUtleXMubGVuZ3RoID09PSBwYXR0ZXJuS2V5cy5sZW5ndGggJiZcbiAgICAgICAgbm9kZUtleXMuZXZlcnkoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIHBhdHRlcm5LZXlzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgIHRoaXMubWF0Y2hOb2RlKChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCAocGF0dGVybiBhcyBSZWNvcmQ8c3RyaW5nLCBQYXR0ZXJuPilba2V5XSwgdmFycylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0dGVyblZhcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFBhdHRlcm5WYXIge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICckdmFyJyBpbiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoaXRlbSwgaSkgPT4gdGhpcy5kZWVwRXF1YWwoaXRlbSwgYltpXSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnICYmIGIgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiZcbiAgICAgICAga2V5c0EuZXZlcnkoKGtleSkgPT4gdGhpcy5kZWVwRXF1YWwoKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19