@bitgo-beta/utxo-staking 0.0.0-semantic-release-managed
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +3 -0
- package/dist/src/babylon/delegationMessage.d.ts +38 -0
- package/dist/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/src/babylon/delegationMessage.js +259 -0
- package/dist/src/babylon/descriptor.d.ts +48 -0
- package/dist/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/src/babylon/descriptor.js +97 -0
- package/dist/src/babylon/index.d.ts +6 -0
- package/dist/src/babylon/index.d.ts.map +1 -0
- package/dist/src/babylon/index.js +49 -0
- package/dist/src/babylon/network.d.ts +7 -0
- package/dist/src/babylon/network.d.ts.map +1 -0
- package/dist/src/babylon/network.js +66 -0
- package/dist/src/babylon/params.mainnet.json +152 -0
- package/dist/src/babylon/params.testnet.json +212 -0
- package/dist/src/babylon/parseDescriptor.d.ts +26 -0
- package/dist/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/src/babylon/parseDescriptor.js +159 -0
- package/dist/src/babylon/stakingManager.d.ts +6 -0
- package/dist/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/src/babylon/stakingManager.js +120 -0
- package/dist/src/babylon/stakingParams.d.ts +40 -0
- package/dist/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/src/babylon/stakingParams.js +132 -0
- package/dist/src/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/src/babylon/undelegation/UndelegationResponse.js +55 -0
- package/dist/src/babylon/undelegation/index.d.ts +3 -0
- package/dist/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/src/babylon/undelegation/index.js +19 -0
- package/dist/src/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/src/coreDao/descriptor.d.ts +18 -0
- package/dist/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/src/coreDao/descriptor.js +38 -0
- package/dist/src/coreDao/index.d.ts +4 -0
- package/dist/src/coreDao/index.d.ts.map +1 -0
- package/dist/src/coreDao/index.js +20 -0
- package/dist/src/coreDao/opReturn.d.ts +41 -0
- package/dist/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/src/coreDao/opReturn.js +183 -0
- package/dist/src/coreDao/transaction.d.ts +28 -0
- package/dist/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/src/coreDao/transaction.js +34 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +39 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/babylon/undelegation/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./unbonding"), exports);
|
|
18
|
+
__exportStar(require("./UndelegationResponse"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYmFieWxvbi91bmRlbGVnYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUE0QjtBQUM1Qix5REFBdUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3VuYm9uZGluZyc7XG5leHBvcnQgKiBmcm9tICcuL1VuZGVsZWdhdGlvblJlc3BvbnNlJztcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
+
import { PartialSig, WitnessUtxo } from 'bip174/src/lib/interfaces';
|
|
3
|
+
import { Descriptor } from '@bitgo/wasm-miniscript';
|
|
4
|
+
/**
|
|
5
|
+
* Asserts that the provided signatures are valid for the given PSBT input.
|
|
6
|
+
*/
|
|
7
|
+
export declare function assertValidSignatures(psbt: utxolib.bitgo.UtxoPsbt, inputIndex: number, signatures: PartialSig[]): void;
|
|
8
|
+
/**
|
|
9
|
+
* @return unsigned PSBT for an unbonding transaction
|
|
10
|
+
*/
|
|
11
|
+
export declare function toUnbondingPsbt(tx: utxolib.bitgo.UtxoTransaction<bigint>, witnessUtxo: WitnessUtxo, stakingDescriptor: Descriptor, network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
|
|
12
|
+
/**
|
|
13
|
+
* @return PSBT for an unbonding transaction with signatures
|
|
14
|
+
*/
|
|
15
|
+
export declare function toUnbondingPsbtWithSignatures(tx: utxolib.bitgo.UtxoTransaction<bigint>, witnessUtxo: WitnessUtxo, stakingDescriptor: Descriptor, signatures: PartialSig[], network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
|
|
16
|
+
//# sourceMappingURL=unbonding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unbonding.d.ts","sourceRoot":"","sources":["../../../../src/babylon/undelegation/unbonding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAmB,MAAM,wBAAwB,CAAC;AAiBrE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,EAAE,GACvB,IAAI,CAON;AAQD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EACzC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,UAAU,EAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CA4BxB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EACzC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,UAAU,EAC7B,UAAU,EAAE,UAAU,EAAE,EACxB,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMxB"}
|
|
@@ -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-beta/utxo-lib"));
|
|
44
|
+
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
|
|
45
|
+
const descriptor_1 = require("@bitgo-beta/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_miniscript_1.Miniscript.fromString(wasm_miniscript_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ib25kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JhYnlsb24vdW5kZWxlZ2F0aW9uL3VuYm9uZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxzREFXQztBQVdELDBDQWlDQztBQUtELHNFQVlDO0FBaEdELG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFFaEQsNERBQXFFO0FBQ3JFLGlFQUFnRztBQUVoRyx3REFBNEQ7QUFFNUQ7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQTRCLEVBQUUsVUFBa0IsRUFBRSxVQUF3QjtJQUN2RyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzdELElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztJQUN0RixNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHFC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QUNILFNBQWdCLDZCQUE2QixDQUMzQyxFQUF5QyxFQUN6QyxXQUF3QixFQUN4QixpQkFBNkIsRUFDN0IsVUFBd0IsRUFDeEIsT0FBd0I7SUFFeEIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsbURBQW1ELENBQUMsQ0FBQztJQUMzRixxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0MsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IFBhcnRpYWxTaWcsIFdpdG5lc3NVdHhvIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0LCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcbmltcG9ydCB7IGZpbmRUYXBMZWFmU2NyaXB0LCB0b1V0eG9Qc2J0LCB0b1dyYXBwZWRQc2J0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yIH0gZnJvbSAnLi4vcGFyc2VEZXNjcmlwdG9yJztcblxuLyoqXG4gKiBBZGRzIGNvdmVuYW50IHNpZ25hdHVyZXMgdG8gYSBQU0JUIGlucHV0LlxuICovXG5mdW5jdGlvbiBhZGRDb3ZlbmFudFNpZ25hdHVyZXMocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBzaWduYXR1cmVzOiBQYXJ0aWFsU2lnW10pOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICBhc3NlcnQoaW5wdXQudGFwTGVhZlNjcmlwdCwgJ0lucHV0IG11c3QgaGF2ZSB0YXBMZWFmU2NyaXB0Jyk7XG4gIGFzc2VydChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA9PT0gMSwgJ0lucHV0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSB0YXBMZWFmU2NyaXB0Jyk7XG4gIGNvbnN0IFt7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH1dID0gaW5wdXQudGFwTGVhZlNjcmlwdDtcbiAgY29uc3QgbGVhZkhhc2ggPSB1dHhvbGliLnRhcHJvb3QuZ2V0VGFwbGVhZkhhc2godXR4b2xpYi5lY2MsIGNvbnRyb2xCbG9jaywgc2NyaXB0KTtcbiAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHRhcFNjcmlwdFNpZzogc2lnbmF0dXJlcy5tYXAoKHMpID0+ICh7IC4uLnMsIGxlYWZIYXNoIH0pKSB9KTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIHByb3ZpZGVkIHNpZ25hdHVyZXMgYXJlIHZhbGlkIGZvciB0aGUgZ2l2ZW4gUFNCVCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkU2lnbmF0dXJlcyhcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduYXR1cmVzOiBQYXJ0aWFsU2lnW11cbik6IHZvaWQge1xuICBzaWduYXR1cmVzLmZvckVhY2goKHMpID0+IHtcbiAgICBhc3NlcnQoXG4gICAgICBwc2J0LnZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIHMucHVia2V5KSxcbiAgICAgIGBTaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7cy5wdWJrZXkudG9TdHJpbmcoJ2hleCcpfWBcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5ib25kaW5nU2NyaXB0KHN0YWtpbmdEZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogTWluaXNjcmlwdCB7XG4gIGNvbnN0IHBhcnNlZERlc2NyaXB0b3IgPSBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yKHN0YWtpbmdEZXNjcmlwdG9yKTtcbiAgYXNzZXJ0KHBhcnNlZERlc2NyaXB0b3IsICdJbnZhbGlkIHN0YWtpbmcgZGVzY3JpcHRvcicpO1xuICByZXR1cm4gTWluaXNjcmlwdC5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHBhcnNlZERlc2NyaXB0b3IudW5ib25kaW5nTWluaXNjcmlwdE5vZGUpLCAndGFwJyk7XG59XG5cbi8qKlxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUIGZvciBhbiB1bmJvbmRpbmcgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5ib25kaW5nUHNidChcbiAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIHdpdG5lc3NVdHhvOiBXaXRuZXNzVXR4byxcbiAgc3Rha2luZ0Rlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHVuYm9uZGluZ1NjcmlwdCA9IGdldFVuYm9uZGluZ1NjcmlwdChzdGFraW5nRGVzY3JpcHRvcik7XG4gIGNvbnN0IHBzYnQgPSBuZXcgdXR4b2xpYi5Qc2J0KHsgbmV0d29yayB9KTtcbiAgcHNidC5zZXRWZXJzaW9uKHR4LnZlcnNpb24pO1xuICBwc2J0LnNldExvY2t0aW1lKHR4LmxvY2t0aW1lKTtcbiAgcHNidC5hZGRPdXRwdXRzKFxuICAgIHR4Lm91dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBzY3JpcHQ6IG91dHB1dC5zY3JpcHQsXG4gICAgICB2YWx1ZTogQmlnSW50KG91dHB1dC52YWx1ZSksXG4gICAgfSkpXG4gICk7XG4gIGFzc2VydCh0eC5pbnMubGVuZ3RoID09PSAxKTtcbiAgY29uc3QgaW5wdXQgPSB0eC5pbnNbMF07XG4gIHBzYnQuYWRkSW5wdXQoe1xuICAgIGhhc2g6IGlucHV0Lmhhc2gsXG4gICAgaW5kZXg6IGlucHV0LmluZGV4LFxuICAgIHNlcXVlbmNlOiBpbnB1dC5zZXF1ZW5jZSxcbiAgICB3aXRuZXNzVXR4byxcbiAgfSk7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidChwc2J0KTtcbiAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBzdGFraW5nRGVzY3JpcHRvcik7XG4gIGNvbnN0IHVud3JhcHBlZCA9IHRvVXR4b1BzYnQod3JhcHBlZFBzYnQsIG5ldHdvcmspO1xuICBhc3NlcnQodW53cmFwcGVkLmRhdGEuaW5wdXRzLmxlbmd0aCA9PT0gMSwgJ1VuYm9uZGluZyB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgZXhhY3RseSBvbmUgaW5wdXQnKTtcbiAgY29uc3QgdW53cmFwcGVkSW5wdXREYXRhID0gdW53cmFwcGVkLmRhdGEuaW5wdXRzWzBdO1xuICBhc3NlcnQodW53cmFwcGVkSW5wdXREYXRhLnRhcExlYWZTY3JpcHQpO1xuICBjb25zdCB1bndyYXBwZWRVbmJvbmQgPSBmaW5kVGFwTGVhZlNjcmlwdCh1bndyYXBwZWRJbnB1dERhdGEudGFwTGVhZlNjcmlwdCwgdW5ib25kaW5nU2NyaXB0KTtcbiAgdW53cmFwcGVkSW5wdXREYXRhLnRhcExlYWZTY3JpcHQgPSBbdW53cmFwcGVkVW5ib25kXTtcbiAgcmV0dXJuIHVud3JhcHBlZDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZm9yIGFuIHVuYm9uZGluZyB0cmFuc2FjdGlvbiB3aXRoIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5ib25kaW5nUHNidFdpdGhTaWduYXR1cmVzKFxuICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgd2l0bmVzc1V0eG86IFdpdG5lc3NVdHhvLFxuICBzdGFraW5nRGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgc2lnbmF0dXJlczogUGFydGlhbFNpZ1tdLFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBwc2J0ID0gdG9VbmJvbmRpbmdQc2J0KHR4LCB3aXRuZXNzVXR4bywgc3Rha2luZ0Rlc2NyaXB0b3IsIG5ldHdvcmspO1xuICBhc3NlcnQocHNidC5kYXRhLmlucHV0cy5sZW5ndGggPT09IDEsICdVbmJvbmRpbmcgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGlucHV0Jyk7XG4gIGFkZENvdmVuYW50U2lnbmF0dXJlcyhwc2J0LCAwLCBzaWduYXR1cmVzKTtcbiAgYXNzZXJ0VmFsaWRTaWduYXR1cmVzKHBzYnQsIDAsIHNpZ25hdHVyZXMpO1xuICByZXR1cm4gcHNidDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BIP32Interface } from '@bitgo-beta/utxo-lib';
|
|
2
|
+
/**
|
|
3
|
+
* Script type for a descriptor.
|
|
4
|
+
*
|
|
5
|
+
* See https://docs.coredao.org/docs/Learn/products/btc-staking/design#p2shp2wsh-output
|
|
6
|
+
*/
|
|
7
|
+
export type ScriptType = 'sh' | 'sh-wsh' | 'wsh';
|
|
8
|
+
/**
|
|
9
|
+
* Create a multi-sig descriptor to produce a coredao staking address
|
|
10
|
+
* @param scriptType segwit or legacy
|
|
11
|
+
* @param locktime locktime for CLTV
|
|
12
|
+
* @param m Total number of keys required to unlock
|
|
13
|
+
* @param orderedKeys If Bip32Interfaces, these are xprvs or xpubs and are derivable.
|
|
14
|
+
* If they are buffers, then they are pub/prv keys and are not derivable.
|
|
15
|
+
* @param neutered If true, neuter the keys. Default to true
|
|
16
|
+
*/
|
|
17
|
+
export declare function createMultiSigDescriptor(scriptType: ScriptType, locktime: number, m: number, orderedKeys: (BIP32Interface | Buffer)[], neutered?: boolean): string;
|
|
18
|
+
//# sourceMappingURL=descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/coreDao/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;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_miniscript_1 = require("@bitgo/wasm-miniscript");
|
|
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_miniscript_1.ast.formatNode({ sh: inner });
|
|
32
|
+
case 'sh-wsh':
|
|
33
|
+
return wasm_miniscript_1.ast.formatNode({ sh: { wsh: inner } });
|
|
34
|
+
case 'wsh':
|
|
35
|
+
return wasm_miniscript_1.ast.formatNode({ wsh: inner });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsNERBeUJDO0FBbERELDREQUE2QztBQVM3QyxTQUFTLGVBQWUsQ0FBQyxHQUE0QixFQUFFLFFBQWlCO0lBQ3RFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDN0QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQ3RDLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLENBQVMsRUFDVCxXQUF3QyxFQUN4QyxRQUFRLEdBQUcsSUFBSTtJQUVmLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IsTUFBTSxDQUFDLHVEQUF1RCxXQUFXLENBQUMsTUFBTSxzQkFBc0IsQ0FDdkcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsUUFBUSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQXVCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRyxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSTtZQUNQLE9BQU8scUJBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2QyxLQUFLLFFBQVE7WUFDWCxPQUFPLHFCQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxLQUFLLEtBQUs7WUFDUixPQUFPLHFCQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLW1pbmlzY3JpcHQnO1xuXG4vKipcbiAqIFNjcmlwdCB0eXBlIGZvciBhIGRlc2NyaXB0b3IuXG4gKlxuICogU2VlIGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNwMnNocDJ3c2gtb3V0cHV0XG4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdFR5cGUgPSAnc2gnIHwgJ3NoLXdzaCcgfCAnd3NoJztcblxuZnVuY3Rpb24gYXNEZXNjcmlwdG9yS2V5KGtleTogQklQMzJJbnRlcmZhY2UgfCBCdWZmZXIsIG5ldXRlcmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIChuZXV0ZXJlZCA/IGtleS5uZXV0ZXJlZCgpIDoga2V5KS50b0Jhc2U1OCgpICsgJy8qJztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtdWx0aS1zaWcgZGVzY3JpcHRvciB0byBwcm9kdWNlIGEgY29yZWRhbyBzdGFraW5nIGFkZHJlc3NcbiAqIEBwYXJhbSBzY3JpcHRUeXBlIHNlZ3dpdCBvciBsZWdhY3lcbiAqIEBwYXJhbSBsb2NrdGltZSBsb2NrdGltZSBmb3IgQ0xUVlxuICogQHBhcmFtIG0gVG90YWwgbnVtYmVyIG9mIGtleXMgcmVxdWlyZWQgdG8gdW5sb2NrXG4gKiBAcGFyYW0gb3JkZXJlZEtleXMgSWYgQmlwMzJJbnRlcmZhY2VzLCB0aGVzZSBhcmUgeHBydnMgb3IgeHB1YnMgYW5kIGFyZSBkZXJpdmFibGUuXG4gKiAgICAgICAgICAgICAgICAgICAgSWYgdGhleSBhcmUgYnVmZmVycywgdGhlbiB0aGV5IGFyZSBwdWIvcHJ2IGtleXMgYW5kIGFyZSBub3QgZGVyaXZhYmxlLlxuICogQHBhcmFtIG5ldXRlcmVkIElmIHRydWUsIG5ldXRlciB0aGUga2V5cy4gRGVmYXVsdCB0byB0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdWx0aVNpZ0Rlc2NyaXB0b3IoXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUsXG4gIGxvY2t0aW1lOiBudW1iZXIsXG4gIG06IG51bWJlcixcbiAgb3JkZXJlZEtleXM6IChCSVAzMkludGVyZmFjZSB8IEJ1ZmZlcilbXSxcbiAgbmV1dGVyZWQgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBpZiAobSA+IG9yZGVyZWRLZXlzLmxlbmd0aCB8fCBtIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtICgke219KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGtleXMgKCR7b3JkZXJlZEtleXMubGVuZ3RofSkgYW5kIGdyZWF0ZXIgdGhhbiAwYFxuICAgICk7XG4gIH1cbiAgaWYgKGxvY2t0aW1lIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvY2t0aW1lICgke2xvY2t0aW1lfSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMGApO1xuICB9XG4gIGNvbnN0IGtleXMgPSBvcmRlcmVkS2V5cy5tYXAoKGtleSkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgbmV1dGVyZWQpKTtcbiAgY29uc3QgaW5uZXI6IGFzdC5NaW5pc2NyaXB0Tm9kZSA9IHsgYW5kX3Y6IFt7ICdyOmFmdGVyJzogbG9ja3RpbWUgfSwgeyBtdWx0aTogW20sIC4uLmtleXNdIH1dIH07XG4gIHN3aXRjaCAoc2NyaXB0VHlwZSkge1xuICAgIGNhc2UgJ3NoJzpcbiAgICAgIHJldHVybiBhc3QuZm9ybWF0Tm9kZSh7IHNoOiBpbm5lciB9KTtcbiAgICBjYXNlICdzaC13c2gnOlxuICAgICAgcmV0dXJuIGFzdC5mb3JtYXROb2RlKHsgc2g6IHsgd3NoOiBpbm5lciB9IH0pO1xuICAgIGNhc2UgJ3dzaCc6XG4gICAgICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyB3c2g6IGlubmVyIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -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"}
|
|
@@ -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("./opReturn"), exports);
|
|
18
|
+
__exportStar(require("./descriptor"), exports);
|
|
19
|
+
__exportStar(require("./transaction"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLCtDQUE2QjtBQUM3QixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL29wUmV0dXJuJztcbmV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zYWN0aW9uJztcbiJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare const CORE_DAO_DEVNET_CHAIN_ID: Buffer<ArrayBuffer>;
|
|
2
|
+
export declare const CORE_DAO_TESTNET2_CHAIN_ID: Buffer<ArrayBuffer>;
|
|
3
|
+
export declare const CORE_DAO_TESTNET_CHAIN_ID: Buffer<ArrayBuffer>;
|
|
4
|
+
export declare const CORE_DAO_MAINNET_CHAIN_ID: Buffer<ArrayBuffer>;
|
|
5
|
+
export declare const CORE_DAO_SATOSHI_PLUS_IDENTIFIER: Buffer<ArrayBuffer>;
|
|
6
|
+
export declare function encodeTimelock(timelock: number): Buffer;
|
|
7
|
+
export declare function decodeTimelock(buffer: Buffer): number;
|
|
8
|
+
type BaseParams = {
|
|
9
|
+
version: number;
|
|
10
|
+
chainId: Buffer;
|
|
11
|
+
delegator: Buffer;
|
|
12
|
+
validator: Buffer;
|
|
13
|
+
fee: number;
|
|
14
|
+
};
|
|
15
|
+
export type OpReturnParams = BaseParams & ({
|
|
16
|
+
redeemScript: Buffer;
|
|
17
|
+
} | {
|
|
18
|
+
timelock: number;
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Create a CoreDAO OP_RETURN output script
|
|
22
|
+
*
|
|
23
|
+
* @param version Version of the OP_RETURN
|
|
24
|
+
* @param chainId Chain ID
|
|
25
|
+
* @param delegator Delegator address
|
|
26
|
+
* @param validator Validator address
|
|
27
|
+
* @param fee Fee for relayer
|
|
28
|
+
* @param redeemScript Redeem script of the staking output
|
|
29
|
+
* @param timelock Timelock for the staking output
|
|
30
|
+
* @returns Buffer OP_RETURN buffer
|
|
31
|
+
*/
|
|
32
|
+
export declare function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }: OpReturnParams): Buffer;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a CoreDAO OP_RETURN output script into the constituent parts
|
|
35
|
+
* @param script
|
|
36
|
+
* @returns OpReturnParams
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseCoreDaoOpReturnOutputScript(script: Buffer): OpReturnParams;
|
|
39
|
+
export declare function toString(params: OpReturnParams): string;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=opReturn.d.ts.map
|
|
@@ -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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSx3Q0FJQztBQUVELHdDQUtDO0FBd0JELDhFQThGQztBQU9ELDRFQWtFQztBQUVELDRCQVVDO0FBak9ELG1EQUEwRDtBQUUxRCwwRUFBMEU7QUFDN0QsUUFBQSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxRQUFBLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWM7SUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQVlEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsRUFDaEQsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLElBQUksRUFDUTtJQUNmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFDRSxDQUFDLENBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQ0FBeUIsQ0FBQztRQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLGtDQUEwQixDQUFDO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUNBQXlCLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQ0FBd0IsQ0FBQyxDQUN6QyxFQUNELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUV2QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHlDQUF5QztJQUN6Qyw4REFBOEQ7SUFDOUQsTUFBTSxjQUFjLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3pCLHdDQUFnQztRQUNoQyxhQUFhO1FBQ2IsT0FBTztRQUNQLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULGtCQUFrQjtRQUNsQixjQUFjO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxLQUFLLENBQUM7UUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ1osT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0NBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1CQUFRLENBQUMsT0FBTztLQUN4RixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQUMsTUFBYztJQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLG1CQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsNkJBQTZCO0lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHdDQUFnQyxDQUFDLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixpQkFBaUI7SUFDakIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixpQkFBaUI7SUFDakIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxJQUNFLENBQUMsQ0FDQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdDQUF3QixDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUNBQXlCLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQ0FBMEIsQ0FBQztRQUMxQyxPQUFPLENBQUMsTUFBTSxDQUFDLGlDQUF5QixDQUFDLENBQzFDLEVBQ0QsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isb0JBQW9CLE9BQU8sQ0FBQyxRQUFRLENBQ2xDLEtBQUssQ0FDTiwwRUFBMEUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosbUJBQW1CO0lBQ25CLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUViLG1CQUFtQjtJQUNuQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFYixhQUFhO0lBQ2IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixNQUFNLFVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVuRSxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLEVBQUUsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUFzQjtJQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDdkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztRQUNmLEdBQUcsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUYsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXltZW50cywgbmV0d29ya3MgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbi8vIFNvdXJjZTogaHR0cHM6Ly9kb2NzLmNvcmVkYW8ub3JnL2RvY3MvTGVhcm4vcHJvZHVjdHMvYnRjLXN0YWtpbmcvZGVzaWduXG5leHBvcnQgY29uc3QgQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NTgnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fVEVTVE5FVDJfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YScsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWInLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fTUFJTk5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDVjJywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSID0gQnVmZmVyLmZyb20oJzUzNDE1NDJiJywgJ2hleCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iLzU5NjFiMjM4OThlZTdjMGFmMjYyNmM0NmQ1ZDcwZTgwMTM2NTc4ZDMvc3JjL3NjcmlwdC9zY3JpcHQuaCNMNDdcbmNvbnN0IE9QX1JFVFVSTl9JREVOVElGSUVSID0gQnVmZmVyLmZyb20oJzZhJywgJ2hleCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVGltZWxvY2sodGltZWxvY2s6IG51bWJlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuYWxsb2MoNCk7XG4gIGJ1ZmYud3JpdGVVSW50MzJMRSh0aW1lbG9jayk7XG4gIHJldHVybiBidWZmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVGltZWxvY2soYnVmZmVyOiBCdWZmZXIpOiBudW1iZXIge1xuICBpZiAoYnVmZmVyLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lbG9jayBidWZmZXIgbGVuZ3RoJyk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5yZWFkVUludDMyTEUoKTtcbn1cblxudHlwZSBCYXNlUGFyYW1zID0ge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGNoYWluSWQ6IEJ1ZmZlcjtcbiAgZGVsZWdhdG9yOiBCdWZmZXI7XG4gIHZhbGlkYXRvcjogQnVmZmVyO1xuICBmZWU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE9wUmV0dXJuUGFyYW1zID0gQmFzZVBhcmFtcyAmICh7IHJlZGVlbVNjcmlwdDogQnVmZmVyIH0gfCB7IHRpbWVsb2NrOiBudW1iZXIgfSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29yZURBTyBPUF9SRVRVUk4gb3V0cHV0IHNjcmlwdFxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIFZlcnNpb24gb2YgdGhlIE9QX1JFVFVSTlxuICogQHBhcmFtIGNoYWluSWQgQ2hhaW4gSURcbiAqIEBwYXJhbSBkZWxlZ2F0b3IgRGVsZWdhdG9yIGFkZHJlc3NcbiAqIEBwYXJhbSB2YWxpZGF0b3IgVmFsaWRhdG9yIGFkZHJlc3NcbiAqIEBwYXJhbSBmZWUgRmVlIGZvciByZWxheWVyXG4gKiBAcGFyYW0gcmVkZWVtU2NyaXB0IFJlZGVlbSBzY3JpcHQgb2YgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcGFyYW0gdGltZWxvY2sgVGltZWxvY2sgZm9yIHRoZSBzdGFraW5nIG91dHB1dFxuICogQHJldHVybnMgQnVmZmVyIE9QX1JFVFVSTiBidWZmZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gIHZlcnNpb24sXG4gIGNoYWluSWQsXG4gIGRlbGVnYXRvcixcbiAgdmFsaWRhdG9yLFxuICBmZWUsXG4gIC4uLnJlc3Rcbn06IE9wUmV0dXJuUGFyYW1zKTogQnVmZmVyIHtcbiAgLyoqXG4gICAqIEFzIG9mIHYyLCB0aGlzIGlzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIE9QX1JFVFVSTjpcbiAgICogU291cmNlOiBodHRwczovL2RvY3MuY29yZWRhby5vcmcvZG9jcy9MZWFybi9wcm9kdWN0cy9idGMtc3Rha2luZy9kZXNpZ24jb3BfcmV0dXJuLW91dHB1dFxuICAgKlxuICAgKiBUaGUgT1BfUkVUVVJOIG91dHB1dCBzaG91bGQgY29udGFpbiBhbGwgc3Rha2luZyBpbmZvcm1hdGlvbiBpbiBvcmRlciwgYW5kIGJlIGNvbXBvc2VkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKlxuICAgKiBTYXRvc2hpIFBsdXMgSWRlbnRpZmllcjogKFNBVCspIDQgYnl0ZXNcbiAgICogVmVyc2lvbjogKDB4MDEpIDEgYnl0ZVxuICAgKiBDaGFpbiBJRDogKDB4MDQ1YiAoMTExNSkgZm9yIENvcmUgVGVzdG5ldCBhbmQgMHgwNDVjICgxMTE2KSBmb3IgQ29yZSBNYWlubmV0KSAyIGJ5dGVzXG4gICAqIERlbGVnYXRvcjogVGhlIENvcmUgYWRkcmVzcyB0byByZWNlaXZlIHJld2FyZHMsIDIwIGJ5dGVzXG4gICAqIFZhbGlkYXRvcjogVGhlIENvcmUgdmFsaWRhdG9yIGFkZHJlc3MgdG8gc3Rha2UgdG8sIDIwIGJ5dGVzXG4gICAqIEZlZTogRmVlIGZvciByZWxheWVyLCAxIGJ5dGUsIHJhbmdlIFswLDI1NV0sIG1lYXN1cmVkIGluIENPUkVcbiAgICogKE9wdGlvbmFsKSBSZWRlZW1TY3JpcHRcbiAgICogKE9wdGlvbmFsKSBUaW1lbG9jazogNCBieXRlc1xuICAgKlxuICAgKiBFaXRoZXIgUmVkZWVtU2NyaXB0IG9yIFRpbWVsb2NrIG11c3QgYmUgYXZhaWxhYmxlLCB0aGUgcHVycG9zZSBpcyB0byBhbGxvdyByZWxheWVyIHRvXG4gICAqIG9idGFpbiB0aGUgUmVkZWVtU2NyaXB0IGFuZCBzdWJtaXQgdHJhbnNhY3Rpb25zIG9uIENvcmUuIElmIGEgUmVkZWVtU2NyaXB0IGlzIHByb3ZpZGVkLFxuICAgKiByZWxheWVyIHdpbGwgdXNlIGl0IGRpcmVjdGx5LiBPdGhlcndpc2UsIHJlbGF5ZXIgd2lsbCBjb25zdHJ1Y3QgdGhlIHJlZGVlbSBzY3JpcHQgYmFzZWRcbiAgICogb24gdGhlIHRpbWVsb2NrIGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRyYW5zYWN0aW9uIGlucHV0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IGFueSBsZW5ndGggPiA4MCBieXRlcyB3b250IGJlIHJlbGF5ZWQgYnkgbm9kZXMgYW5kIHRoZXJlZm9yZSB3ZSB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKi9cbiAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiAyNTUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmVyc2lvbiAtIG91dCBvZiByYW5nZScpO1xuICB9XG4gIGNvbnN0IHZlcnNpb25CdWZmZXIgPSBCdWZmZXIuYWxsb2MoMSwgdmVyc2lvbik7XG5cbiAgaWYgKFxuICAgICEoXG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVDJfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoYWluIElEJyk7XG4gIH1cblxuICBpZiAoZGVsZWdhdG9yLmxlbmd0aCAhPT0gMjApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVsZWdhdG9yIGFkZHJlc3MnKTtcbiAgfVxuXG4gIGlmICh2YWxpZGF0b3IubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWxpZGF0b3IgYWRkcmVzcycpO1xuICB9XG5cbiAgaWYgKGZlZSA8IDAgfHwgZmVlID4gMjU1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZlZSAtIG91dCBvZiByYW5nZScpO1xuICB9XG4gIGNvbnN0IGZlZUJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxLCBmZWUpO1xuXG4gIGlmIChmZWVCdWZmZXIubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZlZScpO1xuICB9XG5cbiAgY29uc3QgcmVkZWVtU2NyaXB0QnVmZmVyID0gJ3JlZGVlbVNjcmlwdCcgaW4gcmVzdCA/IHJlc3QucmVkZWVtU2NyaXB0IDogQnVmZmVyLmZyb20oW10pO1xuICBpZiAoJ3RpbWVsb2NrJyBpbiByZXN0ICYmIChyZXN0LnRpbWVsb2NrIDwgMCB8fCByZXN0LnRpbWVsb2NrID4gNDI5NDk2NzI5NSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZWxvY2sgLSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuXG4gIC8vIGVuY29kZSB0aGUgbnVtYmVyIGludG8gYSA0LWJ5dGUgYnVmZmVyXG4gIC8vIGlmIHRpbWVsb2NrIGlzIHByb3ZpZGVkLCB3cml0ZSBpdCBpbnRvIDMyLWJpdCBsaXR0bGUtZW5kaWFuXG4gIGNvbnN0IHRpbWVsb2NrQnVmZmVyID0gJ3RpbWVsb2NrJyBpbiByZXN0ID8gZW5jb2RlVGltZWxvY2socmVzdC50aW1lbG9jaykgOiBCdWZmZXIuZnJvbShbXSk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUixcbiAgICB2ZXJzaW9uQnVmZmVyLFxuICAgIGNoYWluSWQsXG4gICAgZGVsZWdhdG9yLFxuICAgIHZhbGlkYXRvcixcbiAgICBmZWVCdWZmZXIsXG4gICAgcmVkZWVtU2NyaXB0QnVmZmVyLFxuICAgIHRpbWVsb2NrQnVmZmVyLFxuICBdKTtcbiAgaWYgKGRhdGEubGVuZ3RoID4gODApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09QX1JFVFVSTiBvdXRwdXRzIGNhbm5vdCBoYXZlIGEgbGVuZ3RoIGxhcmdlciB0aGFuIDgwIGJ5dGVzJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50ID0gcGF5bWVudHMuZW1iZWQoe1xuICAgIGRhdGE6IFtkYXRhXSxcbiAgICBuZXR3b3JrOiBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19ERVZORVRfQ0hBSU5fSUQpID8gbmV0d29ya3MudGVzdG5ldCA6IG5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pO1xuICBpZiAoIXBheW1lbnQub3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gY3JlYXRlIE9QX1JFVFVSTiBvdXRwdXQnKTtcbiAgfVxuXG4gIHJldHVybiBwYXltZW50Lm91dHB1dDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHQgaW50byB0aGUgY29uc3RpdHVlbnQgcGFydHNcbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zIE9wUmV0dXJuUGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IE9wUmV0dXJuUGFyYW1zIHtcbiAgaWYgKCFzY3JpcHQuc3ViYXJyYXkoMCwgMSkuZXF1YWxzKE9QX1JFVFVSTl9JREVOVElGSUVSKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYnl0ZSBtdXN0IGJlIGFuIE9QX1JFVFVSTicpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLmVtYmVkKHtcbiAgICBvdXRwdXQ6IHNjcmlwdCxcbiAgfSk7XG4gIGNvbnN0IGRhdGEgPSBwYXltZW50LmRhdGE7XG4gIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBPUF9SRVRVUk4gb3V0cHV0Jyk7XG4gIH1cbiAgY29uc3QgZGF0YUJ1ZmZlciA9IGRhdGFbMF07XG4gIGlmIChkYXRhQnVmZmVyLmxlbmd0aCA+IDgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPUF9SRVRVUk4gb3V0cHV0cyBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBsYXJnZXIgdGhhbiA4MCBieXRlc2ApO1xuICB9XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIC8vIERlY29kZSBzYXRvc2hpKyBpZGVudGlmaWVyXG4gIGlmICghZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDQpLmVxdWFscyhDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2F0b3NoaSsgaWRlbnRpZmllcicpO1xuICB9XG4gIG9mZnNldCArPSA0O1xuXG4gIC8vIERlY29kZSB2ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIC8vIERlY29kZSBjaGFpbklkXG4gIGNvbnN0IGNoYWluSWQgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMikpO1xuICBpZiAoXG4gICAgIShcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUMl9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQpXG4gICAgKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBDaGFpbklEOiAke2NoYWluSWQudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApfS4gTXVzdCBiZSBlaXRoZXIgMHgwNDU4IChkZXZuZXQpLCAweDA0NWIgKHRlc3RuZXQpLCBvciAweDA0NWMgKG1haW5uZXQpLmBcbiAgICApO1xuICB9XG4gIG9mZnNldCArPSAyO1xuXG4gIC8vIERlY29kZSBkZWxlZ2F0b3JcbiAgY29uc3QgZGVsZWdhdG9yID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIwKSk7XG4gIG9mZnNldCArPSAyMDtcblxuICAvLyBEZWNvZGUgdmFsaWRhdG9yXG4gIGNvbnN0IHZhbGlkYXRvciA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyMCkpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gRGVjb2RlIGZlZVxuICBjb25zdCBmZWUgPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIGNvbnN0IGJhc2VQYXJhbXMgPSB7IHZlcnNpb24sIGNoYWluSWQsIGRlbGVnYXRvciwgdmFsaWRhdG9yLCBmZWUgfTtcblxuICAvLyBEZWNvZGUgcmVkZWVtU2NyaXB0IG9yIHRpbWVsb2NrXG4gIGlmIChvZmZzZXQgPT09IGRhdGFCdWZmZXIubGVuZ3RoIC0gNCkge1xuICAgIHJldHVybiB7IC4uLmJhc2VQYXJhbXMsIHRpbWVsb2NrOiBkZWNvZGVUaW1lbG9jayhkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZVBhcmFtcywgcmVkZWVtU2NyaXB0OiBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHBhcmFtczogT3BSZXR1cm5QYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uLFxuICAgIGNoYWluSWQ6IHBhcmFtcy5jaGFpbklkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBkZWxlZ2F0b3I6IHBhcmFtcy5kZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpLFxuICAgIHZhbGlkYXRvcjogcGFyYW1zLnZhbGlkYXRvci50b1N0cmluZygnaGV4JyksXG4gICAgZmVlOiBwYXJhbXMuZmVlLFxuICAgIC4uLigncmVkZWVtU2NyaXB0JyBpbiBwYXJhbXMgPyB7IHJlZGVlbVNjcmlwdDogcGFyYW1zLnJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JykgfSA6IHt9KSxcbiAgICAuLi4oJ3RpbWVsb2NrJyBpbiBwYXJhbXMgPyB7IHRpbWVsb2NrOiBwYXJhbXMudGltZWxvY2sgfSA6IHt9KSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Output } from '@bitgo-beta/utxo-core';
|
|
2
|
+
import { Descriptor } from '@bitgo/wasm-miniscript';
|
|
3
|
+
import { OpReturnParams } from './opReturn';
|
|
4
|
+
type StakingParams = {
|
|
5
|
+
amount: bigint;
|
|
6
|
+
descriptor: Descriptor;
|
|
7
|
+
index?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Create the staking outputs for a CoreDAO staking transaction. This is the ordering
|
|
11
|
+
* in which to add into the transaction.
|
|
12
|
+
* @param stakingParams how to create the timelocked stake output
|
|
13
|
+
* @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
|
|
14
|
+
* If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
|
|
15
|
+
* @param opReturnParams to create the OP_RETURN output
|
|
16
|
+
*/
|
|
17
|
+
export declare function createStakingOutputsCore(stakingParams: StakingParams, opReturnParams: OpReturnParams): Output<bigint>[];
|
|
18
|
+
type LegacyOutput = {
|
|
19
|
+
script: Buffer;
|
|
20
|
+
amount: bigint;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @see createStakingOutputsCore
|
|
24
|
+
* @deprecated - use createStakingOutputsCore instead
|
|
25
|
+
*/
|
|
26
|
+
export declare function createStakingOutputs(stakingParams: StakingParams, opReturnParams: OpReturnParams): LegacyOutput[];
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/coreDao/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSw0REFtQkM7QUFXRCxvREFFQztBQWhERCx5Q0FBK0U7QUFRL0U7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxhQUE0QixFQUM1QixjQUE4QjtJQUU5QixJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUztRQUMvQixDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUU7UUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUNuRixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBQSw0Q0FBaUMsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUV6RSxPQUFPO1FBQ0wsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3JELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBT0Q7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsYUFBNEIsRUFBRSxjQUE4QjtJQUMvRixPQUFPLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNySCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlJztcbmltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LCBPcFJldHVyblBhcmFtcyB9IGZyb20gJy4vb3BSZXR1cm4nO1xuXG50eXBlIFN0YWtpbmdQYXJhbXMgPSB7XG4gIGFtb3VudDogYmlnaW50O1xuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yO1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBzdGFraW5nIG91dHB1dHMgZm9yIGEgQ29yZURBTyBzdGFraW5nIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHRoZSBvcmRlcmluZ1xuICogaW4gd2hpY2ggdG8gYWRkIGludG8gdGhlIHRyYW5zYWN0aW9uLlxuICogQHBhcmFtIHN0YWtpbmdQYXJhbXMgaG93IHRvIGNyZWF0ZSB0aGUgdGltZWxvY2tlZCBzdGFrZSBvdXRwdXRcbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3IgaWYgc3Rha2luZ1BhcmFtcy5pbmRleCBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlZmluaXRlYCBkZXNjcmlwdG9yLlxuICogSWYgc3Rha2luZ1BhcmFtcy5pbmRleCBpcyBwcm92aWRlZCwgdGhlbiB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgYSBgZGVyaXZhYmxlYCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIG9wUmV0dXJuUGFyYW1zIHRvIGNyZWF0ZSB0aGUgT1BfUkVUVVJOIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Rha2luZ091dHB1dHNDb3JlKFxuICBzdGFraW5nUGFyYW1zOiBTdGFraW5nUGFyYW1zLFxuICBvcFJldHVyblBhcmFtczogT3BSZXR1cm5QYXJhbXNcbik6IE91dHB1dDxiaWdpbnQ+W10ge1xuICBpZiAoc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmhhc1dpbGRjYXJkKCkgJiYgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHN0YWtpbmcgb3V0cHV0cyB3aXRoIGEgd2lsZGNhcmQgZGVzY3JpcHRvciBhbmQgbm8gZGVyaXZhdGlvbiBpbmRleCcpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NyaXB0ID0gQnVmZmVyLmZyb20oXG4gICAgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKVxuICAgICAgOiBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoc3Rha2luZ1BhcmFtcy5pbmRleCkuc2NyaXB0UHVia2V5KClcbiAgKTtcbiAgY29uc3Qgb3BSZXR1cm5TY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQob3BSZXR1cm5QYXJhbXMpO1xuXG4gIHJldHVybiBbXG4gICAgeyBzY3JpcHQ6IG91dHB1dFNjcmlwdCwgdmFsdWU6IHN0YWtpbmdQYXJhbXMuYW1vdW50IH0sXG4gICAgeyBzY3JpcHQ6IG9wUmV0dXJuU2NyaXB0LCB2YWx1ZTogQmlnSW50KDApIH0sXG4gIF07XG59XG5cbnR5cGUgTGVnYWN5T3V0cHV0ID0ge1xuICBzY3JpcHQ6IEJ1ZmZlcjtcbiAgYW1vdW50OiBiaWdpbnQ7XG59O1xuXG4vKipcbiAqIEBzZWUgY3JlYXRlU3Rha2luZ091dHB1dHNDb3JlXG4gKiBAZGVwcmVjYXRlZCAtIHVzZSBjcmVhdGVTdGFraW5nT3V0cHV0c0NvcmUgaW5zdGVhZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Rha2luZ091dHB1dHMoc3Rha2luZ1BhcmFtczogU3Rha2luZ1BhcmFtcywgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zKTogTGVnYWN5T3V0cHV0W10ge1xuICByZXR1cm4gY3JlYXRlU3Rha2luZ091dHB1dHNDb3JlKHN0YWtpbmdQYXJhbXMsIG9wUmV0dXJuUGFyYW1zKS5tYXAoKHsgdmFsdWUsIC4uLm8gfSkgPT4gKHsgLi4ubywgYW1vdW50OiB2YWx1ZSB9KSk7XG59XG4iXX0=
|
|
@@ -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"}
|