@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,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorMultiplePayGoProofAtPsbtIndex = exports.ErrorOutputIndexOutOfBounds = exports.ErrorPayGoAddressProofFailedVerification = exports.ErrorMultiplePayGoProof = exports.ErrorNoPayGoProof = exports.PayGoError = void 0;
4
+ class PayGoError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = this.constructor.name;
8
+ }
9
+ }
10
+ exports.PayGoError = PayGoError;
11
+ class ErrorNoPayGoProof extends PayGoError {
12
+ constructor(outputIndex) {
13
+ super(`There is no paygo address proof encoded in the PSBT at output ${outputIndex}.`);
14
+ this.outputIndex = outputIndex;
15
+ }
16
+ }
17
+ exports.ErrorNoPayGoProof = ErrorNoPayGoProof;
18
+ class ErrorMultiplePayGoProof extends PayGoError {
19
+ constructor() {
20
+ super('There are multiple paygo address proofs encoded in the PSBT. Something went wrong.');
21
+ }
22
+ }
23
+ exports.ErrorMultiplePayGoProof = ErrorMultiplePayGoProof;
24
+ class ErrorPayGoAddressProofFailedVerification extends PayGoError {
25
+ constructor() {
26
+ super('Cannot verify the paygo address signature with the provided pubkey.');
27
+ }
28
+ }
29
+ exports.ErrorPayGoAddressProofFailedVerification = ErrorPayGoAddressProofFailedVerification;
30
+ class ErrorOutputIndexOutOfBounds extends PayGoError {
31
+ constructor(outputIndex) {
32
+ super(`Output index ${outputIndex} is out of bounds for PSBT outputs.`);
33
+ this.outputIndex = outputIndex;
34
+ }
35
+ }
36
+ exports.ErrorOutputIndexOutOfBounds = ErrorOutputIndexOutOfBounds;
37
+ class ErrorMultiplePayGoProofAtPsbtIndex extends PayGoError {
38
+ constructor(outputIndex) {
39
+ super(`There are multiple PayGo addresses in the PSBT output ${outputIndex}.`);
40
+ this.outputIndex = outputIndex;
41
+ }
42
+ }
43
+ exports.ErrorMultiplePayGoProofAtPsbtIndex = ErrorMultiplePayGoProofAtPsbtIndex;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BheWdvL3BzYnQvRXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQWEsVUFBVyxTQUFRLEtBQUs7SUFDbkMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBTEQsZ0NBS0M7QUFFRCxNQUFhLGlCQUFrQixTQUFRLFVBQVU7SUFDL0MsWUFBbUIsV0FBbUI7UUFDcEMsS0FBSyxDQUFDLGlFQUFpRSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRHRFLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBRXRDLENBQUM7Q0FDRjtBQUpELDhDQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxVQUFVO0lBQ3JEO1FBQ0UsS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7SUFDOUYsQ0FBQztDQUNGO0FBSkQsMERBSUM7QUFFRCxNQUFhLHdDQUF5QyxTQUFRLFVBQVU7SUFDdEU7UUFDRSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0NBQ0Y7QUFKRCw0RkFJQztBQUVELE1BQWEsMkJBQTRCLFNBQVEsVUFBVTtJQUN6RCxZQUFtQixXQUFtQjtRQUNwQyxLQUFLLENBQUMsZ0JBQWdCLFdBQVcscUNBQXFDLENBQUMsQ0FBQztRQUR2RCxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtJQUV0QyxDQUFDO0NBQ0Y7QUFKRCxrRUFJQztBQUVELE1BQWEsa0NBQW1DLFNBQVEsVUFBVTtJQUNoRSxZQUFtQixXQUFtQjtRQUNwQyxLQUFLLENBQUMseURBQXlELFdBQVcsR0FBRyxDQUFDLENBQUM7UUFEOUQsZ0JBQVcsR0FBWCxXQUFXLENBQVE7SUFFdEMsQ0FBQztDQUNGO0FBSkQsZ0ZBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgUGF5R29FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck5vUGF5R29Qcm9vZiBleHRlbmRzIFBheUdvRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3V0cHV0SW5kZXg6IG51bWJlcikge1xuICAgIHN1cGVyKGBUaGVyZSBpcyBubyBwYXlnbyBhZGRyZXNzIHByb29mIGVuY29kZWQgaW4gdGhlIFBTQlQgYXQgb3V0cHV0ICR7b3V0cHV0SW5kZXh9LmApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck11bHRpcGxlUGF5R29Qcm9vZiBleHRlbmRzIFBheUdvRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignVGhlcmUgYXJlIG11bHRpcGxlIHBheWdvIGFkZHJlc3MgcHJvb2ZzIGVuY29kZWQgaW4gdGhlIFBTQlQuIFNvbWV0aGluZyB3ZW50IHdyb25nLicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvclBheUdvQWRkcmVzc1Byb29mRmFpbGVkVmVyaWZpY2F0aW9uIGV4dGVuZHMgUGF5R29FcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdDYW5ub3QgdmVyaWZ5IHRoZSBwYXlnbyBhZGRyZXNzIHNpZ25hdHVyZSB3aXRoIHRoZSBwcm92aWRlZCBwdWJrZXkuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yT3V0cHV0SW5kZXhPdXRPZkJvdW5kcyBleHRlbmRzIFBheUdvRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3V0cHV0SW5kZXg6IG51bWJlcikge1xuICAgIHN1cGVyKGBPdXRwdXQgaW5kZXggJHtvdXRwdXRJbmRleH0gaXMgb3V0IG9mIGJvdW5kcyBmb3IgUFNCVCBvdXRwdXRzLmApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck11bHRpcGxlUGF5R29Qcm9vZkF0UHNidEluZGV4IGV4dGVuZHMgUGF5R29FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvdXRwdXRJbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYFRoZXJlIGFyZSBtdWx0aXBsZSBQYXlHbyBhZGRyZXNzZXMgaW4gdGhlIFBTQlQgb3V0cHV0ICR7b3V0cHV0SW5kZXh9LmApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './payGoAddressProof';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/paygo/psbt/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
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("./payGoAddressProof"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGF5Z28vcHNidC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9wYXlHb0FkZHJlc3NQcm9vZic7XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ /** This function adds the entropy and signature into the PSBT output unknown key vals.
3
+ * We store the entropy so that we reconstruct the message <ENTROPY><ADDRESS><UUID>
4
+ * to later verify.
5
+ *
6
+ * @param psbt - PSBT that we need to encode our paygo address into
7
+ * @param outputIndex - the index of the address in our output
8
+ * @param sig - the signature that we want to encode
9
+ * @param entropy - the arbitrary entropy bytes from our vasp proof
10
+ */
11
+ export declare function addPayGoAddressProof(psbt: utxolib.bitgo.UtxoPsbt, outputIndex: number, sig: Buffer, entropy: Buffer): void;
12
+ /** Verify the paygo address signature is valid using verification pub key.
13
+ *
14
+ * @param psbt - PSBT we want to verify that the paygo address is in
15
+ * @param outputIndex - we have the output index that address is in
16
+ * @param verificationPubkey - the pubkey signed by the HSM to verify our message
17
+ * @returns
18
+ */
19
+ export declare function verifyPayGoAddressProof(psbt: utxolib.bitgo.UtxoPsbt, outputIndex: number, verificationPubkey: Buffer): void;
20
+ /** Get the output index of the paygo output if there is one. It does this by
21
+ * checking if the metadata is on one of the outputs of the PSBT. If there is
22
+ * no paygo output, return undefined
23
+ *
24
+ * @param psbt
25
+ * @returns number - the index of the output address
26
+ */
27
+ export declare function getPayGoAddressProofOutputIndex(psbt: utxolib.bitgo.UtxoPsbt): number | undefined;
28
+ export declare function psbtOutputIncludesPaygoAddressProof(psbt: utxolib.bitgo.UtxoPsbt): boolean;
29
+ //# sourceMappingURL=payGoAddressProof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payGoAddressProof.d.ts","sourceRoot":"","sources":["../../../../src/paygo/psbt/payGoAddressProof.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAchD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,GACzB,IAAI,CAiCN;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,CAehG;AAED,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAEzF"}
@@ -0,0 +1,124 @@
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.addPayGoAddressProof = addPayGoAddressProof;
37
+ exports.verifyPayGoAddressProof = verifyPayGoAddressProof;
38
+ exports.getPayGoAddressProofOutputIndex = getPayGoAddressProofOutputIndex;
39
+ exports.psbtOutputIncludesPaygoAddressProof = psbtOutputIncludesPaygoAddressProof;
40
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
41
+ const utils_1 = require("bip174/src/lib/utils");
42
+ const bip32utils_1 = require("../../bip32utils");
43
+ const attestation_1 = require("../attestation");
44
+ const Errors_1 = require("./Errors");
45
+ /** This function adds the entropy and signature into the PSBT output unknown key vals.
46
+ * We store the entropy so that we reconstruct the message <ENTROPY><ADDRESS><UUID>
47
+ * to later verify.
48
+ *
49
+ * @param psbt - PSBT that we need to encode our paygo address into
50
+ * @param outputIndex - the index of the address in our output
51
+ * @param sig - the signature that we want to encode
52
+ * @param entropy - the arbitrary entropy bytes from our vasp proof
53
+ */
54
+ function addPayGoAddressProof(psbt, outputIndex, sig, entropy) {
55
+ utxolib.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'output', outputIndex, {
56
+ key: {
57
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
58
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.PAYGO_ADDRESS_ATTESTATION_PROOF,
59
+ keydata: entropy,
60
+ },
61
+ value: sig,
62
+ });
63
+ }
64
+ /** Verify the paygo address signature is valid using verification pub key.
65
+ *
66
+ * @param psbt - PSBT we want to verify that the paygo address is in
67
+ * @param outputIndex - we have the output index that address is in
68
+ * @param verificationPubkey - the pubkey signed by the HSM to verify our message
69
+ * @returns
70
+ */
71
+ function verifyPayGoAddressProof(psbt, outputIndex, verificationPubkey) {
72
+ const psbtOutputs = (0, utils_1.checkForOutput)(psbt.data.outputs, outputIndex);
73
+ const stored = utxolib.bitgo.getProprietaryKeyValuesFromUnknownKeyValues(psbtOutputs, {
74
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
75
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.PAYGO_ADDRESS_ATTESTATION_PROOF,
76
+ });
77
+ // assert stored length is 0 or 1
78
+ if (stored.length === 0) {
79
+ throw new Errors_1.ErrorNoPayGoProof(outputIndex);
80
+ }
81
+ else if (stored.length > 1) {
82
+ throw new Errors_1.ErrorMultiplePayGoProof();
83
+ }
84
+ // We get the signature and entropy from our PSBT unknown key vals
85
+ const signature = stored[0].value;
86
+ const entropy = stored[0].key.keydata;
87
+ // Get the the PayGo address from the txOutputs
88
+ const txOutputs = psbt.txOutputs;
89
+ if (outputIndex >= txOutputs.length) {
90
+ throw new Errors_1.ErrorOutputIndexOutOfBounds(outputIndex);
91
+ }
92
+ const output = txOutputs[outputIndex];
93
+ const addressFromOutput = utxolib.address.fromOutputScript(output.script, psbt.network);
94
+ // We construct our message <ENTROPY><ADDRESS><UUID>
95
+ const message = (0, attestation_1.createPayGoAttestationBuffer)(addressFromOutput, entropy, psbt.network);
96
+ // bip32utils.verifyMessage now takes in message as a Buffer
97
+ if (!(0, bip32utils_1.verifyMessage)(message, verificationPubkey, signature, utxolib.networks.bitcoin)) {
98
+ throw new Errors_1.ErrorPayGoAddressProofFailedVerification();
99
+ }
100
+ }
101
+ /** Get the output index of the paygo output if there is one. It does this by
102
+ * checking if the metadata is on one of the outputs of the PSBT. If there is
103
+ * no paygo output, return undefined
104
+ *
105
+ * @param psbt
106
+ * @returns number - the index of the output address
107
+ */
108
+ function getPayGoAddressProofOutputIndex(psbt) {
109
+ const res = psbt.data.outputs.flatMap((output, outputIndex) => {
110
+ const proprietaryKeyVals = utxolib.bitgo.getPsbtOutputProprietaryKeyVals(output, {
111
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
112
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.PAYGO_ADDRESS_ATTESTATION_PROOF,
113
+ });
114
+ if (proprietaryKeyVals.length > 1) {
115
+ throw new Errors_1.ErrorMultiplePayGoProofAtPsbtIndex(outputIndex);
116
+ }
117
+ return proprietaryKeyVals.length === 0 ? [] : [outputIndex];
118
+ });
119
+ return res.length === 0 ? undefined : res[0];
120
+ }
121
+ function psbtOutputIncludesPaygoAddressProof(psbt) {
122
+ return getPayGoAddressProofOutputIndex(psbt) !== undefined;
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5R29BZGRyZXNzUHJvb2YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGF5Z28vcHNidC9wYXlHb0FkZHJlc3NQcm9vZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxvREFjQztBQVNELDBEQXFDQztBQVNELDBFQWVDO0FBRUQsa0ZBRUM7QUEvR0QsOERBQWdEO0FBQ2hELGdEQUFzRDtBQUV0RCxpREFBaUQ7QUFDakQsZ0RBQThEO0FBRTlELHFDQU1rQjtBQUVsQjs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxJQUE0QixFQUM1QixXQUFtQixFQUNuQixHQUFXLEVBQ1gsT0FBZTtJQUVmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7UUFDckYsR0FBRyxFQUFFO1lBQ0gsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCO1lBQ3JELE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLCtCQUErQjtZQUM1RSxPQUFPLEVBQUUsT0FBTztTQUNqQjtRQUNELEtBQUssRUFBRSxHQUFHO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxJQUE0QixFQUM1QixXQUFtQixFQUNuQixrQkFBMEI7SUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBQSxzQkFBYyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsV0FBVyxFQUFFO1FBQ3BGLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQjtRQUNyRCxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQywrQkFBK0I7S0FDN0UsQ0FBQyxDQUFDO0lBRUgsaUNBQWlDO0lBQ2pDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksMEJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksZ0NBQXVCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7SUFFdEMsK0NBQStDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDakMsSUFBSSxXQUFXLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxvQ0FBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV4RixvREFBb0Q7SUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQ0FBNEIsRUFBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZGLDREQUE0RDtJQUM1RCxJQUFJLENBQUMsSUFBQSwwQkFBYSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3JGLE1BQU0sSUFBSSxpREFBd0MsRUFBRSxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsK0JBQStCLENBQUMsSUFBNEI7SUFDMUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO1FBQzVELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLEVBQUU7WUFDL0UsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCO1lBQ3JELE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLCtCQUErQjtTQUM3RSxDQUFDLENBQUM7UUFFSCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksMkNBQWtDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQWdCLG1DQUFtQyxDQUFDLElBQTRCO0lBQzlFLE9BQU8sK0JBQStCLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGNoZWNrRm9yT3V0cHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyB2ZXJpZnlNZXNzYWdlIH0gZnJvbSAnLi4vLi4vYmlwMzJ1dGlscyc7XG5pbXBvcnQgeyBjcmVhdGVQYXlHb0F0dGVzdGF0aW9uQnVmZmVyIH0gZnJvbSAnLi4vYXR0ZXN0YXRpb24nO1xuXG5pbXBvcnQge1xuICBFcnJvck11bHRpcGxlUGF5R29Qcm9vZixcbiAgRXJyb3JNdWx0aXBsZVBheUdvUHJvb2ZBdFBzYnRJbmRleCxcbiAgRXJyb3JOb1BheUdvUHJvb2YsXG4gIEVycm9yT3V0cHV0SW5kZXhPdXRPZkJvdW5kcyxcbiAgRXJyb3JQYXlHb0FkZHJlc3NQcm9vZkZhaWxlZFZlcmlmaWNhdGlvbixcbn0gZnJvbSAnLi9FcnJvcnMnO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBlbnRyb3B5IGFuZCBzaWduYXR1cmUgaW50byB0aGUgUFNCVCBvdXRwdXQgdW5rbm93biBrZXkgdmFscy5cbiAqIFdlIHN0b3JlIHRoZSBlbnRyb3B5IHNvIHRoYXQgd2UgcmVjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgPEVOVFJPUFk+PEFERFJFU1M+PFVVSUQ+XG4gKiB0byBsYXRlciB2ZXJpZnkuXG4gKlxuICogQHBhcmFtIHBzYnQgLSBQU0JUIHRoYXQgd2UgbmVlZCB0byBlbmNvZGUgb3VyIHBheWdvIGFkZHJlc3MgaW50b1xuICogQHBhcmFtIG91dHB1dEluZGV4IC0gdGhlIGluZGV4IG9mIHRoZSBhZGRyZXNzIGluIG91ciBvdXRwdXRcbiAqIEBwYXJhbSBzaWcgLSB0aGUgc2lnbmF0dXJlIHRoYXQgd2Ugd2FudCB0byBlbmNvZGVcbiAqIEBwYXJhbSBlbnRyb3B5IC0gdGhlIGFyYml0cmFyeSBlbnRyb3B5IGJ5dGVzIGZyb20gb3VyIHZhc3AgcHJvb2ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBheUdvQWRkcmVzc1Byb29mKFxuICBwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICBvdXRwdXRJbmRleDogbnVtYmVyLFxuICBzaWc6IEJ1ZmZlcixcbiAgZW50cm9weTogQnVmZmVyXG4pOiB2b2lkIHtcbiAgdXR4b2xpYi5iaXRnby5hZGRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKHBzYnQsICdvdXRwdXQnLCBvdXRwdXRJbmRleCwge1xuICAgIGtleToge1xuICAgICAgaWRlbnRpZmllcjogdXR4b2xpYi5iaXRnby5QU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5QQVlHT19BRERSRVNTX0FUVEVTVEFUSU9OX1BST09GLFxuICAgICAga2V5ZGF0YTogZW50cm9weSxcbiAgICB9LFxuICAgIHZhbHVlOiBzaWcsXG4gIH0pO1xufVxuXG4vKiogVmVyaWZ5IHRoZSBwYXlnbyBhZGRyZXNzIHNpZ25hdHVyZSBpcyB2YWxpZCB1c2luZyB2ZXJpZmljYXRpb24gcHViIGtleS5cbiAqXG4gKiBAcGFyYW0gcHNidCAtIFBTQlQgd2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgcGF5Z28gYWRkcmVzcyBpcyBpblxuICogQHBhcmFtIG91dHB1dEluZGV4IC0gd2UgaGF2ZSB0aGUgb3V0cHV0IGluZGV4IHRoYXQgYWRkcmVzcyBpcyBpblxuICogQHBhcmFtIHZlcmlmaWNhdGlvblB1YmtleSAtIHRoZSBwdWJrZXkgc2lnbmVkIGJ5IHRoZSBIU00gdG8gdmVyaWZ5IG91ciBtZXNzYWdlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5UGF5R29BZGRyZXNzUHJvb2YoXG4gIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gIG91dHB1dEluZGV4OiBudW1iZXIsXG4gIHZlcmlmaWNhdGlvblB1YmtleTogQnVmZmVyXG4pOiB2b2lkIHtcbiAgY29uc3QgcHNidE91dHB1dHMgPSBjaGVja0Zvck91dHB1dChwc2J0LmRhdGEub3V0cHV0cywgb3V0cHV0SW5kZXgpO1xuICBjb25zdCBzdG9yZWQgPSB1dHhvbGliLmJpdGdvLmdldFByb3ByaWV0YXJ5S2V5VmFsdWVzRnJvbVVua25vd25LZXlWYWx1ZXMocHNidE91dHB1dHMsIHtcbiAgICBpZGVudGlmaWVyOiB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5QQVlHT19BRERSRVNTX0FUVEVTVEFUSU9OX1BST09GLFxuICB9KTtcblxuICAvLyBhc3NlcnQgc3RvcmVkIGxlbmd0aCBpcyAwIG9yIDFcbiAgaWYgKHN0b3JlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JOb1BheUdvUHJvb2Yob3V0cHV0SW5kZXgpO1xuICB9IGVsc2UgaWYgKHN0b3JlZC5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTXVsdGlwbGVQYXlHb1Byb29mKCk7XG4gIH1cblxuICAvLyBXZSBnZXQgdGhlIHNpZ25hdHVyZSBhbmQgZW50cm9weSBmcm9tIG91ciBQU0JUIHVua25vd24ga2V5IHZhbHNcbiAgY29uc3Qgc2lnbmF0dXJlID0gc3RvcmVkWzBdLnZhbHVlO1xuICBjb25zdCBlbnRyb3B5ID0gc3RvcmVkWzBdLmtleS5rZXlkYXRhO1xuXG4gIC8vIEdldCB0aGUgdGhlIFBheUdvIGFkZHJlc3MgZnJvbSB0aGUgdHhPdXRwdXRzXG4gIGNvbnN0IHR4T3V0cHV0cyA9IHBzYnQudHhPdXRwdXRzO1xuICBpZiAob3V0cHV0SW5kZXggPj0gdHhPdXRwdXRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvck91dHB1dEluZGV4T3V0T2ZCb3VuZHMob3V0cHV0SW5kZXgpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHR4T3V0cHV0c1tvdXRwdXRJbmRleF07XG4gIGNvbnN0IGFkZHJlc3NGcm9tT3V0cHV0ID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0LnNjcmlwdCwgcHNidC5uZXR3b3JrKTtcblxuICAvLyBXZSBjb25zdHJ1Y3Qgb3VyIG1lc3NhZ2UgPEVOVFJPUFk+PEFERFJFU1M+PFVVSUQ+XG4gIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVQYXlHb0F0dGVzdGF0aW9uQnVmZmVyKGFkZHJlc3NGcm9tT3V0cHV0LCBlbnRyb3B5LCBwc2J0Lm5ldHdvcmspO1xuXG4gIC8vIGJpcDMydXRpbHMudmVyaWZ5TWVzc2FnZSBub3cgdGFrZXMgaW4gbWVzc2FnZSBhcyBhIEJ1ZmZlclxuICBpZiAoIXZlcmlmeU1lc3NhZ2UobWVzc2FnZSwgdmVyaWZpY2F0aW9uUHVia2V5LCBzaWduYXR1cmUsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3JQYXlHb0FkZHJlc3NQcm9vZkZhaWxlZFZlcmlmaWNhdGlvbigpO1xuICB9XG59XG5cbi8qKiBHZXQgdGhlIG91dHB1dCBpbmRleCBvZiB0aGUgcGF5Z28gb3V0cHV0IGlmIHRoZXJlIGlzIG9uZS4gSXQgZG9lcyB0aGlzIGJ5XG4gKiBjaGVja2luZyBpZiB0aGUgbWV0YWRhdGEgaXMgb24gb25lIG9mIHRoZSBvdXRwdXRzIG9mIHRoZSBQU0JULiBJZiB0aGVyZSBpc1xuICogbm8gcGF5Z28gb3V0cHV0LCByZXR1cm4gdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHBzYnRcbiAqIEByZXR1cm5zIG51bWJlciAtIHRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBheUdvQWRkcmVzc1Byb29mT3V0cHV0SW5kZXgocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlcyA9IHBzYnQuZGF0YS5vdXRwdXRzLmZsYXRNYXAoKG91dHB1dCwgb3V0cHV0SW5kZXgpID0+IHtcbiAgICBjb25zdCBwcm9wcmlldGFyeUtleVZhbHMgPSB1dHhvbGliLmJpdGdvLmdldFBzYnRPdXRwdXRQcm9wcmlldGFyeUtleVZhbHMob3V0cHV0LCB7XG4gICAgICBpZGVudGlmaWVyOiB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLlBBWUdPX0FERFJFU1NfQVRURVNUQVRJT05fUFJPT0YsXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHJpZXRhcnlLZXlWYWxzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvck11bHRpcGxlUGF5R29Qcm9vZkF0UHNidEluZGV4KG91dHB1dEluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHJpZXRhcnlLZXlWYWxzLmxlbmd0aCA9PT0gMCA/IFtdIDogW291dHB1dEluZGV4XTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlcy5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiByZXNbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwc2J0T3V0cHV0SW5jbHVkZXNQYXlnb0FkZHJlc3NQcm9vZihwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRQYXlHb0FkZHJlc3NQcm9vZk91dHB1dEluZGV4KHBzYnQpICE9PSB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import { Miniscript, Descriptor, ast } from '@bitgo/wasm-miniscript';
2
+ import { BIP32Interface } from '@bitgo-beta/utxo-lib';
3
+ import { DescriptorMap, PsbtParams } from '../../descriptor';
4
+ import { Triple, KeyTriple } from '../key.utils';
5
+ export declare function getDefaultXPubs(seed?: string): Triple<string>;
6
+ export declare function getUnspendableKey(): string;
7
+ export type DescriptorTemplate = 'Wsh2Of3' | 'Tr1Of3-NoKeyPath-Tree' | 'Tr1Of3-NoKeyPath-Tree-Plain' | 'Tr2Of3-NoKeyPath' | 'Wsh2Of2' | 'Wsh2Of3CltvDrop';
8
+ export declare function getPsbtParams(t: DescriptorTemplate): Partial<PsbtParams>;
9
+ export declare function containsKey(script: Miniscript | ast.MiniscriptNode, key: BIP32Interface | string): boolean;
10
+ export declare function getTapLeafScripts(d: Descriptor): string[];
11
+ export declare function getDescriptor(template: DescriptorTemplate, keys?: KeyTriple | string[], path?: string): Descriptor;
12
+ export declare function getDescriptorMap(template: DescriptorTemplate, keys?: KeyTriple | string[]): DescriptorMap;
13
+ //# sourceMappingURL=descriptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../../../../src/testutil/descriptor/descriptors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAS,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAgB,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE/D,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAsB1C;AAMD,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,uBAAuB,GAEvB,6BAA6B,GAC7B,kBAAkB,GAClB,SAAS,GAMT,iBAAiB,CAAC;AAkCtB,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAOxE;AAuED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAQ1G;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAIzD;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,GAAE,SAAS,GAAG,MAAM,EAAsB,EAC9C,IAAI,SAAQ,GACX,UAAU,CAEZ;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,GAAE,SAAS,GAAG,MAAM,EAAsB,GAC7C,aAAa,CAKf"}
@@ -0,0 +1,162 @@
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.getDefaultXPubs = getDefaultXPubs;
7
+ exports.getUnspendableKey = getUnspendableKey;
8
+ exports.getPsbtParams = getPsbtParams;
9
+ exports.containsKey = containsKey;
10
+ exports.getTapLeafScripts = getTapLeafScripts;
11
+ exports.getDescriptor = getDescriptor;
12
+ exports.getDescriptorMap = getDescriptorMap;
13
+ const assert_1 = __importDefault(require("assert"));
14
+ const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
15
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
16
+ const key_utils_1 = require("../key.utils");
17
+ function getDefaultXPubs(seed) {
18
+ return (0, key_utils_1.getKeyTriple)(seed).map((k) => k.neutered().toBase58());
19
+ }
20
+ function getUnspendableKey() {
21
+ /*
22
+ https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#constructing-and-spending-taproot-outputs
23
+
24
+ ```
25
+ If one or more of the spending conditions consist of just a single key (after aggregation), the most likely one should
26
+ be made the internal key. If no such condition exists, it may be worthwhile adding one that consists of an aggregation
27
+ of all keys participating in all scripts combined; effectively adding an "everyone agrees" branch. If that is
28
+ inacceptable, pick as internal key a "Nothing Up My Sleeve" (NUMS) point, i.e., a point with unknown discrete
29
+ logarithm.
30
+
31
+ One example of such a point is H = lift_x(0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0) which is
32
+ constructed by taking the hash of the standard uncompressed encoding of the secp256k1 base point G as X coordinate.
33
+ In order to avoid leaking the information that key path spending is not possible it is recommended to pick a fresh
34
+ integer r in the range 0...n-1 uniformly at random and use H + rG as internal key. It is possible to prove that this
35
+ internal key does not have a known discrete logarithm with respect to G by revealing r to a verifier who can then
36
+ reconstruct how the internal key was created.
37
+ ```
38
+
39
+ We could do the random integer trick here, but for internal testing it is sufficient to use the fixed point.
40
+ */
41
+ return '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0';
42
+ }
43
+ function toDescriptorMap(v) {
44
+ return new Map(Object.entries(v).map(([k, v]) => [k, wasm_miniscript_1.Descriptor.fromString(v, 'derivable')]));
45
+ }
46
+ function toXPub(k, path) {
47
+ if (typeof k === 'string') {
48
+ return k + '/' + path;
49
+ }
50
+ return k.neutered().toBase58() + '/' + path;
51
+ }
52
+ function toPlain(k, { xonly = false } = {}) {
53
+ if (typeof k === 'string') {
54
+ if (k.startsWith('xpub') || k.startsWith('xprv')) {
55
+ return toPlain(utxo_lib_1.bip32.fromBase58(k), { xonly });
56
+ }
57
+ return k;
58
+ }
59
+ return k.publicKey.subarray(xonly ? 1 : 0).toString('hex');
60
+ }
61
+ function toXOnly(k) {
62
+ return toPlain(k, { xonly: true });
63
+ }
64
+ function multiArgs(m, n, keys, path) {
65
+ if (n < m) {
66
+ throw new Error(`Cannot create ${m} of ${n} multisig`);
67
+ }
68
+ if (keys.length < n) {
69
+ throw new Error(`Not enough keys for ${m} of ${n} multisig: keys.length=${keys.length}`);
70
+ }
71
+ keys = keys.slice(0, n);
72
+ return [m, ...keys.map((k) => toXPub(k, path))];
73
+ }
74
+ function getPsbtParams(t) {
75
+ switch (t) {
76
+ case 'Wsh2Of3CltvDrop':
77
+ return { locktime: 1 };
78
+ default:
79
+ return {};
80
+ }
81
+ }
82
+ function getDescriptorNode(template, keys = getDefaultXPubs(), path = '0/*') {
83
+ switch (template) {
84
+ case 'Wsh2Of3':
85
+ return {
86
+ wsh: { multi: multiArgs(2, 3, keys, path) },
87
+ };
88
+ case 'Wsh2Of3CltvDrop':
89
+ const { locktime } = getPsbtParams(template);
90
+ (0, assert_1.default)(locktime);
91
+ return {
92
+ wsh: {
93
+ and_v: [{ 'r:after': locktime }, { multi: multiArgs(2, 3, keys, path) }],
94
+ },
95
+ };
96
+ case 'Wsh2Of2':
97
+ return {
98
+ wsh: { multi: multiArgs(2, 2, keys, path) },
99
+ };
100
+ case 'Tr2Of3-NoKeyPath':
101
+ return {
102
+ tr: [getUnspendableKey(), { multi_a: multiArgs(2, 3, keys, path) }],
103
+ };
104
+ case 'Tr1Of3-NoKeyPath-Tree':
105
+ return {
106
+ tr: [
107
+ getUnspendableKey(),
108
+ [{ pk: toXPub(keys[0], path) }, [{ pk: toXPub(keys[1], path) }, { pk: toXPub(keys[2], path) }]],
109
+ ],
110
+ };
111
+ case 'Tr1Of3-NoKeyPath-Tree-Plain':
112
+ return {
113
+ tr: [getUnspendableKey(), [{ pk: toXOnly(keys[0]) }, [{ pk: toXOnly(keys[1]) }, { pk: toXOnly(keys[2]) }]]],
114
+ };
115
+ }
116
+ throw new Error(`Unknown descriptor template: ${template}`);
117
+ }
118
+ function getTapLeafScriptNodes(t) {
119
+ if (Array.isArray(t)) {
120
+ if (t.length !== 2) {
121
+ throw new Error(`expected tuple, got: ${JSON.stringify(t)}`);
122
+ }
123
+ return t.map((v) => (Array.isArray(v) ? getTapLeafScriptNodes(v) : v)).flat();
124
+ }
125
+ if (typeof t === 'object') {
126
+ const node = t;
127
+ if (!('tr' in node)) {
128
+ throw new Error(`TapLeafScripts are only supported for Taproot descriptors, got: ${t}`);
129
+ }
130
+ if (!Array.isArray(node.tr) || node.tr.length !== 2) {
131
+ throw new Error(`expected tuple, got: ${JSON.stringify(node.tr)}`);
132
+ }
133
+ const tapscript = node.tr[1];
134
+ if (!Array.isArray(tapscript)) {
135
+ throw new Error(`expected tapscript to be an array, got: ${JSON.stringify(tapscript)}`);
136
+ }
137
+ return getTapLeafScriptNodes(tapscript);
138
+ }
139
+ throw new Error(`Invalid input: ${JSON.stringify(t)}`);
140
+ }
141
+ function containsKey(script, key) {
142
+ if (script instanceof wasm_miniscript_1.Miniscript) {
143
+ script = wasm_miniscript_1.ast.fromMiniscript(script);
144
+ }
145
+ if ('pk' in script) {
146
+ return script.pk === toXOnly(key);
147
+ }
148
+ throw new Error(`Unsupported script type: ${JSON.stringify(script)}`);
149
+ }
150
+ function getTapLeafScripts(d) {
151
+ return getTapLeafScriptNodes(wasm_miniscript_1.ast.fromDescriptor(d)).map((n) => wasm_miniscript_1.Miniscript.fromString(wasm_miniscript_1.ast.formatNode(n), 'tap').toString());
152
+ }
153
+ function getDescriptor(template, keys = getDefaultXPubs(), path = '0/*') {
154
+ return wasm_miniscript_1.Descriptor.fromStringDetectType(wasm_miniscript_1.ast.formatNode(getDescriptorNode(template, keys, path)));
155
+ }
156
+ function getDescriptorMap(template, keys = getDefaultXPubs()) {
157
+ return toDescriptorMap({
158
+ external: getDescriptor(template, keys, '0/*').toString(),
159
+ internal: getDescriptor(template, keys, '1/*').toString(),
160
+ });
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdHV0aWwvZGVzY3JpcHRvci9kZXNjcmlwdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLDBDQUVDO0FBRUQsOENBc0JDO0FBb0RELHNDQU9DO0FBdUVELGtDQVFDO0FBRUQsOENBSUM7QUFFRCxzQ0FNQztBQUVELDRDQVFDO0FBcE1ELG9EQUE0QjtBQUU1Qiw0REFBcUU7QUFDckUsbURBQTZEO0FBRzdELDRDQUErRDtBQUUvRCxTQUFnQixlQUFlLENBQUMsSUFBYTtJQUMzQyxPQUFPLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBbUIsQ0FBQztBQUNsRixDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCO0lBQy9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BbUJFO0lBQ0YsT0FBTyxrRUFBa0UsQ0FBQztBQUM1RSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsQ0FBeUI7SUFDaEQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSw0QkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQztBQWdCRCxTQUFTLE1BQU0sQ0FBQyxDQUEwQixFQUFFLElBQVk7SUFDdEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxR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LFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQTRCLEVBQzVCLE9BQTZCLGVBQWUsRUFBRTtJQUU5QyxPQUFPLGVBQWUsQ0FBQztRQUNyQixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3pELFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7S0FDMUQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHsgTWluaXNjcmlwdCwgRGVzY3JpcHRvciwgYXN0IH0gZnJvbSAnQGJpdGdvL3dhc20tbWluaXNjcmlwdCc7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB7IERlc2NyaXB0b3JNYXAsIFBzYnRQYXJhbXMgfSBmcm9tICcuLi8uLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGdldEtleVRyaXBsZSwgVHJpcGxlLCBLZXlUcmlwbGUgfSBmcm9tICcuLi9rZXkudXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFhQdWJzKHNlZWQ/OiBzdHJpbmcpOiBUcmlwbGU8c3RyaW5nPiB7XG4gIHJldHVybiBnZXRLZXlUcmlwbGUoc2VlZCkubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkgYXMgVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnNwZW5kYWJsZUtleSgpOiBzdHJpbmcge1xuICAvKlxuICBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraSNjb25zdHJ1Y3RpbmctYW5kLXNwZW5kaW5nLXRhcHJvb3Qtb3V0cHV0c1xuXG4gIGBgYFxuICBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyBjb25zaXN0IG9mIGp1c3QgYSBzaW5nbGUga2V5IChhZnRlciBhZ2dyZWdhdGlvbiksIHRoZSBtb3N0IGxpa2VseSBvbmUgc2hvdWxkXG4gIGJlIG1hZGUgdGhlIGludGVybmFsIGtleS4gSWYgbm8gc3VjaCBjb25kaXRpb24gZXhpc3RzLCBpdCBtYXkgYmUgd29ydGh3aGlsZSBhZGRpbmcgb25lIHRoYXQgY29uc2lzdHMgb2YgYW4gYWdncmVnYXRpb25cbiAgb2YgYWxsIGtleXMgcGFydGljaXBhdGluZyBpbiBhbGwgc2NyaXB0cyBjb21iaW5lZDsgZWZmZWN0aXZlbHkgYWRkaW5nIGFuIFwiZXZlcnlvbmUgYWdyZWVzXCIgYnJhbmNoLiBJZiB0aGF0IGlzXG4gIGluYWNjZXB0YWJsZSwgcGljayBhcyBpbnRlcm5hbCBrZXkgYSBcIk5vdGhpbmcgVXAgTXkgU2xlZXZlXCIgKE5VTVMpIHBvaW50LCBpLmUuLCBhIHBvaW50IHdpdGggdW5rbm93biBkaXNjcmV0ZVxuICBsb2dhcml0aG0uXG5cbiAgT25lIGV4YW1wbGUgb2Ygc3VjaCBhIHBvaW50IGlzIEggPSBsaWZ0X3goMHg1MDkyOWI3NGMxYTA0OTU0Yjc4YjRiNjAzNWU5N2E1ZTA3OGE1YTBmMjhlYzk2ZDU0N2JmZWU5YWNlODAzYWMwKSB3aGljaCBpc1xuICBjb25zdHJ1Y3RlZCBieSB0YWtpbmcgdGhlIGhhc2ggb2YgdGhlIHN0YW5kYXJkIHVuY29tcHJlc3NlZCBlbmNvZGluZyBvZiB0aGUgc2VjcDI1NmsxIGJhc2UgcG9pbnQgRyBhcyBYIGNvb3JkaW5hdGUuXG4gIEluIG9yZGVyIHRvIGF2b2lkIGxlYWtpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQga2V5IHBhdGggc3BlbmRpbmcgaXMgbm90IHBvc3NpYmxlIGl0IGlzIHJlY29tbWVuZGVkIHRvIHBpY2sgYSBmcmVzaFxuICBpbnRlZ2VyIHIgaW4gdGhlIHJhbmdlIDAuLi5uLTEgdW5pZm9ybWx5IGF0IHJhbmRvbSBhbmQgdXNlIEggKyByRyBhcyBpbnRlcm5hbCBrZXkuIEl0IGlzIHBvc3NpYmxlIHRvIHByb3ZlIHRoYXQgdGhpc1xuICBpbnRlcm5hbCBrZXkgZG9lcyBub3QgaGF2ZSBhIGtub3duIGRpc2NyZXRlIGxvZ2FyaXRobSB3aXRoIHJlc3BlY3QgdG8gRyBieSByZXZlYWxpbmcgciB0byBhIHZlcmlmaWVyIHdobyBjYW4gdGhlblxuICByZWNvbnN0cnVjdCBob3cgdGhlIGludGVybmFsIGtleSB3YXMgY3JlYXRlZC5cbiAgYGBgXG5cbiAgV2UgY291bGQgZG8gdGhlIHJhbmRvbSBpbnRlZ2VyIHRyaWNrIGhlcmUsIGJ1dCBmb3IgaW50ZXJuYWwgdGVzdGluZyBpdCBpcyBzdWZmaWNpZW50IHRvIHVzZSB0aGUgZml4ZWQgcG9pbnQuXG4gICovXG4gIHJldHVybiAnNTA5MjliNzRjMWEwNDk1NGI3OGI0YjYwMzVlOTdhNWUwNzhhNWEwZjI4ZWM5NmQ1NDdiZmVlOWFjZTgwM2FjMCc7XG59XG5cbmZ1bmN0aW9uIHRvRGVzY3JpcHRvck1hcCh2OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogRGVzY3JpcHRvck1hcCB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHYpLm1hcCgoW2ssIHZdKSA9PiBbaywgRGVzY3JpcHRvci5mcm9tU3RyaW5nKHYsICdkZXJpdmFibGUnKV0pKTtcbn1cblxuZXhwb3J0IHR5cGUgRGVzY3JpcHRvclRlbXBsYXRlID1cbiAgfCAnV3NoMk9mMydcbiAgfCAnVHIxT2YzLU5vS2V5UGF0aC1UcmVlJ1xuICAvLyBubyB4cHVicywganVzdCBwbGFpbiBrZXlzXG4gIHwgJ1RyMU9mMy1Ob0tleVBhdGgtVHJlZS1QbGFpbidcbiAgfCAnVHIyT2YzLU5vS2V5UGF0aCdcbiAgfCAnV3NoMk9mMidcbiAgLypcbiAgICogVGhpcyBpcyBhIHdyYXBwZWQgc2Vnd2l0IDJvZjMgbXVsdGlzaWcgdGhhdCBhbHNvIHVzZXMgYSByZWxhdGl2ZSBsb2NrdGltZSB3aXRoXG4gICAqIGFuIE9QX0RST1AgKHJlcXVpcmluZyBhIG1pbmlzY3JpcHQgZXh0ZW5zaW9uKS5cbiAgICogSXQgaXMgYmFzaWNhbGx5IHdoYXQgaXMgdXNlZCBpbiBDb3JlRGFvIHN0YWtpbmcgdHJhbnNhY3Rpb25zLlxuICAgKi9cbiAgfCAnV3NoMk9mM0NsdHZEcm9wJztcblxuZnVuY3Rpb24gdG9YUHViKGs6IEJJUDMySW50ZXJmYWNlIHwgc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGsgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGsgKyAnLycgKyBwYXRoO1xuICB9XG4gIHJldHVybiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSArICcvJyArIHBhdGg7XG59XG5cbmZ1bmN0aW9uIHRvUGxhaW4oazogQklQMzJJbnRlcmZhY2UgfCBzdHJpbmcsIHsgeG9ubHkgPSBmYWxzZSB9ID0ge30pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGsgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aCgneHB1YicpIHx8IGsuc3RhcnRzV2l0aCgneHBydicpKSB7XG4gICAgICByZXR1cm4gdG9QbGFpbihiaXAzMi5mcm9tQmFzZTU4KGspLCB7IHhvbmx5IH0pO1xuICAgIH1cbiAgICByZXR1cm4gaztcbiAgfVxuICByZXR1cm4gay5wdWJsaWNLZXkuc3ViYXJyYXkoeG9ubHkgPyAxIDogMCkudG9TdHJpbmcoJ2hleCcpO1xufVxuXG5mdW5jdGlvbiB0b1hPbmx5KGs6IEJJUDMySW50ZXJmYWNlIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvUGxhaW4oaywgeyB4b25seTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gbXVsdGlBcmdzKG06IG51bWJlciwgbjogbnVtYmVyLCBrZXlzOiBCSVAzMkludGVyZmFjZVtdIHwgc3RyaW5nW10sIHBhdGg6IHN0cmluZyk6IFtudW1iZXIsIC4uLnN0cmluZ1tdXSB7XG4gIGlmIChuIDwgbSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSAke219IG9mICR7bn0gbXVsdGlzaWdgKTtcbiAgfVxuICBpZiAoa2V5cy5sZW5ndGggPCBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZW5vdWdoIGtleXMgZm9yICR7bX0gb2YgJHtufSBtdWx0aXNpZzoga2V5cy5sZW5ndGg9JHtrZXlzLmxlbmd0aH1gKTtcbiAgfVxuICBrZXlzID0ga2V5cy5zbGljZSgwLCBuKTtcbiAgcmV0dXJuIFttLCAuLi5rZXlzLm1hcCgoaykgPT4gdG9YUHViKGssIHBhdGgpKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQc2J0UGFyYW1zKHQ6IERlc2NyaXB0b3JUZW1wbGF0ZSk6IFBhcnRpYWw8UHNidFBhcmFtcz4ge1xuICBzd2l0Y2ggKHQpIHtcbiAgICBjYXNlICdXc2gyT2YzQ2x0dkRyb3AnOlxuICAgICAgcmV0dXJuIHsgbG9ja3RpbWU6IDEgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlc2NyaXB0b3JOb2RlKFxuICB0ZW1wbGF0ZTogRGVzY3JpcHRvclRlbXBsYXRlLFxuICBrZXlzOiBLZXlUcmlwbGUgfCBzdHJpbmdbXSA9IGdldERlZmF1bHRYUHVicygpLFxuICBwYXRoID0gJzAvKidcbik6IGFzdC5EZXNjcmlwdG9yTm9kZSB7XG4gIHN3aXRjaCAodGVtcGxhdGUpIHtcbiAgICBjYXNlICdXc2gyT2YzJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdzaDogeyBtdWx0aTogbXVsdGlBcmdzKDIsIDMsIGtleXMsIHBhdGgpIH0sXG4gICAgICB9O1xuICAgIGNhc2UgJ1dzaDJPZjNDbHR2RHJvcCc6XG4gICAgICBjb25zdCB7IGxvY2t0aW1lIH0gPSBnZXRQc2J0UGFyYW1zKHRlbXBsYXRlKTtcbiAgICAgIGFzc2VydChsb2NrdGltZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3c2g6IHtcbiAgICAgICAgICBhbmRfdjogW3sgJ3I6YWZ0ZXInOiBsb2NrdGltZSB9LCB7IG11bHRpOiBtdWx0aUFyZ3MoMiwgMywga2V5cywgcGF0aCkgfV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIGNhc2UgJ1dzaDJPZjInOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3NoOiB7IG11bHRpOiBtdWx0aUFyZ3MoMiwgMiwga2V5cywgcGF0aCkgfSxcbiAgICAgIH07XG4gICAgY2FzZSAnVHIyT2YzLU5vS2V5UGF0aCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cjogW2dldFVuc3BlbmRhYmxlS2V5KCksIHsgbXVsdGlfYTogbXVsdGlBcmdzKDIsIDMsIGtleXMsIHBhdGgpIH1dLFxuICAgICAgfTtcbiAgICBjYXNlICdUcjFPZjMtTm9LZXlQYXRoLVRyZWUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHI6IFtcbiAgICAgICAgICBnZXRVbnNwZW5kYWJsZUtleSgpLFxuICAgICAgICAgIFt7IHBrOiB0b1hQdWIoa2V5c1swXSwgcGF0aCkgfSwgW3sgcGs6IHRvWFB1YihrZXlzWzFdLCBwYXRoKSB9LCB7IHBrOiB0b1hQdWIoa2V5c1syXSwgcGF0aCkgfV1dLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICBjYXNlICdUcjFPZjMtTm9LZXlQYXRoLVRyZWUtUGxhaW4nOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHI6IFtnZXRVbnNwZW5kYWJsZUtleSgpLCBbeyBwazogdG9YT25seShrZXlzWzBdKSB9LCBbeyBwazogdG9YT25seShrZXlzWzFdKSB9LCB7IHBrOiB0b1hPbmx5KGtleXNbMl0pIH1dXV0sXG4gICAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkZXNjcmlwdG9yIHRlbXBsYXRlOiAke3RlbXBsYXRlfWApO1xufVxuXG50eXBlIFRhcFRyZWUgPSBbVGFwVHJlZSwgVGFwVHJlZV0gfCBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbmZ1bmN0aW9uIGdldFRhcExlYWZTY3JpcHROb2Rlcyh0OiBhc3QuRGVzY3JpcHRvck5vZGUgfCBUYXBUcmVlKTogYXN0Lk1pbmlzY3JpcHROb2RlW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgIGlmICh0Lmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB0dXBsZSwgZ290OiAke0pTT04uc3RyaW5naWZ5KHQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdC5tYXAoKHYpID0+IChBcnJheS5pc0FycmF5KHYpID8gZ2V0VGFwTGVhZlNjcmlwdE5vZGVzKHYpIDogdikpLmZsYXQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBub2RlID0gdDtcbiAgICBpZiAoISgndHInIGluIG5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhcExlYWZTY3JpcHRzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgVGFwcm9vdCBkZXNjcmlwdG9ycywgZ290OiAke3R9YCk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlLnRyKSB8fCBub2RlLnRyLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB0dXBsZSwgZ290OiAke0pTT04uc3RyaW5naWZ5KG5vZGUudHIpfWApO1xuICAgIH1cbiAgICBjb25zdCB0YXBzY3JpcHQgPSBub2RlLnRyWzFdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXBzY3JpcHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHRhcHNjcmlwdCB0byBiZSBhbiBhcnJheSwgZ290OiAke0pTT04uc3RyaW5naWZ5KHRhcHNjcmlwdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBnZXRUYXBMZWFmU2NyaXB0Tm9kZXModGFwc2NyaXB0KTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dDogJHtKU09OLnN0cmluZ2lmeSh0KX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zS2V5KHNjcmlwdDogTWluaXNjcmlwdCB8IGFzdC5NaW5pc2NyaXB0Tm9kZSwga2V5OiBCSVAzMkludGVyZmFjZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc2NyaXB0IGluc3RhbmNlb2YgTWluaXNjcmlwdCkge1xuICAgIHNjcmlwdCA9IGFzdC5mcm9tTWluaXNjcmlwdChzY3JpcHQpO1xuICB9XG4gIGlmICgncGsnIGluIHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQucGsgPT09IHRvWE9ubHkoa2V5KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNjcmlwdCB0eXBlOiAke0pTT04uc3RyaW5naWZ5KHNjcmlwdCl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXBMZWFmU2NyaXB0cyhkOiBEZXNjcmlwdG9yKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0VGFwTGVhZlNjcmlwdE5vZGVzKGFzdC5mcm9tRGVzY3JpcHRvcihkKSkubWFwKChuKSA9PlxuICAgIE1pbmlzY3JpcHQuZnJvbVN0cmluZyhhc3QuZm9ybWF0Tm9kZShuKSwgJ3RhcCcpLnRvU3RyaW5nKClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NyaXB0b3IoXG4gIHRlbXBsYXRlOiBEZXNjcmlwdG9yVGVtcGxhdGUsXG4gIGtleXM6IEtleVRyaXBsZSB8IHN0cmluZ1tdID0gZ2V0RGVmYXVsdFhQdWJzKCksXG4gIHBhdGggPSAnMC8qJ1xuKTogRGVzY3JpcHRvciB7XG4gIHJldHVybiBEZXNjcmlwdG9yLmZyb21TdHJpbmdEZXRlY3RUeXBlKGFzdC5mb3JtYXROb2RlKGdldERlc2NyaXB0b3JOb2RlKHRlbXBsYXRlLCBrZXlzLCBwYXRoKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvck1hcChcbiAgdGVtcGxhdGU6IERlc2NyaXB0b3JUZW1wbGF0ZSxcbiAga2V5czogS2V5VHJpcGxlIHwgc3RyaW5nW10gPSBnZXREZWZhdWx0WFB1YnMoKVxuKTogRGVzY3JpcHRvck1hcCB7XG4gIHJldHVybiB0b0Rlc2NyaXB0b3JNYXAoe1xuICAgIGV4dGVybmFsOiBnZXREZXNjcmlwdG9yKHRlbXBsYXRlLCBrZXlzLCAnMC8qJykudG9TdHJpbmcoKSxcbiAgICBpbnRlcm5hbDogZ2V0RGVzY3JpcHRvcih0ZW1wbGF0ZSwga2V5cywgJzEvKicpLnRvU3RyaW5nKCksXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ export * from './descriptors';
2
+ export * from './mock.utils';
3
+ export * from './psbt.utils';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testutil/descriptor/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,20 @@
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("./descriptors"), exports);
18
+ __exportStar(require("./mock.utils"), exports);
19
+ __exportStar(require("./psbt.utils"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdHV0aWwvZGVzY3JpcHRvci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQThCO0FBQzlCLCtDQUE2QjtBQUM3QiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rlc2NyaXB0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9jay51dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3BzYnQudXRpbHMnO1xuIl19
@@ -0,0 +1,36 @@
1
+ import { Descriptor, Miniscript } from '@bitgo/wasm-miniscript';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ import { PsbtParams, DerivedDescriptorTransactionInput } from '../../descriptor';
4
+ import { DescriptorTemplate } from './descriptors';
5
+ type MockOutputIdParams = {
6
+ hash?: string;
7
+ vout?: number;
8
+ };
9
+ type BaseMockDescriptorOutputParams = {
10
+ id?: MockOutputIdParams;
11
+ index?: number;
12
+ value?: bigint;
13
+ sequence?: number;
14
+ selectTapLeafScript?: Miniscript;
15
+ };
16
+ export declare function mockDerivedDescriptorWalletOutput(descriptor: Descriptor, outputParams?: BaseMockDescriptorOutputParams): DerivedDescriptorTransactionInput;
17
+ type MockInput = BaseMockDescriptorOutputParams & {
18
+ index: number;
19
+ descriptor: Descriptor;
20
+ selectTapLeafScript?: Miniscript;
21
+ };
22
+ type MockOutput = {
23
+ descriptor: Descriptor;
24
+ index: number;
25
+ value: bigint;
26
+ external?: boolean;
27
+ };
28
+ export declare function mockPsbt(inputs: MockInput[], outputs: MockOutput[], params?: Partial<PsbtParams>): utxolib.bitgo.UtxoPsbt;
29
+ export declare function mockPsbtDefault({ descriptorSelf, descriptorOther, params, }?: {
30
+ descriptorSelf?: Descriptor;
31
+ descriptorOther?: Descriptor;
32
+ params?: Partial<PsbtParams>;
33
+ }): utxolib.bitgo.UtxoPsbt;
34
+ export declare function mockPsbtDefaultWithDescriptorTemplate(t: DescriptorTemplate, params?: Partial<PsbtParams>): utxolib.bitgo.UtxoPsbt;
35
+ export {};
36
+ //# sourceMappingURL=mock.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.utils.d.ts","sourceRoot":"","sources":["../../../../src/testutil/descriptor/mock.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EACL,UAAU,EAGV,iCAAiC,EAClC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAkC,MAAM,eAAe,CAAC;AAEnF,KAAK,kBAAkB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,KAAK,8BAA8B,GAAG;IACpC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAWF,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,UAAU,EACtB,YAAY,GAAE,8BAAmC,GAChD,iCAAiC,CAcnC;AAED,KAAK,SAAS,GAAG,8BAA8B,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,mBAAmB,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAMF,wBAAgB,QAAQ,CACtB,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAaxB;AAED,wBAAgB,eAAe,CAAC,EAC9B,cAA+D,EAC/D,eAAgE,EAChE,MAAW,GACZ,GAAE;IACD,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CACzB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAY9B;AAED,wBAAgB,qCAAqC,CACnD,CAAC,EAAE,kBAAkB,EACrB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMxB"}