@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.
- package/LICENSE +191 -0
- package/README.md +6 -0
- package/dist/src/Output.d.ts +43 -0
- package/dist/src/Output.d.ts.map +1 -0
- package/dist/src/Output.js +60 -0
- package/dist/src/bip322/index.d.ts +5 -0
- package/dist/src/bip322/index.d.ts.map +1 -0
- package/dist/src/bip322/index.js +21 -0
- package/dist/src/bip322/toSign.d.ts +25 -0
- package/dist/src/bip322/toSign.d.ts.map +1 -0
- package/dist/src/bip322/toSign.js +126 -0
- package/dist/src/bip322/toSpend.d.ts +22 -0
- package/dist/src/bip322/toSpend.d.ts.map +1 -0
- package/dist/src/bip322/toSpend.js +72 -0
- package/dist/src/bip322/utils.d.ts +18 -0
- package/dist/src/bip322/utils.d.ts.map +1 -0
- package/dist/src/bip322/utils.js +115 -0
- package/dist/src/bip322/verify.d.ts +12 -0
- package/dist/src/bip322/verify.d.ts.map +1 -0
- package/dist/src/bip322/verify.js +115 -0
- package/dist/src/bip32utils.d.ts +16 -0
- package/dist/src/bip32utils.d.ts.map +1 -0
- package/dist/src/bip32utils.js +71 -0
- package/dist/src/bip65/index.d.ts +2 -0
- package/dist/src/bip65/index.d.ts.map +1 -0
- package/dist/src/bip65/index.js +18 -0
- package/dist/src/bip65/locktime.d.ts +8 -0
- package/dist/src/bip65/locktime.d.ts.map +1 -0
- package/dist/src/bip65/locktime.js +37 -0
- package/dist/src/descriptor/DescriptorMap.d.ts +9 -0
- package/dist/src/descriptor/DescriptorMap.d.ts.map +1 -0
- package/dist/src/descriptor/DescriptorMap.js +9 -0
- package/dist/src/descriptor/Output.d.ts +23 -0
- package/dist/src/descriptor/Output.d.ts.map +1 -0
- package/dist/src/descriptor/Output.js +41 -0
- package/dist/src/descriptor/VirtualSize.d.ts +23 -0
- package/dist/src/descriptor/VirtualSize.d.ts.map +1 -0
- package/dist/src/descriptor/VirtualSize.js +100 -0
- package/dist/src/descriptor/address.d.ts +5 -0
- package/dist/src/descriptor/address.d.ts.map +1 -0
- package/dist/src/descriptor/address.js +48 -0
- package/dist/src/descriptor/derive.d.ts +13 -0
- package/dist/src/descriptor/derive.d.ts.map +1 -0
- package/dist/src/descriptor/derive.js +45 -0
- package/dist/src/descriptor/fromFixedScriptWallet.d.ts +16 -0
- package/dist/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
- package/dist/src/descriptor/fromFixedScriptWallet.js +88 -0
- package/dist/src/descriptor/index.d.ts +11 -0
- package/dist/src/descriptor/index.d.ts.map +1 -0
- package/dist/src/descriptor/index.js +27 -0
- package/dist/src/descriptor/parse/PatternMatcher.d.ts +14 -0
- package/dist/src/descriptor/parse/PatternMatcher.d.ts.map +1 -0
- package/dist/src/descriptor/parse/PatternMatcher.js +60 -0
- package/dist/src/descriptor/psbt/assertSatisfiable.d.ts +20 -0
- package/dist/src/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/assertSatisfiable.js +74 -0
- package/dist/src/descriptor/psbt/createPsbt.d.ts +23 -0
- package/dist/src/descriptor/psbt/createPsbt.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/createPsbt.js +107 -0
- package/dist/src/descriptor/psbt/findDescriptors.d.ts +26 -0
- package/dist/src/descriptor/psbt/findDescriptors.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/findDescriptors.js +98 -0
- package/dist/src/descriptor/psbt/index.d.ts +7 -0
- package/dist/src/descriptor/psbt/index.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/index.js +23 -0
- package/dist/src/descriptor/psbt/parse.d.ts +27 -0
- package/dist/src/descriptor/psbt/parse.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/parse.js +87 -0
- package/dist/src/descriptor/psbt/sign.d.ts +26 -0
- package/dist/src/descriptor/psbt/sign.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/sign.js +42 -0
- package/dist/src/descriptor/psbt/wrap.d.ts +12 -0
- package/dist/src/descriptor/psbt/wrap.d.ts.map +1 -0
- package/dist/src/descriptor/psbt/wrap.js +76 -0
- package/dist/src/dustThreshold.d.ts +4 -0
- package/dist/src/dustThreshold.d.ts.map +1 -0
- package/dist/src/dustThreshold.js +134 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +49 -0
- package/dist/src/paygo/attestation.d.ts +11 -0
- package/dist/src/paygo/attestation.d.ts.map +1 -0
- package/dist/src/paygo/attestation.js +58 -0
- package/dist/src/paygo/index.d.ts +3 -0
- package/dist/src/paygo/index.d.ts.map +1 -0
- package/dist/src/paygo/index.js +19 -0
- package/dist/src/paygo/parsePayGoAttestation.d.ts +16 -0
- package/dist/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
- package/dist/src/paygo/parsePayGoAttestation.js +50 -0
- package/dist/src/paygo/psbt/Errors.d.ts +22 -0
- package/dist/src/paygo/psbt/Errors.d.ts.map +1 -0
- package/dist/src/paygo/psbt/Errors.js +44 -0
- package/dist/src/paygo/psbt/index.d.ts +2 -0
- package/dist/src/paygo/psbt/index.d.ts.map +1 -0
- package/dist/src/paygo/psbt/index.js +18 -0
- package/dist/src/paygo/psbt/payGoAddressProof.d.ts +29 -0
- package/dist/src/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
- package/dist/src/paygo/psbt/payGoAddressProof.js +124 -0
- package/dist/src/testutil/descriptor/descriptors.d.ts +13 -0
- package/dist/src/testutil/descriptor/descriptors.d.ts.map +1 -0
- package/dist/src/testutil/descriptor/descriptors.js +162 -0
- package/dist/src/testutil/descriptor/index.d.ts +4 -0
- package/dist/src/testutil/descriptor/index.d.ts.map +1 -0
- package/dist/src/testutil/descriptor/index.js +20 -0
- package/dist/src/testutil/descriptor/mock.utils.d.ts +36 -0
- package/dist/src/testutil/descriptor/mock.utils.d.ts.map +1 -0
- package/dist/src/testutil/descriptor/mock.utils.js +92 -0
- package/dist/src/testutil/descriptor/psbt.utils.d.ts +4 -0
- package/dist/src/testutil/descriptor/psbt.utils.d.ts.map +1 -0
- package/dist/src/testutil/descriptor/psbt.utils.js +21 -0
- package/dist/src/testutil/fixtures.utils.d.ts +15 -0
- package/dist/src/testutil/fixtures.utils.d.ts.map +1 -0
- package/dist/src/testutil/fixtures.utils.js +127 -0
- package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
- package/dist/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
- package/dist/src/testutil/generatePayGoAttestationProof.utils.js +38 -0
- package/dist/src/testutil/index.d.ts +6 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/index.js +22 -0
- package/dist/src/testutil/key.utils.d.ts +16 -0
- package/dist/src/testutil/key.utils.d.ts.map +1 -0
- package/dist/src/testutil/key.utils.js +59 -0
- package/dist/src/testutil/toPlainObject.utils.d.ts +11 -0
- package/dist/src/testutil/toPlainObject.utils.d.ts.map +1 -0
- package/dist/src/testutil/toPlainObject.utils.js +89 -0
- package/dist/src/testutil/trimMessagePrefix.d.ts +11 -0
- package/dist/src/testutil/trimMessagePrefix.d.ts.map +1 -0
- package/dist/src/testutil/trimMessagePrefix.js +60 -0
- package/dist/src/xOnlyPubkey.d.ts +2 -0
- package/dist/src/xOnlyPubkey.d.ts.map +1 -0
- package/dist/src/xOnlyPubkey.js +18 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|