@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
@@ -1,183 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = exports.CORE_DAO_MAINNET_CHAIN_ID = exports.CORE_DAO_TESTNET_CHAIN_ID = exports.CORE_DAO_TESTNET2_CHAIN_ID = exports.CORE_DAO_DEVNET_CHAIN_ID = void 0;
4
- exports.encodeTimelock = encodeTimelock;
5
- exports.decodeTimelock = decodeTimelock;
6
- exports.createCoreDaoOpReturnOutputScript = createCoreDaoOpReturnOutputScript;
7
- exports.parseCoreDaoOpReturnOutputScript = parseCoreDaoOpReturnOutputScript;
8
- exports.toString = toString;
9
- const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
10
- // Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design
11
- exports.CORE_DAO_DEVNET_CHAIN_ID = Buffer.from('0458', 'hex');
12
- exports.CORE_DAO_TESTNET2_CHAIN_ID = Buffer.from('045a', 'hex');
13
- exports.CORE_DAO_TESTNET_CHAIN_ID = Buffer.from('045b', 'hex');
14
- exports.CORE_DAO_MAINNET_CHAIN_ID = Buffer.from('045c', 'hex');
15
- exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = Buffer.from('5341542b', 'hex');
16
- // https://github.com/bitcoin/bitcoin/blob/5961b23898ee7c0af2626c46d5d70e80136578d3/src/script/script.h#L47
17
- const OP_RETURN_IDENTIFIER = Buffer.from('6a', 'hex');
18
- function encodeTimelock(timelock) {
19
- const buff = Buffer.alloc(4);
20
- buff.writeUInt32LE(timelock);
21
- return buff;
22
- }
23
- function decodeTimelock(buffer) {
24
- if (buffer.length !== 4) {
25
- throw new Error('Invalid timelock buffer length');
26
- }
27
- return buffer.readUInt32LE();
28
- }
29
- /**
30
- * Create a CoreDAO OP_RETURN output script
31
- *
32
- * @param version Version of the OP_RETURN
33
- * @param chainId Chain ID
34
- * @param delegator Delegator address
35
- * @param validator Validator address
36
- * @param fee Fee for relayer
37
- * @param redeemScript Redeem script of the staking output
38
- * @param timelock Timelock for the staking output
39
- * @returns Buffer OP_RETURN buffer
40
- */
41
- function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }) {
42
- /**
43
- * As of v2, this is the construction of the OP_RETURN:
44
- * Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output
45
- *
46
- * The OP_RETURN output should contain all staking information in order, and be composed in the following format:
47
- *
48
- * Satoshi Plus Identifier: (SAT+) 4 bytes
49
- * Version: (0x01) 1 byte
50
- * Chain ID: (0x045b (1115) for Core Testnet and 0x045c (1116) for Core Mainnet) 2 bytes
51
- * Delegator: The Core address to receive rewards, 20 bytes
52
- * Validator: The Core validator address to stake to, 20 bytes
53
- * Fee: Fee for relayer, 1 byte, range [0,255], measured in CORE
54
- * (Optional) RedeemScript
55
- * (Optional) Timelock: 4 bytes
56
- *
57
- * Either RedeemScript or Timelock must be available, the purpose is to allow relayer to
58
- * obtain the RedeemScript and submit transactions on Core. If a RedeemScript is provided,
59
- * relayer will use it directly. Otherwise, relayer will construct the redeem script based
60
- * on the timelock and the information in the transaction inputs.
61
- *
62
- * Note that any length > 80 bytes wont be relayed by nodes and therefore we will throw an error.
63
- */
64
- if (version < 0 || version > 255) {
65
- throw new Error('Invalid version - out of range');
66
- }
67
- const versionBuffer = Buffer.alloc(1, version);
68
- if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ||
69
- chainId.equals(exports.CORE_DAO_TESTNET2_CHAIN_ID) ||
70
- chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID) ||
71
- chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID))) {
72
- throw new Error('Invalid chain ID');
73
- }
74
- if (delegator.length !== 20) {
75
- throw new Error('Invalid delegator address');
76
- }
77
- if (validator.length !== 20) {
78
- throw new Error('Invalid validator address');
79
- }
80
- if (fee < 0 || fee > 255) {
81
- throw new Error('Invalid fee - out of range');
82
- }
83
- const feeBuffer = Buffer.alloc(1, fee);
84
- if (feeBuffer.length !== 1) {
85
- throw new Error('Invalid fee');
86
- }
87
- const redeemScriptBuffer = 'redeemScript' in rest ? rest.redeemScript : Buffer.from([]);
88
- if ('timelock' in rest && (rest.timelock < 0 || rest.timelock > 4294967295)) {
89
- throw new Error('Invalid timelock - out of range');
90
- }
91
- // encode the number into a 4-byte buffer
92
- // if timelock is provided, write it into 32-bit little-endian
93
- const timelockBuffer = 'timelock' in rest ? encodeTimelock(rest.timelock) : Buffer.from([]);
94
- const data = Buffer.concat([
95
- exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER,
96
- versionBuffer,
97
- chainId,
98
- delegator,
99
- validator,
100
- feeBuffer,
101
- redeemScriptBuffer,
102
- timelockBuffer,
103
- ]);
104
- if (data.length > 80) {
105
- throw new Error('OP_RETURN outputs cannot have a length larger than 80 bytes');
106
- }
107
- const payment = utxo_lib_1.payments.embed({
108
- data: [data],
109
- network: chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID) ? utxo_lib_1.networks.testnet : utxo_lib_1.networks.bitcoin,
110
- });
111
- if (!payment.output) {
112
- throw new Error('Unable to create OP_RETURN output');
113
- }
114
- return payment.output;
115
- }
116
- /**
117
- * Parse a CoreDAO OP_RETURN output script into the constituent parts
118
- * @param script
119
- * @returns OpReturnParams
120
- */
121
- function parseCoreDaoOpReturnOutputScript(script) {
122
- if (!script.subarray(0, 1).equals(OP_RETURN_IDENTIFIER)) {
123
- throw new Error('First byte must be an OP_RETURN');
124
- }
125
- const payment = utxo_lib_1.payments.embed({
126
- output: script,
127
- });
128
- const data = payment.data;
129
- if (!data || data.length !== 1) {
130
- throw new Error('Invalid OP_RETURN output');
131
- }
132
- const dataBuffer = data[0];
133
- if (dataBuffer.length > 80) {
134
- throw new Error(`OP_RETURN outputs cannot have a length larger than 80 bytes`);
135
- }
136
- let offset = 0;
137
- // Decode satoshi+ identifier
138
- if (!dataBuffer.subarray(offset, offset + 4).equals(exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER)) {
139
- throw new Error('Invalid satoshi+ identifier');
140
- }
141
- offset += 4;
142
- // Decode version
143
- const version = dataBuffer[offset];
144
- offset += 1;
145
- // Decode chainId
146
- const chainId = Buffer.from(dataBuffer.subarray(offset, offset + 2));
147
- if (!(chainId.equals(exports.CORE_DAO_DEVNET_CHAIN_ID) ||
148
- chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ||
149
- chainId.equals(exports.CORE_DAO_TESTNET2_CHAIN_ID) ||
150
- chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
151
- throw new Error(`Invalid ChainID: ${chainId.toString('hex')}. Must be either 0x0458 (devnet), 0x045b (testnet), or 0x045c (mainnet).`);
152
- }
153
- offset += 2;
154
- // Decode delegator
155
- const delegator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
156
- offset += 20;
157
- // Decode validator
158
- const validator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
159
- offset += 20;
160
- // Decode fee
161
- const fee = dataBuffer[offset];
162
- offset += 1;
163
- const baseParams = { version, chainId, delegator, validator, fee };
164
- // Decode redeemScript or timelock
165
- if (offset === dataBuffer.length - 4) {
166
- return { ...baseParams, timelock: decodeTimelock(dataBuffer.subarray(offset)) };
167
- }
168
- else {
169
- return { ...baseParams, redeemScript: Buffer.from(dataBuffer.subarray(offset)) };
170
- }
171
- }
172
- function toString(params) {
173
- return JSON.stringify({
174
- version: params.version,
175
- chainId: params.chainId.toString('hex'),
176
- delegator: params.delegator.toString('hex'),
177
- validator: params.validator.toString('hex'),
178
- fee: params.fee,
179
- ...('redeemScript' in params ? { redeemScript: params.redeemScript.toString('hex') } : {}),
180
- ...('timelock' in params ? { timelock: params.timelock } : {}),
181
- });
182
- }
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSx3Q0FJQztBQUVELHdDQUtDO0FBd0JELDhFQThGQztBQU9ELDRFQWtFQztBQUVELDRCQVVDO0FBak9ELG1EQUEwRDtBQUUxRCwwRUFBMEU7QUFDN0QsUUFBQSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RCxRQUFBLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLE1BQWM7SUFDM0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJ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QyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUYsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXltZW50cywgbmV0d29ya3MgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbi8vIFNvdXJjZTogaHR0cHM6Ly9kb2NzLmNvcmVkYW8ub3JnL2RvY3MvTGVhcm4vcHJvZHVjdHMvYnRjLXN0YWtpbmcvZGVzaWduXG5leHBvcnQgY29uc3QgQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NTgnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fVEVTVE5FVDJfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YScsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWInLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fTUFJTk5FVF9DSEFJTl9JRCA9IEJ1ZmZlci5mcm9tKCcwNDVjJywgJ2hleCcpO1xuZXhwb3J0IGNvbnN0IENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSID0gQnVmZmVyLmZyb20oJzUzNDE1NDJiJywgJ2hleCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iLzU5NjFiMjM4OThlZTdjMGFmMjYyNmM0NmQ1ZDcwZTgwMTM2NTc4ZDMvc3JjL3NjcmlwdC9zY3JpcHQuaCNMNDdcbmNvbnN0IE9QX1JFVFVSTl9JREVOVElGSUVSID0gQnVmZmVyLmZyb20oJzZhJywgJ2hleCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVGltZWxvY2sodGltZWxvY2s6IG51bWJlcik6IEJ1ZmZlciB7XG4gIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuYWxsb2MoNCk7XG4gIGJ1ZmYud3JpdGVVSW50MzJMRSh0aW1lbG9jayk7XG4gIHJldHVybiBidWZmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVGltZWxvY2soYnVmZmVyOiBCdWZmZXIpOiBudW1iZXIge1xuICBpZiAoYnVmZmVyLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lbG9jayBidWZmZXIgbGVuZ3RoJyk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5yZWFkVUludDMyTEUoKTtcbn1cblxudHlwZSBCYXNlUGFyYW1zID0ge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGNoYWluSWQ6IEJ1ZmZlcjtcbiAgZGVsZWdhdG9yOiBCdWZmZXI7XG4gIHZhbGlkYXRvcjogQnVmZmVyO1xuICBmZWU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE9wUmV0dXJuUGFyYW1zID0gQmFzZVBhcmFtcyAmICh7IHJlZGVlbVNjcmlwdDogQnVmZmVyIH0gfCB7IHRpbWVsb2NrOiBudW1iZXIgfSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29yZURBTyBPUF9SRVRVUk4gb3V0cHV0IHNjcmlwdFxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIFZlcnNpb24gb2YgdGhlIE9QX1JFVFVSTlxuICogQHBhcmFtIGNoYWluSWQgQ2hhaW4gSURcbiAqIEBwYXJhbSBkZWxlZ2F0b3IgRGVsZWdhdG9yIGFkZHJlc3NcbiAqIEBwYXJhbSB2YWxpZGF0b3IgVmFsaWRhdG9yIGFkZHJlc3NcbiAqIEBwYXJhbSBmZWUgRmVlIGZvciByZWxheWVyXG4gKiBAcGFyYW0gcmVkZWVtU2NyaXB0IFJlZGVlbSBzY3JpcHQgb2YgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcGFyYW0gdGltZWxvY2sgVGltZWxvY2sgZm9yIHRoZSBzdGFraW5nIG91dHB1dFxuICogQHJldHVybnMgQnVmZmVyIE9QX1JFVFVSTiBidWZmZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdCh7XG4gIHZlcnNpb24sXG4gIGNoYWluSWQsXG4gIGRlbGVnYXRvcixcbiAgdmFsaWRhdG9yLFxuICBmZWUsXG4gIC4uLnJlc3Rcbn06IE9wUmV0dXJuUGFyYW1zKTogQnVmZmVyIHtcbiAgLyoqXG4gICAqIEFzIG9mIHYyLCB0aGlzIGlzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIE9QX1JFVFVSTjpcbiAgICogU291cmNlOiBodHRwczovL2RvY3MuY29yZWRhby5vcmcvZG9jcy9MZWFybi9wcm9kdWN0cy9idGMtc3Rha2luZy9kZXNpZ24jb3BfcmV0dXJuLW91dHB1dFxuICAgKlxuICAgKiBUaGUgT1BfUkVUVVJOIG91dHB1dCBzaG91bGQgY29udGFpbiBhbGwgc3Rha2luZyBpbmZvcm1hdGlvbiBpbiBvcmRlciwgYW5kIGJlIGNvbXBvc2VkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKlxuICAgKiBTYXRvc2hpIFBsdXMgSWRlbnRpZmllcjogKFNBVCspIDQgYnl0ZXNcbiAgICogVmVyc2lvbjogKDB4MDEpIDEgYnl0ZVxuICAgKiBDaGFpbiBJRDogKDB4MDQ1YiAoMTExNSkgZm9yIENvcmUgVGVzdG5ldCBhbmQgMHgwNDVjICgxMTE2KSBmb3IgQ29yZSBNYWlubmV0KSAyIGJ5dGVzXG4gICAqIERlbGVnYXRvcjogVGhlIENvcmUgYWRkcmVzcyB0byByZWNlaXZlIHJld2FyZHMsIDIwIGJ5dGVzXG4gICAqIFZhbGlkYXRvcjogVGhlIENvcmUgdmFsaWRhdG9yIGFkZHJlc3MgdG8gc3Rha2UgdG8sIDIwIGJ5dGVzXG4gICAqIEZlZTogRmVlIGZvciByZWxheWVyLCAxIGJ5dGUsIHJhbmdlIFswLDI1NV0sIG1lYXN1cmVkIGluIENPUkVcbiAgICogKE9wdGlvbmFsKSBSZWRlZW1TY3JpcHRcbiAgICogKE9wdGlvbmFsKSBUaW1lbG9jazogNCBieXRlc1xuICAgKlxuICAgKiBFaXRoZXIgUmVkZWVtU2NyaXB0IG9yIFRpbWVsb2NrIG11c3QgYmUgYXZhaWxhYmxlLCB0aGUgcHVycG9zZSBpcyB0byBhbGxvdyByZWxheWVyIHRvXG4gICAqIG9idGFpbiB0aGUgUmVkZWVtU2NyaXB0IGFuZCBzdWJtaXQgdHJhbnNhY3Rpb25zIG9uIENvcmUuIElmIGEgUmVkZWVtU2NyaXB0IGlzIHByb3ZpZGVkLFxuICAgKiByZWxheWVyIHdpbGwgdXNlIGl0IGRpcmVjdGx5LiBPdGhlcndpc2UsIHJlbGF5ZXIgd2lsbCBjb25zdHJ1Y3QgdGhlIHJlZGVlbSBzY3JpcHQgYmFzZWRcbiAgICogb24gdGhlIHRpbWVsb2NrIGFuZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRyYW5zYWN0aW9uIGlucHV0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IGFueSBsZW5ndGggPiA4MCBieXRlcyB3b250IGJlIHJlbGF5ZWQgYnkgbm9kZXMgYW5kIHRoZXJlZm9yZSB3ZSB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKi9cbiAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiAyNTUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmVyc2lvbiAtIG91dCBvZiByYW5nZScpO1xuICB9XG4gIGNvbnN0IHZlcnNpb25CdWZmZXIgPSBCdWZmZXIuYWxsb2MoMSwgdmVyc2lvbik7XG5cbiAgaWYgKFxuICAgICEoXG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fVEVTVE5FVDJfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSB8fFxuICAgICAgY2hhaW5JZC5lcXVhbHMoQ09SRV9EQU9fREVWTkVUX0NIQUlOX0lEKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoYWluIElEJyk7XG4gIH1cblxuICBpZiAoZGVsZWdhdG9yLmxlbmd0aCAhPT0gMjApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVsZWdhdG9yIGFkZHJlc3MnKTtcbiAgfVxuXG4gIGlmICh2YWxpZGF0b3IubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWxpZGF0b3IgYWRkcmVzcycpO1xuICB9XG5cbiAgaWYgKGZlZSA8IDAgfHwgZmVlID4gMjU1KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZlZSAtIG91dCBvZiByYW5nZScpO1xuICB9XG4gIGNvbnN0IGZlZUJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxLCBmZWUpO1xuXG4gIGlmIChmZWVCdWZmZXIubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZlZScpO1xuICB9XG5cbiAgY29uc3QgcmVkZWVtU2NyaXB0QnVmZmVyID0gJ3JlZGVlbVNjcmlwdCcgaW4gcmVzdCA/IHJlc3QucmVkZWVtU2NyaXB0IDogQnVmZmVyLmZyb20oW10pO1xuICBpZiAoJ3RpbWVsb2NrJyBpbiByZXN0ICYmIChyZXN0LnRpbWVsb2NrIDwgMCB8fCByZXN0LnRpbWVsb2NrID4gNDI5NDk2NzI5NSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGltZWxvY2sgLSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuXG4gIC8vIGVuY29kZSB0aGUgbnVtYmVyIGludG8gYSA0LWJ5dGUgYnVmZmVyXG4gIC8vIGlmIHRpbWVsb2NrIGlzIHByb3ZpZGVkLCB3cml0ZSBpdCBpbnRvIDMyLWJpdCBsaXR0bGUtZW5kaWFuXG4gIGNvbnN0IHRpbWVsb2NrQnVmZmVyID0gJ3RpbWVsb2NrJyBpbiByZXN0ID8gZW5jb2RlVGltZWxvY2socmVzdC50aW1lbG9jaykgOiBCdWZmZXIuZnJvbShbXSk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUixcbiAgICB2ZXJzaW9uQnVmZmVyLFxuICAgIGNoYWluSWQsXG4gICAgZGVsZWdhdG9yLFxuICAgIHZhbGlkYXRvcixcbiAgICBmZWVCdWZmZXIsXG4gICAgcmVkZWVtU2NyaXB0QnVmZmVyLFxuICAgIHRpbWVsb2NrQnVmZmVyLFxuICBdKTtcbiAgaWYgKGRhdGEubGVuZ3RoID4gODApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09QX1JFVFVSTiBvdXRwdXRzIGNhbm5vdCBoYXZlIGEgbGVuZ3RoIGxhcmdlciB0aGFuIDgwIGJ5dGVzJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50ID0gcGF5bWVudHMuZW1iZWQoe1xuICAgIGRhdGE6IFtkYXRhXSxcbiAgICBuZXR3b3JrOiBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19ERVZORVRfQ0hBSU5fSUQpID8gbmV0d29ya3MudGVzdG5ldCA6IG5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pO1xuICBpZiAoIXBheW1lbnQub3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gY3JlYXRlIE9QX1JFVFVSTiBvdXRwdXQnKTtcbiAgfVxuXG4gIHJldHVybiBwYXltZW50Lm91dHB1dDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHQgaW50byB0aGUgY29uc3RpdHVlbnQgcGFydHNcbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zIE9wUmV0dXJuUGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IE9wUmV0dXJuUGFyYW1zIHtcbiAgaWYgKCFzY3JpcHQuc3ViYXJyYXkoMCwgMSkuZXF1YWxzKE9QX1JFVFVSTl9JREVOVElGSUVSKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYnl0ZSBtdXN0IGJlIGFuIE9QX1JFVFVSTicpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLmVtYmVkKHtcbiAgICBvdXRwdXQ6IHNjcmlwdCxcbiAgfSk7XG4gIGNvbnN0IGRhdGEgPSBwYXltZW50LmRhdGE7XG4gIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBPUF9SRVRVUk4gb3V0cHV0Jyk7XG4gIH1cbiAgY29uc3QgZGF0YUJ1ZmZlciA9IGRhdGFbMF07XG4gIGlmIChkYXRhQnVmZmVyLmxlbmd0aCA+IDgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPUF9SRVRVUk4gb3V0cHV0cyBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBsYXJnZXIgdGhhbiA4MCBieXRlc2ApO1xuICB9XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIC8vIERlY29kZSBzYXRvc2hpKyBpZGVudGlmaWVyXG4gIGlmICghZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDQpLmVxdWFscyhDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2F0b3NoaSsgaWRlbnRpZmllcicpO1xuICB9XG4gIG9mZnNldCArPSA0O1xuXG4gIC8vIERlY29kZSB2ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIC8vIERlY29kZSBjaGFpbklkXG4gIGNvbnN0IGNoYWluSWQgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMikpO1xuICBpZiAoXG4gICAgIShcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX0RFVk5FVF9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQpIHx8XG4gICAgICBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUMl9DSEFJTl9JRCkgfHxcbiAgICAgIGNoYWluSWQuZXF1YWxzKENPUkVfREFPX01BSU5ORVRfQ0hBSU5fSUQpXG4gICAgKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBDaGFpbklEOiAke2NoYWluSWQudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApfS4gTXVzdCBiZSBlaXRoZXIgMHgwNDU4IChkZXZuZXQpLCAweDA0NWIgKHRlc3RuZXQpLCBvciAweDA0NWMgKG1haW5uZXQpLmBcbiAgICApO1xuICB9XG4gIG9mZnNldCArPSAyO1xuXG4gIC8vIERlY29kZSBkZWxlZ2F0b3JcbiAgY29uc3QgZGVsZWdhdG9yID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIwKSk7XG4gIG9mZnNldCArPSAyMDtcblxuICAvLyBEZWNvZGUgdmFsaWRhdG9yXG4gIGNvbnN0IHZhbGlkYXRvciA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyMCkpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gRGVjb2RlIGZlZVxuICBjb25zdCBmZWUgPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIGNvbnN0IGJhc2VQYXJhbXMgPSB7IHZlcnNpb24sIGNoYWluSWQsIGRlbGVnYXRvciwgdmFsaWRhdG9yLCBmZWUgfTtcblxuICAvLyBEZWNvZGUgcmVkZWVtU2NyaXB0IG9yIHRpbWVsb2NrXG4gIGlmIChvZmZzZXQgPT09IGRhdGFCdWZmZXIubGVuZ3RoIC0gNCkge1xuICAgIHJldHVybiB7IC4uLmJhc2VQYXJhbXMsIHRpbWVsb2NrOiBkZWNvZGVUaW1lbG9jayhkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZVBhcmFtcywgcmVkZWVtU2NyaXB0OiBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHBhcmFtczogT3BSZXR1cm5QYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uLFxuICAgIGNoYWluSWQ6IHBhcmFtcy5jaGFpbklkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBkZWxlZ2F0b3I6IHBhcmFtcy5kZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpLFxuICAgIHZhbGlkYXRvcjogcGFyYW1zLnZhbGlkYXRvci50b1N0cmluZygnaGV4JyksXG4gICAgZmVlOiBwYXJhbXMuZmVlLFxuICAgIC4uLigncmVkZWVtU2NyaXB0JyBpbiBwYXJhbXMgPyB7IHJlZGVlbVNjcmlwdDogcGFyYW1zLnJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JykgfSA6IHt9KSxcbiAgICAuLi4oJ3RpbWVsb2NrJyBpbiBwYXJhbXMgPyB7IHRpbWVsb2NrOiBwYXJhbXMudGltZWxvY2sgfSA6IHt9KSxcbiAgfSk7XG59XG4iXX0=
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/coreDao/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAqC,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,cAAc,EAAE,cAAc,GAC7B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBtC"}
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createStakingOutputs = createStakingOutputs;
4
- const opReturn_1 = require("./opReturn");
5
- /**
6
- * Create the staking outputs for a CoreDAO staking transaction. This is the ordering
7
- * in which to add into the transaction.
8
- * @param stakingParams how to create the timelocked stake output
9
- * @param stakingParams.descriptor if stakingParams.index is not provided, then this is assumed to be a `definite` descriptor.
10
- * If stakingParams.index is provided, then this is assumed to be a `derivable` descriptor.
11
- * @param opReturnParams to create the OP_RETURN output
12
- */
13
- function createStakingOutputs(stakingParams, opReturnParams) {
14
- if (stakingParams.descriptor.hasWildcard() && stakingParams.index === undefined) {
15
- throw new Error('Cannot create staking outputs with a wildcard descriptor and no derivation index');
16
- }
17
- const outputScript = Buffer.from(stakingParams.index === undefined
18
- ? stakingParams.descriptor.scriptPubkey()
19
- : stakingParams.descriptor.atDerivationIndex(stakingParams.index).scriptPubkey());
20
- const opReturnScript = (0, opReturn_1.createCoreDaoOpReturnOutputScript)(opReturnParams);
21
- return [
22
- { script: outputScript, amount: stakingParams.amount },
23
- { script: opReturnScript, amount: BigInt(0) },
24
- ];
25
- }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLG9EQXVCQztBQWpDRCx5Q0FBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxhQUlDLEVBQ0QsY0FBOEI7SUFFOUIsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUM5QixhQUFhLENBQUMsS0FBSyxLQUFLLFNBQVM7UUFDL0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFO1FBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FDbkYsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLElBQUEsNENBQWlDLEVBQUMsY0FBYyxDQUFDLENBQUM7SUFFekUsT0FBTztRQUNMLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRTtRQUN0RCxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtLQUM5QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LCBPcFJldHVyblBhcmFtcyB9IGZyb20gJy4vb3BSZXR1cm4nO1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgc3Rha2luZyBvdXRwdXRzIGZvciBhIENvcmVEQU8gc3Rha2luZyB0cmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgb3JkZXJpbmdcbiAqIGluIHdoaWNoIHRvIGFkZCBpbnRvIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zIGhvdyB0byBjcmVhdGUgdGhlIHRpbWVsb2NrZWQgc3Rha2Ugb3V0cHV0XG4gKiBAcGFyYW0gc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yIGlmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIGBkZWZpbml0ZWAgZGVzY3JpcHRvci5cbiAqIElmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlcml2YWJsZWAgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSBvcFJldHVyblBhcmFtcyB0byBjcmVhdGUgdGhlIE9QX1JFVFVSTiBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzKFxuICBzdGFraW5nUGFyYW1zOiB7XG4gICAgYW1vdW50OiBiaWdpbnQ7XG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjtcbiAgICBpbmRleD86IG51bWJlcjtcbiAgfSxcbiAgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zXG4pOiB7IHNjcmlwdDogQnVmZmVyOyBhbW91bnQ6IGJpZ2ludCB9W10ge1xuICBpZiAoc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmhhc1dpbGRjYXJkKCkgJiYgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHN0YWtpbmcgb3V0cHV0cyB3aXRoIGEgd2lsZGNhcmQgZGVzY3JpcHRvciBhbmQgbm8gZGVyaXZhdGlvbiBpbmRleCcpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NyaXB0ID0gQnVmZmVyLmZyb20oXG4gICAgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKVxuICAgICAgOiBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoc3Rha2luZ1BhcmFtcy5pbmRleCkuc2NyaXB0UHVia2V5KClcbiAgKTtcbiAgY29uc3Qgb3BSZXR1cm5TY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQob3BSZXR1cm5QYXJhbXMpO1xuXG4gIHJldHVybiBbXG4gICAgeyBzY3JpcHQ6IG91dHB1dFNjcmlwdCwgYW1vdW50OiBzdGFraW5nUGFyYW1zLmFtb3VudCB9LFxuICAgIHsgc2NyaXB0OiBvcFJldHVyblNjcmlwdCwgYW1vdW50OiBCaWdJbnQoMCkgfSxcbiAgXTtcbn1cbiJdfQ==
@@ -1,3 +0,0 @@
1
- export * as coreDao from './coreDao';
2
- export * from './transaction';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,32 +0,0 @@
1
- import * as utxolib from '@bitgo-beta/utxo-lib';
2
- /**
3
- * Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
4
- *
5
- * Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
6
- * We always add the change address as the last output.
7
- *
8
- * @param rootWalletKeys
9
- * @param unspents
10
- * @param createStakingOutputs
11
- * @param changeAddressInfo
12
- * @param feeRateSatKB
13
- * @param network
14
- */
15
- export declare function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount, }: {
16
- rootWalletKeys: utxolib.bitgo.RootWalletKeys;
17
- unspents: utxolib.bitgo.WalletUnspent<bigint>[];
18
- outputs: {
19
- script: Buffer;
20
- value: bigint;
21
- }[];
22
- changeAddressInfo: {
23
- chain: utxolib.bitgo.ChainCode;
24
- index: number;
25
- address: string;
26
- };
27
- feeRateSatKB: number;
28
- network: utxolib.Network;
29
- skipNonWitnessUtxo?: boolean;
30
- dustAmount?: bigint;
31
- }): utxolib.bitgo.UtxoPsbt;
32
- //# sourceMappingURL=transaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAGhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,cAAc,EACd,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,kBAAkB,EAClB,UAAsB,GACvB,EAAE;IACD,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;IAC7C,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;IAChD,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,iBAAiB,EAAE;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CA0DzB"}
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildFixedWalletStakingPsbt = buildFixedWalletStakingPsbt;
4
- const utxolib = require("@bitgo-beta/utxo-lib");
5
- const unspents_1 = require("@bitgo-beta/unspents");
6
- /**
7
- * Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
8
- *
9
- * Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
10
- * We always add the change address as the last output.
11
- *
12
- * @param rootWalletKeys
13
- * @param unspents
14
- * @param createStakingOutputs
15
- * @param changeAddressInfo
16
- * @param feeRateSatKB
17
- * @param network
18
- */
19
- function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount = BigInt(0), }) {
20
- if (feeRateSatKB < 1000) {
21
- throw new Error('Fee rate must be at least 1 sat/vbyte');
22
- }
23
- if (unspents.length === 0 || outputs.length === 0) {
24
- throw new Error('Must have at least one input and one output');
25
- }
26
- // Check the change address info
27
- const changeScript = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(changeAddressInfo.chain, changeAddressInfo.index).publicKeys, utxolib.bitgo.scriptTypeForChain(changeAddressInfo.chain), network).scriptPubKey;
28
- if (!changeScript.equals(utxolib.addressFormat.toOutputScriptTryFormats(changeAddressInfo.address, network))) {
29
- throw new Error('Change address info does not match the derived change script');
30
- }
31
- const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
32
- utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
33
- const inputAmount = unspents.reduce((sum, unspent) => sum + unspent.value, BigInt(0));
34
- const outputAmount = outputs.reduce((sum, output) => sum + output.value, BigInt(0));
35
- unspents.forEach((unspent) => utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, rootWalletKeys, 'user', 'bitgo', {
36
- isReplaceableByFee: true,
37
- skipNonWitnessUtxo,
38
- }));
39
- outputs.forEach((output) => psbt.addOutput(output));
40
- const fee = Math.ceil((unspents_1.Dimensions.fromPsbt(psbt)
41
- .plus(unspents_1.Dimensions.fromOutput({ script: changeScript }))
42
- .getVSize() *
43
- feeRateSatKB) /
44
- 1000);
45
- const changeAmount = inputAmount - (outputAmount + BigInt(fee));
46
- if (changeAmount < BigInt(0)) {
47
- throw new Error(`Input amount ${inputAmount.toString()} cannot cover the staking amount ${outputAmount} and the fee: ${fee}`);
48
- }
49
- if (changeAmount > dustAmount) {
50
- utxolib.bitgo.addWalletOutputToPsbt(psbt, rootWalletKeys, changeAddressInfo.chain, changeAddressInfo.index, changeAmount);
51
- }
52
- return psbt;
53
- }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsa0VBbUZDO0FBbkdELGdEQUFnRDtBQUNoRCxtREFBa0Q7QUFFbEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsRUFDMUMsY0FBYyxFQUNkLFFBQVEsRUFDUixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBaUJ2QjtJQUNDLElBQUksWUFBWSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUNyRSxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFDbEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFDekQsT0FBTyxDQUNSLENBQUMsWUFBWSxDQUFDO0lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdHLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRW5ELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtRQUNuRixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLGtCQUFrQjtLQUNuQixDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUNuQixDQUFDLHFCQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUN2QixJQUFJLENBQUMscUJBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztTQUNyRCxRQUFRLEVBQUU7UUFDWCxZQUFZLENBQUM7UUFDYixJQUFJLENBQ1AsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLFdBQVcsR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLGdCQUFnQixXQUFXLENBQUMsUUFBUSxFQUFFLG9DQUFvQyxZQUFZLGtCQUFrQixHQUFHLEVBQUUsQ0FDOUcsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFlBQVksR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxJQUFJLEVBQ0osY0FBYyxFQUNkLGlCQUFpQixDQUFDLEtBQUssRUFDdkIsaUJBQWlCLENBQUMsS0FBSyxFQUN2QixZQUFZLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28tYmV0YS91bnNwZW50cyc7XG5cbi8qKlxuICogQnVpbGQgYSBzdGFraW5nIHRyYW5zYWN0aW9uIGZvciBhIHdhbGxldCB0aGF0IGFzc3VtZXMgMi1vZi0zIG11bHRpc2lnIGZvciB0aGUgaW5wdXRzXG4gKlxuICogR2l2ZW4gdGhlIGlucHV0cyBhbmQgdGhlIHN0YWtpbmcgb3V0cHV0cywgd2Ugd2lsbCBjcmVhdGUgdGhlIFBTQlQgd2l0aCB0aGUgZGVzaXJlZCBmZWUgcmF0ZS5cbiAqIFdlIGFsd2F5cyBhZGQgdGhlIGNoYW5nZSBhZGRyZXNzIGFzIHRoZSBsYXN0IG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXNcbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIGNyZWF0ZVN0YWtpbmdPdXRwdXRzXG4gKiBAcGFyYW0gY2hhbmdlQWRkcmVzc0luZm9cbiAqIEBwYXJhbSBmZWVSYXRlU2F0S0JcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpeGVkV2FsbGV0U3Rha2luZ1BzYnQoe1xuICByb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHMsXG4gIG91dHB1dHMsXG4gIGNoYW5nZUFkZHJlc3NJbmZvLFxuICBmZWVSYXRlU2F0S0IsXG4gIG5ldHdvcmssXG4gIHNraXBOb25XaXRuZXNzVXR4byxcbiAgZHVzdEFtb3VudCA9IEJpZ0ludCgwKSxcbn06IHtcbiAgcm9vdFdhbGxldEtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG4gIHVuc3BlbnRzOiB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8YmlnaW50PltdO1xuICBvdXRwdXRzOiB7XG4gICAgc2NyaXB0OiBCdWZmZXI7XG4gICAgdmFsdWU6IGJpZ2ludDtcbiAgfVtdO1xuICBjaGFuZ2VBZGRyZXNzSW5mbzoge1xuICAgIGNoYWluOiB1dHhvbGliLmJpdGdvLkNoYWluQ29kZTtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgfTtcbiAgZmVlUmF0ZVNhdEtCOiBudW1iZXI7XG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaztcbiAgc2tpcE5vbldpdG5lc3NVdHhvPzogYm9vbGVhbjtcbiAgZHVzdEFtb3VudD86IGJpZ2ludDtcbn0pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgaWYgKGZlZVJhdGVTYXRLQiA8IDEwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlZSByYXRlIG11c3QgYmUgYXQgbGVhc3QgMSBzYXQvdmJ5dGUnKTtcbiAgfVxuICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwIHx8IG91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0Jyk7XG4gIH1cblxuICAvLyBDaGVjayB0aGUgY2hhbmdlIGFkZHJlc3MgaW5mb1xuICBjb25zdCBjaGFuZ2VTY3JpcHQgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhcbiAgICByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYW5nZUFkZHJlc3NJbmZvLmNoYWluLCBjaGFuZ2VBZGRyZXNzSW5mby5pbmRleCkucHVibGljS2V5cyxcbiAgICB1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFuZ2VBZGRyZXNzSW5mby5jaGFpbiksXG4gICAgbmV0d29ya1xuICApLnNjcmlwdFB1YktleTtcbiAgaWYgKCFjaGFuZ2VTY3JpcHQuZXF1YWxzKHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdFRyeUZvcm1hdHMoY2hhbmdlQWRkcmVzc0luZm8uYWRkcmVzcywgbmV0d29yaykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaGFuZ2UgYWRkcmVzcyBpbmZvIGRvZXMgbm90IG1hdGNoIHRoZSBkZXJpdmVkIGNoYW5nZSBzY3JpcHQnKTtcbiAgfVxuXG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCByb290V2FsbGV0S2V5cyk7XG5cbiAgY29uc3QgaW5wdXRBbW91bnQgPSB1bnNwZW50cy5yZWR1Y2UoKHN1bSwgdW5zcGVudCkgPT4gc3VtICsgdW5zcGVudC52YWx1ZSwgQmlnSW50KDApKTtcbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gb3V0cHV0cy5yZWR1Y2UoKHN1bSwgb3V0cHV0KSA9PiBzdW0gKyBvdXRwdXQudmFsdWUsIEJpZ0ludCgwKSk7XG5cbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT5cbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcm9vdFdhbGxldEtleXMsICd1c2VyJywgJ2JpdGdvJywge1xuICAgICAgaXNSZXBsYWNlYWJsZUJ5RmVlOiB0cnVlLFxuICAgICAgc2tpcE5vbldpdG5lc3NVdHhvLFxuICAgIH0pXG4gICk7XG4gIG91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiBwc2J0LmFkZE91dHB1dChvdXRwdXQpKTtcblxuICBjb25zdCBmZWUgPSBNYXRoLmNlaWwoXG4gICAgKERpbWVuc2lvbnMuZnJvbVBzYnQocHNidClcbiAgICAgIC5wbHVzKERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogY2hhbmdlU2NyaXB0IH0pKVxuICAgICAgLmdldFZTaXplKCkgKlxuICAgICAgZmVlUmF0ZVNhdEtCKSAvXG4gICAgICAxMDAwXG4gICk7XG5cbiAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRBbW91bnQgLSAob3V0cHV0QW1vdW50ICsgQmlnSW50KGZlZSkpO1xuICBpZiAoY2hhbmdlQW1vdW50IDwgQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYElucHV0IGFtb3VudCAke2lucHV0QW1vdW50LnRvU3RyaW5nKCl9IGNhbm5vdCBjb3ZlciB0aGUgc3Rha2luZyBhbW91bnQgJHtvdXRwdXRBbW91bnR9IGFuZCAgdGhlIGZlZTogJHtmZWV9YFxuICAgICk7XG4gIH1cblxuICBpZiAoY2hhbmdlQW1vdW50ID4gZHVzdEFtb3VudCkge1xuICAgIHV0eG9saWIuYml0Z28uYWRkV2FsbGV0T3V0cHV0VG9Qc2J0KFxuICAgICAgcHNidCxcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAgY2hhbmdlQWRkcmVzc0luZm8uY2hhaW4sXG4gICAgICBjaGFuZ2VBZGRyZXNzSW5mby5pbmRleCxcbiAgICAgIGNoYW5nZUFtb3VudFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcHNidDtcbn1cbiJdfQ==
File without changes
File without changes
File without changes
File without changes
File without changes