@bitgo-beta/utxo-staking 1.1.1-beta.9 → 1.1.1-beta.900

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 (139) 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/{src → cjs/src}/coreDao/descriptor.d.ts +4 -4
  37. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  38. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  39. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  40. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  41. package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +5 -5
  42. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  43. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  44. package/dist/{src → cjs/src}/coreDao/transaction.d.ts +16 -9
  45. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  46. package/dist/cjs/src/coreDao/transaction.js +34 -0
  47. package/dist/cjs/src/index.d.ts +3 -0
  48. package/dist/cjs/src/index.d.ts.map +1 -0
  49. package/dist/cjs/src/index.js +39 -0
  50. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  51. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  52. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  53. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  54. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  55. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  56. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  57. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  58. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  59. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  60. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  61. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  62. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  63. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  64. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  65. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  66. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  67. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  68. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  69. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  70. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  71. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  72. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  73. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  74. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  75. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  76. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  77. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  78. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  79. package/dist/esm/babylon/delegationMessage.d.ts.map +1 -0
  80. package/dist/esm/babylon/delegationMessage.js +239 -0
  81. package/dist/esm/babylon/descriptor.d.ts +48 -0
  82. package/dist/esm/babylon/descriptor.d.ts.map +1 -0
  83. package/dist/esm/babylon/descriptor.js +91 -0
  84. package/dist/esm/babylon/index.d.ts +8 -0
  85. package/dist/esm/babylon/index.d.ts.map +1 -0
  86. package/dist/esm/babylon/index.js +13 -0
  87. package/dist/esm/babylon/network.d.ts +7 -0
  88. package/dist/esm/babylon/network.d.ts.map +1 -0
  89. package/dist/esm/babylon/network.js +29 -0
  90. package/dist/esm/babylon/params.mainnet.json +152 -0
  91. package/dist/esm/babylon/params.testnet.json +212 -0
  92. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  93. package/dist/esm/babylon/parseDescriptor.d.ts.map +1 -0
  94. package/dist/esm/babylon/parseDescriptor.js +155 -0
  95. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  96. package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
  97. package/dist/esm/babylon/stakingManager.js +83 -0
  98. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  99. package/dist/esm/babylon/stakingParams.d.ts.map +1 -0
  100. package/dist/esm/babylon/stakingParams.js +86 -0
  101. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  102. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  103. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  104. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  105. package/dist/esm/babylon/undelegation/index.d.ts.map +1 -0
  106. package/dist/esm/babylon/undelegation/index.js +3 -0
  107. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  108. package/dist/esm/babylon/undelegation/unbonding.d.ts.map +1 -0
  109. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  110. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  111. package/dist/esm/coreDao/descriptor.d.ts.map +1 -0
  112. package/dist/esm/coreDao/descriptor.js +35 -0
  113. package/dist/esm/coreDao/index.d.ts +4 -0
  114. package/dist/esm/coreDao/index.js +4 -0
  115. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  116. package/dist/esm/coreDao/opReturn.d.ts.map +1 -0
  117. package/dist/esm/coreDao/opReturn.js +175 -0
  118. package/dist/esm/coreDao/transaction.d.ts +28 -0
  119. package/dist/esm/coreDao/transaction.d.ts.map +1 -0
  120. package/dist/esm/coreDao/transaction.js +30 -0
  121. package/dist/esm/index.d.ts +3 -0
  122. package/dist/{src → esm}/index.d.ts.map +1 -1
  123. package/dist/esm/index.js +3 -0
  124. package/package.json +42 -12
  125. package/.eslintignore +0 -5
  126. package/.mocharc.yml +0 -8
  127. package/CHANGELOG.md +0 -24
  128. package/dist/src/coreDao/descriptor.d.ts.map +0 -1
  129. package/dist/src/coreDao/descriptor.js +0 -31
  130. package/dist/src/coreDao/opReturn.d.ts.map +0 -1
  131. package/dist/src/coreDao/opReturn.js +0 -175
  132. package/dist/src/coreDao/transaction.d.ts.map +0 -1
  133. package/dist/src/coreDao/transaction.js +0 -27
  134. package/dist/src/index.d.ts +0 -3
  135. package/dist/src/transaction.d.ts +0 -34
  136. package/dist/src/transaction.d.ts.map +0 -1
  137. package/dist/src/transaction.js +0 -55
  138. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  139. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
