@bitgo-beta/utxo-core 1.0.1-alpha.11 → 1.0.1-alpha.111
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/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 +4 -0
- package/dist/src/bip322/index.d.ts.map +1 -0
- package/dist/src/bip322/index.js +20 -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 +125 -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 +10 -0
- package/dist/src/bip322/utils.d.ts.map +1 -0
- package/dist/src/bip322/utils.js +72 -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.map +1 -1
- package/dist/src/descriptor/DescriptorMap.js +2 -5
- package/dist/src/descriptor/Output.d.ts +2 -43
- package/dist/src/descriptor/Output.d.ts.map +1 -1
- package/dist/src/descriptor/Output.js +12 -66
- package/dist/src/descriptor/VirtualSize.d.ts +2 -0
- package/dist/src/descriptor/VirtualSize.d.ts.map +1 -1
- package/dist/src/descriptor/VirtualSize.js +14 -1
- package/dist/src/descriptor/address.d.ts +1 -1
- package/dist/src/descriptor/address.d.ts.map +1 -1
- package/dist/src/descriptor/address.js +2 -2
- 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 +10 -8
- package/dist/src/descriptor/index.d.ts.map +1 -1
- package/dist/src/descriptor/index.js +14 -36
- 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/createPsbt.d.ts +10 -2
- package/dist/src/descriptor/psbt/createPsbt.d.ts.map +1 -1
- package/dist/src/descriptor/psbt/createPsbt.js +35 -10
- package/dist/src/descriptor/psbt/findDescriptors.d.ts +6 -2
- package/dist/src/descriptor/psbt/findDescriptors.d.ts.map +1 -1
- package/dist/src/descriptor/psbt/findDescriptors.js +24 -11
- package/dist/src/descriptor/psbt/index.d.ts +1 -0
- package/dist/src/descriptor/psbt/index.d.ts.map +1 -1
- package/dist/src/descriptor/psbt/index.js +2 -1
- package/dist/src/descriptor/psbt/parse.d.ts +1 -1
- package/dist/src/descriptor/psbt/parse.d.ts.map +1 -1
- package/dist/src/descriptor/psbt/parse.js +8 -8
- 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/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 +7 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -2
- 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 +5 -2
- package/dist/src/testutil/descriptor/descriptors.d.ts.map +1 -1
- package/dist/src/testutil/descriptor/descriptors.js +58 -7
- package/dist/src/testutil/descriptor/mock.utils.d.ts +6 -4
- package/dist/src/testutil/descriptor/mock.utils.d.ts.map +1 -1
- package/dist/src/testutil/descriptor/mock.utils.js +10 -5
- package/dist/src/testutil/descriptor/psbt.utils.d.ts.map +1 -1
- package/dist/src/testutil/descriptor/psbt.utils.js +9 -8
- 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 +2 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +3 -1
- package/dist/src/testutil/toPlainObject.utils.d.ts.map +1 -1
- package/dist/src/testutil/toPlainObject.utils.js +16 -2
- 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 +11 -8
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type Output<TValue = bigint> = {
|
|
2
|
+
script: Buffer;
|
|
3
|
+
value: TValue;
|
|
4
|
+
};
|
|
5
|
+
export type MaxOutput = Output<'max'>;
|
|
6
|
+
type ValueBigInt = {
|
|
7
|
+
value: bigint;
|
|
8
|
+
};
|
|
9
|
+
type ValueMax = {
|
|
10
|
+
value: 'max';
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* @return true if the output is a max output
|
|
14
|
+
*/
|
|
15
|
+
export declare function isMaxOutput<A extends ValueBigInt, B extends ValueMax>(output: A | B): output is B;
|
|
16
|
+
/**
|
|
17
|
+
* @return the max output if there is one
|
|
18
|
+
* @throws if there are multiple max outputs
|
|
19
|
+
*/
|
|
20
|
+
export declare function getMaxOutput<A extends ValueBigInt, B extends ValueMax>(outputs: (A | B)[]): B | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* @return the sum of the outputs
|
|
23
|
+
*/
|
|
24
|
+
export declare function getOutputSum(outputs: ValueBigInt[]): bigint;
|
|
25
|
+
/**
|
|
26
|
+
* @return the sum of the outputs that are not 'max'
|
|
27
|
+
*/
|
|
28
|
+
export declare function getFixedOutputSum(outputs: (ValueBigInt | ValueMax)[]): bigint;
|
|
29
|
+
/**
|
|
30
|
+
* @param outputs
|
|
31
|
+
* @param params
|
|
32
|
+
* @return the outputs with the 'max' output replaced with the max amount
|
|
33
|
+
*/
|
|
34
|
+
export declare function toFixedOutputs<A extends ValueBigInt, B extends ValueMax>(outputs: (A | B)[], params: {
|
|
35
|
+
maxAmount: bigint;
|
|
36
|
+
}): A[];
|
|
37
|
+
export type PrevOutput = {
|
|
38
|
+
hash: string;
|
|
39
|
+
index: number;
|
|
40
|
+
witnessUtxo: Output;
|
|
41
|
+
};
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=Output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Output.d.ts","sourceRoot":"","sources":["../../src/Output.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,CAAC,MAAM,GAAG,MAAM,IAAI;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACtC,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACrC,KAAK,QAAQ,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEjC;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,CAEjG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CASzG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAE,GAAG,MAAM,CAE7E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,QAAQ,EACtE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAClB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5B,CAAC,EAAE,CAaL;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMaxOutput = isMaxOutput;
|
|
4
|
+
exports.getMaxOutput = getMaxOutput;
|
|
5
|
+
exports.getOutputSum = getOutputSum;
|
|
6
|
+
exports.getFixedOutputSum = getFixedOutputSum;
|
|
7
|
+
exports.toFixedOutputs = toFixedOutputs;
|
|
8
|
+
/**
|
|
9
|
+
* @return true if the output is a max output
|
|
10
|
+
*/
|
|
11
|
+
function isMaxOutput(output) {
|
|
12
|
+
return output.value === 'max';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @return the max output if there is one
|
|
16
|
+
* @throws if there are multiple max outputs
|
|
17
|
+
*/
|
|
18
|
+
function getMaxOutput(outputs) {
|
|
19
|
+
const max = outputs.filter((isMaxOutput));
|
|
20
|
+
if (max.length === 0) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
if (max.length > 1) {
|
|
24
|
+
throw new Error('Multiple max outputs');
|
|
25
|
+
}
|
|
26
|
+
return max[0];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @return the sum of the outputs
|
|
30
|
+
*/
|
|
31
|
+
function getOutputSum(outputs) {
|
|
32
|
+
return outputs.reduce((sum, output) => sum + output.value, 0n);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @return the sum of the outputs that are not 'max'
|
|
36
|
+
*/
|
|
37
|
+
function getFixedOutputSum(outputs) {
|
|
38
|
+
return getOutputSum(outputs.filter((o) => !isMaxOutput(o)));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @param outputs
|
|
42
|
+
* @param params
|
|
43
|
+
* @return the outputs with the 'max' output replaced with the max amount
|
|
44
|
+
*/
|
|
45
|
+
function toFixedOutputs(outputs, params) {
|
|
46
|
+
// assert that there is at most one max output
|
|
47
|
+
const maxOutput = getMaxOutput(outputs);
|
|
48
|
+
return outputs.map((output) => {
|
|
49
|
+
if (isMaxOutput(output)) {
|
|
50
|
+
if (output !== maxOutput) {
|
|
51
|
+
throw new Error('illegal state');
|
|
52
|
+
}
|
|
53
|
+
return { ...output, value: params.maxAmount };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return output;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLGtDQUVDO0FBTUQsb0NBU0M7QUFLRCxvQ0FFQztBQUtELDhDQUVDO0FBT0Qsd0NBZ0JDO0FBekREOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUE0QyxNQUFhO0lBQ2xGLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBNEMsT0FBa0I7SUFDeEYsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLFdBQWlCLENBQUEsQ0FBQyxDQUFDO0lBQzlDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLE9BQXNCO0lBQ2pELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE9BQW1DO0lBQ25FLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FDNUIsT0FBa0IsRUFDbEIsTUFBNkI7SUFFN0IsOENBQThDO0lBQzlDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBTyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUssRUFBRTtRQUMvQixJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPdXRwdXQ8VFZhbHVlID0gYmlnaW50PiA9IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIHZhbHVlOiBUVmFsdWU7XG59O1xuZXhwb3J0IHR5cGUgTWF4T3V0cHV0ID0gT3V0cHV0PCdtYXgnPjtcbnR5cGUgVmFsdWVCaWdJbnQgPSB7IHZhbHVlOiBiaWdpbnQgfTtcbnR5cGUgVmFsdWVNYXggPSB7IHZhbHVlOiAnbWF4JyB9O1xuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3V0cHV0IGlzIGEgbWF4IG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXhPdXRwdXQ8QSBleHRlbmRzIFZhbHVlQmlnSW50LCBCIGV4dGVuZHMgVmFsdWVNYXg+KG91dHB1dDogQSB8IEIpOiBvdXRwdXQgaXMgQiB7XG4gIHJldHVybiBvdXRwdXQudmFsdWUgPT09ICdtYXgnO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdGhlIG1heCBvdXRwdXQgaWYgdGhlcmUgaXMgb25lXG4gKiBAdGhyb3dzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXggb3V0cHV0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4T3V0cHV0PEEgZXh0ZW5kcyBWYWx1ZUJpZ0ludCwgQiBleHRlbmRzIFZhbHVlTWF4PihvdXRwdXRzOiAoQSB8IEIpW10pOiBCIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4ID0gb3V0cHV0cy5maWx0ZXIoaXNNYXhPdXRwdXQ8QSwgQj4pO1xuICBpZiAobWF4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKG1heC5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBtYXggb3V0cHV0cycpO1xuICB9XG4gIHJldHVybiBtYXhbMF07XG59XG5cbi8qKlxuICogQHJldHVybiB0aGUgc3VtIG9mIHRoZSBvdXRwdXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRTdW0ob3V0cHV0czogVmFsdWVCaWdJbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvdXRwdXQpID0+IHN1bSArIG91dHB1dC52YWx1ZSwgMG4pO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdGhlIHN1bSBvZiB0aGUgb3V0cHV0cyB0aGF0IGFyZSBub3QgJ21heCdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpeGVkT3V0cHV0U3VtKG91dHB1dHM6IChWYWx1ZUJpZ0ludCB8IFZhbHVlTWF4KVtdKTogYmlnaW50IHtcbiAgcmV0dXJuIGdldE91dHB1dFN1bShvdXRwdXRzLmZpbHRlcigobyk6IG8gaXMgT3V0cHV0ID0+ICFpc01heE91dHB1dChvKSkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvdXRwdXRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcmV0dXJuIHRoZSBvdXRwdXRzIHdpdGggdGhlICdtYXgnIG91dHB1dCByZXBsYWNlZCB3aXRoIHRoZSBtYXggYW1vdW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0ZpeGVkT3V0cHV0czxBIGV4dGVuZHMgVmFsdWVCaWdJbnQsIEIgZXh0ZW5kcyBWYWx1ZU1heD4oXG4gIG91dHB1dHM6IChBIHwgQilbXSxcbiAgcGFyYW1zOiB7IG1heEFtb3VudDogYmlnaW50IH1cbik6IEFbXSB7XG4gIC8vIGFzc2VydCB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIG1heCBvdXRwdXRcbiAgY29uc3QgbWF4T3V0cHV0ID0gZ2V0TWF4T3V0cHV0PEEsIEI+KG91dHB1dHMpO1xuICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCk6IEEgPT4ge1xuICAgIGlmIChpc01heE91dHB1dChvdXRwdXQpKSB7XG4gICAgICBpZiAob3V0cHV0ICE9PSBtYXhPdXRwdXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbGxlZ2FsIHN0YXRlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5vdXRwdXQsIHZhbHVlOiBwYXJhbXMubWF4QW1vdW50IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgUHJldk91dHB1dCA9IHtcbiAgaGFzaDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICB3aXRuZXNzVXR4bzogT3V0cHV0O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/bip322/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,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("./toSpend"), exports);
|
|
18
|
+
__exportStar(require("./toSign"), exports);
|
|
19
|
+
__exportStar(require("./utils"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBMEI7QUFDMUIsMkNBQXlCO0FBQ3pCLDBDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdG9TcGVuZCc7XG5leHBvcnQgKiBmcm9tICcuL3RvU2lnbic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Psbt, bitgo } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
export type AddressDetails = {
|
|
3
|
+
redeemScript?: Buffer;
|
|
4
|
+
witnessScript?: Buffer;
|
|
5
|
+
scriptPubKey: Buffer;
|
|
6
|
+
};
|
|
7
|
+
export declare const MAX_NUM_BIP322_INPUTS = 200;
|
|
8
|
+
/**
|
|
9
|
+
* Create the base PSBT for the to_sign transaction for BIP322 signing.
|
|
10
|
+
* There will be ever 1 output.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBaseToSignPsbt(rootWalletKeys?: bitgo.RootWalletKeys): bitgo.UtxoPsbt;
|
|
13
|
+
/**
|
|
14
|
+
* Add a BIP322 input to the PSBT.
|
|
15
|
+
* Source implementation:
|
|
16
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
17
|
+
*
|
|
18
|
+
* @param {string} message - The message that is hashed into the `to_spend` transaction.
|
|
19
|
+
* @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
|
|
20
|
+
* @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
21
|
+
* @returns {Psbt} - The hex representation of the constructed PSBT.
|
|
22
|
+
*/
|
|
23
|
+
export declare function addBip322Input(psbt: Psbt, message: string, addressDetails: AddressDetails, tag?: string): void;
|
|
24
|
+
export declare function addBip322InputWithChainAndIndex(psbt: bitgo.UtxoPsbt, message: string, rootWalletKeys: bitgo.RootWalletKeys, scriptId: bitgo.ScriptId): void;
|
|
25
|
+
//# sourceMappingURL=toSign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSign.d.ts","sourceRoot":"","sources":["../../../src/bip322/toSign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAY,MAAM,sBAAsB,CAAC;AAM7D,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAmB1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,SAAa,GAAG,IAAI,CA4BlH;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,KAAK,CAAC,QAAQ,EACpB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACvB,IAAI,CA0EN"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_NUM_BIP322_INPUTS = void 0;
|
|
4
|
+
exports.createBaseToSignPsbt = createBaseToSignPsbt;
|
|
5
|
+
exports.addBip322Input = addBip322Input;
|
|
6
|
+
exports.addBip322InputWithChainAndIndex = addBip322InputWithChainAndIndex;
|
|
7
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
8
|
+
const outputScripts_1 = require("@bitgo-beta/utxo-lib/dist/src/bitgo/outputScripts");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
const toSpend_1 = require("./toSpend");
|
|
11
|
+
exports.MAX_NUM_BIP322_INPUTS = 200;
|
|
12
|
+
/**
|
|
13
|
+
* Create the base PSBT for the to_sign transaction for BIP322 signing.
|
|
14
|
+
* There will be ever 1 output.
|
|
15
|
+
*/
|
|
16
|
+
function createBaseToSignPsbt(rootWalletKeys) {
|
|
17
|
+
// Create PSBT object for constructing the transaction
|
|
18
|
+
const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network: utxo_lib_1.networks.bitcoin });
|
|
19
|
+
// Set default value for nVersion and nLockTime
|
|
20
|
+
psbt.setVersion(0); // nVersion = 0
|
|
21
|
+
psbt.setLocktime(0); // nLockTime = 0
|
|
22
|
+
// Set the output
|
|
23
|
+
psbt.addOutput({
|
|
24
|
+
value: BigInt(0), // vout[0].nValue = 0
|
|
25
|
+
script: Buffer.from([0x6a]), // vout[0].scriptPubKey = OP_RETURN
|
|
26
|
+
});
|
|
27
|
+
// If rootWalletKeys are provided, add them to the PSBT as global xpubs
|
|
28
|
+
if (rootWalletKeys) {
|
|
29
|
+
utxo_lib_1.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
|
|
30
|
+
}
|
|
31
|
+
return psbt;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Add a BIP322 input to the PSBT.
|
|
35
|
+
* Source implementation:
|
|
36
|
+
* https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
37
|
+
*
|
|
38
|
+
* @param {string} message - The message that is hashed into the `to_spend` transaction.
|
|
39
|
+
* @param {AddressDetails} addressDetails - The details of the address, including redeemScript and/or witnessScript.
|
|
40
|
+
* @param {string} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
41
|
+
* @returns {Psbt} - The hex representation of the constructed PSBT.
|
|
42
|
+
*/
|
|
43
|
+
function addBip322Input(psbt, message, addressDetails, tag = toSpend_1.BIP322_TAG) {
|
|
44
|
+
const toSpendTx = (0, toSpend_1.buildToSpendTransaction)(addressDetails.scriptPubKey, message, tag);
|
|
45
|
+
if (psbt.data.inputs.length >= exports.MAX_NUM_BIP322_INPUTS) {
|
|
46
|
+
throw new Error(`Exceeded maximum number of BIP322 inputs (${exports.MAX_NUM_BIP322_INPUTS})`);
|
|
47
|
+
}
|
|
48
|
+
psbt.addInput({
|
|
49
|
+
hash: toSpendTx.getId(), // vin[0].prevout.hash = to_spend.txid
|
|
50
|
+
index: 0, // vin[0].prevout.n = 0
|
|
51
|
+
sequence: 0, // vin[0].nSequence = 0
|
|
52
|
+
nonWitnessUtxo: toSpendTx.toBuffer(), // previous transaction for us to rebuild later to verify
|
|
53
|
+
});
|
|
54
|
+
const inputIndex = psbt.data.inputs.length - 1;
|
|
55
|
+
psbt.updateInput(inputIndex, {
|
|
56
|
+
witnessUtxo: { value: BigInt(0), script: addressDetails.scriptPubKey },
|
|
57
|
+
});
|
|
58
|
+
if (addressDetails.redeemScript) {
|
|
59
|
+
psbt.updateInput(inputIndex, { redeemScript: addressDetails.redeemScript });
|
|
60
|
+
}
|
|
61
|
+
if (addressDetails.witnessScript) {
|
|
62
|
+
psbt.updateInput(inputIndex, {
|
|
63
|
+
witnessScript: addressDetails.witnessScript,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Add the message as a proprietary key value to the PSBT so we can verify it later
|
|
67
|
+
(0, utils_1.addBip322ProofMessage)(psbt, inputIndex, Buffer.from(message));
|
|
68
|
+
}
|
|
69
|
+
function addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, scriptId) {
|
|
70
|
+
const scriptType = utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain);
|
|
71
|
+
const walletKeys = rootWalletKeys.deriveForChainAndIndex(scriptId.chain, scriptId.index);
|
|
72
|
+
const output = utxo_lib_1.bitgo.outputScripts.createOutputScript2of3(walletKeys.publicKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain));
|
|
73
|
+
addBip322Input(psbt, message, {
|
|
74
|
+
scriptPubKey: output.scriptPubKey,
|
|
75
|
+
redeemScript: output.redeemScript,
|
|
76
|
+
witnessScript: output.witnessScript,
|
|
77
|
+
});
|
|
78
|
+
const inputIndex = psbt.data.inputs.length - 1;
|
|
79
|
+
// When adding the taproot metadata, we assume that we are NOT using the backup path
|
|
80
|
+
// For script type p2tr, it means that we are using signer and bitgo keys when creating the tap tree
|
|
81
|
+
// spending paths. For p2trMusig2, it means that we are using the taproot key path spending
|
|
82
|
+
const keyNames = ['user', 'bitgo'];
|
|
83
|
+
if (scriptType === 'p2tr') {
|
|
84
|
+
const { controlBlock, witnessScript, leafVersion, leafHash } = utxo_lib_1.bitgo.outputScripts.createSpendScriptP2tr(walletKeys.publicKeys, [walletKeys.user.publicKey, walletKeys.bitgo.publicKey]);
|
|
85
|
+
psbt.updateInput(inputIndex, {
|
|
86
|
+
tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
|
|
87
|
+
});
|
|
88
|
+
psbt.updateInput(inputIndex, {
|
|
89
|
+
tapBip32Derivation: keyNames.map((key) => ({
|
|
90
|
+
leafHashes: [leafHash],
|
|
91
|
+
pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
|
|
92
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
|
|
93
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
94
|
+
})),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else if (scriptType === 'p2trMusig2') {
|
|
98
|
+
const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = utxo_lib_1.bitgo.outputScripts.createKeyPathP2trMusig2(walletKeys.publicKeys);
|
|
99
|
+
const participantsKeyValData = utxo_lib_1.bitgo.musig2.encodePsbtMusig2Participants({
|
|
100
|
+
tapOutputKey,
|
|
101
|
+
tapInternalKey,
|
|
102
|
+
participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
|
|
103
|
+
});
|
|
104
|
+
utxo_lib_1.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, participantsKeyValData);
|
|
105
|
+
psbt.updateInput(inputIndex, {
|
|
106
|
+
tapInternalKey: tapInternalKey,
|
|
107
|
+
});
|
|
108
|
+
psbt.updateInput(inputIndex, {
|
|
109
|
+
tapMerkleRoot: taptreeRoot,
|
|
110
|
+
});
|
|
111
|
+
psbt.updateInput(inputIndex, {
|
|
112
|
+
tapBip32Derivation: keyNames.map((key) => ({
|
|
113
|
+
leafHashes: [],
|
|
114
|
+
pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletKeys[key].publicKey),
|
|
115
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], scriptId.chain, scriptId.index),
|
|
116
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
117
|
+
})),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Add bip32 derivation information for the input
|
|
122
|
+
psbt.updateInput(inputIndex, utxo_lib_1.bitgo.getPsbtBip32DerivationOutputUpdate(rootWalletKeys, walletKeys, utxo_lib_1.bitgo.scriptTypeForChain(scriptId.chain)));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TaWduLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi90b1NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBLG9EQW1CQztBQVlELHdDQTRCQztBQUVELDBFQStFQztBQTdKRCxtREFBNkQ7QUFDN0QscUZBQXFGO0FBRXJGLG1DQUFnRDtBQUNoRCx1Q0FBZ0U7QUFPbkQsUUFBQSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFekM7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsY0FBcUM7SUFDeEUsc0RBQXNEO0lBQ3RELE1BQU0sSUFBSSxHQUFHLGdCQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLCtDQUErQztJQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTtJQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO0lBRXJDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLG1DQUFtQztLQUNqRSxDQUFDLENBQUM7SUFFSCx1RUFBdUU7SUFDdkUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixnQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxJQUFVLEVBQUUsT0FBZSxFQUFFLGNBQThCLEVBQUUsR0FBRyxHQUFHLG9CQUFVO0lBQzFHLE1BQU0s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LENBQUM7U0FDNUUsQ0FBQyxDQUFDO1FBQ0gsZ0JBQUssQ0FBQywyQ0FBMkMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBRXJHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQzNCLGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQzNCLGFBQWEsRUFBRSxXQUFXO1NBQzNCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQzNCLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxJQUFBLGdDQUFnQixFQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ25ELElBQUksRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDM0YsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVc7YUFDbkQsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FDZCxVQUFVLEVBQ1YsZ0JBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLGdCQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQy9HLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQsIGJpdGdvLCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYi9kaXN0L3NyYy9iaXRnby9vdXRwdXRTY3JpcHRzJztcblxuaW1wb3J0IHsgYWRkQmlwMzIyUHJvb2ZNZXNzYWdlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBCSVAzMjJfVEFHLCBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdG9TcGVuZCc7XG5cbmV4cG9ydCB0eXBlIEFkZHJlc3NEZXRhaWxzID0ge1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIHNjcmlwdFB1YktleTogQnVmZmVyO1xufTtcbmV4cG9ydCBjb25zdCBNQVhfTlVNX0JJUDMyMl9JTlBVVFMgPSAyMDA7XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiYXNlIFBTQlQgZm9yIHRoZSB0b19zaWduIHRyYW5zYWN0aW9uIGZvciBCSVAzMjIgc2lnbmluZy5cbiAqIFRoZXJlIHdpbGwgYmUgZXZlciAxIG91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzPzogYml0Z28uUm9vdFdhbGxldEtleXMpOiBiaXRnby5VdHhvUHNidCB7XG4gIC8vIENyZWF0ZSBQU0JUIG9iamVjdCBmb3IgY29uc3RydWN0aW5nIHRoZSB0cmFuc2FjdGlvblxuICBjb25zdCBwc2J0ID0gYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrOiBuZXR3b3Jrcy5iaXRjb2luIH0pO1xuICAvLyBTZXQgZGVmYXVsdCB2YWx1ZSBmb3IgblZlcnNpb24gYW5kIG5Mb2NrVGltZVxuICBwc2J0LnNldFZlcnNpb24oMCk7IC8vIG5WZXJzaW9uID0gMFxuICBwc2J0LnNldExvY2t0aW1lKDApOyAvLyBuTG9ja1RpbWUgPSAwXG5cbiAgLy8gU2V0IHRoZSBvdXRwdXRcbiAgcHNidC5hZGRPdXRwdXQoe1xuICAgIHZhbHVlOiBCaWdJbnQoMCksIC8vIHZvdXRbMF0ublZhbHVlID0gMFxuICAgIHNjcmlwdDogQnVmZmVyLmZyb20oWzB4NmFdKSwgLy8gdm91dFswXS5zY3JpcHRQdWJLZXkgPSBPUF9SRVRVUk5cbiAgfSk7XG5cbiAgLy8gSWYgcm9vdFdhbGxldEtleXMgYXJlIHByb3ZpZGVkLCBhZGQgdGhlbSB0byB0aGUgUFNCVCBhcyBnbG9iYWwgeHB1YnNcbiAgaWYgKHJvb3RXYWxsZXRLZXlzKSB7XG4gICAgYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgcm9vdFdhbGxldEtleXMpO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogQWRkIGEgQklQMzIyIGlucHV0IHRvIHRoZSBQU0JULlxuICogU291cmNlIGltcGxlbWVudGF0aW9uOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjZnVsbFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdGhhdCBpcyBoYXNoZWQgaW50byB0aGUgYHRvX3NwZW5kYCB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSB7QWRkcmVzc0RldGFpbHN9IGFkZHJlc3NEZXRhaWxzIC0gVGhlIGRldGFpbHMgb2YgdGhlIGFkZHJlc3MsIGluY2x1ZGluZyByZWRlZW1TY3JpcHQgYW5kL29yIHdpdG5lc3NTY3JpcHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz1CSVAzMjJfVEFHXSAtIFRoZSB0YWcgdG8gdXNlIGZvciBoYXNoaW5nLCBkZWZhdWx0cyB0byBCSVAzMjJfVEFHLlxuICogQHJldHVybnMge1BzYnR9IC0gVGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0ZWQgUFNCVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEJpcDMyMklucHV0KHBzYnQ6IFBzYnQsIG1lc3NhZ2U6IHN0cmluZywgYWRkcmVzc0RldGFpbHM6IEFkZHJlc3NEZXRhaWxzLCB0YWcgPSBCSVAzMjJfVEFHKTogdm9pZCB7XG4gIGNvbnN0IHRvU3BlbmRUeCA9IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uKGFkZHJlc3NEZXRhaWxzLnNjcmlwdFB1YktleSwgbWVzc2FnZSwgdGFnKTtcbiAgaWYgKHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoID49IE1BWF9OVU1fQklQMzIyX0lOUFVUUykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhjZWVkZWQgbWF4aW11bSBudW1iZXIgb2YgQklQMzIyIGlucHV0cyAoJHtNQVhfTlVNX0JJUDMyMl9JTlBVVFN9KWApO1xuICB9XG5cbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogdG9TcGVuZFR4LmdldElkKCksIC8vIHZpblswXS5wcmV2b3V0Lmhhc2ggPSB0b19zcGVuZC50eGlkXG4gICAgaW5kZXg6IDAsIC8vIHZpblswXS5wcmV2b3V0Lm4gPSAwXG4gICAgc2VxdWVuY2U6IDAsIC8vIHZpblswXS5uU2VxdWVuY2UgPSAwXG4gICAgbm9uV2l0bmVzc1V0eG86IHRvU3BlbmRUeC50b0J1ZmZlcigpLCAvLyBwcmV2aW91cyB0cmFuc2FjdGlvbiBmb3IgdXMgdG8gcmVidWlsZCBsYXRlciB0byB2ZXJpZnlcbiAgfSk7XG4gIGNvbnN0IGlucHV0SW5kZXggPSBwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCAtIDE7XG4gIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgIHdpdG5lc3NVdHhvOiB7IHZhbHVlOiBCaWdJbnQoMCksIHNjcmlwdDogYWRkcmVzc0RldGFpbHMuc2NyaXB0UHViS2V5IH0sXG4gIH0pO1xuXG4gIGlmIChhZGRyZXNzRGV0YWlscy5yZWRlZW1TY3JpcHQpIHtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgcmVkZWVtU2NyaXB0OiBhZGRyZXNzRGV0YWlscy5yZWRlZW1TY3JpcHQgfSk7XG4gIH1cbiAgaWYgKGFkZHJlc3NEZXRhaWxzLndpdG5lc3NTY3JpcHQpIHtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHdpdG5lc3NTY3JpcHQ6IGFkZHJlc3NEZXRhaWxzLndpdG5lc3NTY3JpcHQsXG4gICAgfSk7XG4gIH1cblxuICAvLyBBZGQgdGhlIG1lc3NhZ2UgYXMgYSBwcm9wcmlldGFyeSBrZXkgdmFsdWUgdG8gdGhlIFBTQlQgc28gd2UgY2FuIHZlcmlmeSBpdCBsYXRlclxuICBhZGRCaXAzMjJQcm9vZk1lc3NhZ2UocHNidCwgaW5wdXRJbmRleCwgQnVmZmVyLmZyb20obWVzc2FnZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQmlwMzIySW5wdXRXaXRoQ2hhaW5BbmRJbmRleChcbiAgcHNidDogYml0Z28uVXR4b1BzYnQsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgcm9vdFdhbGxldEtleXM6IGJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBzY3JpcHRJZDogYml0Z28uU2NyaXB0SWRcbik6IHZvaWQge1xuICBjb25zdCBzY3JpcHRUeXBlID0gYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKHNjcmlwdElkLmNoYWluKTtcbiAgY29uc3Qgd2FsbGV0S2V5cyA9IHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoc2NyaXB0SWQuY2hhaW4sIHNjcmlwdElkLmluZGV4KTtcbiAgY29uc3Qgb3V0cHV0ID0gYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgIHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICBiaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oc2NyaXB0SWQuY2hhaW4pXG4gICk7XG5cbiAgYWRkQmlwMzIySW5wdXQocHNidCBhcyBQc2J0LCBtZXNzYWdlLCB7XG4gICAgc2NyaXB0UHViS2V5OiBvdXRwdXQuc2NyaXB0UHViS2V5LFxuICAgIHJlZGVlbVNjcmlwdDogb3V0cHV0LnJlZGVlbVNjcmlwdCxcbiAgICB3aXRuZXNzU2NyaXB0OiBvdXRwdXQud2l0bmVzc1NjcmlwdCxcbiAgfSk7XG5cbiAgY29uc3QgaW5wdXRJbmRleCA9IHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoIC0gMTtcblxuICAvLyBXaGVuIGFkZGluZyB0aGUgdGFwcm9vdCBtZXRhZGF0YSwgd2UgYXNzdW1lIHRoYXQgd2UgYXJlIE5PVCB1c2luZyB0aGUgYmFja3VwIHBhdGhcbiAgLy8gRm9yIHNjcmlwdCB0eXBlIHAydHIsIGl0IG1lYW5zIHRoYXQgd2UgYXJlIHVzaW5nIHNpZ25lciBhbmQgYml0Z28ga2V5cyB3aGVuIGNyZWF0aW5nIHRoZSB0YXAgdHJlZVxuICAvLyBzcGVuZGluZyBwYXRocy4gRm9yIHAydHJNdXNpZzIsIGl0IG1lYW5zIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSB0YXByb290IGtleSBwYXRoIHNwZW5kaW5nXG4gIGNvbnN0IGtleU5hbWVzID0gWyd1c2VyJywgJ2JpdGdvJ10gYXMgYml0Z28uS2V5TmFtZVtdO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHdpdG5lc3NTY3JpcHQsIGxlYWZWZXJzaW9uLCBsZWFmSGFzaCB9ID0gYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVTcGVuZFNjcmlwdFAydHIoXG4gICAgICB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgICBbd2FsbGV0S2V5cy51c2VyLnB1YmxpY0tleSwgd2FsbGV0S2V5cy5iaXRnby5wdWJsaWNLZXldXG4gICAgKTtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcExlYWZTY3JpcHQ6IFt7IGNvbnRyb2xCbG9jaywgc2NyaXB0OiB3aXRuZXNzU2NyaXB0LCBsZWFmVmVyc2lvbiB9XSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBrZXlOYW1lcy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgbGVhZkhhc2hlczogW2xlYWZIYXNoXSxcbiAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290V2FsbGV0S2V5c1trZXldLCBzY3JpcHRJZC5jaGFpbiwgc2NyaXB0SWQuaW5kZXgpLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXNba2V5XS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAncDJ0ck11c2lnMicpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcm5hbFB1YmtleTogdGFwSW50ZXJuYWxLZXksXG4gICAgICBvdXRwdXRQdWJrZXk6IHRhcE91dHB1dEtleSxcbiAgICAgIHRhcHRyZWVSb290LFxuICAgIH0gPSBiaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZUtleVBhdGhQMnRyTXVzaWcyKHdhbGxldEtleXMucHVibGljS2V5cyk7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gYml0Z28ubXVzaWcyLmVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoe1xuICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgdGFwSW50ZXJuYWxLZXksXG4gICAgICBwYXJ0aWNpcGFudFB1YktleXM6IFt3YWxsZXRLZXlzLnVzZXIucHVibGljS2V5LCB3YWxsZXRLZXlzLmJpdGdvLnB1YmxpY0tleV0sXG4gICAgfSk7XG4gICAgYml0Z28uYWRkUHJvcHJpZXRhcnlLZXlWYWx1ZXNGcm9tVW5rbm93bktleVZhbHVlcyhwc2J0LCAnaW5wdXQnLCBpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwSW50ZXJuYWxLZXk6IHRhcEludGVybmFsS2V5LFxuICAgIH0pO1xuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBNZXJrbGVSb290OiB0YXB0cmVlUm9vdCxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBrZXlOYW1lcy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgbGVhZkhhc2hlczogW10sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRLZXlzW2tleV0ucHVibGljS2V5KSxcbiAgICAgICAgcGF0aDogcm9vdFdhbGxldEtleXMuZ2V0RGVyaXZhdGlvblBhdGgocm9vdFdhbGxldEtleXNba2V5XSwgc2NyaXB0SWQuY2hhaW4sIHNjcmlwdElkLmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzW2tleV0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQWRkIGJpcDMyIGRlcml2YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dFxuICAgIHBzYnQudXBkYXRlSW5wdXQoXG4gICAgICBpbnB1dEluZGV4LFxuICAgICAgYml0Z28uZ2V0UHNidEJpcDMyRGVyaXZhdGlvbk91dHB1dFVwZGF0ZShyb290V2FsbGV0S2V5cywgd2FsbGV0S2V5cywgYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKHNjcmlwdElkLmNoYWluKSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Transaction, bitgo } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
export declare const BIP322_TAG = "BIP0322-signed-message";
|
|
3
|
+
/**
|
|
4
|
+
* Perform a tagged hash
|
|
5
|
+
*
|
|
6
|
+
* @param {string | Buffer} message - The message to hash as a Buffer or utf-8 string
|
|
7
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
8
|
+
* @returns {Buffer} - The resulting hash of the message with the tag.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hashMessageWithTag(message: string | Buffer, tag?: string): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Build a BIP322 "to spend" transaction
|
|
13
|
+
* Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
14
|
+
*
|
|
15
|
+
* @param {Buffer} scriptPubKey - The scriptPubKey to use for the output
|
|
16
|
+
* @param {string | Buffer} message - The message to include in the transaction
|
|
17
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
18
|
+
* @returns {Transaction} - The constructed transaction
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildToSpendTransaction(scriptPubKey: Buffer, message: string | Buffer, tag?: string): Transaction<bigint>;
|
|
21
|
+
export declare function buildToSpendTransactionFromChainAndIndex(rootWalletKeys: bitgo.RootWalletKeys, chain: bitgo.ChainCode, index: number, message: string | Buffer, tag?: string): Transaction<bigint>;
|
|
22
|
+
//# sourceMappingURL=toSpend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSpend.d.ts","sourceRoot":"","sources":["../../../src/bip322/toSpend.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAE,KAAK,EAAY,MAAM,sBAAsB,CAAC;AAE1E,eAAO,MAAM,UAAU,2BAA2B,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAYrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,GAAG,SAAa,GACf,WAAW,CAAC,MAAM,CAAC,CA4BrB;AAED,wBAAgB,wCAAwC,CACtD,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,GAAG,SAAa,GACf,WAAW,CAAC,MAAM,CAAC,CAOrB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BIP322_TAG = void 0;
|
|
4
|
+
exports.hashMessageWithTag = hashMessageWithTag;
|
|
5
|
+
exports.buildToSpendTransaction = buildToSpendTransaction;
|
|
6
|
+
exports.buildToSpendTransactionFromChainAndIndex = buildToSpendTransactionFromChainAndIndex;
|
|
7
|
+
const fast_sha256_1 = require("fast-sha256");
|
|
8
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
9
|
+
exports.BIP322_TAG = 'BIP0322-signed-message';
|
|
10
|
+
/**
|
|
11
|
+
* Perform a tagged hash
|
|
12
|
+
*
|
|
13
|
+
* @param {string | Buffer} message - The message to hash as a Buffer or utf-8 string
|
|
14
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
15
|
+
* @returns {Buffer} - The resulting hash of the message with the tag.
|
|
16
|
+
*/
|
|
17
|
+
function hashMessageWithTag(message, tag = exports.BIP322_TAG) {
|
|
18
|
+
// Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
|
|
19
|
+
// Reference: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
20
|
+
const tagHasher = new fast_sha256_1.Hash();
|
|
21
|
+
tagHasher.update(Buffer.from(exports.BIP322_TAG));
|
|
22
|
+
const tagHash = tagHasher.digest();
|
|
23
|
+
const messageHasher = new fast_sha256_1.Hash();
|
|
24
|
+
messageHasher.update(tagHash);
|
|
25
|
+
messageHasher.update(tagHash);
|
|
26
|
+
messageHasher.update(Buffer.from(message));
|
|
27
|
+
const messageHash = messageHasher.digest();
|
|
28
|
+
return Buffer.from(messageHash);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build a BIP322 "to spend" transaction
|
|
32
|
+
* Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#full
|
|
33
|
+
*
|
|
34
|
+
* @param {Buffer} scriptPubKey - The scriptPubKey to use for the output
|
|
35
|
+
* @param {string | Buffer} message - The message to include in the transaction
|
|
36
|
+
* @param {Buffer} [tag=BIP322_TAG] - The tag to use for hashing, defaults to BIP322_TAG.
|
|
37
|
+
* @returns {Transaction} - The constructed transaction
|
|
38
|
+
*/
|
|
39
|
+
function buildToSpendTransaction(scriptPubKey, message, tag = exports.BIP322_TAG) {
|
|
40
|
+
// Create PSBT object for constructing the transaction
|
|
41
|
+
const psbt = new utxo_lib_1.Psbt();
|
|
42
|
+
// Set default value for nVersion and nLockTime
|
|
43
|
+
psbt.setVersion(0); // nVersion = 0
|
|
44
|
+
psbt.setLocktime(0); // nLockTime = 0
|
|
45
|
+
// Compute the message hash - SHA256(SHA256(tag) || SHA256(tag) || message)
|
|
46
|
+
const messageHash = hashMessageWithTag(message, tag);
|
|
47
|
+
// Construct the scriptSig - OP_0 PUSH32[ message_hash ]
|
|
48
|
+
const scriptSigPartOne = new Uint8Array([0x00, 0x20]); // OP_0 PUSH32
|
|
49
|
+
const scriptSig = new Uint8Array(scriptSigPartOne.length + messageHash.length);
|
|
50
|
+
scriptSig.set(scriptSigPartOne);
|
|
51
|
+
scriptSig.set(messageHash, scriptSigPartOne.length);
|
|
52
|
+
// Set the input
|
|
53
|
+
psbt.addInput({
|
|
54
|
+
hash: '0'.repeat(64), // vin[0].prevout.hash = 0000...000
|
|
55
|
+
index: 0xffffffff, // vin[0].prevout.n = 0xFFFFFFFF
|
|
56
|
+
sequence: 0, // vin[0].nSequence = 0
|
|
57
|
+
finalScriptSig: Buffer.from(scriptSig), // vin[0].scriptSig = OP_0 PUSH32[ message_hash ]
|
|
58
|
+
witnessScript: Buffer.from([]), // vin[0].scriptWitness = []
|
|
59
|
+
});
|
|
60
|
+
// Set the output
|
|
61
|
+
psbt.addOutput({
|
|
62
|
+
value: BigInt(0), // vout[0].nValue = 0
|
|
63
|
+
script: scriptPubKey, // vout[0].scriptPubKey = message_challenge
|
|
64
|
+
});
|
|
65
|
+
// Return transaction
|
|
66
|
+
return psbt.extractTransaction();
|
|
67
|
+
}
|
|
68
|
+
function buildToSpendTransactionFromChainAndIndex(rootWalletKeys, chain, index, message, tag = exports.BIP322_TAG) {
|
|
69
|
+
const outputScript = utxo_lib_1.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys, utxo_lib_1.bitgo.scriptTypeForChain(chain), utxo_lib_1.networks.bitcoin);
|
|
70
|
+
return buildToSpendTransaction(outputScript.scriptPubKey, message, tag);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXAzMjIvdG9TcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSxnREFZQztBQVdELDBEQWdDQztBQUVELDRGQWFDO0FBbEZELDZDQUFtQztBQUNuQyxtREFBMEU7QUFFN0QsUUFBQSxVQUFVLEdBQUcsd0JBQXdCLENBQUM7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsT0FBd0IsRUFBRSxHQUFHLEdBQUcsa0JBQVU7SUFDM0UsMkVBQTJFO0lBQzNFLGlGQUFpRjtJQUNqRixNQUFNLFNBQVMsR0FBRyxJQUFJLGtCQUFJLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQVUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksa0JBQUksRUFBRSxDQUFDO0lBQ2pDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxZQUFvQixFQUNwQixPQUF3QixFQUN4QixHQUFHLEdBQUcsa0JBQVU7SUFFaEIsc0RBQXNEO0lBQ3RELE1BQU0sSUFBSSxHQUFHLElBQUksZUFBSSxFQUFFLENBQUM7SUFDeEIsK0NBQStDO0lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO0lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7SUFDckMsMkVBQTJFO0lBQzNFLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRCx3REFBd0Q7SUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYztJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9FLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxnQkFBZ0I7SUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNaLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLG1DQUFtQztRQUN6RCxLQUFLLEVBQUUsVUFBVSxFQUFFLGdDQUFnQztRQUNuRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QjtRQUNwQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxpREFBaUQ7UUFDekYsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsNEJBQTRCO0tBQzdELENBQUMsQ0FBQztJQUNILGlCQUFpQjtJQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUI7UUFDdkMsTUFBTSxFQUFFLFlBQVksRUFBRSwyQ0FBMkM7S0FDbEUsQ0FBQyxDQUFDO0lBQ0gscUJBQXFCO0lBQ3JCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQWdCLHdDQUF3QyxDQUN0RCxjQUFvQyxFQUNwQyxLQUFzQixFQUN0QixLQUFhLEVBQ2IsT0FBd0IsRUFDeEIsR0FBRyxHQUFHLGtCQUFVO0lBRWhCLE1BQU0sWUFBWSxHQUFHLGdCQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUM3RCxjQUFjLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFDOUQsZ0JBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFDL0IsbUJBQVEsQ0FBQyxPQUFPLENBQ2pCLENBQUM7SUFDRixPQUFPLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNoIH0gZnJvbSAnZmFzdC1zaGEyNTYnO1xuaW1wb3J0IHsgUHNidCwgVHJhbnNhY3Rpb24sIGJpdGdvLCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IGNvbnN0IEJJUDMyMl9UQUcgPSAnQklQMDMyMi1zaWduZWQtbWVzc2FnZSc7XG5cbi8qKlxuICogUGVyZm9ybSBhIHRhZ2dlZCBoYXNoXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBoYXNoIGFzIGEgQnVmZmVyIG9yIHV0Zi04IHN0cmluZ1xuICogQHBhcmFtIHtCdWZmZXJ9IFt0YWc9QklQMzIyX1RBR10gLSBUaGUgdGFnIHRvIHVzZSBmb3IgaGFzaGluZywgZGVmYXVsdHMgdG8gQklQMzIyX1RBRy5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHJlc3VsdGluZyBoYXNoIG9mIHRoZSBtZXNzYWdlIHdpdGggdGhlIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hNZXNzYWdlV2l0aFRhZyhtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsIHRhZyA9IEJJUDMyMl9UQUcpOiBCdWZmZXIge1xuICAvLyBDb21wdXRlIHRoZSBtZXNzYWdlIGhhc2ggLSBTSEEyNTYoU0hBMjU2KHRhZykgfHwgU0hBMjU2KHRhZykgfHwgbWVzc2FnZSlcbiAgLy8gUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSNmdWxsXG4gIGNvbnN0IHRhZ0hhc2hlciA9IG5ldyBIYXNoKCk7XG4gIHRhZ0hhc2hlci51cGRhdGUoQnVmZmVyLmZyb20oQklQMzIyX1RBRykpO1xuICBjb25zdCB0YWdIYXNoID0gdGFnSGFzaGVyLmRpZ2VzdCgpO1xuICBjb25zdCBtZXNzYWdlSGFzaGVyID0gbmV3IEhhc2goKTtcbiAgbWVzc2FnZUhhc2hlci51cGRhdGUodGFnSGFzaCk7XG4gIG1lc3NhZ2VIYXNoZXIudXBkYXRlKHRhZ0hhc2gpO1xuICBtZXNzYWdlSGFzaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShtZXNzYWdlKSk7XG4gIGNvbnN0IG1lc3NhZ2VIYXNoID0gbWVzc2FnZUhhc2hlci5kaWdlc3QoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lc3NhZ2VIYXNoKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIEJJUDMyMiBcInRvIHNwZW5kXCIgdHJhbnNhY3Rpb25cbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjZnVsbFxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzY3JpcHRQdWJLZXkgLSBUaGUgc2NyaXB0UHViS2V5IHRvIHVzZSBmb3IgdGhlIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtCdWZmZXJ9IFt0YWc9QklQMzIyX1RBR10gLSBUaGUgdGFnIHRvIHVzZSBmb3IgaGFzaGluZywgZGVmYXVsdHMgdG8gQklQMzIyX1RBRy5cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbn0gLSBUaGUgY29uc3RydWN0ZWQgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uKFxuICBzY3JpcHRQdWJLZXk6IEJ1ZmZlcixcbiAgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyLFxuICB0YWcgPSBCSVAzMjJfVEFHXG4pOiBUcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgLy8gQ3JlYXRlIFBTQlQgb2JqZWN0IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHRyYW5zYWN0aW9uXG4gIGNvbnN0IHBzYnQgPSBuZXcgUHNidCgpO1xuICAvLyBTZXQgZGVmYXVsdCB2YWx1ZSBmb3IgblZlcnNpb24gYW5kIG5Mb2NrVGltZVxuICBwc2J0LnNldFZlcnNpb24oMCk7IC8vIG5WZXJzaW9uID0gMFxuICBwc2J0LnNldExvY2t0aW1lKDApOyAvLyBuTG9ja1RpbWUgPSAwXG4gIC8vIENvbXB1dGUgdGhlIG1lc3NhZ2UgaGFzaCAtIFNIQTI1NihTSEEyNTYodGFnKSB8fCBTSEEyNTYodGFnKSB8fCBtZXNzYWdlKVxuICBjb25zdCBtZXNzYWdlSGFzaCA9IGhhc2hNZXNzYWdlV2l0aFRhZyhtZXNzYWdlLCB0YWcpO1xuICAvLyBDb25zdHJ1Y3QgdGhlIHNjcmlwdFNpZyAtIE9QXzAgUFVTSDMyWyBtZXNzYWdlX2hhc2ggXVxuICBjb25zdCBzY3JpcHRTaWdQYXJ0T25lID0gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4MjBdKTsgLy8gT1BfMCBQVVNIMzJcbiAgY29uc3Qgc2NyaXB0U2lnID0gbmV3IFVpbnQ4QXJyYXkoc2NyaXB0U2lnUGFydE9uZS5sZW5ndGggKyBtZXNzYWdlSGFzaC5sZW5ndGgpO1xuICBzY3JpcHRTaWcuc2V0KHNjcmlwdFNpZ1BhcnRPbmUpO1xuICBzY3JpcHRTaWcuc2V0KG1lc3NhZ2VIYXNoLCBzY3JpcHRTaWdQYXJ0T25lLmxlbmd0aCk7XG4gIC8vIFNldCB0aGUgaW5wdXRcbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogJzAnLnJlcGVhdCg2NCksIC8vIHZpblswXS5wcmV2b3V0Lmhhc2ggPSAwMDAwLi4uMDAwXG4gICAgaW5kZXg6IDB4ZmZmZmZmZmYsIC8vIHZpblswXS5wcmV2b3V0Lm4gPSAweEZGRkZGRkZGXG4gICAgc2VxdWVuY2U6IDAsIC8vIHZpblswXS5uU2VxdWVuY2UgPSAwXG4gICAgZmluYWxTY3JpcHRTaWc6IEJ1ZmZlci5mcm9tKHNjcmlwdFNpZyksIC8vIHZpblswXS5zY3JpcHRTaWcgPSBPUF8wIFBVU0gzMlsgbWVzc2FnZV9oYXNoIF1cbiAgICB3aXRuZXNzU2NyaXB0OiBCdWZmZXIuZnJvbShbXSksIC8vIHZpblswXS5zY3JpcHRXaXRuZXNzID0gW11cbiAgfSk7XG4gIC8vIFNldCB0aGUgb3V0cHV0XG4gIHBzYnQuYWRkT3V0cHV0KHtcbiAgICB2YWx1ZTogQmlnSW50KDApLCAvLyB2b3V0WzBdLm5WYWx1ZSA9IDBcbiAgICBzY3JpcHQ6IHNjcmlwdFB1YktleSwgLy8gdm91dFswXS5zY3JpcHRQdWJLZXkgPSBtZXNzYWdlX2NoYWxsZW5nZVxuICB9KTtcbiAgLy8gUmV0dXJuIHRyYW5zYWN0aW9uXG4gIHJldHVybiBwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb25Gcm9tQ2hhaW5BbmRJbmRleChcbiAgcm9vdFdhbGxldEtleXM6IGJpdGdvLlJvb3RXYWxsZXRLZXlzLFxuICBjaGFpbjogYml0Z28uQ2hhaW5Db2RlLFxuICBpbmRleDogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIsXG4gIHRhZyA9IEJJUDMyMl9UQUdcbik6IFRyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICBjb25zdCBvdXRwdXRTY3JpcHQgPSBiaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpLnB1YmxpY0tleXMsXG4gICAgYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSxcbiAgICBuZXR3b3Jrcy5iaXRjb2luXG4gICk7XG4gIHJldHVybiBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbihvdXRwdXRTY3JpcHQuc2NyaXB0UHViS2V5LCBtZXNzYWdlLCB0YWcpO1xufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
export declare function addBip322ProofMessage(psbt: utxolib.Psbt, inputIndex: number, message: Buffer): void;
|
|
3
|
+
/**
|
|
4
|
+
* Get the BIP322 proof message at a specific input index of the PSBT
|
|
5
|
+
* @param psbt
|
|
6
|
+
* @param inputIndex
|
|
7
|
+
* @returns The BIP322 proof message as a Buffer, or undefined if not found
|
|
8
|
+
*/
|
|
9
|
+
export declare function getBip322ProofMessageAtIndex(psbt: utxolib.Psbt, inputIndex: number): Buffer | undefined;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/bip322/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASnG;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAevG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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.addBip322ProofMessage = addBip322ProofMessage;
|
|
37
|
+
exports.getBip322ProofMessageAtIndex = getBip322ProofMessageAtIndex;
|
|
38
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
39
|
+
function addBip322ProofMessage(psbt, inputIndex, message) {
|
|
40
|
+
utxolib.bitgo.addProprietaryKeyValuesFromUnknownKeyValues(psbt, 'input', inputIndex, {
|
|
41
|
+
key: {
|
|
42
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
43
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
|
|
44
|
+
keydata: Buffer.alloc(0),
|
|
45
|
+
},
|
|
46
|
+
value: message,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the BIP322 proof message at a specific input index of the PSBT
|
|
51
|
+
* @param psbt
|
|
52
|
+
* @param inputIndex
|
|
53
|
+
* @returns The BIP322 proof message as a Buffer, or undefined if not found
|
|
54
|
+
*/
|
|
55
|
+
function getBip322ProofMessageAtIndex(psbt, inputIndex) {
|
|
56
|
+
if (psbt.data.inputs.length <= inputIndex) {
|
|
57
|
+
throw new Error(`Input index ${inputIndex} is out of bounds for the PSBT`);
|
|
58
|
+
}
|
|
59
|
+
const input = psbt.data.inputs[inputIndex];
|
|
60
|
+
const proprietaryKeyVals = utxolib.bitgo.getPsbtInputProprietaryKeyVals(input, {
|
|
61
|
+
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
62
|
+
subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
|
|
63
|
+
});
|
|
64
|
+
if (proprietaryKeyVals.length === 0) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
else if (proprietaryKeyVals.length > 1) {
|
|
68
|
+
throw new Error(`Multiple BIP322 messages found at input index ${inputIndex}`);
|
|
69
|
+
}
|
|
70
|
+
return Buffer.from(proprietaryKeyVals[0].value);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmlwMzIyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsc0RBU0M7QUFRRCxvRUFlQztBQWxDRCw4REFBZ0Q7QUFFaEQsU0FBZ0IscUJBQXFCLENBQUMsSUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWU7SUFDM0YsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRTtRQUNuRixHQUFHLEVBQUU7WUFDSCxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7WUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztZQUMzRCxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekI7UUFDRCxLQUFLLEVBQUUsT0FBTztLQUNmLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLDRCQUE0QixDQUFDLElBQWtCLEVBQUUsVUFBa0I7SUFDakYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFLENBQUM7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLFVBQVUsZ0NBQWdDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLEtBQUssRUFBRTtRQUM3RSxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7UUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztLQUM1RCxDQUFDLENBQUM7SUFDSCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO1NBQU0sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEJpcDMyMlByb29mTWVzc2FnZShwc2J0OiB1dHhvbGliLlBzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgbWVzc2FnZTogQnVmZmVyKTogdm9pZCB7XG4gIHV0eG9saWIuYml0Z28uYWRkUHJvcHJpZXRhcnlLZXlWYWx1ZXNGcm9tVW5rbm93bktleVZhbHVlcyhwc2J0LCAnaW5wdXQnLCBpbnB1dEluZGV4LCB7XG4gICAga2V5OiB7XG4gICAgICBpZGVudGlmaWVyOiB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLkJJUDMyMl9NRVNTQUdFLFxuICAgICAga2V5ZGF0YTogQnVmZmVyLmFsbG9jKDApLFxuICAgIH0sXG4gICAgdmFsdWU6IG1lc3NhZ2UsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgQklQMzIyIHByb29mIG1lc3NhZ2UgYXQgYSBzcGVjaWZpYyBpbnB1dCBpbmRleCBvZiB0aGUgUFNCVFxuICogQHBhcmFtIHBzYnRcbiAqIEBwYXJhbSBpbnB1dEluZGV4XG4gKiBAcmV0dXJucyBUaGUgQklQMzIyIHByb29mIG1lc3NhZ2UgYXMgYSBCdWZmZXIsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJpcDMyMlByb29mTWVzc2FnZUF0SW5kZXgocHNidDogdXR4b2xpYi5Qc2J0LCBpbnB1dEluZGV4OiBudW1iZXIpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAocHNidC5kYXRhLmlucHV0cy5sZW5ndGggPD0gaW5wdXRJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kZXggJHtpbnB1dEluZGV4fSBpcyBvdXQgb2YgYm91bmRzIGZvciB0aGUgUFNCVGApO1xuICB9XG4gIGNvbnN0IGlucHV0ID0gcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgY29uc3QgcHJvcHJpZXRhcnlLZXlWYWxzID0gdXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXQsIHtcbiAgICBpZGVudGlmaWVyOiB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5CSVAzMjJfTUVTU0FHRSxcbiAgfSk7XG4gIGlmIChwcm9wcmlldGFyeUtleVZhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChwcm9wcmlldGFyeUtleVZhbHMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgQklQMzIyIG1lc3NhZ2VzIGZvdW5kIGF0IGlucHV0IGluZGV4ICR7aW5wdXRJbmRleH1gKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20ocHJvcHJpZXRhcnlLZXlWYWxzWzBdLnZhbHVlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BIP32Interface } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
/**
|
|
3
|
+
* bip32-aware wrapper around bitcoin-message package
|
|
4
|
+
* @see {bitcoinMessage.sign}
|
|
5
|
+
*/
|
|
6
|
+
export declare function signMessage(message: string | Buffer, privateKey: BIP32Interface | Buffer, network: {
|
|
7
|
+
messagePrefix: string;
|
|
8
|
+
}): Buffer;
|
|
9
|
+
/**
|
|
10
|
+
* bip32-aware wrapper around bitcoin-message package
|
|
11
|
+
* @see {bitcoinMessage.verify}
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyMessage(message: string | Buffer, publicKey: BIP32Interface | Buffer, signature: Buffer, network: {
|
|
14
|
+
messagePrefix: string;
|
|
15
|
+
}): boolean;
|
|
16
|
+
//# sourceMappingURL=bip32utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bip32utils.d.ts","sourceRoot":"","sources":["../../src/bip32utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,UAAU,EAAE,cAAc,GAAG,MAAM,EACnC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACjC,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,cAAc,GAAG,MAAM,EAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAcT"}
|