@bitgo/utxo-staking 1.24.0 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
- package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
- package/dist/cjs/scripts/babylon-sync.js +126 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/cjs/src/babylon/delegationMessage.js +285 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/index.js +1 -1
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/network.js +1 -1
- package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingManager.js +120 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingParams.js +132 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/descriptor.js +38 -0
- package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/coreDao/index.js +1 -1
- package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/opReturn.js +183 -0
- package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/transaction.js +34 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/bug71.js +108 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/transactions.js +338 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/utils.js +54 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures.utils.js +91 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/babylon/delegationMessage.d.ts +38 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +6 -0
- package/dist/esm/babylon/index.js +11 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.js +29 -0
- package/dist/esm/babylon/params.mainnet.json +152 -0
- package/dist/esm/babylon/params.testnet.json +212 -0
- package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.js +86 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
- package/dist/esm/babylon/undelegation/index.d.ts +3 -0
- package/dist/esm/babylon/undelegation/index.js +3 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/esm/coreDao/descriptor.js +35 -0
- package/dist/esm/coreDao/index.d.ts +4 -0
- package/dist/esm/coreDao/index.js +4 -0
- package/dist/esm/coreDao/opReturn.d.ts +41 -0
- package/dist/esm/coreDao/opReturn.js +175 -0
- package/dist/esm/coreDao/transaction.d.ts +28 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/package.json +27 -11
- package/dist/src/babylon/delegationMessage.js +0 -285
- package/dist/src/babylon/descriptor.js +0 -97
- package/dist/src/babylon/parseDescriptor.js +0 -159
- package/dist/src/babylon/stakingManager.js +0 -120
- package/dist/src/babylon/stakingParams.js +0 -132
- package/dist/src/babylon/undelegation/unbonding.js +0 -111
- package/dist/src/coreDao/descriptor.js +0 -38
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.js +0 -34
- /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.assertValidSignatures = assertValidSignatures;
|
|
40
|
+
exports.toUnbondingPsbt = toUnbondingPsbt;
|
|
41
|
+
exports.toUnbondingPsbtWithSignatures = toUnbondingPsbtWithSignatures;
|
|
42
|
+
const assert_1 = __importDefault(require("assert"));
|
|
43
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
44
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
45
|
+
const descriptor_1 = require("@bitgo/utxo-core/descriptor");
|
|
46
|
+
const parseDescriptor_1 = require("../parseDescriptor");
|
|
47
|
+
/**
|
|
48
|
+
* Adds covenant signatures to a PSBT input.
|
|
49
|
+
*/
|
|
50
|
+
function addCovenantSignatures(psbt, inputIndex, signatures) {
|
|
51
|
+
const input = psbt.data.inputs[inputIndex];
|
|
52
|
+
(0, assert_1.default)(input.tapLeafScript, 'Input must have tapLeafScript');
|
|
53
|
+
(0, assert_1.default)(input.tapLeafScript.length === 1, 'Input must have exactly one tapLeafScript');
|
|
54
|
+
const [{ controlBlock, script }] = input.tapLeafScript;
|
|
55
|
+
const leafHash = utxolib.taproot.getTapleafHash(utxolib.ecc, controlBlock, script);
|
|
56
|
+
psbt.updateInput(inputIndex, { tapScriptSig: signatures.map((s) => ({ ...s, leafHash })) });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Asserts that the provided signatures are valid for the given PSBT input.
|
|
60
|
+
*/
|
|
61
|
+
function assertValidSignatures(psbt, inputIndex, signatures) {
|
|
62
|
+
signatures.forEach((s) => {
|
|
63
|
+
(0, assert_1.default)(psbt.validateTaprootSignaturesOfInput(inputIndex, s.pubkey), `Signature validation failed for ${s.pubkey.toString('hex')}`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function getUnbondingScript(stakingDescriptor) {
|
|
67
|
+
const parsedDescriptor = (0, parseDescriptor_1.parseStakingDescriptor)(stakingDescriptor);
|
|
68
|
+
(0, assert_1.default)(parsedDescriptor, 'Invalid staking descriptor');
|
|
69
|
+
return wasm_utxo_1.Miniscript.fromString(wasm_utxo_1.ast.formatNode(parsedDescriptor.unbondingMiniscriptNode), 'tap');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* @return unsigned PSBT for an unbonding transaction
|
|
73
|
+
*/
|
|
74
|
+
function toUnbondingPsbt(tx, witnessUtxo, stakingDescriptor, network) {
|
|
75
|
+
const unbondingScript = getUnbondingScript(stakingDescriptor);
|
|
76
|
+
const psbt = new utxolib.Psbt({ network });
|
|
77
|
+
psbt.setVersion(tx.version);
|
|
78
|
+
psbt.setLocktime(tx.locktime);
|
|
79
|
+
psbt.addOutputs(tx.outs.map((output) => ({
|
|
80
|
+
script: output.script,
|
|
81
|
+
value: BigInt(output.value),
|
|
82
|
+
})));
|
|
83
|
+
(0, assert_1.default)(tx.ins.length === 1);
|
|
84
|
+
const input = tx.ins[0];
|
|
85
|
+
psbt.addInput({
|
|
86
|
+
hash: input.hash,
|
|
87
|
+
index: input.index,
|
|
88
|
+
sequence: input.sequence,
|
|
89
|
+
witnessUtxo,
|
|
90
|
+
});
|
|
91
|
+
const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(psbt);
|
|
92
|
+
wrappedPsbt.updateInputWithDescriptor(0, stakingDescriptor);
|
|
93
|
+
const unwrapped = (0, descriptor_1.toUtxoPsbt)(wrappedPsbt, network);
|
|
94
|
+
(0, assert_1.default)(unwrapped.data.inputs.length === 1, 'Unbonding transaction must have exactly one input');
|
|
95
|
+
const unwrappedInputData = unwrapped.data.inputs[0];
|
|
96
|
+
(0, assert_1.default)(unwrappedInputData.tapLeafScript);
|
|
97
|
+
const unwrappedUnbond = (0, descriptor_1.findTapLeafScript)(unwrappedInputData.tapLeafScript, unbondingScript);
|
|
98
|
+
unwrappedInputData.tapLeafScript = [unwrappedUnbond];
|
|
99
|
+
return unwrapped;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @return PSBT for an unbonding transaction with signatures
|
|
103
|
+
*/
|
|
104
|
+
function toUnbondingPsbtWithSignatures(tx, witnessUtxo, stakingDescriptor, signatures, network) {
|
|
105
|
+
const psbt = toUnbondingPsbt(tx, witnessUtxo, stakingDescriptor, network);
|
|
106
|
+
(0, assert_1.default)(psbt.data.inputs.length === 1, 'Unbonding transaction must have exactly one input');
|
|
107
|
+
addCovenantSignatures(psbt, 0, signatures);
|
|
108
|
+
assertValidSignatures(psbt, 0, signatures);
|
|
109
|
+
return psbt;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ib25kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2JhYnlsb24vdW5kZWxlZ2F0aW9uL3VuYm9uZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxzREFXQztBQVdELDBDQWlDQztBQUtELHNFQVlDO0FBaEdELG9EQUE0QjtBQUU1Qix5REFBMkM7QUFFM0MsZ0RBQStEO0FBQy9ELDREQUEyRjtBQUUzRix3REFBNEQ7QUFFNUQ7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQTRCLEVBQUUsVUFBa0IsRUFBRSxVQUF3QjtJQUN2RyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzdELElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztJQUN0RixNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdC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O0FBQ0gsU0FBZ0IsNkJBQTZCLENBQzNDLEVBQXlDLEVBQ3pDLFdBQXdCLEVBQ3hCLGlCQUE2QixFQUM3QixVQUF3QixFQUN4QixPQUF3QjtJQUV4QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxRSxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO0lBQzNGLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0MscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IFBhcnRpYWxTaWcsIFdpdG5lc3NVdHhvIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0LCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGZpbmRUYXBMZWFmU2NyaXB0LCB0b1V0eG9Qc2J0LCB0b1dyYXBwZWRQc2J0IH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuaW1wb3J0IHsgcGFyc2VTdGFraW5nRGVzY3JpcHRvciB9IGZyb20gJy4uL3BhcnNlRGVzY3JpcHRvcic7XG5cbi8qKlxuICogQWRkcyBjb3ZlbmFudCBzaWduYXR1cmVzIHRvIGEgUFNCVCBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gYWRkQ292ZW5hbnRTaWduYXR1cmVzKHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlciwgc2lnbmF0dXJlczogUGFydGlhbFNpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0ID0gcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgYXNzZXJ0KGlucHV0LnRhcExlYWZTY3JpcHQsICdJbnB1dCBtdXN0IGhhdmUgdGFwTGVhZlNjcmlwdCcpO1xuICBhc3NlcnQoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPT09IDEsICdJbnB1dCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgdGFwTGVhZlNjcmlwdCcpO1xuICBjb25zdCBbeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9XSA9IGlucHV0LnRhcExlYWZTY3JpcHQ7XG4gIGNvbnN0IGxlYWZIYXNoID0gdXR4b2xpYi50YXByb290LmdldFRhcGxlYWZIYXNoKHV0eG9saWIuZWNjLCBjb250cm9sQmxvY2ssIHNjcmlwdCk7XG4gIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB0YXBTY3JpcHRTaWc6IHNpZ25hdHVyZXMubWFwKChzKSA9PiAoeyAuLi5zLCBsZWFmSGFzaCB9KSkgfSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBwcm92aWRlZCBzaWduYXR1cmVzIGFyZSB2YWxpZCBmb3IgdGhlIGdpdmVuIFBTQlQgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZFNpZ25hdHVyZXMoXG4gIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgc2lnbmF0dXJlczogUGFydGlhbFNpZ1tdXG4pOiB2b2lkIHtcbiAgc2lnbmF0dXJlcy5mb3JFYWNoKChzKSA9PiB7XG4gICAgYXNzZXJ0KFxuICAgICAgcHNidC52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBzLnB1YmtleSksXG4gICAgICBgU2lnbmF0dXJlIHZhbGlkYXRpb24gZmFpbGVkIGZvciAke3MucHVia2V5LnRvU3RyaW5nKCdoZXgnKX1gXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuYm9uZGluZ1NjcmlwdChzdGFraW5nRGVzY3JpcHRvcjogRGVzY3JpcHRvcik6IE1pbmlzY3JpcHQge1xuICBjb25zdCBwYXJzZWREZXNjcmlwdG9yID0gcGFyc2VTdGFraW5nRGVzY3JpcHRvcihzdGFraW5nRGVzY3JpcHRvcik7XG4gIGFzc2VydChwYXJzZWREZXNjcmlwdG9yLCAnSW52YWxpZCBzdGFraW5nIGRlc2NyaXB0b3InKTtcbiAgcmV0dXJuIE1pbmlzY3JpcHQuZnJvbVN0cmluZyhhc3QuZm9ybWF0Tm9kZShwYXJzZWREZXNjcmlwdG9yLnVuYm9uZGluZ01pbmlzY3JpcHROb2RlKSwgJ3RhcCcpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdW5zaWduZWQgUFNCVCBmb3IgYW4gdW5ib25kaW5nIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuYm9uZGluZ1BzYnQoXG4gIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LFxuICB3aXRuZXNzVXR4bzogV2l0bmVzc1V0eG8sXG4gIHN0YWtpbmdEZXNjcmlwdG9yOiBEZXNjcmlwdG9yLFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB1bmJvbmRpbmdTY3JpcHQgPSBnZXRVbmJvbmRpbmdTY3JpcHQoc3Rha2luZ0Rlc2NyaXB0b3IpO1xuICBjb25zdCBwc2J0ID0gbmV3IHV0eG9saWIuUHNidCh7IG5ldHdvcmsgfSk7XG4gIHBzYnQuc2V0VmVyc2lvbih0eC52ZXJzaW9uKTtcbiAgcHNidC5zZXRMb2NrdGltZSh0eC5sb2NrdGltZSk7XG4gIHBzYnQuYWRkT3V0cHV0cyhcbiAgICB0eC5vdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgc2NyaXB0OiBvdXRwdXQuc2NyaXB0LFxuICAgICAgdmFsdWU6IEJpZ0ludChvdXRwdXQudmFsdWUpLFxuICAgIH0pKVxuICApO1xuICBhc3NlcnQodHguaW5zLmxlbmd0aCA9PT0gMSk7XG4gIGNvbnN0IGlucHV0ID0gdHguaW5zWzBdO1xuICBwc2J0LmFkZElucHV0KHtcbiAgICBoYXNoOiBpbnB1dC5oYXNoLFxuICAgIGluZGV4OiBpbnB1dC5pbmRleCxcbiAgICBzZXF1ZW5jZTogaW5wdXQuc2VxdWVuY2UsXG4gICAgd2l0bmVzc1V0eG8sXG4gIH0pO1xuICBjb25zdCB3cmFwcGVkUHNidCA9IHRvV3JhcHBlZFBzYnQocHNidCk7XG4gIHdyYXBwZWRQc2J0LnVwZGF0ZUlucHV0V2l0aERlc2NyaXB0b3IoMCwgc3Rha2luZ0Rlc2NyaXB0b3IpO1xuICBjb25zdCB1bndyYXBwZWQgPSB0b1V0eG9Qc2J0KHdyYXBwZWRQc2J0LCBuZXR3b3JrKTtcbiAgYXNzZXJ0KHVud3JhcHBlZC5kYXRhLmlucHV0cy5sZW5ndGggPT09IDEsICdVbmJvbmRpbmcgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGlucHV0Jyk7XG4gIGNvbnN0IHVud3JhcHBlZElucHV0RGF0YSA9IHVud3JhcHBlZC5kYXRhLmlucHV0c1swXTtcbiAgYXNzZXJ0KHVud3JhcHBlZElucHV0RGF0YS50YXBMZWFmU2NyaXB0KTtcbiAgY29uc3QgdW53cmFwcGVkVW5ib25kID0gZmluZFRhcExlYWZTY3JpcHQodW53cmFwcGVkSW5wdXREYXRhLnRhcExlYWZTY3JpcHQsIHVuYm9uZGluZ1NjcmlwdCk7XG4gIHVud3JhcHBlZElucHV0RGF0YS50YXBMZWFmU2NyaXB0ID0gW3Vud3JhcHBlZFVuYm9uZF07XG4gIHJldHVybiB1bndyYXBwZWQ7XG59XG5cbi8qKlxuICogQHJldHVybiBQU0JUIGZvciBhbiB1bmJvbmRpbmcgdHJhbnNhY3Rpb24gd2l0aCBzaWduYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VuYm9uZGluZ1BzYnRXaXRoU2lnbmF0dXJlcyhcbiAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIHdpdG5lc3NVdHhvOiBXaXRuZXNzVXR4byxcbiAgc3Rha2luZ0Rlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gIHNpZ25hdHVyZXM6IFBhcnRpYWxTaWdbXSxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgcHNidCA9IHRvVW5ib25kaW5nUHNidCh0eCwgd2l0bmVzc1V0eG8sIHN0YWtpbmdEZXNjcmlwdG9yLCBuZXR3b3JrKTtcbiAgYXNzZXJ0KHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoID09PSAxLCAnVW5ib25kaW5nIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBpbnB1dCcpO1xuICBhZGRDb3ZlbmFudFNpZ25hdHVyZXMocHNidCwgMCwgc2lnbmF0dXJlcyk7XG4gIGFzc2VydFZhbGlkU2lnbmF0dXJlcyhwc2J0LCAwLCBzaWduYXR1cmVzKTtcbiAgcmV0dXJuIHBzYnQ7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../src/coreDao/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC;AASjD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,WAAW,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,EAAE,EACxC,QAAQ,UAAO,GACd,MAAM,CAmBR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMultiSigDescriptor = createMultiSigDescriptor;
|
|
4
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
5
|
+
function asDescriptorKey(key, neutered) {
|
|
6
|
+
if (Buffer.isBuffer(key)) {
|
|
7
|
+
return key.toString('hex');
|
|
8
|
+
}
|
|
9
|
+
return (neutered ? key.neutered() : key).toBase58() + '/*';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a multi-sig descriptor to produce a coredao staking address
|
|
13
|
+
* @param scriptType segwit or legacy
|
|
14
|
+
* @param locktime locktime for CLTV
|
|
15
|
+
* @param m Total number of keys required to unlock
|
|
16
|
+
* @param orderedKeys If Bip32Interfaces, these are xprvs or xpubs and are derivable.
|
|
17
|
+
* If they are buffers, then they are pub/prv keys and are not derivable.
|
|
18
|
+
* @param neutered If true, neuter the keys. Default to true
|
|
19
|
+
*/
|
|
20
|
+
function createMultiSigDescriptor(scriptType, locktime, m, orderedKeys, neutered = true) {
|
|
21
|
+
if (m > orderedKeys.length || m < 1) {
|
|
22
|
+
throw new Error(`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`);
|
|
23
|
+
}
|
|
24
|
+
if (locktime <= 0) {
|
|
25
|
+
throw new Error(`locktime (${locktime}) must be greater than 0`);
|
|
26
|
+
}
|
|
27
|
+
const keys = orderedKeys.map((key) => asDescriptorKey(key, neutered));
|
|
28
|
+
const inner = { and_v: [{ 'r:after': locktime }, { multi: [m, ...keys] }] };
|
|
29
|
+
switch (scriptType) {
|
|
30
|
+
case 'sh':
|
|
31
|
+
return wasm_utxo_1.ast.formatNode({ sh: inner });
|
|
32
|
+
case 'sh-wsh':
|
|
33
|
+
return wasm_utxo_1.ast.formatNode({ sh: { wsh: inner } });
|
|
34
|
+
case 'wsh':
|
|
35
|
+
return wasm_utxo_1.ast.formatNode({ wsh: inner });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsNERBeUJDO0FBbERELGdEQUF1QztBQVN2QyxTQUFTLGVBQWUsQ0FBQyxHQUE0QixFQUFFLFFBQWlCO0lBQ3RFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDN0QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQ3RDLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLENBQVMsRUFDVCxXQUF3QyxFQUN4QyxRQUFRLEdBQUcsSUFBSTtJQUVmLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IsTUFBTSxDQUFDLHVEQUF1RCxXQUFXLENBQUMsTUFBTSxzQkFBc0IsQ0FDdkcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsUUFBUSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQXVCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRyxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSTtZQUNQLE9BQU8sZUFBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssUUFBUTtZQUNYLE9BQU8sZUFBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsS0FBSyxLQUFLO1lBQ1IsT0FBTyxlQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuLyoqXG4gKiBTY3JpcHQgdHlwZSBmb3IgYSBkZXNjcmlwdG9yLlxuICpcbiAqIFNlZSBodHRwczovL2RvY3MuY29yZWRhby5vcmcvZG9jcy9MZWFybi9wcm9kdWN0cy9idGMtc3Rha2luZy9kZXNpZ24jcDJzaHAyd3NoLW91dHB1dFxuICovXG5leHBvcnQgdHlwZSBTY3JpcHRUeXBlID0gJ3NoJyB8ICdzaC13c2gnIHwgJ3dzaCc7XG5cbmZ1bmN0aW9uIGFzRGVzY3JpcHRvcktleShrZXk6IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyLCBuZXV0ZXJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybiBrZXkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG4gIHJldHVybiAobmV1dGVyZWQgPyBrZXkubmV1dGVyZWQoKSA6IGtleSkudG9CYXNlNTgoKSArICcvKic7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbXVsdGktc2lnIGRlc2NyaXB0b3IgdG8gcHJvZHVjZSBhIGNvcmVkYW8gc3Rha2luZyBhZGRyZXNzXG4gKiBAcGFyYW0gc2NyaXB0VHlwZSBzZWd3aXQgb3IgbGVnYWN5XG4gKiBAcGFyYW0gbG9ja3RpbWUgbG9ja3RpbWUgZm9yIENMVFZcbiAqIEBwYXJhbSBtIFRvdGFsIG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9ja1xuICogQHBhcmFtIG9yZGVyZWRLZXlzIElmIEJpcDMySW50ZXJmYWNlcywgdGhlc2UgYXJlIHhwcnZzIG9yIHhwdWJzIGFuZCBhcmUgZGVyaXZhYmxlLlxuICogICAgICAgICAgICAgICAgICAgIElmIHRoZXkgYXJlIGJ1ZmZlcnMsIHRoZW4gdGhleSBhcmUgcHViL3BydiBrZXlzIGFuZCBhcmUgbm90IGRlcml2YWJsZS5cbiAqIEBwYXJhbSBuZXV0ZXJlZCBJZiB0cnVlLCBuZXV0ZXIgdGhlIGtleXMuIERlZmF1bHQgdG8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKFxuICBzY3JpcHRUeXBlOiBTY3JpcHRUeXBlLFxuICBsb2NrdGltZTogbnVtYmVyLFxuICBtOiBudW1iZXIsXG4gIG9yZGVyZWRLZXlzOiAoQklQMzJJbnRlcmZhY2UgfCBCdWZmZXIpW10sXG4gIG5ldXRlcmVkID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgaWYgKG0gPiBvcmRlcmVkS2V5cy5sZW5ndGggfHwgbSA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgbSAoJHttfSkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBrZXlzICgke29yZGVyZWRLZXlzLmxlbmd0aH0pIGFuZCBncmVhdGVyIHRoYW4gMGBcbiAgICApO1xuICB9XG4gIGlmIChsb2NrdGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2NrdGltZSAoJHtsb2NrdGltZX0pIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBgKTtcbiAgfVxuICBjb25zdCBrZXlzID0gb3JkZXJlZEtleXMubWFwKChrZXkpID0+IGFzRGVzY3JpcHRvcktleShrZXksIG5ldXRlcmVkKSk7XG4gIGNvbnN0IGlubmVyOiBhc3QuTWluaXNjcmlwdE5vZGUgPSB7IGFuZF92OiBbeyAncjphZnRlcic6IGxvY2t0aW1lIH0sIHsgbXVsdGk6IFttLCAuLi5rZXlzXSB9XSB9O1xuICBzd2l0Y2ggKHNjcmlwdFR5cGUpIHtcbiAgICBjYXNlICdzaCc6XG4gICAgICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyBzaDogaW5uZXIgfSk7XG4gICAgY2FzZSAnc2gtd3NoJzpcbiAgICAgIHJldHVybiBhc3QuZm9ybWF0Tm9kZSh7IHNoOiB7IHdzaDogaW5uZXIgfSB9KTtcbiAgICBjYXNlICd3c2gnOlxuICAgICAgcmV0dXJuIGFzdC5mb3JtYXROb2RlKHsgd3NoOiBpbm5lciB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/coreDao/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
|
|
@@ -17,4 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./opReturn"), exports);
|
|
18
18
|
__exportStar(require("./descriptor"), exports);
|
|
19
19
|
__exportStar(require("./transaction"), exports);
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZURhby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLCtDQUE2QjtBQUM3QixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL29wUmV0dXJuJztcbmV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zYWN0aW9uJztcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opReturn.d.ts","sourceRoot":"","sources":["../../../../src/coreDao/opReturn.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,qBAA6B,CAAC;AACnE,eAAO,MAAM,0BAA0B,qBAA6B,CAAC;AACrE,eAAO,MAAM,yBAAyB,qBAA6B,CAAC;AACpE,eAAO,MAAM,yBAAyB,qBAA6B,CAAC;AACpE,eAAO,MAAM,gCAAgC,qBAAiC,CAAC;AAI/E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,wBAAgB,iCAAiC,CAAC,EAChD,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,GAAG,MAAM,CAuFzB;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAkE/E;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUvD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = exports.CORE_DAO_MAINNET_CHAIN_ID = exports.CORE_DAO_TESTNET_CHAIN_ID = exports.CORE_DAO_TESTNET2_CHAIN_ID = exports.CORE_DAO_DEVNET_CHAIN_ID = void 0;
|
|
4
|
+
exports.encodeTimelock = encodeTimelock;
|
|
5
|
+
exports.decodeTimelock = decodeTimelock;
|
|
6
|
+
exports.createCoreDaoOpReturnOutputScript = createCoreDaoOpReturnOutputScript;
|
|
7
|
+
exports.parseCoreDaoOpReturnOutputScript = parseCoreDaoOpReturnOutputScript;
|
|
8
|
+
exports.toString = toString;
|
|
9
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
10
|
+
// Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design
|
|
11
|
+
exports.CORE_DAO_DEVNET_CHAIN_ID = Buffer.from('0458', 'hex');
|
|
12
|
+
exports.CORE_DAO_TESTNET2_CHAIN_ID = Buffer.from('045a', 'hex');
|
|
13
|
+
exports.CORE_DAO_TESTNET_CHAIN_ID = Buffer.from('045b', 'hex');
|
|
14
|
+
exports.CORE_DAO_MAINNET_CHAIN_ID = Buffer.from('045c', 'hex');
|
|
15
|
+
exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = Buffer.from('5341542b', 'hex');
|
|
16
|
+
// https://github.com/bitcoin/bitcoin/blob/5961b23898ee7c0af2626c46d5d70e80136578d3/src/script/script.h#L47
|
|
17
|
+
const OP_RETURN_IDENTIFIER = Buffer.from('6a', 'hex');
|
|
18
|
+
function encodeTimelock(timelock) {
|
|
19
|
+
const buff = Buffer.alloc(4);
|
|
20
|
+
buff.writeUInt32LE(timelock);
|
|
21
|
+
return buff;
|
|
22
|
+
}
|
|
23
|
+
function decodeTimelock(buffer) {
|
|
24
|
+
if (buffer.length !== 4) {
|
|
25
|
+
throw new Error('Invalid timelock buffer length');
|
|
26
|
+
}
|
|
27
|
+
return buffer.readUInt32LE();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a CoreDAO OP_RETURN output script
|
|
31
|
+
*
|
|
32
|
+
* @param version Version of the OP_RETURN
|
|
33
|
+
* @param chainId Chain ID
|
|
34
|
+
* @param delegator Delegator address
|
|
35
|
+
* @param validator Validator address
|
|
36
|
+
* @param fee Fee for relayer
|
|
37
|
+
* @param redeemScript Redeem script of the staking output
|
|
38
|
+
* @param timelock Timelock for the staking output
|
|
39
|
+
* @returns Buffer OP_RETURN buffer
|
|
40
|
+
*/
|
|
41
|
+
function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }) {
|
|
42
|
+
/**
|
|
43
|
+
* As of v2, this is the construction of the OP_RETURN:
|
|
44
|
+
* Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output
|
|
45
|
+
*
|
|
46
|
+
* The OP_RETURN output should contain all staking information in order, and be composed in the following format:
|
|
47
|
+
*
|
|
48
|
+
* Satoshi Plus Identifier: (SAT+) 4 bytes
|
|
49
|
+
* Version: (0x01) 1 byte
|
|
50
|
+
* Chain ID: (0x045b (1115) for Core Testnet and 0x045c (1116) for Core Mainnet) 2 bytes
|
|
51
|
+
* Delegator: The Core address to receive rewards, 20 bytes
|
|
52
|
+
* Validator: The Core validator address to stake to, 20 bytes
|
|
53
|
+
* Fee: Fee for relayer, 1 byte, range [0,255], measured in CORE
|
|
54
|
+
* (Optional) RedeemScript
|
|
55
|
+
* (Optional) Timelock: 4 bytes
|
|
56
|
+
*
|
|
57
|
+
* Either RedeemScript or Timelock must be available, the purpose is to allow relayer to
|
|
58
|
+
* obtain the RedeemScript and submit transactions on Core. If a RedeemScript is provided,
|
|
59
|
+
* relayer will use it directly. Otherwise, relayer will construct the redeem script based
|
|
60
|
+
* on the timelock and the information in the transaction inputs.
|
|
61
|
+
*
|
|
62
|
+
* Note that any length > 80 bytes wont be relayed by nodes and therefore we will throw an error.
|
|
63
|
+
*/
|
|
64
|
+
if (version < 0 || version > 255) {
|
|
65
|
+
throw new Error('Invalid version - out of range');
|
|
66
|
+
}
|
|
67
|
+
const versionBuffer = Buffer.alloc(1, version);
|
|
68
|
+
if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ||
|
|
69
|
+
chainId.equals(exports.CORE_DAO_TESTNET2_CHAIN_ID) ||
|
|
70
|
+
chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID) ||
|
|
71
|
+
chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID))) {
|
|
72
|
+
throw new Error('Invalid chain ID');
|
|
73
|
+
}
|
|
74
|
+
if (delegator.length !== 20) {
|
|
75
|
+
throw new Error('Invalid delegator address');
|
|
76
|
+
}
|
|
77
|
+
if (validator.length !== 20) {
|
|
78
|
+
throw new Error('Invalid validator address');
|
|
79
|
+
}
|
|
80
|
+
if (fee < 0 || fee > 255) {
|
|
81
|
+
throw new Error('Invalid fee - out of range');
|
|
82
|
+
}
|
|
83
|
+
const feeBuffer = Buffer.alloc(1, fee);
|
|
84
|
+
if (feeBuffer.length !== 1) {
|
|
85
|
+
throw new Error('Invalid fee');
|
|
86
|
+
}
|
|
87
|
+
const redeemScriptBuffer = 'redeemScript' in rest ? rest.redeemScript : Buffer.from([]);
|
|
88
|
+
if ('timelock' in rest && (rest.timelock < 0 || rest.timelock > 4294967295)) {
|
|
89
|
+
throw new Error('Invalid timelock - out of range');
|
|
90
|
+
}
|
|
91
|
+
// encode the number into a 4-byte buffer
|
|
92
|
+
// if timelock is provided, write it into 32-bit little-endian
|
|
93
|
+
const timelockBuffer = 'timelock' in rest ? encodeTimelock(rest.timelock) : Buffer.from([]);
|
|
94
|
+
const data = Buffer.concat([
|
|
95
|
+
exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER,
|
|
96
|
+
versionBuffer,
|
|
97
|
+
chainId,
|
|
98
|
+
delegator,
|
|
99
|
+
validator,
|
|
100
|
+
feeBuffer,
|
|
101
|
+
redeemScriptBuffer,
|
|
102
|
+
timelockBuffer,
|
|
103
|
+
]);
|
|
104
|
+
if (data.length > 80) {
|
|
105
|
+
throw new Error('OP_RETURN outputs cannot have a length larger than 80 bytes');
|
|
106
|
+
}
|
|
107
|
+
const payment = utxo_lib_1.payments.embed({
|
|
108
|
+
data: [data],
|
|
109
|
+
network: chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID) ? utxo_lib_1.networks.testnet : utxo_lib_1.networks.bitcoin,
|
|
110
|
+
});
|
|
111
|
+
if (!payment.output) {
|
|
112
|
+
throw new Error('Unable to create OP_RETURN output');
|
|
113
|
+
}
|
|
114
|
+
return payment.output;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Parse a CoreDAO OP_RETURN output script into the constituent parts
|
|
118
|
+
* @param script
|
|
119
|
+
* @returns OpReturnParams
|
|
120
|
+
*/
|
|
121
|
+
function parseCoreDaoOpReturnOutputScript(script) {
|
|
122
|
+
if (!script.subarray(0, 1).equals(OP_RETURN_IDENTIFIER)) {
|
|
123
|
+
throw new Error('First byte must be an OP_RETURN');
|
|
124
|
+
}
|
|
125
|
+
const payment = utxo_lib_1.payments.embed({
|
|
126
|
+
output: script,
|
|
127
|
+
});
|
|
128
|
+
const data = payment.data;
|
|
129
|
+
if (!data || data.length !== 1) {
|
|
130
|
+
throw new Error('Invalid OP_RETURN output');
|
|
131
|
+
}
|
|
132
|
+
const dataBuffer = data[0];
|
|
133
|
+
if (dataBuffer.length > 80) {
|
|
134
|
+
throw new Error(`OP_RETURN outputs cannot have a length larger than 80 bytes`);
|
|
135
|
+
}
|
|
136
|
+
let offset = 0;
|
|
137
|
+
// Decode satoshi+ identifier
|
|
138
|
+
if (!dataBuffer.subarray(offset, offset + 4).equals(exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER)) {
|
|
139
|
+
throw new Error('Invalid satoshi+ identifier');
|
|
140
|
+
}
|
|
141
|
+
offset += 4;
|
|
142
|
+
// Decode version
|
|
143
|
+
const version = dataBuffer[offset];
|
|
144
|
+
offset += 1;
|
|
145
|
+
// Decode chainId
|
|
146
|
+
const chainId = Buffer.from(dataBuffer.subarray(offset, offset + 2));
|
|
147
|
+
if (!(chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID) ||
|
|
148
|
+
chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ||
|
|
149
|
+
chainId.equals(exports.CORE_DAO_TESTNET2_CHAIN_ID) ||
|
|
150
|
+
chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
|
|
151
|
+
throw new Error(`Invalid ChainID: ${chainId.toString('hex')}. Must be either 0x0458 (devnet), 0x045b (testnet), or 0x045c (mainnet).`);
|
|
152
|
+
}
|
|
153
|
+
offset += 2;
|
|
154
|
+
// Decode delegator
|
|
155
|
+
const delegator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
156
|
+
offset += 20;
|
|
157
|
+
// Decode validator
|
|
158
|
+
const validator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
|
|
159
|
+
offset += 20;
|
|
160
|
+
// Decode fee
|
|
161
|
+
const fee = dataBuffer[offset];
|
|
162
|
+
offset += 1;
|
|
163
|
+
const baseParams = { version, chainId, delegator, validator, fee };
|
|
164
|
+
// Decode redeemScript or timelock
|
|
165
|
+
if (offset === dataBuffer.length - 4) {
|
|
166
|
+
return { ...baseParams, timelock: decodeTimelock(dataBuffer.subarray(offset)) };
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return { ...baseParams, redeemScript: Buffer.from(dataBuffer.subarray(offset)) };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function toString(params) {
|
|
173
|
+
return JSON.stringify({
|
|
174
|
+
version: params.version,
|
|
175
|
+
chainId: params.chainId.toString('hex'),
|
|
176
|
+
delegator: params.delegator.toString('hex'),
|
|
177
|
+
validator: params.validator.toString('hex'),
|
|
178
|
+
fee: params.fee,
|
|
179
|
+
...('redeemScript' in params ? { redeemScript: params.redeemScript.toString('hex') } : {}),
|
|
180
|
+
...('timelock' in params ? { timelock: params.timelock } : {}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSx3Q0FJQztBQUVELHdDQUtDO0FBd0JELDhFQThGQztBQU9ELDRFQWtFQztBQUVELDRCQVVDO0FBak9ELDhDQUFxRDtBQUVyRCwwRUFBMEU7QUFDN0QsUUFBQSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxRQUFBLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWM7SUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FB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Q0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUYsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXltZW50cywgbmV0d29ya3MgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG4vLyBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnblxuZXhwb3J0IGNvbnN0IENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDU4JywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX1RFU1RORVQyX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWEnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fVEVTVE5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDViJywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YycsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUiA9IEJ1ZmZlci5mcm9tKCc1MzQxNTQyYicsICdoZXgnKTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpdGNvaW4vYmxvYi81OTYxYjIzODk4ZWU3YzBhZjI2MjZjNDZkNWQ3MGU4MDEzNjU3OGQzL3NyYy9zY3JpcHQvc2NyaXB0LmgjTDQ3XG5jb25zdCBPUF9SRVRVUk5fSURFTlRJRklFUiA9IEJ1ZmZlci5mcm9tKCc2YScsICdoZXgnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVRpbWVsb2NrKHRpbWVsb2NrOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBidWZmID0gQnVmZmVyLmFsbG9jKDQpO1xuICBidWZmLndyaXRlVUludDMyTEUodGltZWxvY2spO1xuICByZXR1cm4gYnVmZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRpbWVsb2NrKGJ1ZmZlcjogQnVmZmVyKTogbnVtYmVyIHtcbiAgaWYgKGJ1ZmZlci5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZWxvY2sgYnVmZmVyIGxlbmd0aCcpO1xuICB9XG4gIHJldHVybiBidWZmZXIucmVhZFVJbnQzMkxFKCk7XG59XG5cbnR5cGUgQmFzZVBhcmFtcyA9IHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBjaGFpbklkOiBCdWZmZXI7XG4gIGRlbGVnYXRvcjogQnVmZmVyO1xuICB2YWxpZGF0b3I6IEJ1ZmZlcjtcbiAgZmVlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcFJldHVyblBhcmFtcyA9IEJhc2VQYXJhbXMgJiAoeyByZWRlZW1TY3JpcHQ6IEJ1ZmZlciB9IHwgeyB0aW1lbG9jazogbnVtYmVyIH0pO1xuXG4vKipcbiAqIENyZWF0ZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHRcbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uIG9mIHRoZSBPUF9SRVRVUk5cbiAqIEBwYXJhbSBjaGFpbklkIENoYWluIElEXG4gKiBAcGFyYW0gZGVsZWdhdG9yIERlbGVnYXRvciBhZGRyZXNzXG4gKiBAcGFyYW0gdmFsaWRhdG9yIFZhbGlkYXRvciBhZGRyZXNzXG4gKiBAcGFyYW0gZmVlIEZlZSBmb3IgcmVsYXllclxuICogQHBhcmFtIHJlZGVlbVNjcmlwdCBSZWRlZW0gc2NyaXB0IG9mIHRoZSBzdGFraW5nIG91dHB1dFxuICogQHBhcmFtIHRpbWVsb2NrIFRpbWVsb2NrIGZvciB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEByZXR1cm5zIEJ1ZmZlciBPUF9SRVRVUk4gYnVmZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICB2ZXJzaW9uLFxuICBjaGFpbklkLFxuICBkZWxlZ2F0b3IsXG4gIHZhbGlkYXRvcixcbiAgZmVlLFxuICAuLi5yZXN0XG59OiBPcFJldHVyblBhcmFtcyk6IEJ1ZmZlciB7XG4gIC8qKlxuICAgKiBBcyBvZiB2MiwgdGhpcyBpcyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBPUF9SRVRVUk46XG4gICAqIFNvdXJjZTogaHR0cHM6Ly9kb2NzLmNvcmVkYW8ub3JnL2RvY3MvTGVhcm4vcHJvZHVjdHMvYnRjLXN0YWtpbmcvZGVzaWduI29wX3JldHVybi1vdXRwdXRcbiAgICpcbiAgICogVGhlIE9QX1JFVFVSTiBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gYWxsIHN0YWtpbmcgaW5mb3JtYXRpb24gaW4gb3JkZXIsIGFuZCBiZSBjb21wb3NlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICpcbiAgICogU2F0b3NoaSBQbHVzIElkZW50aWZpZXI6IChTQVQrKSA0IGJ5dGVzXG4gICAqIFZlcnNpb246ICgweDAxKSAxIGJ5dGVcbiAgICogQ2hhaW4gSUQ6ICgweDA0NWIgKDExMTUpIGZvciBDb3JlIFRlc3RuZXQgYW5kIDB4MDQ1YyAoMTExNikgZm9yIENvcmUgTWFpbm5ldCkgMiBieXRlc1xuICAgKiBEZWxlZ2F0b3I6IFRoZSBDb3JlIGFkZHJlc3MgdG8gcmVjZWl2ZSByZXdhcmRzLCAyMCBieXRlc1xuICAgKiBWYWxpZGF0b3I6IFRoZSBDb3JlIHZhbGlkYXRvciBhZGRyZXNzIHRvIHN0YWtlIHRvLCAyMCBieXRlc1xuICAgKiBGZWU6IEZlZSBmb3IgcmVsYXllciwgMSBieXRlLCByYW5nZSBbMCwyNTVdLCBtZWFzdXJlZCBpbiBDT1JFXG4gICAqIChPcHRpb25hbCkgUmVkZWVtU2NyaXB0XG4gICAqIChPcHRpb25hbCkgVGltZWxvY2s6IDQgYnl0ZXNcbiAgICpcbiAgICogRWl0aGVyIFJlZGVlbVNjcmlwdCBvciBUaW1lbG9jayBtdXN0IGJlIGF2YWlsYWJsZSwgdGhlIHB1cnBvc2UgaXMgdG8gYWxsb3cgcmVsYXllciB0b1xuICAgKiBvYnRhaW4gdGhlIFJlZGVlbVNjcmlwdCBhbmQgc3VibWl0IHRyYW5zYWN0aW9ucyBvbiBDb3JlLiBJZiBhIFJlZGVlbVNjcmlwdCBpcyBwcm92aWRlZCxcbiAgICogcmVsYXllciB3aWxsIHVzZSBpdCBkaXJlY3RseS4gT3RoZXJ3aXNlLCByZWxheWVyIHdpbGwgY29uc3RydWN0IHRoZSByZWRlZW0gc2NyaXB0IGJhc2VkXG4gICAqIG9uIHRoZSB0aW1lbG9jayBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB0cmFuc2FjdGlvbiBpbnB1dHMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbnkgbGVuZ3RoID4gODAgYnl0ZXMgd29udCBiZSByZWxheWVkIGJ5IG5vZGVzIGFuZCB0aGVyZWZvcmUgd2Ugd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICovXG4gIGlmICh2ZXJzaW9uIDwgMCB8fCB2ZXJzaW9uID4gMjU1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZlcnNpb24gLSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuICBjb25zdCB2ZXJzaW9uQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEsIHZlcnNpb24pO1xuXG4gIGlmIChcbiAgICAhKFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVQyX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fTUFJTk5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRClcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGFpbiBJRCcpO1xuICB9XG5cbiAgaWYgKGRlbGVnYXRvci5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRlbGVnYXRvciBhZGRyZXNzJyk7XG4gIH1cblxuICBpZiAodmFsaWRhdG9yLmxlbmd0aCAhPT0gMjApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsaWRhdG9yIGFkZHJlc3MnKTtcbiAgfVxuXG4gIGlmIChmZWUgPCAwIHx8IGZlZSA+IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmZWUgLSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuICBjb25zdCBmZWVCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMSwgZmVlKTtcblxuICBpZiAoZmVlQnVmZmVyLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmZWUnKTtcbiAgfVxuXG4gIGNvbnN0IHJlZGVlbVNjcmlwdEJ1ZmZlciA9ICdyZWRlZW1TY3JpcHQnIGluIHJlc3QgPyByZXN0LnJlZGVlbVNjcmlwdCA6IEJ1ZmZlci5mcm9tKFtdKTtcbiAgaWYgKCd0aW1lbG9jaycgaW4gcmVzdCAmJiAocmVzdC50aW1lbG9jayA8IDAgfHwgcmVzdC50aW1lbG9jayA+IDQyOTQ5NjcyOTUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVsb2NrIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cblxuICAvLyBlbmNvZGUgdGhlIG51bWJlciBpbnRvIGEgNC1ieXRlIGJ1ZmZlclxuICAvLyBpZiB0aW1lbG9jayBpcyBwcm92aWRlZCwgd3JpdGUgaXQgaW50byAzMi1iaXQgbGl0dGxlLWVuZGlhblxuICBjb25zdCB0aW1lbG9ja0J1ZmZlciA9ICd0aW1lbG9jaycgaW4gcmVzdCA/IGVuY29kZVRpbWVsb2NrKHJlc3QudGltZWxvY2spIDogQnVmZmVyLmZyb20oW10pO1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmNvbmNhdChbXG4gICAgQ09SRV9EQU9fU0FUT1NISV9QTFVTX0lERU5USUZJRVIsXG4gICAgdmVyc2lvbkJ1ZmZlcixcbiAgICBjaGFpbklkLFxuICAgIGRlbGVnYXRvcixcbiAgICB2YWxpZGF0b3IsXG4gICAgZmVlQnVmZmVyLFxuICAgIHJlZGVlbVNjcmlwdEJ1ZmZlcixcbiAgICB0aW1lbG9ja0J1ZmZlcixcbiAgXSk7XG4gIGlmIChkYXRhLmxlbmd0aCA+IDgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPUF9SRVRVUk4gb3V0cHV0cyBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBsYXJnZXIgdGhhbiA4MCBieXRlcycpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLmVtYmVkKHtcbiAgICBkYXRhOiBbZGF0YV0sXG4gICAgbmV0d29yazogY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEKSA/IG5ldHdvcmtzLnRlc3RuZXQgOiBuZXR3b3Jrcy5iaXRjb2luLFxuICB9KTtcbiAgaWYgKCFwYXltZW50Lm91dHB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNyZWF0ZSBPUF9SRVRVUk4gb3V0cHV0Jyk7XG4gIH1cblxuICByZXR1cm4gcGF5bWVudC5vdXRwdXQ7XG59XG5cbi8qKlxuICogUGFyc2UgYSBDb3JlREFPIE9QX1JFVFVSTiBvdXRwdXQgc2NyaXB0IGludG8gdGhlIGNvbnN0aXR1ZW50IHBhcnRzXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJucyBPcFJldHVyblBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoc2NyaXB0OiBCdWZmZXIpOiBPcFJldHVyblBhcmFtcyB7XG4gIGlmICghc2NyaXB0LnN1YmFycmF5KDAsIDEpLmVxdWFscyhPUF9SRVRVUk5fSURFTlRJRklFUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGJ5dGUgbXVzdCBiZSBhbiBPUF9SRVRVUk4nKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5lbWJlZCh7XG4gICAgb3V0cHV0OiBzY3JpcHQsXG4gIH0pO1xuICBjb25zdCBkYXRhID0gcGF5bWVudC5kYXRhO1xuICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT1BfUkVUVVJOIG91dHB1dCcpO1xuICB9XG4gIGNvbnN0IGRhdGFCdWZmZXIgPSBkYXRhWzBdO1xuICBpZiAoZGF0YUJ1ZmZlci5sZW5ndGggPiA4MCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgT1BfUkVUVVJOIG91dHB1dHMgY2Fubm90IGhhdmUgYSBsZW5ndGggbGFyZ2VyIHRoYW4gODAgYnl0ZXNgKTtcbiAgfVxuICBsZXQgb2Zmc2V0ID0gMDtcblxuICAvLyBEZWNvZGUgc2F0b3NoaSsgaWRlbnRpZmllclxuICBpZiAoIWRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyA0KS5lcXVhbHMoQ09SRV9EQU9fU0FUT1NISV9QTFVTX0lERU5USUZJRVIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNhdG9zaGkrIGlkZW50aWZpZXInKTtcbiAgfVxuICBvZmZzZXQgKz0gNDtcblxuICAvLyBEZWNvZGUgdmVyc2lvblxuICBjb25zdCB2ZXJzaW9uID0gZGF0YUJ1ZmZlcltvZmZzZXRdO1xuICBvZmZzZXQgKz0gMTtcblxuICAvLyBEZWNvZGUgY2hhaW5JZFxuICBjb25zdCBjaGFpbklkID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIpKTtcbiAgaWYgKFxuICAgICEoXG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19ERVZORVRfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVDJfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgQ2hhaW5JRDogJHtjaGFpbklkLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKX0uIE11c3QgYmUgZWl0aGVyIDB4MDQ1OCAoZGV2bmV0KSwgMHgwNDViICh0ZXN0bmV0KSwgb3IgMHgwNDVjIChtYWlubmV0KS5gXG4gICAgKTtcbiAgfVxuICBvZmZzZXQgKz0gMjtcblxuICAvLyBEZWNvZGUgZGVsZWdhdG9yXG4gIGNvbnN0IGRlbGVnYXRvciA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyMCkpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gRGVjb2RlIHZhbGlkYXRvclxuICBjb25zdCB2YWxpZGF0b3IgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMjApKTtcbiAgb2Zmc2V0ICs9IDIwO1xuXG4gIC8vIERlY29kZSBmZWVcbiAgY29uc3QgZmVlID0gZGF0YUJ1ZmZlcltvZmZzZXRdO1xuICBvZmZzZXQgKz0gMTtcblxuICBjb25zdCBiYXNlUGFyYW1zID0geyB2ZXJzaW9uLCBjaGFpbklkLCBkZWxlZ2F0b3IsIHZhbGlkYXRvciwgZmVlIH07XG5cbiAgLy8gRGVjb2RlIHJlZGVlbVNjcmlwdCBvciB0aW1lbG9ja1xuICBpZiAob2Zmc2V0ID09PSBkYXRhQnVmZmVyLmxlbmd0aCAtIDQpIHtcbiAgICByZXR1cm4geyAuLi5iYXNlUGFyYW1zLCB0aW1lbG9jazogZGVjb2RlVGltZWxvY2soZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQpKSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLmJhc2VQYXJhbXMsIHJlZGVlbVNjcmlwdDogQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQpKSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyhwYXJhbXM6IE9wUmV0dXJuUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICB2ZXJzaW9uOiBwYXJhbXMudmVyc2lvbixcbiAgICBjaGFpbklkOiBwYXJhbXMuY2hhaW5JZC50b1N0cmluZygnaGV4JyksXG4gICAgZGVsZWdhdG9yOiBwYXJhbXMuZGVsZWdhdG9yLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB2YWxpZGF0b3I6IHBhcmFtcy52YWxpZGF0b3IudG9TdHJpbmcoJ2hleCcpLFxuICAgIGZlZTogcGFyYW1zLmZlZSxcbiAgICAuLi4oJ3JlZGVlbVNjcmlwdCcgaW4gcGFyYW1zID8geyByZWRlZW1TY3JpcHQ6IHBhcmFtcy5yZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpIH0gOiB7fSksXG4gICAgLi4uKCd0aW1lbG9jaycgaW4gcGFyYW1zID8geyB0aW1lbG9jazogcGFyYW1zLnRpbWVsb2NrIH0gOiB7fSksXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../../src/coreDao/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAqC,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/E,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,GAC7B,MAAM,CAAC,MAAM,CAAC,EAAE,CAgBlB;AAED,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,GAAG,YAAY,EAAE,CAEjH"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStakingOutputsCore = createStakingOutputsCore;
|
|
4
|
+
exports.createStakingOutputs = createStakingOutputs;
|
|
5
|
+
const opReturn_1 = require("./opReturn");
|
|
6
|
+
/**
|
|
7
|
+
* Create the staking outputs for a CoreDAO staking transaction. This is the ordering
|
|
8
|
+
* in which to add into the transaction.
|
|
9
|
+
* @param stakingParams how to create the timelocked stake output
|
|
10
|
+
* @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
|
|
11
|
+
* If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
|
|
12
|
+
* @param opReturnParams to create the OP_RETURN output
|
|
13
|
+
*/
|
|
14
|
+
function createStakingOutputsCore(stakingParams, opReturnParams) {
|
|
15
|
+
if (stakingParams.descriptor.hasWildcard() && stakingParams.index === undefined) {
|
|
16
|
+
throw new Error('Cannot create staking outputs with a wildcard descriptor and no derivation index');
|
|
17
|
+
}
|
|
18
|
+
const outputScript = Buffer.from(stakingParams.index === undefined
|
|
19
|
+
? stakingParams.descriptor.scriptPubkey()
|
|
20
|
+
: stakingParams.descriptor.atDerivationIndex(stakingParams.index).scriptPubkey());
|
|
21
|
+
const opReturnScript = (0, opReturn_1.createCoreDaoOpReturnOutputScript)(opReturnParams);
|
|
22
|
+
return [
|
|
23
|
+
{ script: outputScript, value: stakingParams.amount },
|
|
24
|
+
{ script: opReturnScript, value: BigInt(0) },
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @see createStakingOutputsCore
|
|
29
|
+
* @deprecated - use createStakingOutputsCore instead
|
|
30
|
+
*/
|
|
31
|
+
function createStakingOutputs(stakingParams, opReturnParams) {
|
|
32
|
+
return createStakingOutputsCore(stakingParams, opReturnParams).map(({ value, ...o }) => ({ ...o, amount: value }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSw0REFtQkM7QUFXRCxvREFFQztBQWhERCx5Q0FBK0U7QUFRL0U7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxhQUE0QixFQUM1QixjQUE4QjtJQUU5QixJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUztRQUMvQixDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUU7UUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUNuRixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBQSw0Q0FBaUMsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUV6RSxPQUFPO1FBQ0wsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3JELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBT0Q7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsYUFBNEIsRUFBRSxjQUE4QjtJQUMvRixPQUFPLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNySCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCwgT3BSZXR1cm5QYXJhbXMgfSBmcm9tICcuL29wUmV0dXJuJztcblxudHlwZSBTdGFraW5nUGFyYW1zID0ge1xuICBhbW91bnQ6IGJpZ2ludDtcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjtcbiAgaW5kZXg/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgc3Rha2luZyBvdXRwdXRzIGZvciBhIENvcmVEQU8gc3Rha2luZyB0cmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgb3JkZXJpbmdcbiAqIGluIHdoaWNoIHRvIGFkZCBpbnRvIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zIGhvdyB0byBjcmVhdGUgdGhlIHRpbWVsb2NrZWQgc3Rha2Ugb3V0cHV0XG4gKiBAcGFyYW0gc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yIGlmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIGBkZWZpbml0ZWAgZGVzY3JpcHRvci5cbiAqIElmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlcml2YWJsZWAgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSBvcFJldHVyblBhcmFtcyB0byBjcmVhdGUgdGhlIE9QX1JFVFVSTiBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZShcbiAgc3Rha2luZ1BhcmFtczogU3Rha2luZ1BhcmFtcyxcbiAgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zXG4pOiBPdXRwdXQ8YmlnaW50PltdIHtcbiAgaWYgKHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5oYXNXaWxkY2FyZCgpICYmIHN0YWtpbmdQYXJhbXMuaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBzdGFraW5nIG91dHB1dHMgd2l0aCBhIHdpbGRjYXJkIGRlc2NyaXB0b3IgYW5kIG5vIGRlcml2YXRpb24gaW5kZXgnKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNjcmlwdCA9IEJ1ZmZlci5mcm9tKFxuICAgIHN0YWtpbmdQYXJhbXMuaW5kZXggPT09IHVuZGVmaW5lZFxuICAgICAgPyBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KClcbiAgICAgIDogc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KHN0YWtpbmdQYXJhbXMuaW5kZXgpLnNjcmlwdFB1YmtleSgpXG4gICk7XG4gIGNvbnN0IG9wUmV0dXJuU2NyaXB0ID0gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KG9wUmV0dXJuUGFyYW1zKTtcblxuICByZXR1cm4gW1xuICAgIHsgc2NyaXB0OiBvdXRwdXRTY3JpcHQsIHZhbHVlOiBzdGFraW5nUGFyYW1zLmFtb3VudCB9LFxuICAgIHsgc2NyaXB0OiBvcFJldHVyblNjcmlwdCwgdmFsdWU6IEJpZ0ludCgwKSB9LFxuICBdO1xufVxuXG50eXBlIExlZ2FjeU91dHB1dCA9IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG4gIGFtb3VudDogYmlnaW50O1xufTtcblxuLyoqXG4gKiBAc2VlIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZVxuICogQGRlcHJlY2F0ZWQgLSB1c2UgY3JlYXRlU3Rha2luZ091dHB1dHNDb3JlIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzKHN0YWtpbmdQYXJhbXM6IFN0YWtpbmdQYXJhbXMsIG9wUmV0dXJuUGFyYW1zOiBPcFJldHVyblBhcmFtcyk6IExlZ2FjeU91dHB1dFtdIHtcbiAgcmV0dXJuIGNyZWF0ZVN0YWtpbmdPdXRwdXRzQ29yZShzdGFraW5nUGFyYW1zLCBvcFJldHVyblBhcmFtcykubWFwKCh7IHZhbHVlLCAuLi5vIH0pID0+ICh7IC4uLm8sIGFtb3VudDogdmFsdWUgfSkpO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
|
|
@@ -36,4 +36,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.babylon = exports.coreDao = void 0;
|
|
37
37
|
exports.coreDao = __importStar(require("./coreDao"));
|
|
38
38
|
exports.babylon = __importStar(require("./babylon"));
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFDO0FBQ3JDLHFEQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIGNvcmVEYW8gZnJvbSAnLi9jb3JlRGFvJztcbmV4cG9ydCAqIGFzIGJhYnlsb24gZnJvbSAnLi9iYWJ5bG9uJztcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug71.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/bug71.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
41
|
+
const bitcoinjs = __importStar(require("bitcoinjs-lib"));
|
|
42
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
43
|
+
const wasmMiniscript = __importStar(require("@bitgo/wasm-utxo"));
|
|
44
|
+
// demonstrate https://github.com/babylonlabs-io/btc-staking-ts/issues/71
|
|
45
|
+
describe('btc-staking-ts bug #71', function () {
|
|
46
|
+
let buf;
|
|
47
|
+
before('load half-signed transaction', async function () {
|
|
48
|
+
const fixture = JSON.parse(await fs.promises.readFile(__dirname + '/../../fixtures/babylon/txTree.testnet.json', 'utf-8'));
|
|
49
|
+
const base64 = fixture.slashingSignedBase64;
|
|
50
|
+
(0, assert_1.default)(typeof base64 === 'string');
|
|
51
|
+
buf = Buffer.from(base64, 'base64');
|
|
52
|
+
});
|
|
53
|
+
it('can finalize with bitcoinjs-lib', function () {
|
|
54
|
+
const psbt = bitcoinjs.Psbt.fromBuffer(buf);
|
|
55
|
+
// this does not throw because of a bug in bitcoinjs-lib
|
|
56
|
+
psbt.finalizeAllInputs();
|
|
57
|
+
});
|
|
58
|
+
it('cannot finalize with utxolib', function () {
|
|
59
|
+
const psbt = utxolib.Psbt.fromBuffer(buf);
|
|
60
|
+
assert_1.default.throws(() => {
|
|
61
|
+
psbt.finalizeAllInputs();
|
|
62
|
+
}, /Error: Can not finalize input #0/);
|
|
63
|
+
});
|
|
64
|
+
it('cannot finalize with wasm-miniscript', function () {
|
|
65
|
+
const psbt = wasmMiniscript.Psbt.deserialize(buf);
|
|
66
|
+
assert_1.default.throws(() => {
|
|
67
|
+
psbt.finalize();
|
|
68
|
+
}, /CouldNotSatisfyTr/);
|
|
69
|
+
});
|
|
70
|
+
it('cannot finalize with bitcoind', async function () {
|
|
71
|
+
let cookie;
|
|
72
|
+
try {
|
|
73
|
+
cookie = await fs.promises.readFile(process.env.HOME + '/.bitcoin/regtest/.cookie', 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
if (e.code === 'ENOENT') {
|
|
77
|
+
console.log('No cookie file found, skipping test');
|
|
78
|
+
this.skip();
|
|
79
|
+
}
|
|
80
|
+
throw e;
|
|
81
|
+
}
|
|
82
|
+
// make regtest JSON-RPC request with cookie
|
|
83
|
+
const url = 'http://localhost:18443';
|
|
84
|
+
const headers = {
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
Authorization: 'Basic ' + Buffer.from(cookie, 'utf-8').toString('base64'),
|
|
87
|
+
};
|
|
88
|
+
// Create the request payload for finalizepsbt RPC call
|
|
89
|
+
const body = JSON.stringify({
|
|
90
|
+
jsonrpc: '1.0',
|
|
91
|
+
id: 'bitgo-test',
|
|
92
|
+
method: 'finalizepsbt',
|
|
93
|
+
params: [buf.toString('base64')],
|
|
94
|
+
});
|
|
95
|
+
// Make the RPC request
|
|
96
|
+
const response = await fetch(url, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers,
|
|
99
|
+
body,
|
|
100
|
+
});
|
|
101
|
+
assert_1.default.deepStrictEqual((await response.json()).result, {
|
|
102
|
+
// the response psbt is the same as the input psbt - not finalized
|
|
103
|
+
psbt: buf.toString('base64'),
|
|
104
|
+
complete: false,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVnNzEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYmFieWxvbi9idWc3MS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QixvREFBNEI7QUFFNUIseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyxpRUFBbUQ7QUFFbkQseUVBQXlFO0FBQ3pFLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxJQUFJLEdBQVcsQ0FBQztJQUNoQixNQUFNLENBQUMsOEJBQThCLEVBQUUsS0FBSztRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN4QixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyw2Q0FBNkMsRUFBRSxPQUFPLENBQUMsQ0FDL0YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUM1QyxJQUFBLGdCQUFNLEVBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDbkMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtRQUNqQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7UUFDekMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxLQUFLO1FBQ3ZDLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLDJCQUEyQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCw0Q0FBNEM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQUc7WUFDZCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLGFBQWEsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUMxRSxDQUFDO1FBRUYsdURBQXVEO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUIsT0FBTyxFQUFFLEtBQUs7WUFDZCxFQUFFLEVBQUUsWUFBWTtZQUNoQixNQUFNLEVBQUUsY0FBYztZQUN0QixNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUVILHVCQUF1QjtRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDaEMsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPO1lBQ1AsSUFBSTtTQUNMLENBQUMsQ0FBQztRQUVILGdCQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDckQsa0VBQWtFO1lBQ2xFLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUM1QixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBiaXRjb2luanMgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB3YXNtTWluaXNjcmlwdCBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuLy8gZGVtb25zdHJhdGUgaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2J0Yy1zdGFraW5nLXRzL2lzc3Vlcy83MVxuZGVzY3JpYmUoJ2J0Yy1zdGFraW5nLXRzIGJ1ZyAjNzEnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBidWY6IEJ1ZmZlcjtcbiAgYmVmb3JlKCdsb2FkIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGZpeHR1cmUgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoX19kaXJuYW1lICsgJy8uLi8uLi9maXh0dXJlcy9iYWJ5bG9uL3R4VHJlZS50ZXN0bmV0Lmpzb24nLCAndXRmLTgnKVxuICAgICk7XG4gICAgY29uc3QgYmFzZTY0ID0gZml4dHVyZS5zbGFzaGluZ1NpZ25lZEJhc2U2NDtcbiAgICBhc3NlcnQodHlwZW9mIGJhc2U2NCA9PT0gJ3N0cmluZycpO1xuICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICB9KTtcblxuICBpdCgnY2FuIGZpbmFsaXplIHdpdGggYml0Y29pbmpzLWxpYicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gYml0Y29pbmpzLlBzYnQuZnJvbUJ1ZmZlcihidWYpO1xuICAgIC8vIHRoaXMgZG9lcyBub3QgdGhyb3cgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBiaXRjb2luanMtbGliXG4gICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICB9KTtcblxuICBpdCgnY2Fubm90IGZpbmFsaXplIHdpdGggdXR4b2xpYicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5Qc2J0LmZyb21CdWZmZXIoYnVmKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIHBzYnQuZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgICB9LCAvRXJyb3I6IENhbiBub3QgZmluYWxpemUgaW5wdXQgIzAvKTtcbiAgfSk7XG5cbiAgaXQoJ2Nhbm5vdCBmaW5hbGl6ZSB3aXRoIHdhc20tbWluaXNjcmlwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gd2FzbU1pbmlzY3JpcHQuUHNidC5kZXNlcmlhbGl6ZShidWYpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgcHNidC5maW5hbGl6ZSgpO1xuICAgIH0sIC9Db3VsZE5vdFNhdGlzZnlUci8pO1xuICB9KTtcblxuICBpdCgnY2Fubm90IGZpbmFsaXplIHdpdGggYml0Y29pbmQnLCBhc3luYyBmdW5jdGlvbiAodGhpczogTW9jaGEuQ29udGV4dCkge1xuICAgIGxldCBjb29raWU6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29va2llID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocHJvY2Vzcy5lbnYuSE9NRSArICcvLmJpdGNvaW4vcmVndGVzdC8uY29va2llJywgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ05vIGNvb2tpZSBmaWxlIGZvdW5kLCBza2lwcGluZyB0ZXN0Jyk7XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgLy8gbWFrZSByZWd0ZXN0IEpTT04tUlBDIHJlcXVlc3Qgd2l0aCBjb29raWVcbiAgICBjb25zdCB1cmwgPSAnaHR0cDovL2xvY2FsaG9zdDoxODQ0Myc7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICBBdXRob3JpemF0aW9uOiAnQmFzaWMgJyArIEJ1ZmZlci5mcm9tKGNvb2tpZSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3QgcGF5bG9hZCBmb3IgZmluYWxpemVwc2J0IFJQQyBjYWxsXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGpzb25ycGM6ICcxLjAnLFxuICAgICAgaWQ6ICdiaXRnby10ZXN0JyxcbiAgICAgIG1ldGhvZDogJ2ZpbmFsaXplcHNidCcsXG4gICAgICBwYXJhbXM6IFtidWYudG9TdHJpbmcoJ2Jhc2U2NCcpXSxcbiAgICB9KTtcblxuICAgIC8vIE1ha2UgdGhlIFJQQyByZXF1ZXN0XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKChhd2FpdCByZXNwb25zZS5qc29uKCkpLnJlc3VsdCwge1xuICAgICAgLy8gdGhlIHJlc3BvbnNlIHBzYnQgaXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHBzYnQgLSBub3QgZmluYWxpemVkXG4gICAgICBwc2J0OiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgY29tcGxldGU6IGZhbHNlLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ECPairInterface } from '@bitgo/utxo-lib';
|
|
2
|
+
export declare function getECKey(seed: string): ECPairInterface;
|
|
3
|
+
export declare function getECKeys(key: string, count: number): ECPairInterface[];
|
|
4
|
+
export declare function getXOnlyPubkey(key: ECPairInterface): Buffer;
|
|
5
|
+
export declare function fromXOnlyPublicKey(key: Buffer): ECPairInterface;
|
|
6
|
+
//# sourceMappingURL=key.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.utils.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/key.utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAItD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAEvE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAS/D"}
|