@@ -1,175 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toString = exports.parseCoreDaoOpReturnOutputScript = exports.createCoreDaoOpReturnOutputScript = exports.decodeTimelock = exports.encodeTimelock = exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = exports.CORE_DAO_MAINNET_CHAIN_ID = exports.CORE_DAO_TESTNET_CHAIN_ID = void 0;
4
- const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
5
- // Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design
6
- exports.CORE_DAO_TESTNET_CHAIN_ID = Buffer.from('045b', 'hex');
7
- exports.CORE_DAO_MAINNET_CHAIN_ID = Buffer.from('045c', 'hex');
8
- exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER = Buffer.from('5341542b', 'hex');
9
- // https://github.com/bitcoin/bitcoin/blob/5961b23898ee7c0af2626c46d5d70e80136578d3/src/script/script.h#L47
10
- const OP_RETURN_IDENTIFIER = Buffer.from('6a', 'hex');
11
- function encodeTimelock(timelock) {
12
- const buff = Buffer.alloc(4);
13
- buff.writeUInt32LE(timelock);
14
- return buff;
15
- }
16
- exports.encodeTimelock = encodeTimelock;
17
- function decodeTimelock(buffer) {
18
- if (buffer.length !== 4) {
19
- throw new Error('Invalid timelock buffer length');
20
- }
21
- return buffer.readUInt32LE();
22
- }
23
- exports.decodeTimelock = decodeTimelock;
24
- /**
25
- * Create a CoreDAO OP_RETURN output script
26
- *
27
- * @param version Version of the OP_RETURN
28
- * @param chainId Chain ID
29
- * @param delegator Delegator address
30
- * @param validator Validator address
31
- * @param fee Fee for relayer
32
- * @param redeemScript Redeem script of the staking output
33
- * @param timelock Timelock for the staking output
34
- * @returns Buffer OP_RETURN buffer
35
- */
36
- function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }) {
37
- /**
38
- * As of v2, this is the construction of the OP_RETURN:
39
- * Source: https://docs.coredao.org/docs/Learn/products/btc-staking/design#op_return-output
40
- *
41
- * The OP_RETURN output should contain all staking information in order, and be composed in the following format:
42
- *
43
- * Satoshi Plus Identifier: (SAT+) 4 bytes
44
- * Version: (0x01) 1 byte
45
- * Chain ID: (0x045b (1115) for Core Testnet and 0x045c (1116) for Core Mainnet) 2 bytes
46
- * Delegator: The Core address to receive rewards, 20 bytes
47
- * Validator: The Core validator address to stake to, 20 bytes
48
- * Fee: Fee for relayer, 1 byte, range [0,255], measured in CORE
49
- * (Optional) RedeemScript
50
- * (Optional) Timelock: 4 bytes
51
- *
52
- * Either RedeemScript or Timelock must be available, the purpose is to allow relayer to
53
- * obtain the RedeemScript and submit transactions on Core. If a RedeemScript is provided,
54
- * relayer will use it directly. Otherwise, relayer will construct the redeem script based
55
- * on the timelock and the information in the transaction inputs.
56
- *
57
- * Note that any length > 80 bytes wont be relayed by nodes and therefore we will throw an error.
58
- */
59
- if (version < 0 || version > 255) {
60
- throw new Error('Invalid version - out of range');
61
- }
62
- const versionBuffer = Buffer.alloc(1, version);
63
- if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) || chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
64
- throw new Error('Invalid chain ID');
65
- }
66
- if (delegator.length !== 20) {
67
- throw new Error('Invalid delegator address');
68
- }
69
- if (validator.length !== 20) {
70
- throw new Error('Invalid validator address');
71
- }
72
- if (fee < 0 || fee > 255) {
73
- throw new Error('Invalid fee - out of range');
74
- }
75
- const feeBuffer = Buffer.alloc(1, fee);
76
- if (feeBuffer.length !== 1) {
77
- throw new Error('Invalid fee');
78
- }
79
- const redeemScriptBuffer = 'redeemScript' in rest ? rest.redeemScript : Buffer.from([]);
80
- if ('timelock' in rest && (rest.timelock < 0 || rest.timelock > 4294967295)) {
81
- throw new Error('Invalid timelock - out of range');
82
- }
83
- // encode the number into a 4-byte buffer
84
- // if timelock is provided, write it into 32-bit little-endian
85
- const timelockBuffer = 'timelock' in rest ? encodeTimelock(rest.timelock) : Buffer.from([]);
86
- const data = Buffer.concat([
87
- exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER,
88
- versionBuffer,
89
- chainId,
90
- delegator,
91
- validator,
92
- feeBuffer,
93
- redeemScriptBuffer,
94
- timelockBuffer,
95
- ]);
96
- if (data.length > 80) {
97
- throw new Error('OP_RETURN outputs cannot have a length larger than 80 bytes');
98
- }
99
- const payment = utxo_lib_1.payments.embed({
100
- data: [data],
101
- network: chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) ? utxo_lib_1.networks.testnet : utxo_lib_1.networks.bitcoin,
102
- });
103
- if (!payment.output) {
104
- throw new Error('Unable to create OP_RETURN output');
105
- }
106
- return payment.output;
107
- }
108
- exports.createCoreDaoOpReturnOutputScript = createCoreDaoOpReturnOutputScript;
109
- /**
110
- * Parse a CoreDAO OP_RETURN output script into the constituent parts
111
- * @param script
112
- * @returns OpReturnParams
113
- */
114
- function parseCoreDaoOpReturnOutputScript(script) {
115
- if (!script.subarray(0, 1).equals(OP_RETURN_IDENTIFIER)) {
116
- throw new Error('First byte must be an OP_RETURN');
117
- }
118
- const payment = utxo_lib_1.payments.embed({
119
- output: script,
120
- });
121
- const data = payment.data;
122
- if (!data || data.length !== 1) {
123
- throw new Error('Invalid OP_RETURN output');
124
- }
125
- const dataBuffer = data[0];
126
- if (dataBuffer.length > 80) {
127
- throw new Error(`OP_RETURN outputs cannot have a length larger than 80 bytes`);
128
- }
129
- let offset = 0;
130
- // Decode satoshi+ identifier
131
- if (!dataBuffer.subarray(offset, offset + 4).equals(exports.CORE_DAO_SATOSHI_PLUS_IDENTIFIER)) {
132
- throw new Error('Invalid satoshi+ identifier');
133
- }
134
- offset += 4;
135
- // Decode version
136
- const version = dataBuffer[offset];
137
- offset += 1;
138
- // Decode chainId
139
- const chainId = Buffer.from(dataBuffer.subarray(offset, offset + 2));
140
- if (!(chainId.equals(exports.CORE_DAO_TESTNET_CHAIN_ID) || chainId.equals(exports.CORE_DAO_MAINNET_CHAIN_ID))) {
141
- throw new Error(`Invalid ChainID: ${chainId.toString('hex')}. Must be either 0x045b (testnet) or 0x045c (mainnet).`);
142
- }
143
- offset += 2;
144
- // Decode delegator
145
- const delegator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
146
- offset += 20;
147
- // Decode validator
148
- const validator = Buffer.from(dataBuffer.subarray(offset, offset + 20));
149
- offset += 20;
150
- // Decode fee
151
- const fee = dataBuffer[offset];
152
- offset += 1;
153
- const baseParams = { version, chainId, delegator, validator, fee };
154
- // Decode redeemScript or timelock
155
- if (offset === dataBuffer.length - 4) {
156
- return { ...baseParams, timelock: decodeTimelock(dataBuffer.subarray(offset)) };
157
- }
158
- else {
159
- return { ...baseParams, redeemScript: Buffer.from(dataBuffer.subarray(offset)) };
160
- }
161
- }
162
- exports.parseCoreDaoOpReturnOutputScript = parseCoreDaoOpReturnOutputScript;
163
- function toString(params) {
164
- return JSON.stringify({
165
- version: params.version,
166
- chainId: params.chainId.toString('hex'),
167
- delegator: params.delegator.toString('hex'),
168
- validator: params.validator.toString('hex'),
169
- fee: params.fee,
170
- ...('redeemScript' in params ? { redeemScript: params.redeemScript.toString('hex') } : {}),
171
- ...('timelock' in params ? { timelock: params.timelock } : {}),
172
- });
173
- }
174
- exports.toString = toString;
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BSZXR1cm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9vcFJldHVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBMEQ7QUFFMUQsMEVBQTBFO0FBQzdELFFBQUEseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsUUFBQSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFBLGdDQUFnQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9FLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXRELFNBQWdCLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBSkQsd0NBSUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBYztJQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztLQUNuRDtJQUNELE9BQU8sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFMRCx3Q0FLQztBQVlEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsRUFDaEQsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsRUFDSCxHQUFHLElBQUksRUFDUTtJQUNmOzs7Ozs7Ozs7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QU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRjtBQUNILENBQUM7QUF6REQsNEVBeURDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLE1BQXNCO0lBQzdDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN2QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzNDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO1FBQ2YsR0FBRyxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixHQUFHLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVZELDRCQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF5bWVudHMsIG5ldHdvcmtzIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG4vLyBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnblxuZXhwb3J0IGNvbnN0IENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQgPSBCdWZmZXIuZnJvbSgnMDQ1YicsICdoZXgnKTtcbmV4cG9ydCBjb25zdCBDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEID0gQnVmZmVyLmZyb20oJzA0NWMnLCAnaGV4Jyk7XG5leHBvcnQgY29uc3QgQ09SRV9EQU9fU0FUT1NISV9QTFVTX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNTM0MTU0MmInLCAnaGV4Jyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXRjb2luL2Jsb2IvNTk2MWIyMzg5OGVlN2MwYWYyNjI2YzQ2ZDVkNzBlODAxMzY1NzhkMy9zcmMvc2NyaXB0L3NjcmlwdC5oI0w0N1xuY29uc3QgT1BfUkVUVVJOX0lERU5USUZJRVIgPSBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVUaW1lbG9jayh0aW1lbG9jazogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYnVmZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgYnVmZi53cml0ZVVJbnQzMkxFKHRpbWVsb2NrKTtcbiAgcmV0dXJuIGJ1ZmY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUaW1lbG9jayhidWZmZXI6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGlmIChidWZmZXIubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRpbWVsb2NrIGJ1ZmZlciBsZW5ndGgnKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyLnJlYWRVSW50MzJMRSgpO1xufVxuXG50eXBlIEJhc2VQYXJhbXMgPSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgY2hhaW5JZDogQnVmZmVyO1xuICBkZWxlZ2F0b3I6IEJ1ZmZlcjtcbiAgdmFsaWRhdG9yOiBCdWZmZXI7XG4gIGZlZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgT3BSZXR1cm5QYXJhbXMgPSBCYXNlUGFyYW1zICYgKHsgcmVkZWVtU2NyaXB0OiBCdWZmZXIgfSB8IHsgdGltZWxvY2s6IG51bWJlciB9KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb3JlREFPIE9QX1JFVFVSTiBvdXRwdXQgc2NyaXB0XG4gKlxuICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgT1BfUkVUVVJOXG4gKiBAcGFyYW0gY2hhaW5JZCBDaGFpbiBJRFxuICogQHBhcmFtIGRlbGVnYXRvciBEZWxlZ2F0b3IgYWRkcmVzc1xuICogQHBhcmFtIHZhbGlkYXRvciBWYWxpZGF0b3IgYWRkcmVzc1xuICogQHBhcmFtIGZlZSBGZWUgZm9yIHJlbGF5ZXJcbiAqIEBwYXJhbSByZWRlZW1TY3JpcHQgUmVkZWVtIHNjcmlwdCBvZiB0aGUgc3Rha2luZyBvdXRwdXRcbiAqIEBwYXJhbSB0aW1lbG9jayBUaW1lbG9jayBmb3IgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcmV0dXJucyBCdWZmZXIgT1BfUkVUVVJOIGJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0KHtcbiAgdmVyc2lvbixcbiAgY2hhaW5JZCxcbiAgZGVsZWdhdG9yLFxuICB2YWxpZGF0b3IsXG4gIGZlZSxcbiAgLi4ucmVzdFxufTogT3BSZXR1cm5QYXJhbXMpOiBCdWZmZXIge1xuICAvKipcbiAgICogQXMgb2YgdjIsIHRoaXMgaXMgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgT1BfUkVUVVJOOlxuICAgKiBTb3VyY2U6IGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNvcF9yZXR1cm4tb3V0cHV0XG4gICAqXG4gICAqIFRoZSBPUF9SRVRVUk4gb3V0cHV0IHNob3VsZCBjb250YWluIGFsbCBzdGFraW5nIGluZm9ybWF0aW9uIGluIG9yZGVyLCBhbmQgYmUgY29tcG9zZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqXG4gICAqIFNhdG9zaGkgUGx1cyBJZGVudGlmaWVyOiAoU0FUKykgNCBieXRlc1xuICAgKiBWZXJzaW9uOiAoMHgwMSkgMSBieXRlXG4gICAqIENoYWluIElEOiAoMHgwNDViICgxMTE1KSBmb3IgQ29yZSBUZXN0bmV0IGFuZCAweDA0NWMgKDExMTYpIGZvciBDb3JlIE1haW5uZXQpIDIgYnl0ZXNcbiAgICogRGVsZWdhdG9yOiBUaGUgQ29yZSBhZGRyZXNzIHRvIHJlY2VpdmUgcmV3YXJkcywgMjAgYnl0ZXNcbiAgICogVmFsaWRhdG9yOiBUaGUgQ29yZSB2YWxpZGF0b3IgYWRkcmVzcyB0byBzdGFrZSB0bywgMjAgYnl0ZXNcbiAgICogRmVlOiBGZWUgZm9yIHJlbGF5ZXIsIDEgYnl0ZSwgcmFuZ2UgWzAsMjU1XSwgbWVhc3VyZWQgaW4gQ09SRVxuICAgKiAoT3B0aW9uYWwpIFJlZGVlbVNjcmlwdFxuICAgKiAoT3B0aW9uYWwpIFRpbWVsb2NrOiA0IGJ5dGVzXG4gICAqXG4gICAqIEVpdGhlciBSZWRlZW1TY3JpcHQgb3IgVGltZWxvY2sgbXVzdCBiZSBhdmFpbGFibGUsIHRoZSBwdXJwb3NlIGlzIHRvIGFsbG93IHJlbGF5ZXIgdG9cbiAgICogb2J0YWluIHRoZSBSZWRlZW1TY3JpcHQgYW5kIHN1Ym1pdCB0cmFuc2FjdGlvbnMgb24gQ29yZS4gSWYgYSBSZWRlZW1TY3JpcHQgaXMgcHJvdmlkZWQsXG4gICAqIHJlbGF5ZXIgd2lsbCB1c2UgaXQgZGlyZWN0bHkuIE90aGVyd2lzZSwgcmVsYXllciB3aWxsIGNvbnN0cnVjdCB0aGUgcmVkZWVtIHNjcmlwdCBiYXNlZFxuICAgKiBvbiB0aGUgdGltZWxvY2sgYW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYW55IGxlbmd0aCA+IDgwIGJ5dGVzIHdvbnQgYmUgcmVsYXllZCBieSBub2RlcyBhbmQgdGhlcmVmb3JlIHdlIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqL1xuICBpZiAodmVyc2lvbiA8IDAgfHwgdmVyc2lvbiA+IDI1NSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2ZXJzaW9uIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgdmVyc2lvbkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxLCB2ZXJzaW9uKTtcblxuICBpZiAoIShjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fCBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhaW4gSUQnKTtcbiAgfVxuXG4gIGlmIChkZWxlZ2F0b3IubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZWxlZ2F0b3IgYWRkcmVzcycpO1xuICB9XG5cbiAgaWYgKHZhbGlkYXRvci5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbGlkYXRvciBhZGRyZXNzJyk7XG4gIH1cblxuICBpZiAoZmVlIDwgMCB8fCBmZWUgPiAyNTUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlIC0gb3V0IG9mIHJhbmdlJyk7XG4gIH1cbiAgY29uc3QgZmVlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDEsIGZlZSk7XG5cbiAgaWYgKGZlZUJ1ZmZlci5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmVlJyk7XG4gIH1cblxuICBjb25zdCByZWRlZW1TY3JpcHRCdWZmZXIgPSAncmVkZWVtU2NyaXB0JyBpbiByZXN0ID8gcmVzdC5yZWRlZW1TY3JpcHQgOiBCdWZmZXIuZnJvbShbXSk7XG4gIGlmICgndGltZWxvY2snIGluIHJlc3QgJiYgKHJlc3QudGltZWxvY2sgPCAwIHx8IHJlc3QudGltZWxvY2sgPiA0Mjk0OTY3Mjk1KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0aW1lbG9jayAtIG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgLy8gZW5jb2RlIHRoZSBudW1iZXIgaW50byBhIDQtYnl0ZSBidWZmZXJcbiAgLy8gaWYgdGltZWxvY2sgaXMgcHJvdmlkZWQsIHdyaXRlIGl0IGludG8gMzItYml0IGxpdHRsZS1lbmRpYW5cbiAgY29uc3QgdGltZWxvY2tCdWZmZXIgPSAndGltZWxvY2snIGluIHJlc3QgPyBlbmNvZGVUaW1lbG9jayhyZXN0LnRpbWVsb2NrKSA6IEJ1ZmZlci5mcm9tKFtdKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIENPUkVfREFPX1NBVE9TSElfUExVU19JREVOVElGSUVSLFxuICAgIHZlcnNpb25CdWZmZXIsXG4gICAgY2hhaW5JZCxcbiAgICBkZWxlZ2F0b3IsXG4gICAgdmFsaWRhdG9yLFxuICAgIGZlZUJ1ZmZlcixcbiAgICByZWRlZW1TY3JpcHRCdWZmZXIsXG4gICAgdGltZWxvY2tCdWZmZXIsXG4gIF0pO1xuICBpZiAoZGF0YS5sZW5ndGggPiA4MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignT1BfUkVUVVJOIG91dHB1dHMgY2Fubm90IGhhdmUgYSBsZW5ndGggbGFyZ2VyIHRoYW4gODAgYnl0ZXMnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5lbWJlZCh7XG4gICAgZGF0YTogW2RhdGFdLFxuICAgIG5ldHdvcms6IGNoYWluSWQuZXF1YWxzKENPUkVfREFPX1RFU1RORVRfQ0hBSU5fSUQpID8gbmV0d29ya3MudGVzdG5ldCA6IG5ldHdvcmtzLmJpdGNvaW4sXG4gIH0pO1xuICBpZiAoIXBheW1lbnQub3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gY3JlYXRlIE9QX1JFVFVSTiBvdXRwdXQnKTtcbiAgfVxuXG4gIHJldHVybiBwYXltZW50Lm91dHB1dDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIENvcmVEQU8gT1BfUkVUVVJOIG91dHB1dCBzY3JpcHQgaW50byB0aGUgY29uc3RpdHVlbnQgcGFydHNcbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zIE9wUmV0dXJuUGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvcmVEYW9PcFJldHVybk91dHB1dFNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IE9wUmV0dXJuUGFyYW1zIHtcbiAgaWYgKCFzY3JpcHQuc3ViYXJyYXkoMCwgMSkuZXF1YWxzKE9QX1JFVFVSTl9JREVOVElGSUVSKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYnl0ZSBtdXN0IGJlIGFuIE9QX1JFVFVSTicpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLmVtYmVkKHtcbiAgICBvdXRwdXQ6IHNjcmlwdCxcbiAgfSk7XG4gIGNvbnN0IGRhdGEgPSBwYXltZW50LmRhdGE7XG4gIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBPUF9SRVRVUk4gb3V0cHV0Jyk7XG4gIH1cbiAgY29uc3QgZGF0YUJ1ZmZlciA9IGRhdGFbMF07XG4gIGlmIChkYXRhQnVmZmVyLmxlbmd0aCA+IDgwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPUF9SRVRVUk4gb3V0cHV0cyBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBsYXJnZXIgdGhhbiA4MCBieXRlc2ApO1xuICB9XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIC8vIERlY29kZSBzYXRvc2hpKyBpZGVudGlmaWVyXG4gIGlmICghZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDQpLmVxdWFscyhDT1JFX0RBT19TQVRPU0hJX1BMVVNfSURFTlRJRklFUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2F0b3NoaSsgaWRlbnRpZmllcicpO1xuICB9XG4gIG9mZnNldCArPSA0O1xuXG4gIC8vIERlY29kZSB2ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIC8vIERlY29kZSBjaGFpbklkXG4gIGNvbnN0IGNoYWluSWQgPSBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgMikpO1xuICBpZiAoIShjaGFpbklkLmVxdWFscyhDT1JFX0RBT19URVNUTkVUX0NIQUlOX0lEKSB8fCBjaGFpbklkLmVxdWFscyhDT1JFX0RBT19NQUlOTkVUX0NIQUlOX0lEKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBDaGFpbklEOiAke2NoYWluSWQudG9TdHJpbmcoJ2hleCcpfS4gTXVzdCBiZSBlaXRoZXIgMHgwNDViICh0ZXN0bmV0KSBvciAweDA0NWMgKG1haW5uZXQpLmBcbiAgICApO1xuICB9XG4gIG9mZnNldCArPSAyO1xuXG4gIC8vIERlY29kZSBkZWxlZ2F0b3JcbiAgY29uc3QgZGVsZWdhdG9yID0gQnVmZmVyLmZyb20oZGF0YUJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIDIwKSk7XG4gIG9mZnNldCArPSAyMDtcblxuICAvLyBEZWNvZGUgdmFsaWRhdG9yXG4gIGNvbnN0IHZhbGlkYXRvciA9IEJ1ZmZlci5mcm9tKGRhdGFCdWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyAyMCkpO1xuICBvZmZzZXQgKz0gMjA7XG5cbiAgLy8gRGVjb2RlIGZlZVxuICBjb25zdCBmZWUgPSBkYXRhQnVmZmVyW29mZnNldF07XG4gIG9mZnNldCArPSAxO1xuXG4gIGNvbnN0IGJhc2VQYXJhbXMgPSB7IHZlcnNpb24sIGNoYWluSWQsIGRlbGVnYXRvciwgdmFsaWRhdG9yLCBmZWUgfTtcblxuICAvLyBEZWNvZGUgcmVkZWVtU2NyaXB0IG9yIHRpbWVsb2NrXG4gIGlmIChvZmZzZXQgPT09IGRhdGFCdWZmZXIubGVuZ3RoIC0gNCkge1xuICAgIHJldHVybiB7IC4uLmJhc2VQYXJhbXMsIHRpbWVsb2NrOiBkZWNvZGVUaW1lbG9jayhkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZVBhcmFtcywgcmVkZWVtU2NyaXB0OiBCdWZmZXIuZnJvbShkYXRhQnVmZmVyLnN1YmFycmF5KG9mZnNldCkpIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHBhcmFtczogT3BSZXR1cm5QYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uLFxuICAgIGNoYWluSWQ6IHBhcmFtcy5jaGFpbklkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBkZWxlZ2F0b3I6IHBhcmFtcy5kZWxlZ2F0b3IudG9TdHJpbmcoJ2hleCcpLFxuICAgIHZhbGlkYXRvcjogcGFyYW1zLnZhbGlkYXRvci50b1N0cmluZygnaGV4JyksXG4gICAgZmVlOiBwYXJhbXMuZmVlLFxuICAgIC4uLigncmVkZWVtU2NyaXB0JyBpbiBwYXJhbXMgPyB7IHJlZGVlbVNjcmlwdDogcGFyYW1zLnJlZGVlbVNjcmlwdC50b1N0cmluZygnaGV4JykgfSA6IHt9KSxcbiAgICAuLi4oJ3RpbWVsb2NrJyBpbiBwYXJhbXMgPyB7IHRpbWVsb2NrOiBwYXJhbXMudGltZWxvY2sgfSA6IHt9KSxcbiAgfSk7XG59XG4iXX0=
@@ -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,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createStakingOutputs = void 0;
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
- exports.createStakingOutputs = createStakingOutputs;
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBK0U7QUFFL0U7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxhQUlDLEVBQ0QsY0FBOEI7SUFFOUIsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQztLQUNyRztJQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLGFBQWEsQ0FBQyxLQUFLLEtBQUssU0FBUztRQUMvQixDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUU7UUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUNuRixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBQSw0Q0FBaUMsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUV6RSxPQUFPO1FBQ0wsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFO1FBQ3RELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzlDLENBQUM7QUFDSixDQUFDO0FBdkJELG9EQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgY3JlYXRlQ29yZURhb09wUmV0dXJuT3V0cHV0U2NyaXB0LCBPcFJldHVyblBhcmFtcyB9IGZyb20gJy4vb3BSZXR1cm4nO1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgc3Rha2luZyBvdXRwdXRzIGZvciBhIENvcmVEQU8gc3Rha2luZyB0cmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgb3JkZXJpbmdcbiAqIGluIHdoaWNoIHRvIGFkZCBpbnRvIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbSBzdGFraW5nUGFyYW1zIGhvdyB0byBjcmVhdGUgdGhlIHRpbWVsb2NrZWQgc3Rha2Ugb3V0cHV0XG4gKiBAcGFyYW0gc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yIGlmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIGBkZWZpbml0ZWAgZGVzY3JpcHRvci5cbiAqIElmIHN0YWtpbmdQYXJhbXMuaW5kZXggaXMgcHJvdmlkZWQsIHRoZW4gdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgYGRlcml2YWJsZWAgZGVzY3JpcHRvci5cbiAqIEBwYXJhbSBvcFJldHVyblBhcmFtcyB0byBjcmVhdGUgdGhlIE9QX1JFVFVSTiBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmdPdXRwdXRzKFxuICBzdGFraW5nUGFyYW1zOiB7XG4gICAgYW1vdW50OiBiaWdpbnQ7XG4gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcjtcbiAgICBpbmRleD86IG51bWJlcjtcbiAgfSxcbiAgb3BSZXR1cm5QYXJhbXM6IE9wUmV0dXJuUGFyYW1zXG4pOiB7IHNjcmlwdDogQnVmZmVyOyBhbW91bnQ6IGJpZ2ludCB9W10ge1xuICBpZiAoc3Rha2luZ1BhcmFtcy5kZXNjcmlwdG9yLmhhc1dpbGRjYXJkKCkgJiYgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIHN0YWtpbmcgb3V0cHV0cyB3aXRoIGEgd2lsZGNhcmQgZGVzY3JpcHRvciBhbmQgbm8gZGVyaXZhdGlvbiBpbmRleCcpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2NyaXB0ID0gQnVmZmVyLmZyb20oXG4gICAgc3Rha2luZ1BhcmFtcy5pbmRleCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHN0YWtpbmdQYXJhbXMuZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKVxuICAgICAgOiBzdGFraW5nUGFyYW1zLmRlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgoc3Rha2luZ1BhcmFtcy5pbmRleCkuc2NyaXB0UHVia2V5KClcbiAgKTtcbiAgY29uc3Qgb3BSZXR1cm5TY3JpcHQgPSBjcmVhdGVDb3JlRGFvT3BSZXR1cm5PdXRwdXRTY3JpcHQob3BSZXR1cm5QYXJhbXMpO1xuXG4gIHJldHVybiBbXG4gICAgeyBzY3JpcHQ6IG91dHB1dFNjcmlwdCwgYW1vdW50OiBzdGFraW5nUGFyYW1zLmFtb3VudCB9LFxuICAgIHsgc2NyaXB0OiBvcFJldHVyblNjcmlwdCwgYW1vdW50OiBCaWdJbnQoMCkgfSxcbiAgXTtcbn1cbiJdfQ==
@@ -1,3 +0,0 @@
1
- export * as coreDao from './coreDao';
2
- export * from './transaction';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,34 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- import * as utxolib from '@bitgo-beta/utxo-lib';
4
- /**
5
- * Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
6
- *
7
- * Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
8
- * We always add the change address as the last output.
9
- *
10
- * @param rootWalletKeys
11
- * @param unspents
12
- * @param createStakingOutputs
13
- * @param changeAddressInfo
14
- * @param feeRateSatKB
15
- * @param network
16
- */
17
- export declare function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount, }: {
18
- rootWalletKeys: utxolib.bitgo.RootWalletKeys;
19
- unspents: utxolib.bitgo.WalletUnspent<bigint>[];
20
- outputs: {
21
- script: Buffer;
22
- value: bigint;
23
- }[];
24
- changeAddressInfo: {
25
- chain: utxolib.bitgo.ChainCode;
26
- index: number;
27
- address: string;
28
- };
29
- feeRateSatKB: number;
30
- network: utxolib.Network;
31
- skipNonWitnessUtxo?: boolean;
32
- dustAmount?: bigint;
33
- }): utxolib.bitgo.UtxoPsbt;
34
- //# 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,55 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildFixedWalletStakingPsbt = void 0;
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
- exports.buildFixedWalletStakingPsbt = buildFixedWalletStakingPsbt;
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQWdEO0FBQ2hELG1EQUFrRDtBQUVsRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQiwyQkFBMkIsQ0FBQyxFQUMxQyxjQUFjLEVBQ2QsUUFBUSxFQUNSLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsWUFBWSxFQUNaLE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FpQnZCO0lBQ0MsSUFBSSxZQUFZLEdBQUcsSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztLQUMxRDtJQUNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0tBQ2hFO0lBRUQsZ0NBQWdDO0lBQ2hDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUNyRSxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFDbEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFDekQsT0FBTyxDQUNSLENBQUMsWUFBWSxDQUFDO0lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRTtRQUM1RyxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7S0FDakY7SUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFbkQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1FBQ25GLGtCQUFrQixFQUFFLElBQUk7UUFDeEIsa0JBQWtCO0tBQ25CLENBQUMsQ0FDSCxDQUFDO0lBQ0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ25CLENBQUMscUJBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3ZCLElBQUksQ0FBQyxxQkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ3JELFFBQVEsRUFBRTtRQUNYLFlBQVksQ0FBQztRQUNiLElBQUksQ0FDUCxDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsV0FBVyxHQUFHLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUNiLGdCQUFnQixXQUFXLENBQUMsUUFBUSxFQUFFLG9DQUFvQyxZQUFZLGtCQUFrQixHQUFHLEVBQUUsQ0FDOUcsQ0FBQztLQUNIO0lBRUQsSUFBSSxZQUFZLEdBQUcsVUFBVSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLElBQUksRUFDSixjQUFjLEVBQ2QsaUJBQWlCLENBQUMsS0FBSyxFQUN2QixpQkFBaUIsQ0FBQyxLQUFLLEVBQ3ZCLFlBQVksQ0FDYixDQUFDO0tBQ0g7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFuRkQsa0VBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgc3Rha2luZyB0cmFuc2FjdGlvbiBmb3IgYSB3YWxsZXQgdGhhdCBhc3N1bWVzIDItb2YtMyBtdWx0aXNpZyBmb3IgdGhlIGlucHV0c1xuICpcbiAqIEdpdmVuIHRoZSBpbnB1dHMgYW5kIHRoZSBzdGFraW5nIG91dHB1dHMsIHdlIHdpbGwgY3JlYXRlIHRoZSBQU0JUIHdpdGggdGhlIGRlc2lyZWQgZmVlIHJhdGUuXG4gKiBXZSBhbHdheXMgYWRkIHRoZSBjaGFuZ2UgYWRkcmVzcyBhcyB0aGUgbGFzdCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSBjcmVhdGVTdGFraW5nT3V0cHV0c1xuICogQHBhcmFtIGNoYW5nZUFkZHJlc3NJbmZvXG4gKiBAcGFyYW0gZmVlUmF0ZVNhdEtCXG4gKiBAcGFyYW0gbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaXhlZFdhbGxldFN0YWtpbmdQc2J0KHtcbiAgcm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzLFxuICBvdXRwdXRzLFxuICBjaGFuZ2VBZGRyZXNzSW5mbyxcbiAgZmVlUmF0ZVNhdEtCLFxuICBuZXR3b3JrLFxuICBza2lwTm9uV2l0bmVzc1V0eG8sXG4gIGR1c3RBbW91bnQgPSBCaWdJbnQoMCksXG59OiB7XG4gIHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuICB1bnNwZW50czogdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PGJpZ2ludD5bXTtcbiAgb3V0cHV0czoge1xuICAgIHNjcmlwdDogQnVmZmVyO1xuICAgIHZhbHVlOiBiaWdpbnQ7XG4gIH1bXTtcbiAgY2hhbmdlQWRkcmVzc0luZm86IHtcbiAgICBjaGFpbjogdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gIH07XG4gIGZlZVJhdGVTYXRLQjogbnVtYmVyO1xuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG4gIHNraXBOb25XaXRuZXNzVXR4bz86IGJvb2xlYW47XG4gIGR1c3RBbW91bnQ/OiBiaWdpbnQ7XG59KTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGlmIChmZWVSYXRlU2F0S0IgPCAxMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGZWUgcmF0ZSBtdXN0IGJlIGF0IGxlYXN0IDEgc2F0L3ZieXRlJyk7XG4gIH1cbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCB8fCBvdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCcpO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoYW5nZSBhZGRyZXNzIGluZm9cbiAgY29uc3QgY2hhbmdlU2NyaXB0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFuZ2VBZGRyZXNzSW5mby5jaGFpbiwgY2hhbmdlQWRkcmVzc0luZm8uaW5kZXgpLnB1YmxpY0tleXMsXG4gICAgdXR4b2xpYi5iaXRnby5zY3JpcHRUeXBlRm9yQ2hhaW4oY2hhbmdlQWRkcmVzc0luZm8uY2hhaW4pLFxuICAgIG5ldHdvcmtcbiAgKS5zY3JpcHRQdWJLZXk7XG4gIGlmICghY2hhbmdlU2NyaXB0LmVxdWFscyh1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGNoYW5nZUFkZHJlc3NJbmZvLmFkZHJlc3MsIG5ldHdvcmspKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhbmdlIGFkZHJlc3MgaW5mbyBkb2VzIG5vdCBtYXRjaCB0aGUgZGVyaXZlZCBjaGFuZ2Ugc2NyaXB0Jyk7XG4gIH1cblxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcmsgfSk7XG4gIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgcm9vdFdhbGxldEtleXMpO1xuXG4gIGNvbnN0IGlucHV0QW1vdW50ID0gdW5zcGVudHMucmVkdWNlKChzdW0sIHVuc3BlbnQpID0+IHN1bSArIHVuc3BlbnQudmFsdWUsIEJpZ0ludCgwKSk7XG4gIGNvbnN0IG91dHB1dEFtb3VudCA9IG91dHB1dHMucmVkdWNlKChzdW0sIG91dHB1dCkgPT4gc3VtICsgb3V0cHV0LnZhbHVlLCBCaWdJbnQoMCkpO1xuXG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+XG4gICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIHJvb3RXYWxsZXRLZXlzLCAndXNlcicsICdiaXRnbycsIHtcbiAgICAgIGlzUmVwbGFjZWFibGVCeUZlZTogdHJ1ZSxcbiAgICAgIHNraXBOb25XaXRuZXNzVXR4byxcbiAgICB9KVxuICApO1xuICBvdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4gcHNidC5hZGRPdXRwdXQob3V0cHV0KSk7XG5cbiAgY29uc3QgZmVlID0gTWF0aC5jZWlsKFxuICAgIChEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpXG4gICAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IGNoYW5nZVNjcmlwdCB9KSlcbiAgICAgIC5nZXRWU2l6ZSgpICpcbiAgICAgIGZlZVJhdGVTYXRLQikgL1xuICAgICAgMTAwMFxuICApO1xuXG4gIGNvbnN0IGNoYW5nZUFtb3VudCA9IGlucHV0QW1vdW50IC0gKG91dHB1dEFtb3VudCArIEJpZ0ludChmZWUpKTtcbiAgaWYgKGNoYW5nZUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnB1dCBhbW91bnQgJHtpbnB1dEFtb3VudC50b1N0cmluZygpfSBjYW5ub3QgY292ZXIgdGhlIHN0YWtpbmcgYW1vdW50ICR7b3V0cHV0QW1vdW50fSBhbmQgIHRoZSBmZWU6ICR7ZmVlfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGNoYW5nZUFtb3VudCA+IGR1c3RBbW91bnQpIHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldE91dHB1dFRvUHNidChcbiAgICAgIHBzYnQsXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIGNoYW5nZUFkZHJlc3NJbmZvLmNoYWluLFxuICAgICAgY2hhbmdlQWRkcmVzc0luZm8uaW5kZXgsXG4gICAgICBjaGFuZ2VBbW91bnRcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG4iXX0=
File without changes
File without changes