@bitgo-beta/utxo-staking 1.1.1-beta.91 → 1.1.1-beta.911

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 (137) 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 +38 -0
  5. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  6. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  7. package/dist/cjs/src/babylon/descriptor.d.ts +48 -0
  8. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  9. package/dist/cjs/src/babylon/descriptor.js +97 -0
  10. package/dist/cjs/src/babylon/index.d.ts +8 -0
  11. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  12. package/dist/cjs/src/babylon/index.js +51 -0
  13. package/dist/cjs/src/babylon/network.d.ts +7 -0
  14. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  15. package/dist/cjs/src/babylon/network.js +66 -0
  16. package/dist/cjs/src/babylon/params.mainnet.json +152 -0
  17. package/dist/cjs/src/babylon/params.testnet.json +212 -0
  18. package/dist/cjs/src/babylon/parseDescriptor.d.ts +26 -0
  19. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  20. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  21. package/dist/cjs/src/babylon/stakingManager.d.ts +6 -0
  22. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  23. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  24. package/dist/cjs/src/babylon/stakingParams.d.ts +40 -0
  25. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  26. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  27. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  28. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  29. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.js +55 -0
  30. package/dist/cjs/src/babylon/undelegation/index.d.ts +3 -0
  31. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  32. package/dist/{src → cjs/src/babylon/undelegation}/index.js +3 -4
  33. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts +16 -0
  34. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  35. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  36. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  37. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  38. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  39. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  40. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  41. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  42. package/dist/{src → cjs/src}/coreDao/transaction.d.ts +16 -7
  43. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  44. package/dist/cjs/src/coreDao/transaction.js +34 -0
  45. package/dist/cjs/src/index.d.ts +3 -0
  46. package/dist/cjs/src/index.d.ts.map +1 -0
  47. package/dist/cjs/src/index.js +39 -0
  48. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  49. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  50. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  51. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  52. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  53. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  54. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  55. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  56. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  57. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  58. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  59. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  60. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  61. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  62. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  63. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  64. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  65. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  66. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  67. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  68. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  69. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  70. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  71. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  72. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  73. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  74. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  75. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  76. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  77. package/dist/esm/babylon/delegationMessage.d.ts.map +1 -0
  78. package/dist/esm/babylon/delegationMessage.js +239 -0
  79. package/dist/esm/babylon/descriptor.d.ts +48 -0
  80. package/dist/esm/babylon/descriptor.d.ts.map +1 -0
  81. package/dist/esm/babylon/descriptor.js +91 -0
  82. package/dist/esm/babylon/index.d.ts +8 -0
  83. package/dist/esm/babylon/index.d.ts.map +1 -0
  84. package/dist/esm/babylon/index.js +13 -0
  85. package/dist/esm/babylon/network.d.ts +7 -0
  86. package/dist/esm/babylon/network.d.ts.map +1 -0
  87. package/dist/esm/babylon/network.js +29 -0
  88. package/dist/esm/babylon/params.mainnet.json +152 -0
  89. package/dist/esm/babylon/params.testnet.json +212 -0
  90. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  91. package/dist/esm/babylon/parseDescriptor.d.ts.map +1 -0
  92. package/dist/esm/babylon/parseDescriptor.js +155 -0
  93. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  94. package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
  95. package/dist/esm/babylon/stakingManager.js +83 -0
  96. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  97. package/dist/esm/babylon/stakingParams.d.ts.map +1 -0
  98. package/dist/esm/babylon/stakingParams.js +86 -0
  99. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  100. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  101. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  102. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  103. package/dist/esm/babylon/undelegation/index.d.ts.map +1 -0
  104. package/dist/esm/babylon/undelegation/index.js +3 -0
  105. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  106. package/dist/esm/babylon/undelegation/unbonding.d.ts.map +1 -0
  107. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  108. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  109. package/dist/{src → esm}/coreDao/descriptor.d.ts.map +1 -1
  110. package/dist/esm/coreDao/descriptor.js +35 -0
  111. package/dist/esm/coreDao/index.d.ts +4 -0
  112. package/dist/esm/coreDao/index.js +4 -0
  113. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  114. package/dist/esm/coreDao/opReturn.js +175 -0
  115. package/dist/esm/coreDao/transaction.d.ts +28 -0
  116. package/dist/esm/coreDao/transaction.d.ts.map +1 -0
  117. package/dist/esm/coreDao/transaction.js +30 -0
  118. package/dist/esm/index.d.ts +3 -0
  119. package/dist/{src → esm}/index.d.ts.map +1 -1
  120. package/dist/esm/index.js +3 -0
  121. package/package.json +42 -12
  122. package/.eslintignore +0 -5
  123. package/.mocharc.yml +0 -8
  124. package/CHANGELOG.md +0 -63
  125. package/dist/src/coreDao/descriptor.js +0 -37
  126. package/dist/src/coreDao/opReturn.js +0 -183
  127. package/dist/src/coreDao/transaction.d.ts.map +0 -1
  128. package/dist/src/coreDao/transaction.js +0 -26
  129. package/dist/src/index.d.ts +0 -3
  130. package/dist/src/transaction.d.ts +0 -32
  131. package/dist/src/transaction.d.ts.map +0 -1
  132. package/dist/src/transaction.js +0 -54
  133. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  134. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  135. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  136. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  137. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=babylon-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"babylon-sync.d.ts","sourceRoot":"","sources":["../../../scripts/babylon-sync.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
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 node_assert_1 = __importDefault(require("node:assert"));
40
+ const fs = __importStar(require("fs/promises"));
41
+ const yargs_1 = __importDefault(require("yargs"));
42
+ const helpers_1 = require("yargs/helpers");
43
+ function getBaseUrl(network) {
44
+ if (network === 'mainnet') {
45
+ return 'https://babylon.nodes.guru/api';
46
+ }
47
+ return 'https://babylon-testnet-api.nodes.guru';
48
+ }
49
+ function unwrapJson(r) {
50
+ if (r.ok) {
51
+ return r.json();
52
+ }
53
+ return r.text().then((text) => {
54
+ throw new Error(`Fetch failed: ${r.status} ${r.statusText} - ${text}`);
55
+ });
56
+ }
57
+ async function getAllParams(network) {
58
+ const url = `${getBaseUrl(network)}/babylon/btcstaking/v1/params_versions`;
59
+ const result = await unwrapJson(await fetch(url));
60
+ (0, node_assert_1.default)(result && typeof result === 'object', `Invalid response from ${url}`);
61
+ (0, node_assert_1.default)('params' in result, `Response from ${url} does not contain 'params'`);
62
+ (0, node_assert_1.default)(Array.isArray(result.params), `Response from ${url} 'params' is not an array`);
63
+ return result.params;
64
+ }
65
+ async function syncParams(network) {
66
+ if (network === undefined) {
67
+ await syncParams('testnet');
68
+ await syncParams('mainnet');
69
+ return;
70
+ }
71
+ const allParams = await getAllParams(network);
72
+ const filename = __dirname + `/../src/babylon/params.${network}.json`;
73
+ await fs.writeFile(filename, JSON.stringify(allParams, null, 2) + '\n');
74
+ console.log(`Wrote ${allParams.length} params to ${filename}`);
75
+ }
76
+ async function syncDelegationResponse(network, txid) {
77
+ if (network === undefined && txid === undefined) {
78
+ console.log('Syncing delegation with default params');
79
+ return syncDelegationResponse('testnet', '5d277e1b29e5589074aea95ac8c8230fd911c2ec3c58774aafdef915619b772c');
80
+ }
81
+ if (network === undefined || txid === undefined) {
82
+ throw new Error('Network must be specified when syncing delegation response');
83
+ }
84
+ const url = `${getBaseUrl(network)}/babylon/btcstaking/v1/btc_delegation/${txid}`;
85
+ const result = await unwrapJson(await fetch(url));
86
+ (0, node_assert_1.default)(result && typeof result === 'object', `Invalid response from ${url}`);
87
+ const filename = __dirname + `/../test/fixtures/babylon/rpc/btc_delegation/${network}.${txid}.json`;
88
+ await fs.writeFile(filename, JSON.stringify(result, null, 2) + '\n');
89
+ console.log(`Wrote delegation response to ${filename}`);
90
+ }
91
+ (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
92
+ .command({
93
+ command: 'sync-babylon-params',
94
+ describe: 'Sync Babylon params',
95
+ builder(b) {
96
+ return b.option('network', {
97
+ choices: ['mainnet', 'testnet'],
98
+ description: 'Network',
99
+ });
100
+ },
101
+ async handler(argv) {
102
+ await syncParams(argv.network);
103
+ },
104
+ })
105
+ .command({
106
+ command: 'sync-btc-delegation',
107
+ describe: 'Sync BTC delegation messages',
108
+ builder(b) {
109
+ return b
110
+ .option('network', {
111
+ choices: ['mainnet', 'testnet'],
112
+ description: 'Network',
113
+ })
114
+ .option('txid', {
115
+ type: 'string',
116
+ description: 'Transaction ID of the delegation message to sync',
117
+ });
118
+ },
119
+ async handler(argv) {
120
+ await syncDelegationResponse(argv.network, argv.txid);
121
+ },
122
+ })
123
+ .demandCommand()
124
+ .help()
125
+ .strict().argv;
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2NyaXB0cy9iYWJ5bG9uLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4REFBaUM7QUFDakMsZ0RBQWtDO0FBRWxDLGtEQUEwQjtBQUMxQiwyQ0FBd0M7QUFFeEMsU0FBUyxVQUFVLENBQUMsT0FBOEI7SUFDaEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyx3Q0FBd0MsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsQ0FBVztJQUM3QixJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxVQUFVLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFJRCxLQUFLLFVBQVUsWUFBWSxDQUFDLE9BQXVCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQztJQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUEscUJBQU0sRUFBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLElBQUEscUJBQU0s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QUFDO0lBQ1AsT0FBTyxFQUFFLHFCQUFxQjtJQUM5QixRQUFRLEVBQUUsOEJBQThCO0lBQ3hDLE9BQU8sQ0FBQyxDQUFDO1FBQ1AsT0FBTyxDQUFDO2FBQ0wsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNqQixPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFVO1lBQ3hDLFdBQVcsRUFBRSxTQUFTO1NBQ3ZCLENBQUM7YUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQUUsa0RBQWtEO1NBQ2hFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUk7UUFDaEIsTUFBTSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YsQ0FBQztLQUNELGFBQWEsRUFBRTtLQUNmLElBQUksRUFBRTtLQUNOLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5mdW5jdGlvbiBnZXRCYXNlVXJsKG5ldHdvcms6ICdtYWlubmV0JyB8ICd0ZXN0bmV0Jykge1xuICBpZiAobmV0d29yayA9PT0gJ21haW5uZXQnKSB7XG4gICAgcmV0dXJuICdodHRwczovL2JhYnlsb24ubm9kZXMuZ3VydS9hcGknO1xuICB9XG4gIHJldHVybiAnaHR0cHM6Ly9iYWJ5bG9uLXRlc3RuZXQtYXBpLm5vZGVzLmd1cnUnO1xufVxuXG5mdW5jdGlvbiB1bndyYXBKc29uKHI6IFJlc3BvbnNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGlmIChyLm9rKSB7XG4gICAgcmV0dXJuIHIuanNvbigpO1xuICB9XG4gIHJldHVybiByLnRleHQoKS50aGVuKCh0ZXh0KSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGZXRjaCBmYWlsZWQ6ICR7ci5zdGF0dXN9ICR7ci5zdGF0dXNUZXh0fSAtICR7dGV4dH1gKTtcbiAgfSk7XG59XG5cbnR5cGUgQmFieWxvbk5ldHdvcmsgPSAnbWFpbm5ldCcgfCAndGVzdG5ldCc7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFBhcmFtcyhuZXR3b3JrOiBCYWJ5bG9uTmV0d29yayk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gIGNvbnN0IHVybCA9IGAke2dldEJhc2VVcmwobmV0d29yayl9L2JhYnlsb24vYnRjc3Rha2luZy92MS9wYXJhbXNfdmVyc2lvbnNgO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bndyYXBKc29uKGF3YWl0IGZldGNoKHVybCkpO1xuICBhc3NlcnQocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnLCBgSW52YWxpZCByZXNwb25zZSBmcm9tICR7dXJsfWApO1xuICBhc3NlcnQoJ3BhcmFtcycgaW4gcmVzdWx0LCBgUmVzcG9uc2UgZnJvbSAke3VybH0gZG9lcyBub3QgY29udGFpbiAncGFyYW1zJ2ApO1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShyZXN1bHQucGFyYW1zKSwgYFJlc3BvbnNlIGZyb20gJHt1cmx9ICdwYXJhbXMnIGlzIG5vdCBhbiBhcnJheWApO1xuICByZXR1cm4gcmVzdWx0LnBhcmFtcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY1BhcmFtcyhuZXR3b3JrOiBCYWJ5bG9uTmV0d29yayB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAobmV0d29yayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXdhaXQgc3luY1BhcmFtcygndGVzdG5ldCcpO1xuICAgIGF3YWl0IHN5bmNQYXJhbXMoJ21haW5uZXQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhbGxQYXJhbXMgPSBhd2FpdCBnZXRBbGxQYXJhbXMobmV0d29yayk7XG4gIGNvbnN0IGZpbGVuYW1lID0gX19kaXJuYW1lICsgYC8uLi9zcmMvYmFieWxvbi9wYXJhbXMuJHtuZXR3b3JrfS5qc29uYDtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVuYW1lLCBKU09OLnN0cmluZ2lmeShhbGxQYXJhbXMsIG51bGwsIDIpICsgJ1xcbicpO1xuICBjb25zb2xlLmxvZyhgV3JvdGUgJHthbGxQYXJhbXMubGVuZ3RofSBwYXJhbXMgdG8gJHtmaWxlbmFtZX1gKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY0RlbGVnYXRpb25SZXNwb25zZShuZXR3b3JrOiBCYWJ5bG9uTmV0d29yayB8IHVuZGVmaW5lZCwgdHhpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChuZXR3b3JrID09PSB1bmRlZmluZWQgJiYgdHhpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5sb2coJ1N5bmNpbmcgZGVsZWdhdGlvbiB3aXRoIGRlZmF1bHQgcGFyYW1zJyk7XG4gICAgcmV0dXJuIHN5bmNEZWxlZ2F0aW9uUmVzcG9uc2UoJ3Rlc3RuZXQnLCAnNWQyNzdlMWIyOWU1NTg5MDc0YWVhOTVhYzhjODIzMGZkOTExYzJlYzNjNTg3NzRhYWZkZWY5MTU2MTliNzcyYycpO1xuICB9XG5cbiAgaWYgKG5ldHdvcmsgPT09IHVuZGVmaW5lZCB8fCB0eGlkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBzeW5jaW5nIGRlbGVnYXRpb24gcmVzcG9uc2UnKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke2dldEJhc2VVcmwobmV0d29yayl9L2JhYnlsb24vYnRjc3Rha2luZy92MS9idGNfZGVsZWdhdGlvbi8ke3R4aWR9YDtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdW53cmFwSnNvbihhd2FpdCBmZXRjaCh1cmwpKTtcbiAgYXNzZXJ0KHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JywgYEludmFsaWQgcmVzcG9uc2UgZnJvbSAke3VybH1gKTtcblxuICBjb25zdCBmaWxlbmFtZSA9IF9fZGlybmFtZSArIGAvLi4vdGVzdC9maXh0dXJlcy9iYWJ5bG9uL3JwYy9idGNfZGVsZWdhdGlvbi8ke25ldHdvcmt9LiR7dHhpZH0uanNvbmA7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlbmFtZSwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSArICdcXG4nKTtcbiAgY29uc29sZS5sb2coYFdyb3RlIGRlbGVnYXRpb24gcmVzcG9uc2UgdG8gJHtmaWxlbmFtZX1gKTtcbn1cblxueWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuY29tbWFuZCh7XG4gICAgY29tbWFuZDogJ3N5bmMtYmFieWxvbi1wYXJhbXMnLFxuICAgIGRlc2NyaWJlOiAnU3luYyBCYWJ5bG9uIHBhcmFtcycsXG4gICAgYnVpbGRlcihiKSB7XG4gICAgICByZXR1cm4gYi5vcHRpb24oJ25ldHdvcmsnLCB7XG4gICAgICAgIGNob2ljZXM6IFsnbWFpbm5ldCcsICd0ZXN0bmV0J10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTmV0d29yaycsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgICAgYXdhaXQgc3luY1BhcmFtcyhhcmd2Lm5ldHdvcmspO1xuICAgIH0sXG4gIH0pXG4gIC5jb21tYW5kKHtcbiAgICBjb21tYW5kOiAnc3luYy1idGMtZGVsZWdhdGlvbicsXG4gICAgZGVzY3JpYmU6ICdTeW5jIEJUQyBkZWxlZ2F0aW9uIG1lc3NhZ2VzJyxcbiAgICBidWlsZGVyKGIpIHtcbiAgICAgIHJldHVybiBiXG4gICAgICAgIC5vcHRpb24oJ25ldHdvcmsnLCB7XG4gICAgICAgICAgY2hvaWNlczogWydtYWlubmV0JywgJ3Rlc3RuZXQnXSBhcyBjb25zdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ05ldHdvcmsnLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uKCd0eGlkJywge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVHJhbnNhY3Rpb24gSUQgb2YgdGhlIGRlbGVnYXRpb24gbWVzc2FnZSB0byBzeW5jJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICAgIGF3YWl0IHN5bmNEZWxlZ2F0aW9uUmVzcG9uc2UoYXJndi5uZXR3b3JrLCBhcmd2LnR4aWQpO1xuICAgIH0sXG4gIH0pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLmhlbHAoKVxuICAuc3RyaWN0KCkuYXJndjtcbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import * as vendor from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
2
+ import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
3
+ import * as bitcoinjslib from 'bitcoinjs-lib';
4
+ import * as utxolib from '@bitgo-beta/utxo-lib';
5
+ import { Descriptor } from '@bitgo/wasm-utxo';
6
+ import { BabylonDescriptorBuilder } from './descriptor';
7
+ import { BabylonNetworkLike } from './network';
8
+ export type ValueWithTypeUrl<T> = {
9
+ typeUrl: string;
10
+ value: T;
11
+ };
12
+ export declare function getSignedPsbt(psbt: bitcoinjslib.Psbt, descriptor: Descriptor, signers: utxolib.ECPairInterface[], { finalize }: {
13
+ finalize?: boolean | undefined;
14
+ }): bitcoinjslib.Psbt;
15
+ /**
16
+ * Utility method to work around a bug in btc-staking-ts
17
+ * https://github.com/babylonlabs-io/btc-staking-ts/issues/71
18
+ * @param v
19
+ * @param network
20
+ */
21
+ export declare function forceFinalizePsbt(v: Buffer | utxolib.Psbt | bitcoinjslib.Psbt, network: BabylonNetworkLike): bitcoinjslib.Psbt;
22
+ export declare function getBtcProviderForECKey(descriptorBuilder: BabylonDescriptorBuilder, stakerKey: utxolib.ECPairInterface): vendor.BtcProvider;
23
+ type Result = {
24
+ unsignedDelegationMsg: ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>;
25
+ stakingTx: bitcoinjslib.Transaction;
26
+ };
27
+ /**
28
+ * @param stakingKey - this is the single-sig key that is used for co-signing the staking output
29
+ * @param changeAddress - this is unrelated to the staking key and is used for the change output
30
+ */
31
+ export declare function toStakerInfo(stakingKey: utxolib.ECPairInterface | Buffer | string, changeAddress: string): vendor.StakerInfo;
32
+ export declare function createStaking(network: BabylonNetworkLike, blockHeight: number, stakerBtcInfo: vendor.StakerInfo, stakingInput: vendor.StakingInputs, versionedParams?: vendor.VersionedStakingParams[]): vendor.Staking;
33
+ type TransactionLike = bitcoinjslib.Psbt | bitcoinjslib.Transaction | utxolib.Transaction | utxolib.bitgo.UtxoTransaction<bigint | number> | utxolib.Psbt | utxolib.bitgo.UtxoPsbt;
34
+ export declare function toStakingTransaction(tx: TransactionLike): bitcoinjslib.Transaction;
35
+ export declare function createDelegationMessageWithTransaction(channel: 'delegation:create' | 'delegation:register', manager: vendor.BabylonBtcStakingManager, staking: vendor.Staking, stakingAmountSat: number, transaction: TransactionLike, babylonAddress: string): Promise<ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>>;
36
+ export declare function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(btcProvider: vendor.BtcProvider, network: bitcoinjslib.Network, stakerBtcInfo: vendor.StakerInfo, stakingInput: vendor.StakingInputs, babylonBtcTipHeight: number, inputUTXOs: vendor.UTXO[], feeRateSatB: number, babylonAddress: string, channel: 'delegation:create' | 'delegation:register', stakingParams?: vendor.VersionedStakingParams[]): Promise<Result>;
37
+ export {};
38
+ //# sourceMappingURL=delegationMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegationMessage.d.ts","sourceRoot":"","sources":["../../../../src/babylon/delegationMessage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
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.getSignedPsbt = getSignedPsbt;
40
+ exports.forceFinalizePsbt = forceFinalizePsbt;
41
+ exports.getBtcProviderForECKey = getBtcProviderForECKey;
42
+ exports.toStakerInfo = toStakerInfo;
43
+ exports.createStaking = createStaking;
44
+ exports.toStakingTransaction = toStakingTransaction;
45
+ exports.createDelegationMessageWithTransaction = createDelegationMessageWithTransaction;
46
+ exports.createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider = createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider;
47
+ /**
48
+ * https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/x/btcstaking/types/validate_parsed_message.go
49
+ */
50
+ const assert_1 = __importDefault(require("assert"));
51
+ const bip322_js_1 = require("bip322-js");
52
+ const vendor = __importStar(require("@bitgo-beta/babylonlabs-io-btc-staking-ts"));
53
+ const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
54
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
55
+ const utxo_core_1 = require("@bitgo-beta/utxo-core");
56
+ const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
57
+ const stakingManager_1 = require("./stakingManager");
58
+ const stakingParams_1 = require("./stakingParams");
59
+ const network_1 = require("./network");
60
+ /**
61
+ * Decode a hex or base64 encoded string and check if the length is valid.
62
+ * @param v
63
+ * @param encoding
64
+ */
65
+ function decodeCheck(v, encoding) {
66
+ const result = Buffer.from(v, encoding);
67
+ if (result.toString(encoding).length !== v.length) {
68
+ throw new Error(`Invalid ${encoding} encoding`);
69
+ }
70
+ return result;
71
+ }
72
+ /**
73
+ * Convert a Buffer or string to a base64 encoded string.
74
+ * @param v
75
+ */
76
+ function toBase64(v) {
77
+ if (typeof v === 'string') {
78
+ for (const encoding of ['base64', 'hex']) {
79
+ try {
80
+ return toBase64(decodeCheck(v, encoding));
81
+ }
82
+ catch (e) {
83
+ // try next
84
+ }
85
+ }
86
+ throw new Error(`Invalid base64 or hex encoding: ${v}`);
87
+ }
88
+ return v.toString('base64');
89
+ }
90
+ function getSignedPsbt(psbt, descriptor, signers, { finalize = false }) {
91
+ const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(psbt.toBuffer());
92
+ const signedInputs = psbt.data.inputs.flatMap((input, i) => {
93
+ (0, assert_1.default)(input.witnessUtxo);
94
+ if (Buffer.from(descriptor.scriptPubkey()).equals(input.witnessUtxo.script)) {
95
+ wrappedPsbt.updateInputWithDescriptor(i, descriptor);
96
+ const signResults = signers.map((signer) => {
97
+ (0, assert_1.default)(signer.privateKey);
98
+ return wrappedPsbt.signWithPrv(signer.privateKey);
99
+ });
100
+ return [[i, signResults]];
101
+ }
102
+ return [];
103
+ });
104
+ (0, assert_1.default)(signedInputs.length > 0);
105
+ if (finalize) {
106
+ wrappedPsbt.finalize();
107
+ }
108
+ return bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()));
109
+ }
110
+ /**
111
+ * Utility method to work around a bug in btc-staking-ts
112
+ * https://github.com/babylonlabs-io/btc-staking-ts/issues/71
113
+ * @param v
114
+ * @param network
115
+ */
116
+ function forceFinalizePsbt(v, network) {
117
+ if (v instanceof utxolib.Psbt) {
118
+ v = v.toBuffer();
119
+ }
120
+ if (v instanceof bitcoinjslib.Psbt) {
121
+ v = v.toBuffer();
122
+ }
123
+ const psbt = bitcoinjslib.Psbt.fromBuffer(v, { network: (0, network_1.toBitcoinJsNetwork)(network) });
124
+ // this only works with certain bitcoinjslib versions
125
+ psbt.finalizeAllInputs();
126
+ return psbt;
127
+ }
128
+ function getBtcProviderForECKey(descriptorBuilder, stakerKey) {
129
+ function signWithDescriptor(psbt, descriptor, key) {
130
+ psbt = getSignedPsbt(psbt, descriptor, [key], { finalize: false });
131
+ // BUG: we need to blindly finalize here even though we have not fully signed
132
+ psbt.finalizeAllInputs();
133
+ return psbt;
134
+ }
135
+ function signBip322Simple(message) {
136
+ // Get the script public key from the staking descriptor
137
+ const scriptPubKey = Buffer.from(descriptorBuilder.getStakingDescriptor().scriptPubkey());
138
+ const toSpendTx = bip322_js_1.BIP322.buildToSpendTx(message, scriptPubKey);
139
+ // Get the to_spend txid
140
+ const toSpendTxId = toSpendTx.getId();
141
+ // Create PSBT object for constructing the transaction
142
+ const toSignPsbt = new bitcoinjslib.Psbt();
143
+ toSignPsbt.setVersion(2); // nVersion = 0
144
+ toSignPsbt.setLocktime(0); // nLockTime = 0
145
+ toSignPsbt.addInput({
146
+ hash: toSpendTxId,
147
+ index: 0,
148
+ sequence: descriptorBuilder.stakingTimeLock,
149
+ witnessUtxo: {
150
+ script: scriptPubKey,
151
+ value: 0,
152
+ },
153
+ });
154
+ // Sign the PSBT with the staker key
155
+ const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(toSignPsbt.toBuffer());
156
+ wrappedPsbt.updateInputWithDescriptor(0, descriptorBuilder.getStakingDescriptor());
157
+ (0, descriptor_1.signWithKey)(wrappedPsbt, stakerKey);
158
+ wrappedPsbt.finalize();
159
+ // Encode the witness data and return
160
+ return bip322_js_1.BIP322.encodeWitness(bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize())));
161
+ }
162
+ return {
163
+ /**
164
+ * @param message
165
+ * @param type
166
+ * @returns Base64 encoded string
167
+ */
168
+ async signMessage(message, type) {
169
+ switch (type) {
170
+ case 'ecdsa':
171
+ return toBase64(stakerKey.sign(Buffer.from(message, 'hex')));
172
+ case 'bip322-simple':
173
+ return toBase64(signBip322Simple(message));
174
+ default:
175
+ throw new Error(`unexpected type: ${type}`);
176
+ }
177
+ },
178
+ async signPsbt(psbtHex, options) {
179
+ const psbt = bitcoinjslib.Psbt.fromHex(psbtHex);
180
+ switch (options.action.name) {
181
+ case 'sign-btc-slashing-transaction':
182
+ return signWithDescriptor(psbt, descriptorBuilder.getStakingDescriptor(), stakerKey).toHex();
183
+ case 'sign-btc-unbonding-slashing-transaction':
184
+ return signWithDescriptor(psbt, descriptorBuilder.getUnbondingDescriptor(), stakerKey).toHex();
185
+ default:
186
+ throw new Error(`unexpected signing step: ${options.action.name}`);
187
+ }
188
+ },
189
+ /**
190
+ * This function is only used by btc-staking-ts to create a staking expansion registration
191
+ * transaction, which we do not currently support.
192
+ */
193
+ async getTransactionHex(txid) {
194
+ throw new Error(`Unsupported operation getTransactionHex (txid=${txid})`);
195
+ },
196
+ };
197
+ }
198
+ /**
199
+ * @param stakingKey - this is the single-sig key that is used for co-signing the staking output
200
+ * @param changeAddress - this is unrelated to the staking key and is used for the change output
201
+ */
202
+ function toStakerInfo(stakingKey, changeAddress) {
203
+ if (typeof stakingKey === 'object' && 'publicKey' in stakingKey) {
204
+ stakingKey = stakingKey.publicKey;
205
+ }
206
+ if (typeof stakingKey === 'string') {
207
+ stakingKey = Buffer.from(stakingKey, 'hex');
208
+ }
209
+ return {
210
+ publicKeyNoCoordHex: (0, utxo_core_1.toXOnlyPublicKey)(stakingKey).toString('hex'),
211
+ address: changeAddress,
212
+ };
213
+ }
214
+ function createStaking(network, blockHeight, stakerBtcInfo, stakingInput, versionedParams = (0, stakingParams_1.getStakingParams)(network)) {
215
+ if (blockHeight === 0) {
216
+ throw new Error('Babylon BTC tip height cannot be 0');
217
+ }
218
+ // Get the Babylon params based on the BTC tip height from Babylon chain
219
+ const params = vendor.getBabylonParamByBtcHeight(blockHeight, versionedParams);
220
+ return new vendor.Staking((0, network_1.toBitcoinJsNetwork)(network), stakerBtcInfo, params, stakingInput.finalityProviderPksNoCoordHex, stakingInput.stakingTimelock);
221
+ }
222
+ function toStakingTransactionFromPsbt(psbt) {
223
+ if (!(psbt instanceof utxolib.bitgo.UtxoPsbt)) {
224
+ psbt = utxolib.bitgo.createPsbtFromBuffer(psbt.toBuffer(), utxolib.networks.bitcoin);
225
+ }
226
+ if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
227
+ // only utxolib.bitgo.UtxoPsbt has the getUnsignedTx method
228
+ return bitcoinjslib.Transaction.fromHex(psbt.getUnsignedTx().toHex());
229
+ }
230
+ throw new Error('illegal state');
231
+ }
232
+ function toStakingTransaction(tx) {
233
+ if (tx instanceof bitcoinjslib.Psbt || tx instanceof utxolib.Psbt) {
234
+ return toStakingTransactionFromPsbt(tx);
235
+ }
236
+ return bitcoinjslib.Transaction.fromHex(tx.toHex());
237
+ }
238
+ /**
239
+ * As of babylonlabs-io/btc-staking-ts v1.5.7, the BTC delegation message creation functions support two message types:
240
+ * - MsgCreateBTCDelegation
241
+ * - MsgBtcStakeExpand
242
+ *
243
+ * BitGo still only supports MsgCreateBTCDelegation, so we need to check the message type here.
244
+ *
245
+ * @param msg - the message to check
246
+ * @return `true` if the message is of type MsgCreateBTCDelegation
247
+ */
248
+ function isMsgBtcStakeExpand(msg) {
249
+ return 'previousStakingTxHash' in msg;
250
+ }
251
+ /*
252
+ * This is mostly lifted from
253
+ * https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/staking/manager.ts#L100-L172
254
+ *
255
+ * The difference is that here we are returning an _unsigned_ delegation message.
256
+ */
257
+ async function createDelegationMessageWithTransaction(channel, manager, staking, stakingAmountSat, transaction, babylonAddress) {
258
+ if (!vendor.isValidBabylonAddress(babylonAddress)) {
259
+ throw new Error('Invalid Babylon address');
260
+ }
261
+ // Create delegation message without including inclusion proof
262
+ const msg = await manager.createBtcDelegationMsg(channel, staking, {
263
+ stakingTimelock: staking.stakingTimelock,
264
+ finalityProviderPksNoCoordHex: staking.finalityProviderPksNoCoordHex,
265
+ stakingAmountSat,
266
+ }, toStakingTransaction(transaction), babylonAddress, staking.stakerInfo, staking.params);
267
+ // It shouldn't be possible for us to create a MsgBtcStakeExpand here because that only gets created when
268
+ // we pass channel = delegation:expand into createBtcDelegationMsg, which we cannot do.
269
+ if (isMsgBtcStakeExpand(msg.value)) {
270
+ throw new Error('MsgBtcStakeExpand is not supported');
271
+ }
272
+ return { ...msg, value: msg.value };
273
+ }
274
+ async function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(btcProvider, network, stakerBtcInfo, stakingInput, babylonBtcTipHeight, inputUTXOs, feeRateSatB, babylonAddress, channel, stakingParams = (0, stakingParams_1.getStakingParams)(network)) {
275
+ if (inputUTXOs.length === 0) {
276
+ throw new Error('No input UTXOs provided');
277
+ }
278
+ const manager = (0, stakingManager_1.createStakingManager)(network, btcProvider, stakingParams);
279
+ const staking = createStaking(network, babylonBtcTipHeight, stakerBtcInfo, stakingInput, stakingParams);
280
+ // Create unsigned staking transaction
281
+ const { transaction } = staking.createStakingTransaction(stakingInput.stakingAmountSat, inputUTXOs, feeRateSatB);
282
+ const unsignedDelegationMsg = await createDelegationMessageWithTransaction(channel, manager, staking, stakingInput.stakingAmountSat, transaction, babylonAddress);
283
+ return { unsignedDelegationMsg, stakingTx: transaction };
284
+ }
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGlvbk1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYmFieWxvbi9kZWxlZ2F0aW9uTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFEQSxzQ0F3QkM7QUFRRCw4Q0FjQztBQUVELHdEQW9GQztBQVVELG9DQWNDO0FBRUQsc0NBcUJDO0FBdUJELG9EQUtDO0FBd0JELHdGQWlDQztBQUVELGtKQTRCQztBQTNWRDs7R0FFRztBQUNILG9EQUE0QjtBQUU1Qix5Q0FBbUM7QUFDbkMsa0ZBQW9FO0FBRXBFLDREQUE4QztBQUM5Qyw4REFBZ0Q7QUFFaEQscURBQXlEO0FBQ3pELGlFQUE4RTtBQUc5RSxxREFBd0Q7QUFDeEQsbURBQW1EO0FBQ25ELHVDQUFtRTtBQUluRTs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsQ0FBUyxFQUFFLFFBQTBCO0lBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxRQUFRLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBa0I7SUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBVSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDO2dCQUNILE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxXQUFXO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsSUFBdUIsRUFDdkIsVUFBc0IsRUFDdEIsT0FBa0MsRUFDbEMsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFO0lBRXBCLE1BQU0sV0FBVyxHQUFHLElBQUEsMEJBQWEsRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekQsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxXQUFXLENBQUMseUJBQXlCLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDekMsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUIsT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBQSxnQkFBTSxFQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLENBQTRDLEVBQzVDLE9BQTJCO0lBRTNCLElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLHFEQUFxRDtJQUNyRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN6QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMsaUJBQTJDLEVBQzNDLFNBQWtDO0lBRWxDLFNBQVMsa0JBQWtCLENBQ3pCLElBQXVCLEVBQ3ZCLFVBQXNCLEVBQ3RCLEdBQTRCO1FBRTVCLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkUsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVMsZ0JBQWdCLENBQUMsT0FBZTtRQUN2Qyx3REFBd0Q7UUFDeEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUYsTUFBTSxTQUFTLEdBQUcsa0JBQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRS9ELHdCQUF3QjtRQUN4QixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdEMsc0RBQXNEO1FBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlO1FBQ3pDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7UUFDM0MsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNsQixJQUFJLEVBQUUsV0FBVztZQUNqQixLQUFLLEVBQUUsQ0FBQztZQUNSLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxlQUFlO1lBQzNDLFdBQVcsRUFBRTtnQkFDWCxNQUFNLEVBQUUsWUFBWTtnQkFDcEIsS0FBSyxFQUFFLENBQUM7YUFDVDtTQUNGLENBQUMsQ0FBQztRQUVILG9DQUFvQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFBLDBCQUFhLEVBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDbkYsSUFBQSx3QkFBVyxFQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdkIscUNBQXFDO1FBQ3JDLE9BQU8sa0JBQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELE9BQU87UUFDTDs7OztXQUlHO1FBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFlLEVBQUUsSUFBK0I7WUFDaEUsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDYixLQUFLLE9BQU87b0JBQ1YsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELEtBQUssZUFBZTtvQkFDbEIsT0FBTyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDN0M7b0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBZSxFQUFFLE9BQStCO1lBQzdELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELFFBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsS0FBSywrQkFBK0I7b0JBQ2xDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9GLEtBQUsseUNBQXlDO29CQUM1QyxPQUFPLGtCQUFrQixDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNqRztvQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7UUFFRDs7O1dBR0c7UUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBWTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQU1EOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsVUFBcUQsRUFDckQsYUFBcUI7SUFFckIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksV0FBVyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTztRQUNMLG1CQUFtQixFQUFFLElBQUEsNEJBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqRSxPQUFPLEVBQUUsYUFBYTtLQUN2QixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsT0FBMkIsRUFDM0IsV0FBbUIsRUFDbkIsYUFBZ0MsRUFDaEMsWUFBa0MsRUFDbEMsa0JBQW1ELElBQUEsZ0NBQWdCLEVBQUMsT0FBTyxDQUFDO0lBRTVFLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0UsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQ3ZCLElBQUEsNEJBQWtCLEVBQUMsT0FBTyxDQUFDLEVBQzNCLGFBQWEsRUFDYixNQUFNLEVBQ04sWUFBWSxDQUFDLDZCQUE2QixFQUMxQyxZQUFZLENBQUMsZUFBZSxDQUM3QixDQUFDO0FBQ0osQ0FBQztBQVVELFNBQVMsNEJBQTRCLENBQ25DLElBQStEO0lBRS9ELElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDOUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELElBQUksSUFBSSxZQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0MsMkRBQTJEO1FBQzNELE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLEVBQW1CO0lBQ3RELElBQUksRUFBRSxZQUFZLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxZQUFZLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRSxPQUFPLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLG1CQUFtQixDQUMxQixHQUF5RztJQUV6RyxPQUFPLHVCQUF1QixJQUFJLEdBQUcsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsc0NBQXNDLENBQzFELE9BQW9ELEVBQ3BELE9BQXdDLEVBQ3hDLE9BQXVCLEVBQ3ZCLGdCQUF3QixFQUN4QixXQUE0QixFQUM1QixjQUFzQjtJQUV0QixJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCw4REFBOEQ7SUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsc0JBQXNCLENBQzlDLE9BQU8sRUFDUCxPQUFPLEVBQ1A7UUFDRSxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7UUFDeEMsNkJBQTZCLEVBQUUsT0FBTyxDQUFDLDZCQUE2QjtRQUNwRSxnQkFBZ0I7S0FDakIsRUFDRCxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsRUFDakMsY0FBYyxFQUNkLE9BQU8sQ0FBQyxVQUFVLEVBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQ2YsQ0FBQztJQUVGLHlHQUF5RztJQUN6Ryx1RkFBdUY7SUFDdkYsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU8sRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQTRELEVBQUUsQ0FBQztBQUM3RixDQUFDO0FBRU0sS0FBSyxVQUFVLG1FQUFtRSxDQUN2RixXQUErQixFQUMvQixPQUE2QixFQUM3QixhQUFnQyxFQUNoQyxZQUFrQyxFQUNsQyxtQkFBMkIsRUFDM0IsVUFBeUIsRUFDekIsV0FBbUIsRUFDbkIsY0FBc0IsRUFDdEIsT0FBb0QsRUFDcEQsZ0JBQWlELElBQUEsZ0NBQWdCLEVBQUMsT0FBTyxDQUFDO0lBRTFFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQW9CLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDeEcsc0NBQXNDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sc0NBQXNDLENBQ3hFLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsV0FBVyxFQUNYLGNBQWMsQ0FDZixDQUFDO0lBQ0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL3YxLjk5LjAtc25hcHNob3QuMjUwMjExL3gvYnRjc3Rha2luZy90eXBlcy92YWxpZGF0ZV9wYXJzZWRfbWVzc2FnZS5nb1xuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEJJUDMyMiB9IGZyb20gJ2JpcDMyMi1qcyc7XG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0ICogYXMgYmFieWxvblByb3RvYnVmIGZyb20gJ0BiYWJ5bG9ubGFicy1pby9iYWJ5bG9uLXByb3RvLXRzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5qc2xpYiBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBzaWduV2l0aEtleSwgdG9XcmFwcGVkUHNidCB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuaW1wb3J0IHsgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIH0gZnJvbSAnLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGNyZWF0ZVN0YWtpbmdNYW5hZ2VyIH0gZnJvbSAnLi9zdGFraW5nTWFuYWdlcic7XG5pbXBvcnQgeyBnZXRTdGFraW5nUGFyYW1zIH0gZnJvbSAnLi9zdGFraW5nUGFyYW1zJztcbmltcG9ydCB7IEJhYnlsb25OZXR3b3JrTGlrZSwgdG9CaXRjb2luSnNOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3JrJztcblxuZXhwb3J0IHR5cGUgVmFsdWVXaXRoVHlwZVVybDxUPiA9IHsgdHlwZVVybDogc3RyaW5nOyB2YWx1ZTogVCB9O1xuXG4vKipcbiAqIERlY29kZSBhIGhleCBvciBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgYW5kIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgdmFsaWQuXG4gKiBAcGFyYW0gdlxuICogQHBhcmFtIGVuY29kaW5nXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUNoZWNrKHY6IHN0cmluZywgZW5jb2Rpbmc6ICdoZXgnIHwgJ2Jhc2U2NCcpIHtcbiAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmZyb20odiwgZW5jb2RpbmcpO1xuICBpZiAocmVzdWx0LnRvU3RyaW5nKGVuY29kaW5nKS5sZW5ndGggIT09IHYubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7ZW5jb2Rpbmd9IGVuY29kaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQnVmZmVyIG9yIHN0cmluZyB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqIEBwYXJhbSB2XG4gKi9cbmZ1bmN0aW9uIHRvQmFzZTY0KHY6IEJ1ZmZlciB8IHN0cmluZykge1xuICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgZm9yIChjb25zdCBlbmNvZGluZyBvZiBbJ2Jhc2U2NCcsICdoZXgnXSBhcyBjb25zdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRvQmFzZTY0KGRlY29kZUNoZWNrKHYsIGVuY29kaW5nKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHRyeSBuZXh0XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlNjQgb3IgaGV4IGVuY29kaW5nOiAke3Z9YCk7XG4gIH1cblxuICByZXR1cm4gdi50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaWduZWRQc2J0KFxuICBwc2J0OiBiaXRjb2luanNsaWIuUHNidCxcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgc2lnbmVyczogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2VbXSxcbiAgeyBmaW5hbGl6ZSA9IGZhbHNlIH1cbik6IGJpdGNvaW5qc2xpYi5Qc2J0IHtcbiAgY29uc3Qgd3JhcHBlZFBzYnQgPSB0b1dyYXBwZWRQc2J0KHBzYnQudG9CdWZmZXIoKSk7XG4gIGNvbnN0IHNpZ25lZElucHV0cyA9IHBzYnQuZGF0YS5pbnB1dHMuZmxhdE1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBhc3NlcnQoaW5wdXQud2l0bmVzc1V0eG8pO1xuICAgIGlmIChCdWZmZXIuZnJvbShkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKS5lcXVhbHMoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KSkge1xuICAgICAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihpLCBkZXNjcmlwdG9yKTtcbiAgICAgIGNvbnN0IHNpZ25SZXN1bHRzID0gc2lnbmVycy5tYXAoKHNpZ25lcikgPT4ge1xuICAgICAgICBhc3NlcnQoc2lnbmVyLnByaXZhdGVLZXkpO1xuICAgICAgICByZXR1cm4gd3JhcHBlZFBzYnQuc2lnbldpdGhQcnYoc2lnbmVyLnByaXZhdGVLZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW1tpLCBzaWduUmVzdWx0c11dO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuICBhc3NlcnQoc2lnbmVkSW5wdXRzLmxlbmd0aCA+IDApO1xuICBpZiAoZmluYWxpemUpIHtcbiAgICB3cmFwcGVkUHNidC5maW5hbGl6ZSgpO1xuICB9XG4gIHJldHVybiBiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBtZXRob2QgdG8gd29yayBhcm91bmQgYSBidWcgaW4gYnRjLXN0YWtpbmctdHNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9idGMtc3Rha2luZy10cy9pc3N1ZXMvNzFcbiAqIEBwYXJhbSB2XG4gKiBAcGFyYW0gbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VGaW5hbGl6ZVBzYnQoXG4gIHY6IEJ1ZmZlciB8IHV0eG9saWIuUHNidCB8IGJpdGNvaW5qc2xpYi5Qc2J0LFxuICBuZXR3b3JrOiBCYWJ5bG9uTmV0d29ya0xpa2Vcbik6IGJpdGNvaW5qc2xpYi5Qc2J0IHtcbiAgaWYgKHYgaW5zdGFuY2VvZiB1dHhvbGliLlBzYnQpIHtcbiAgICB2ID0gdi50b0J1ZmZlcigpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgYml0Y29pbmpzbGliLlBzYnQpIHtcbiAgICB2ID0gdi50b0J1ZmZlcigpO1xuICB9XG4gIGNvbnN0IHBzYnQgPSBiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKHYsIHsgbmV0d29yazogdG9CaXRjb2luSnNOZXR3b3JrKG5ldHdvcmspIH0pO1xuICAvLyB0aGlzIG9ubHkgd29ya3Mgd2l0aCBjZXJ0YWluIGJpdGNvaW5qc2xpYiB2ZXJzaW9uc1xuICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gIHJldHVybiBwc2J0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnRjUHJvdmlkZXJGb3JFQ0tleShcbiAgZGVzY3JpcHRvckJ1aWxkZXI6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcixcbiAgc3Rha2VyS2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZVxuKTogdmVuZG9yLkJ0Y1Byb3ZpZGVyIHtcbiAgZnVuY3Rpb24gc2lnbldpdGhEZXNjcmlwdG9yKFxuICAgIHBzYnQ6IGJpdGNvaW5qc2xpYi5Qc2J0LFxuICAgIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gICAga2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZVxuICApOiBiaXRjb2luanNsaWIuUHNidCB7XG4gICAgcHNidCA9IGdldFNpZ25lZFBzYnQocHNidCwgZGVzY3JpcHRvciwgW2tleV0sIHsgZmluYWxpemU6IGZhbHNlIH0pO1xuICAgIC8vIEJVRzogd2UgbmVlZCB0byBibGluZGx5IGZpbmFsaXplIGhlcmUgZXZlbiB0aG91Z2ggd2UgaGF2ZSBub3QgZnVsbHkgc2lnbmVkXG4gICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbkJpcDMyMlNpbXBsZShtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEdldCB0aGUgc2NyaXB0IHB1YmxpYyBrZXkgZnJvbSB0aGUgc3Rha2luZyBkZXNjcmlwdG9yXG4gICAgY29uc3Qgc2NyaXB0UHViS2V5ID0gQnVmZmVyLmZyb20oZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKS5zY3JpcHRQdWJrZXkoKSk7XG4gICAgY29uc3QgdG9TcGVuZFR4ID0gQklQMzIyLmJ1aWxkVG9TcGVuZFR4KG1lc3NhZ2UsIHNjcmlwdFB1YktleSk7XG5cbiAgICAvLyBHZXQgdGhlIHRvX3NwZW5kIHR4aWRcbiAgICBjb25zdCB0b1NwZW5kVHhJZCA9IHRvU3BlbmRUeC5nZXRJZCgpO1xuXG4gICAgLy8gQ3JlYXRlIFBTQlQgb2JqZWN0IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdG9TaWduUHNidCA9IG5ldyBiaXRjb2luanNsaWIuUHNidCgpO1xuICAgIHRvU2lnblBzYnQuc2V0VmVyc2lvbigyKTsgLy8gblZlcnNpb24gPSAwXG4gICAgdG9TaWduUHNidC5zZXRMb2NrdGltZSgwKTsgLy8gbkxvY2tUaW1lID0gMFxuICAgIHRvU2lnblBzYnQuYWRkSW5wdXQoe1xuICAgICAgaGFzaDogdG9TcGVuZFR4SWQsXG4gICAgICBpbmRleDogMCxcbiAgICAgIHNlcXVlbmNlOiBkZXNjcmlwdG9yQnVpbGRlci5zdGFraW5nVGltZUxvY2ssXG4gICAgICB3aXRuZXNzVXR4bzoge1xuICAgICAgICBzY3JpcHQ6IHNjcmlwdFB1YktleSxcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2lnbiB0aGUgUFNCVCB3aXRoIHRoZSBzdGFrZXIga2V5XG4gICAgY29uc3Qgd3JhcHBlZFBzYnQgPSB0b1dyYXBwZWRQc2J0KHRvU2lnblBzYnQudG9CdWZmZXIoKSk7XG4gICAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpKTtcbiAgICBzaWduV2l0aEtleSh3cmFwcGVkUHNidCwgc3Rha2VyS2V5KTtcbiAgICB3cmFwcGVkUHNidC5maW5hbGl6ZSgpO1xuXG4gICAgLy8gRW5jb2RlIHRoZSB3aXRuZXNzIGRhdGEgYW5kIHJldHVyblxuICAgIHJldHVybiBCSVAzMjIuZW5jb2RlV2l0bmVzcyhiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICogQHJldHVybnMgQmFzZTY0IGVuY29kZWQgc3RyaW5nXG4gICAgICovXG4gICAgYXN5bmMgc2lnbk1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB0eXBlOiAnZWNkc2EnIHwgJ2JpcDMyMi1zaW1wbGUnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdlY2RzYSc6XG4gICAgICAgICAgcmV0dXJuIHRvQmFzZTY0KHN0YWtlcktleS5zaWduKEJ1ZmZlci5mcm9tKG1lc3NhZ2UsICdoZXgnKSkpO1xuICAgICAgICBjYXNlICdiaXAzMjItc2ltcGxlJzpcbiAgICAgICAgICByZXR1cm4gdG9CYXNlNjQoc2lnbkJpcDMyMlNpbXBsZShtZXNzYWdlKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgc2lnblBzYnQocHNidEhleDogc3RyaW5nLCBvcHRpb25zOiB2ZW5kb3IuU2lnblBzYnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IHBzYnQgPSBiaXRjb2luanNsaWIuUHNidC5mcm9tSGV4KHBzYnRIZXgpO1xuICAgICAgc3dpdGNoIChvcHRpb25zLmFjdGlvbi5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ3NpZ24tYnRjLXNsYXNoaW5nLXRyYW5zYWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gc2lnbldpdGhEZXNjcmlwdG9yKHBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCksIHN0YWtlcktleSkudG9IZXgoKTtcbiAgICAgICAgY2FzZSAnc2lnbi1idGMtdW5ib25kaW5nLXNsYXNoaW5nLXRyYW5zYWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gc2lnbldpdGhEZXNjcmlwdG9yKHBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ0Rlc2NyaXB0b3IoKSwgc3Rha2VyS2V5KS50b0hleCgpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBzaWduaW5nIHN0ZXA6ICR7b3B0aW9ucy5hY3Rpb24ubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgYnkgYnRjLXN0YWtpbmctdHMgdG8gY3JlYXRlIGEgc3Rha2luZyBleHBhbnNpb24gcmVnaXN0cmF0aW9uXG4gICAgICogdHJhbnNhY3Rpb24sIHdoaWNoIHdlIGRvIG5vdCBjdXJyZW50bHkgc3VwcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbkhleCh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvcGVyYXRpb24gZ2V0VHJhbnNhY3Rpb25IZXggKHR4aWQ9JHt0eGlkfSlgKTtcbiAgICB9LFxuICB9O1xufVxudHlwZSBSZXN1bHQgPSB7XG4gIHVuc2lnbmVkRGVsZWdhdGlvbk1zZzogVmFsdWVXaXRoVHlwZVVybDxiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24+O1xuICBzdGFraW5nVHg6IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbjtcbn07XG5cbi8qKlxuICogQHBhcmFtIHN0YWtpbmdLZXkgLSB0aGlzIGlzIHRoZSBzaW5nbGUtc2lnIGtleSB0aGF0IGlzIHVzZWQgZm9yIGNvLXNpZ25pbmcgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcGFyYW0gY2hhbmdlQWRkcmVzcyAtIHRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZSBzdGFraW5nIGtleSBhbmQgaXMgdXNlZCBmb3IgdGhlIGNoYW5nZSBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3Rha2VySW5mbyhcbiAgc3Rha2luZ0tleTogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2UgfCBCdWZmZXIgfCBzdHJpbmcsXG4gIGNoYW5nZUFkZHJlc3M6IHN0cmluZ1xuKTogdmVuZG9yLlN0YWtlckluZm8ge1xuICBpZiAodHlwZW9mIHN0YWtpbmdLZXkgPT09ICdvYmplY3QnICYmICdwdWJsaWNLZXknIGluIHN0YWtpbmdLZXkpIHtcbiAgICBzdGFraW5nS2V5ID0gc3Rha2luZ0tleS5wdWJsaWNLZXk7XG4gIH1cbiAgaWYgKHR5cGVvZiBzdGFraW5nS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHN0YWtpbmdLZXkgPSBCdWZmZXIuZnJvbShzdGFraW5nS2V5LCAnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwdWJsaWNLZXlOb0Nvb3JkSGV4OiB0b1hPbmx5UHVibGljS2V5KHN0YWtpbmdLZXkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Rha2luZyhcbiAgbmV0d29yazogQmFieWxvbk5ldHdvcmtMaWtlLFxuICBibG9ja0hlaWdodDogbnVtYmVyLFxuICBzdGFrZXJCdGNJbmZvOiB2ZW5kb3IuU3Rha2VySW5mbyxcbiAgc3Rha2luZ0lucHV0OiB2ZW5kb3IuU3Rha2luZ0lucHV0cyxcbiAgdmVyc2lvbmVkUGFyYW1zOiB2ZW5kb3IuVmVyc2lvbmVkU3Rha2luZ1BhcmFtc1tdID0gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrKVxuKTogdmVuZG9yLlN0YWtpbmcge1xuICBpZiAoYmxvY2tIZWlnaHQgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhYnlsb24gQlRDIHRpcCBoZWlnaHQgY2Fubm90IGJlIDAnKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgQmFieWxvbiBwYXJhbXMgYmFzZWQgb24gdGhlIEJUQyB0aXAgaGVpZ2h0IGZyb20gQmFieWxvbiBjaGFpblxuICBjb25zdCBwYXJhbXMgPSB2ZW5kb3IuZ2V0QmFieWxvblBhcmFtQnlCdGNIZWlnaHQoYmxvY2tIZWlnaHQsIHZlcnNpb25lZFBhcmFtcyk7XG5cbiAgcmV0dXJuIG5ldyB2ZW5kb3IuU3Rha2luZyhcbiAgICB0b0JpdGNvaW5Kc05ldHdvcmsobmV0d29yayksXG4gICAgc3Rha2VyQnRjSW5mbyxcbiAgICBwYXJhbXMsXG4gICAgc3Rha2luZ0lucHV0LmZpbmFsaXR5UHJvdmlkZXJQa3NOb0Nvb3JkSGV4LFxuICAgIHN0YWtpbmdJbnB1dC5zdGFraW5nVGltZWxvY2tcbiAgKTtcbn1cblxudHlwZSBUcmFuc2FjdGlvbkxpa2UgPVxuICB8IGJpdGNvaW5qc2xpYi5Qc2J0XG4gIHwgYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uXG4gIHwgdXR4b2xpYi5UcmFuc2FjdGlvblxuICB8IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj5cbiAgfCB1dHhvbGliLlBzYnRcbiAgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuXG5mdW5jdGlvbiB0b1N0YWtpbmdUcmFuc2FjdGlvbkZyb21Qc2J0KFxuICBwc2J0OiBiaXRjb2luanNsaWIuUHNidCB8IHV0eG9saWIuUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnRcbik6IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbiB7XG4gIGlmICghKHBzYnQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSkge1xuICAgIHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tQnVmZmVyKHBzYnQudG9CdWZmZXIoKSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgfVxuICBpZiAocHNidCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAvLyBvbmx5IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgaGFzIHRoZSBnZXRVbnNpZ25lZFR4IG1ldGhvZFxuICAgIHJldHVybiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24uZnJvbUhleChwc2J0LmdldFVuc2lnbmVkVHgoKS50b0hleCgpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2lsbGVnYWwgc3RhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3Rha2luZ1RyYW5zYWN0aW9uKHR4OiBUcmFuc2FjdGlvbkxpa2UpOiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24ge1xuICBpZiAodHggaW5zdGFuY2VvZiBiaXRjb2luanNsaWIuUHNidCB8fCB0eCBpbnN0YW5jZW9mIHV0eG9saWIuUHNidCkge1xuICAgIHJldHVybiB0b1N0YWtpbmdUcmFuc2FjdGlvbkZyb21Qc2J0KHR4KTtcbiAgfVxuICByZXR1cm4gYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uLmZyb21IZXgodHgudG9IZXgoKSk7XG59XG5cbi8qKlxuICogQXMgb2YgYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMgdjEuNS43LCB0aGUgQlRDIGRlbGVnYXRpb24gbWVzc2FnZSBjcmVhdGlvbiBmdW5jdGlvbnMgc3VwcG9ydCB0d28gbWVzc2FnZSB0eXBlczpcbiAqIC0gTXNnQ3JlYXRlQlRDRGVsZWdhdGlvblxuICogLSBNc2dCdGNTdGFrZUV4cGFuZFxuICpcbiAqIEJpdEdvIHN0aWxsIG9ubHkgc3VwcG9ydHMgTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbiwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWVzc2FnZSB0eXBlIGhlcmUuXG4gKlxuICogQHBhcmFtIG1zZyAtIHRoZSBtZXNzYWdlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgbWVzc2FnZSBpcyBvZiB0eXBlIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb25cbiAqL1xuZnVuY3Rpb24gaXNNc2dCdGNTdGFrZUV4cGFuZChcbiAgbXNnOiBiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24gfCBiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0J0Y1N0YWtlRXhwYW5kXG4pIHtcbiAgcmV0dXJuICdwcmV2aW91c1N0YWtpbmdUeEhhc2gnIGluIG1zZztcbn1cblxuLypcbiAqIFRoaXMgaXMgbW9zdGx5IGxpZnRlZCBmcm9tXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMvYmxvYi92MC40LjAtcmMuMi9zcmMvc3Rha2luZy9tYW5hZ2VyLnRzI0wxMDAtTDE3MlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaGVyZSB3ZSBhcmUgcmV0dXJuaW5nIGFuIF91bnNpZ25lZF8gZGVsZWdhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGVsZWdhdGlvbk1lc3NhZ2VXaXRoVHJhbnNhY3Rpb24oXG4gIGNoYW5uZWw6ICdkZWxlZ2F0aW9uOmNyZWF0ZScgfCAnZGVsZWdhdGlvbjpyZWdpc3RlcicsXG4gIG1hbmFnZXI6IHZlbmRvci5CYWJ5bG9uQnRjU3Rha2luZ01hbmFnZXIsXG4gIHN0YWtpbmc6IHZlbmRvci5TdGFraW5nLFxuICBzdGFraW5nQW1vdW50U2F0OiBudW1iZXIsXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkxpa2UsXG4gIGJhYnlsb25BZGRyZXNzOiBzdHJpbmdcbik6IFByb21pc2U8VmFsdWVXaXRoVHlwZVVybDxiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24+PiB7XG4gIGlmICghdmVuZG9yLmlzVmFsaWRCYWJ5bG9uQWRkcmVzcyhiYWJ5bG9uQWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQmFieWxvbiBhZGRyZXNzJyk7XG4gIH1cbiAgLy8gQ3JlYXRlIGRlbGVnYXRpb24gbWVzc2FnZSB3aXRob3V0IGluY2x1ZGluZyBpbmNsdXNpb24gcHJvb2ZcbiAgY29uc3QgbXNnID0gYXdhaXQgbWFuYWdlci5jcmVhdGVCdGNEZWxlZ2F0aW9uTXNnKFxuICAgIGNoYW5uZWwsXG4gICAgc3Rha2luZyxcbiAgICB7XG4gICAgICBzdGFraW5nVGltZWxvY2s6IHN0YWtpbmcuc3Rha2luZ1RpbWVsb2NrLFxuICAgICAgZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXg6IHN0YWtpbmcuZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXgsXG4gICAgICBzdGFraW5nQW1vdW50U2F0LFxuICAgIH0sXG4gICAgdG9TdGFraW5nVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pLFxuICAgIGJhYnlsb25BZGRyZXNzLFxuICAgIHN0YWtpbmcuc3Rha2VySW5mbyxcbiAgICBzdGFraW5nLnBhcmFtc1xuICApO1xuXG4gIC8vIEl0IHNob3VsZG4ndCBiZSBwb3NzaWJsZSBmb3IgdXMgdG8gY3JlYXRlIGEgTXNnQnRjU3Rha2VFeHBhbmQgaGVyZSBiZWNhdXNlIHRoYXQgb25seSBnZXRzIGNyZWF0ZWQgd2hlblxuICAvLyB3ZSBwYXNzIGNoYW5uZWwgPSBkZWxlZ2F0aW9uOmV4cGFuZCBpbnRvIGNyZWF0ZUJ0Y0RlbGVnYXRpb25Nc2csIHdoaWNoIHdlIGNhbm5vdCBkby5cbiAgaWYgKGlzTXNnQnRjU3Rha2VFeHBhbmQobXNnLnZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXNnQnRjU3Rha2VFeHBhbmQgaXMgbm90IHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4ubXNnLCB2YWx1ZTogbXNnLnZhbHVlIGFzIGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbiB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRQcmVTdGFrZVJlZ2lzdHJhdGlvbkJhYnlsb25UcmFuc2FjdGlvbldpdGhCdGNQcm92aWRlcihcbiAgYnRjUHJvdmlkZXI6IHZlbmRvci5CdGNQcm92aWRlcixcbiAgbmV0d29yazogYml0Y29pbmpzbGliLk5ldHdvcmssXG4gIHN0YWtlckJ0Y0luZm86IHZlbmRvci5TdGFrZXJJbmZvLFxuICBzdGFraW5nSW5wdXQ6IHZlbmRvci5TdGFraW5nSW5wdXRzLFxuICBiYWJ5bG9uQnRjVGlwSGVpZ2h0OiBudW1iZXIsXG4gIGlucHV0VVRYT3M6IHZlbmRvci5VVFhPW10sXG4gIGZlZVJhdGVTYXRCOiBudW1iZXIsXG4gIGJhYnlsb25BZGRyZXNzOiBzdHJpbmcsXG4gIGNoYW5uZWw6ICdkZWxlZ2F0aW9uOmNyZWF0ZScgfCAnZGVsZWdhdGlvbjpyZWdpc3RlcicsXG4gIHN0YWtpbmdQYXJhbXM6IHZlbmRvci5WZXJzaW9uZWRTdGFraW5nUGFyYW1zW10gPSBnZXRTdGFraW5nUGFyYW1zKG5ldHdvcmspXG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBpZiAoaW5wdXRVVFhPcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0IFVUWE9zIHByb3ZpZGVkJyk7XG4gIH1cbiAgY29uc3QgbWFuYWdlciA9IGNyZWF0ZVN0YWtpbmdNYW5hZ2VyKG5ldHdvcmssIGJ0Y1Byb3ZpZGVyLCBzdGFraW5nUGFyYW1zKTtcbiAgY29uc3Qgc3Rha2luZyA9IGNyZWF0ZVN0YWtpbmcobmV0d29yaywgYmFieWxvbkJ0Y1RpcEhlaWdodCwgc3Rha2VyQnRjSW5mbywgc3Rha2luZ0lucHV0LCBzdGFraW5nUGFyYW1zKTtcbiAgLy8gQ3JlYXRlIHVuc2lnbmVkIHN0YWtpbmcgdHJhbnNhY3Rpb25cbiAgY29uc3QgeyB0cmFuc2FjdGlvbiB9ID0gc3Rha2luZy5jcmVhdGVTdGFraW5nVHJhbnNhY3Rpb24oc3Rha2luZ0lucHV0LnN0YWtpbmdBbW91bnRTYXQsIGlucHV0VVRYT3MsIGZlZVJhdGVTYXRCKTtcbiAgY29uc3QgdW5zaWduZWREZWxlZ2F0aW9uTXNnID0gYXdhaXQgY3JlYXRlRGVsZWdhdGlvbk1lc3NhZ2VXaXRoVHJhbnNhY3Rpb24oXG4gICAgY2hhbm5lbCxcbiAgICBtYW5hZ2VyLFxuICAgIHN0YWtpbmcsXG4gICAgc3Rha2luZ0lucHV0LnN0YWtpbmdBbW91bnRTYXQsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgYmFieWxvbkFkZHJlc3NcbiAgKTtcbiAgcmV0dXJuIHsgdW5zaWduZWREZWxlZ2F0aW9uTXNnLCBzdGFraW5nVHg6IHRyYW5zYWN0aW9uIH07XG59XG4iXX0=
@@ -0,0 +1,48 @@
1
+ /**
2
+ * https://github.com/babylonlabs-io/babylon/tree/main/docs
3
+ * https://github.com/babylonlabs-io/babylon/blob/main/docs/staking-script.md
4
+ * https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/btcstaking/staking.go
5
+ */
6
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
7
+ import { StakingParams } from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
8
+ export declare function getUnspendableKey(): string;
9
+ export declare function sortedKeys(keys: Buffer[]): Buffer[];
10
+ export declare class BabylonDescriptorBuilder {
11
+ stakerKey: Buffer;
12
+ finalityProviderKeys: Buffer[];
13
+ covenantKeys: Buffer[];
14
+ covenantThreshold: number;
15
+ stakingTimeLock: number;
16
+ unbondingTimeLock: number;
17
+ constructor(stakerKey: Buffer, finalityProviderKeys: Buffer[], covenantKeys: Buffer[], covenantThreshold: number, stakingTimeLock: number, unbondingTimeLock: number);
18
+ static fromParams(params: {
19
+ stakerKey: Buffer;
20
+ finalityProviderKeys: Buffer[];
21
+ } & StakingParams): BabylonDescriptorBuilder;
22
+ /** Spend path with the staker key and the staking timelock */
23
+ getStakingTimelockMiniscriptNode(): ast.MiniscriptNode;
24
+ /** Spend path with the staker key and the unbonding timelock */
25
+ getUnbondingTimelockMiniscriptNode(): ast.MiniscriptNode;
26
+ /** Spend path with the staker key and the covenant keys */
27
+ getUnbondingMiniscriptNode(): ast.MiniscriptNode;
28
+ /** Spend path with the finality provider keys and the covenant keys */
29
+ getSlashingMiniscriptNode(): ast.MiniscriptNode;
30
+ /**
31
+ * Creates a descriptor for a staking output.
32
+ *
33
+ * Three spend paths:
34
+ * - the slashing script,
35
+ * - the unbonding script,
36
+ * - the timelocked unstaking script.
37
+ */
38
+ getStakingDescriptor(): Descriptor;
39
+ /**
40
+ * Creates a descriptor for the timelocked unbonding script.
41
+ */
42
+ getUnbondingTimelockDescriptor(): Descriptor;
43
+ /**
44
+ * Creates a descriptor with two script paths: the slashing script and the timelocked unbonding script.
45
+ */
46
+ getUnbondingDescriptor(): Descriptor;
47
+ }
48
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../src/babylon/descriptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAOD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEnD;AAUD,qBAAa,wBAAwB;IAE1B,SAAS,EAAE,MAAM;IACjB,oBAAoB,EAAE,MAAM,EAAE;IAC9B,YAAY,EAAE,MAAM,EAAE;IACtB,iBAAiB,EAAE,MAAM;IACzB,eAAe,EAAE,MAAM;IACvB,iBAAiB,EAAE,MAAM;gBALzB,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM;IAGlC,MAAM,CAAC,UAAU,CACf,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;KAChC,GAAG,aAAa,GAChB,wBAAwB;IAW3B,8DAA8D;IAC9D,gCAAgC,IAAI,GAAG,CAAC,cAAc;IAItD,gEAAgE;IAChE,kCAAkC,IAAI,GAAG,CAAC,cAAc;IAIxD,2DAA2D;IAC3D,0BAA0B,IAAI,GAAG,CAAC,cAAc;IAIhD,uEAAuE;IACvE,yBAAyB,IAAI,GAAG,CAAC,cAAc;IAgB/C;;;;;;;OAOG;IACH,oBAAoB,IAAI,UAAU;IAOlC;;OAEG;IACH,8BAA8B,IAAI,UAAU;IAI5C;;OAEG;IACH,sBAAsB,IAAI,UAAU;CAGrC"}