@bitgo/utxo-staking 1.25.0 → 1.27.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.
Files changed (136) hide show
  1. package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
  2. package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
  3. package/dist/cjs/scripts/babylon-sync.js +126 -0
  4. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  5. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  6. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  7. package/dist/cjs/src/babylon/descriptor.js +97 -0
  8. package/dist/{src → cjs/src}/babylon/index.d.ts +2 -0
  9. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  10. package/dist/{src → cjs/src}/babylon/index.js +3 -1
  11. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  12. package/dist/{src → cjs/src}/babylon/network.js +1 -1
  13. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  14. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  15. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  16. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  17. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  18. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  19. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  20. package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
  21. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  22. package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
  23. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  24. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  25. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  26. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  27. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  28. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  29. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  30. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  31. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  32. package/dist/cjs/src/coreDao/transaction.js +34 -0
  33. package/dist/cjs/src/index.d.ts.map +1 -0
  34. package/dist/{src → cjs/src}/index.js +1 -1
  35. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  36. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  37. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  38. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  39. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  40. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  41. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  42. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  43. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  44. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  45. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  46. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  47. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  48. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  49. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  50. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  51. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  52. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  53. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  54. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  55. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  56. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  57. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  58. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  59. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  60. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  61. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  62. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  63. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  64. package/dist/esm/babylon/delegationMessage.js +239 -0
  65. package/dist/esm/babylon/descriptor.d.ts +48 -0
  66. package/dist/esm/babylon/descriptor.js +91 -0
  67. package/dist/esm/babylon/index.d.ts +8 -0
  68. package/dist/esm/babylon/index.d.ts.map +1 -0
  69. package/dist/esm/babylon/index.js +13 -0
  70. package/dist/esm/babylon/network.d.ts +7 -0
  71. package/dist/esm/babylon/network.js +29 -0
  72. package/dist/esm/babylon/params.mainnet.json +152 -0
  73. package/dist/esm/babylon/params.testnet.json +212 -0
  74. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  75. package/dist/esm/babylon/parseDescriptor.js +155 -0
  76. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  77. package/dist/esm/babylon/stakingManager.js +83 -0
  78. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  79. package/dist/esm/babylon/stakingParams.js +86 -0
  80. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  81. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  82. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  83. package/dist/esm/babylon/undelegation/index.js +3 -0
  84. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  85. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  86. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  87. package/dist/esm/coreDao/descriptor.js +35 -0
  88. package/dist/esm/coreDao/index.d.ts +4 -0
  89. package/dist/esm/coreDao/index.js +4 -0
  90. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  91. package/dist/esm/coreDao/opReturn.js +175 -0
  92. package/dist/esm/coreDao/transaction.d.ts +28 -0
  93. package/dist/esm/coreDao/transaction.js +30 -0
  94. package/dist/esm/index.d.ts +3 -0
  95. package/dist/esm/index.js +3 -0
  96. package/package.json +26 -10
  97. package/dist/src/babylon/delegationMessage.js +0 -285
  98. package/dist/src/babylon/descriptor.js +0 -97
  99. package/dist/src/babylon/index.d.ts.map +0 -1
  100. package/dist/src/babylon/parseDescriptor.js +0 -159
  101. package/dist/src/babylon/stakingManager.js +0 -120
  102. package/dist/src/babylon/stakingParams.js +0 -132
  103. package/dist/src/babylon/undelegation/unbonding.js +0 -111
  104. package/dist/src/coreDao/descriptor.js +0 -38
  105. package/dist/src/coreDao/opReturn.js +0 -183
  106. package/dist/src/coreDao/transaction.js +0 -34
  107. /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
  108. /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
  109. /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
  110. /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
  111. /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
  112. /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
  113. /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
  114. /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
  115. /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
  116. /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
  117. /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
  118. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  119. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  120. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  121. /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
  122. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  123. /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
  124. /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
  125. /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
  126. /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
  127. /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
  128. /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
  129. /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
  130. /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
  131. /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
  132. /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
  133. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  134. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
  135. /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
  136. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLCtDQUE2QjtBQUM3QixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL29wUmV0dXJuJztcbmV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zYWN0aW9uJztcbiJdfQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSx3Q0FJQztBQUVELHdDQUtDO0FBd0JELDhFQThGQztBQU9ELDRFQWtFQztBQUVELDRCQVVDO0FBak9ELDhDQUFxRDtBQUVyRCwwRUFBMEU7QUFDN0QsUUFBQSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxRQUFBLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWM7SUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQVlEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsRUFDaEQsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLElBQUksRUFDUTtJQUNmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQkc7SUFDSCxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFDRSxDQUFDLENBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQ0FBeUIsQ0FBQztRQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLGtDQUEwQixDQUFDO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUNBQXlCLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQ0FBd0IsQ0FBQyxDQUN6QyxFQUNELENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUV2QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHlDQUF5QztJQUN6Qyw4REFBOEQ7SUFDOUQsTUFBTSxjQUFjLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3pCLHdDQUFnQztRQUNoQyxhQUFhO1FBQ2IsT0FBTztRQUNQLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULGtCQUFrQjtRQUNsQixjQUFjO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxLQUFLLENBQUM7UUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ1osT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0NBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1CQUFRLENBQUMsT0FBTztLQUN4RixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQUMsTUFBYztJQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLG1CQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsNkJBQTZCO0lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHdDQUFnQyxDQUFDLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixpQkFBaUI7SUFDakIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixpQkFBaUI7SUFDakIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxJQUNFLENBQUMsQ0FDQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdDQUF3QixDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUNBQXlCLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQ0FBMEIsQ0FBQztRQUMxQyxPQUFPLENBQUMsTUFBTSxDQUFDLGlDQUF5QixDQUFDLENBQzFDLEVBQ0QsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isb0JBQW9CLE9BQU8sQ0FBQyxRQUFRLENBQ2xDLEtBQUssQ0FDTiwwRUFBMEUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLElBQUksQ0FBQyxDQUFDO0lBRVosbUJBQW1CO0lBQ25CLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUViLG1CQUFtQjtJQUNuQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFYixhQUFhO0lBQ2IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFFWixNQUFNLFVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVuRSxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLEVBQUUsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxHQUFHLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUFzQjtJQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDdkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztRQUNmLEdBQUcsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUYsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXltZW50cywgbmV0d29ya3MgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG4vLyBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnblxuZXhwb3J0IGNvbnN0IENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDU4JywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX1RFU1RORVQyX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWEnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fVEVTVE5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDViJywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YycsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUiA9IEJ1ZmZlci5mcm9tKCc1MzQxNTQyYicsICdoZXgnKTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpdGNvaW4vYmxvYi81OTYxYjIzODk4ZWU3YzBhZjI2MjZjNDZkNWQ3MGU4MDEzNjU3OGQzL3NyYy9zY3JpcHQvc2NyaXB0LmgjTDQ3XG5jb25zdCBPUF9SRVRVUk5fSURFTlRJRklFUiA9IEJ1ZmZlci5mcm9tKCc2YScsICdoZXgnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVRpbWVsb2NrKHRpbWVsb2NrOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBidWZmID0gQnVmZmVyLmFsbG9jKDQpO1xuICBidWZmLndyaXRlVUludDMyTEUodGltZWxvY2spO1xuICByZXR1cm4gYnVmZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRpbWVsb2NrKGJ1ZmZlcjogQnVmZmVyKTogbnVtYmVyIHtcbiAgaWYgKGJ1ZmZlci5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZWxvY2sgYnVmZmVyIGxlbmd0aCcpO1xuICB9XG4gIHJldHVybiBidWZmZXIucmVhZFVJbnQzMkxFKCk7XG59XG5cbnR5cGUgQmFzZVBhcmFtcyA9IHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBjaGFpbklkOiBCdWZmZXI7XG4gIGRlbGVnYXRvcjogQnVmZmVyO1xuICB2YWxpZGF0b3I6IEJ1ZmZlcjtcbiAgZmVlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcFJldHVyblBhcmFtcyA9IEJhc2VQYXJhbXMgJiAoeyByZWRlZW1TY3JpcHQ6IEJ1ZmZlciB9IHwgeyB0aW1lbG9jazogbnVtYmVyIH0pO1xuXG4vKipcbiAqIENyZWF0ZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHRcbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uIG9mIHRoZSBPUF9SRVRVUk5cbiAqIEBwYXJhbSBjaGFpbklkIENoYWluIElEXG4gKiBAcGFyYW0gZGVsZWdhdG9yIERlbGVnYXRvciBhZGRyZXNzXG4gKiBAcGFyYW0gdmFsaWRhdG9yIFZhbGlkYXRvciBhZGRyZXNzXG4gKiBAcGFyYW0gZmVlIEZlZSBmb3IgcmVsYXllclxuICogQHBhcmFtIHJlZGVlbVNjcmlwdCBSZWRlZW0gc2NyaXB0IG9mIHRoZSBzdGFraW5nIG91dHB1dFxuICogQHBhcmFtIHRpbWVsb2NrIFRpbWVsb2NrIGZvciB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEByZXR1cm5zIEJ1ZmZlciBPUF9SRVRVUk4gYnVmZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQoe1xuICB2ZXJzaW9uLFxuICBjaGFpbklkLFxuICBkZWxlZ2F0b3IsXG4gIHZhbGlkYXRvcixcbiAgZmVlLFxuICAuLi5yZXN0XG59OiBPcFJldHVyblBhcmFtcyk6IEJ1ZmZlciB7XG4gIC8qKlxuICAgKiBBcyBvZiB2MiwgdGhpcyBpcyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBPUF9SRVRVUk46XG4gICAqIFNvdXJjZTogaHR0cHM6Ly9kb2NzLmNvcmVkYW8ub3JnL2RvY3MvTGVhcm4vcHJvZHVjdHMvYnRjLXN0YWtpbmcvZGVzaWduI29wX3JldHVybi1vdXRwdXRcbiAgICpcbiAgICogVGhlIE9QX1JFVFVSTiBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gYWxsIHN0YWtpbmcgaW5mb3JtYXRpb24gaW4gb3JkZXIsIGFuZCBiZSBjb21wb3NlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICpcbiAgICogU2F0b3NoaSBQbHVzIElkZW50aWZpZXI6IChTQVQrKSA0IGJ5dGVzXG4gICAqIFZlcnNpb246ICgweDAxKSAxIGJ5dGVcbiAgICogQ2hhaW4gSUQ6ICgweDA0NWIgKDExMTUpIGZvciBDb3JlIFRlc3RuZXQgYW5kIDB4MDQ1YyAoMTExNikgZm9yIENvcmUgTWFpbm5ldCkgMiBieXRlc1xuICAgKiBEZWxlZ2F0b3I6IFRoZSBDb3JlIGFkZHJlc3MgdG8gcmVjZWl2ZSByZXdhcmRzLCAyMCBieXRlc1xuICAgKiBWYWxpZGF0b3I6IFRoZSBDb3JlIHZhbGlkYXRvciBhZGRyZXNzIHRvIHN0YWtlIHRvLCAyMCBieXRlc1xuICAgKiBGZWU6IEZlZSBmb3IgcmVsYXllciwgMSBieXRlLCByYW5nZSBbMCwyNTVdLCBtZWFzdXJlZCBpbiBDT1JFXG4gICAqIChPcHRpb25hbCkgUmVkZWVtU2NyaXB0XG4gICAqIChPcHRpb25hbCkgVGltZWxvY2s6IDQgYnl0ZXNcbiAgICpcbiAgICogRWl0aGVyIFJlZGVlbVNjcmlwdCBvciBUaW1lbG9jayBtdXN0IGJlIGF2YWlsYWJsZSwgdGhlIHB1cnBvc2UgaXMgdG8gYWxsb3cgcmVsYXllciB0b1xuICAgKiBvYnRhaW4gdGhlIFJlZGVlbVNjcmlwdCBhbmQgc3VibWl0IHRyYW5zYWN0aW9ucyBvbiBDb3JlLiBJZiBhIFJlZGVlbVNjcmlwdCBpcyBwcm92aWRlZCxcbiAgICogcmVsYXllciB3aWxsIHVzZSBpdCBkaXJlY3RseS4gT3RoZXJ3aXNlLCByZWxheWVyIHdpbGwgY29uc3RydWN0IHRoZSByZWRlZW0gc2NyaXB0IGJhc2VkXG4gICAqIG9uIHRoZSB0aW1lbG9jayBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB0cmFuc2FjdGlvbiBpbnB1dHMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbnkgbGVuZ3RoID4gODAgYnl0ZXMgd29udCBiZSByZWxheWVkIGJ5IG5vZGVzIGFuZCB0aGVyZWZvcmUgd2Ugd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICovXG4gIGlmICh2ZXJzaW9uIDwgMCB8fCB2ZXJzaW9uID4gMjU1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZlcnNpb24gLSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuICBjb25zdCB2ZXJzaW9uQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEsIHZlcnNpb24pO1xuXG4gIGlmIChcbiAgICAhKFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVQyX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fTUFJTk5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRClcbiAgICApXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGFpbiBJRCcpO1xuICB9XG5cbiAgaWYgKGRlbGVnYXRvci5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRlbGVnYXRvciBhZGRyZXNzJyk7XG4gIH1cblxuICBpZiAodmFsaWRhdG9yLmxlbmd0aCAhPT0gMjApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsaWRhdG9yIGFkZHJlc3MnKTtcbiAgfVxuXG4gIGlmIChmZWUgPCAwIHx8IGZlZSA+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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFDO0FBQ3JDLHFEQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIGNvcmVEYW8gZnJvbSAnLi9jb3JlRGFvJztcbmV4cG9ydCAqIGFzIGJhYnlsb24gZnJvbSAnLi9iYWJ5bG9uJztcbiJdfQ==
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFDO0FBQ3JDLHFEQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIGNvcmVEYW8gZnJvbSAnLi9jb3JlRGFvJztcbmV4cG9ydCAqIGFzIGJhYnlsb24gZnJvbSAnLi9iYWJ5bG9uJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bug71.d.ts.map
@@ -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"}