@bitgo-beta/abstract-utxo 1.6.1-alpha.4 → 1.6.1-alpha.400

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 (175) hide show
  1. package/dist/src/abstractUtxoCoin.d.ts +212 -98
  2. package/dist/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/src/abstractUtxoCoin.js +321 -541
  4. package/dist/src/descriptor/NamedDescriptor.d.ts +20 -0
  5. package/dist/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  6. package/dist/src/descriptor/NamedDescriptor.js +79 -0
  7. package/dist/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  8. package/dist/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  9. package/dist/src/descriptor/assertDescriptorWalletAddress.js +66 -0
  10. package/dist/src/descriptor/builder/builder.d.ts +13 -0
  11. package/dist/src/descriptor/builder/builder.d.ts.map +1 -0
  12. package/dist/src/descriptor/builder/builder.js +37 -0
  13. package/dist/src/descriptor/builder/index.d.ts +3 -0
  14. package/dist/src/descriptor/builder/index.d.ts.map +1 -0
  15. package/dist/src/descriptor/builder/index.js +8 -0
  16. package/dist/src/descriptor/builder/parse.d.ts +5 -0
  17. package/dist/src/descriptor/builder/parse.d.ts.map +1 -0
  18. package/dist/src/descriptor/builder/parse.js +149 -0
  19. package/dist/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  20. package/dist/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  21. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +74 -0
  22. package/dist/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  23. package/dist/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  24. package/dist/src/descriptor/createWallet/createDescriptors.js +33 -0
  25. package/dist/src/descriptor/createWallet/index.d.ts +3 -0
  26. package/dist/src/descriptor/createWallet/index.d.ts.map +1 -0
  27. package/dist/src/descriptor/createWallet/index.js +19 -0
  28. package/dist/src/descriptor/descriptorWallet.d.ts +19 -0
  29. package/dist/src/descriptor/descriptorWallet.d.ts.map +1 -0
  30. package/dist/src/descriptor/descriptorWallet.js +54 -0
  31. package/dist/src/descriptor/index.d.ts +8 -0
  32. package/dist/src/descriptor/index.d.ts.map +1 -0
  33. package/dist/src/descriptor/index.js +53 -0
  34. package/dist/src/descriptor/validatePolicy.d.ts +22 -0
  35. package/dist/src/descriptor/validatePolicy.d.ts.map +1 -0
  36. package/dist/src/descriptor/validatePolicy.js +92 -0
  37. package/dist/src/index.d.ts +4 -0
  38. package/dist/src/index.d.ts.map +1 -1
  39. package/dist/src/index.js +32 -2
  40. package/dist/src/keychains.d.ts +48 -0
  41. package/dist/src/keychains.d.ts.map +1 -0
  42. package/dist/src/keychains.js +104 -0
  43. package/dist/src/names.d.ts +26 -0
  44. package/dist/src/names.d.ts.map +1 -0
  45. package/dist/src/names.js +214 -0
  46. package/dist/src/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
  47. package/dist/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  48. package/dist/src/offlineVault/OfflineVaultHalfSigned.js +59 -0
  49. package/dist/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  50. package/dist/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  51. package/dist/src/offlineVault/OfflineVaultSignable.js +55 -0
  52. package/dist/src/offlineVault/TransactionExplanation.d.ts +15 -0
  53. package/dist/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  54. package/dist/src/offlineVault/TransactionExplanation.js +16 -0
  55. package/dist/src/offlineVault/descriptor/index.d.ts +2 -0
  56. package/dist/src/offlineVault/descriptor/index.d.ts.map +1 -0
  57. package/dist/src/offlineVault/descriptor/index.js +18 -0
  58. package/dist/src/offlineVault/descriptor/transaction.d.ts +38 -0
  59. package/dist/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  60. package/dist/src/offlineVault/descriptor/transaction.js +80 -0
  61. package/dist/src/offlineVault/index.d.ts +6 -0
  62. package/dist/src/offlineVault/index.d.ts.map +1 -0
  63. package/dist/src/offlineVault/index.js +44 -0
  64. package/dist/src/recovery/RecoveryProvider.d.ts +6 -5
  65. package/dist/src/recovery/RecoveryProvider.d.ts.map +1 -1
  66. package/dist/src/recovery/RecoveryProvider.js +2 -4
  67. package/dist/src/recovery/backupKeyRecovery.d.ts +44 -15
  68. package/dist/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  69. package/dist/src/recovery/backupKeyRecovery.js +176 -102
  70. package/dist/src/recovery/baseApi.d.ts +3 -6
  71. package/dist/src/recovery/baseApi.d.ts.map +1 -1
  72. package/dist/src/recovery/baseApi.js +6 -6
  73. package/dist/src/recovery/coingeckoApi.d.ts +0 -3
  74. package/dist/src/recovery/coingeckoApi.d.ts.map +1 -1
  75. package/dist/src/recovery/coingeckoApi.js +1 -4
  76. package/dist/src/recovery/crossChainRecovery.d.ts +15 -26
  77. package/dist/src/recovery/crossChainRecovery.d.ts.map +1 -1
  78. package/dist/src/recovery/crossChainRecovery.js +107 -83
  79. package/dist/src/recovery/index.d.ts +0 -1
  80. package/dist/src/recovery/index.d.ts.map +1 -1
  81. package/dist/src/recovery/index.js +6 -3
  82. package/dist/src/recovery/mempoolApi.d.ts.map +1 -1
  83. package/dist/src/recovery/mempoolApi.js +10 -7
  84. package/dist/src/replayProtection.js +37 -5
  85. package/dist/src/sign.d.ts +31 -8
  86. package/dist/src/sign.d.ts.map +1 -1
  87. package/dist/src/sign.js +116 -15
  88. package/dist/src/transaction/bip322.d.ts +27 -0
  89. package/dist/src/transaction/bip322.d.ts.map +1 -0
  90. package/dist/src/transaction/bip322.js +125 -0
  91. package/dist/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  92. package/dist/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  93. package/dist/src/transaction/common/verifyPayGoAmount.js +3 -0
  94. package/dist/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  95. package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  96. package/dist/src/transaction/descriptor/explainPsbt.js +80 -0
  97. package/dist/src/transaction/descriptor/index.d.ts +7 -0
  98. package/dist/src/transaction/descriptor/index.d.ts.map +1 -0
  99. package/dist/src/transaction/descriptor/index.js +14 -0
  100. package/dist/src/transaction/descriptor/parse.d.ts +15 -0
  101. package/dist/src/transaction/descriptor/parse.d.ts.map +1 -0
  102. package/dist/src/transaction/descriptor/parse.js +116 -0
  103. package/dist/src/transaction/descriptor/parseToAmountType.d.ts +13 -0
  104. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  105. package/dist/src/transaction/descriptor/parseToAmountType.js +60 -0
  106. package/dist/src/transaction/descriptor/recipient.d.ts +5 -0
  107. package/dist/src/transaction/descriptor/recipient.d.ts.map +1 -0
  108. package/dist/src/transaction/descriptor/recipient.js +3 -0
  109. package/dist/src/transaction/descriptor/signPsbt.d.ts +25 -0
  110. package/dist/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  111. package/dist/src/transaction/descriptor/signPsbt.js +43 -0
  112. package/dist/src/transaction/descriptor/verifyTransaction.d.ts +33 -0
  113. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  114. package/dist/src/transaction/descriptor/verifyTransaction.js +105 -0
  115. package/dist/src/transaction/explainTransaction.d.ts +17 -0
  116. package/dist/src/transaction/explainTransaction.d.ts.map +1 -0
  117. package/dist/src/transaction/explainTransaction.js +67 -0
  118. package/dist/src/transaction/fetchInputs.d.ts +26 -0
  119. package/dist/src/transaction/fetchInputs.d.ts.map +1 -0
  120. package/dist/src/transaction/fetchInputs.js +109 -0
  121. package/dist/src/transaction/fixedScript/explainTransaction.d.ts +32 -0
  122. package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  123. package/dist/src/transaction/fixedScript/explainTransaction.js +317 -0
  124. package/dist/src/transaction/fixedScript/index.d.ts +6 -0
  125. package/dist/src/transaction/fixedScript/index.d.ts.map +1 -0
  126. package/dist/src/transaction/fixedScript/index.js +13 -0
  127. package/dist/src/transaction/fixedScript/parseOutput.d.ts +26 -0
  128. package/dist/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  129. package/dist/src/transaction/fixedScript/parseOutput.js +213 -0
  130. package/dist/src/transaction/fixedScript/parseTransaction.d.ts +7 -0
  131. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  132. package/dist/src/transaction/fixedScript/parseTransaction.js +203 -0
  133. package/dist/src/transaction/fixedScript/signTransaction.d.ts +18 -0
  134. package/dist/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  135. package/dist/src/transaction/fixedScript/signTransaction.js +100 -0
  136. package/dist/src/transaction/fixedScript/verifyTransaction.d.ts +4 -0
  137. package/dist/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  138. package/dist/src/transaction/fixedScript/verifyTransaction.js +176 -0
  139. package/dist/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  140. package/dist/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  141. package/dist/src/transaction/getPayGoVerificationPubkey.js +53 -0
  142. package/dist/src/transaction/index.d.ts +7 -0
  143. package/dist/src/transaction/index.d.ts.map +1 -0
  144. package/dist/src/transaction/index.js +49 -0
  145. package/dist/src/transaction/outputDifference.d.ts +40 -0
  146. package/dist/src/transaction/outputDifference.d.ts.map +1 -0
  147. package/dist/src/transaction/outputDifference.js +47 -0
  148. package/dist/src/transaction/parseTransaction.d.ts +3 -0
  149. package/dist/src/transaction/parseTransaction.d.ts.map +1 -0
  150. package/dist/src/transaction/parseTransaction.js +48 -0
  151. package/dist/src/transaction/recipient.d.ts +29 -0
  152. package/dist/src/transaction/recipient.d.ts.map +1 -0
  153. package/dist/src/transaction/recipient.js +88 -0
  154. package/dist/src/transaction/signTransaction.d.ts +6 -0
  155. package/dist/src/transaction/signTransaction.d.ts.map +1 -0
  156. package/dist/src/transaction/signTransaction.js +102 -0
  157. package/dist/src/transaction/verifyTransaction.d.ts +4 -0
  158. package/dist/src/transaction/verifyTransaction.d.ts.map +1 -0
  159. package/dist/src/transaction/verifyTransaction.js +50 -0
  160. package/dist/src/verifyKey.d.ts +28 -0
  161. package/dist/src/verifyKey.d.ts.map +1 -0
  162. package/dist/src/verifyKey.js +164 -0
  163. package/dist/src/wallet.d.ts +15 -0
  164. package/dist/src/wallet.d.ts.map +1 -0
  165. package/dist/src/wallet.js +8 -0
  166. package/package.json +19 -13
  167. package/.eslintignore +0 -5
  168. package/CHANGELOG.md +0 -154
  169. package/dist/src/parseOutput.d.ts +0 -22
  170. package/dist/src/parseOutput.d.ts.map +0 -1
  171. package/dist/src/parseOutput.js +0 -170
  172. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  173. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  174. package/dist/src/recovery/smartbitApi.js +0 -36
  175. package/dist/tsconfig.tsbuildinfo +0 -7714
@@ -0,0 +1,317 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.explainPsbt = explainPsbt;
37
+ exports.explainLegacyTx = explainLegacyTx;
38
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
39
+ const utxo_core_1 = require("@bitgo-beta/utxo-core");
40
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
41
+ const utxocore = __importStar(require("@bitgo-beta/utxo-core"));
42
+ const recipient_1 = require("../recipient");
43
+ const getPayGoVerificationPubkey_1 = require("../getPayGoVerificationPubkey");
44
+ function explainCommon(tx, params, network) {
45
+ const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs'];
46
+ let spendAmount = BigInt(0);
47
+ let changeAmount = BigInt(0);
48
+ const changeOutputs = [];
49
+ const outputs = [];
50
+ const { changeInfo } = params;
51
+ const changeAddresses = changeInfo?.map((info) => info.address) ?? [];
52
+ tx.outs.forEach((currentOutput) => {
53
+ // Try to encode the script pubkey with an address. If it fails, try to parse it as an OP_RETURN output with the prefix.
54
+ // If that fails, then it is an unrecognized scriptPubkey and should fail
55
+ const currentAddress = (0, recipient_1.toExtendedAddressFormat)(currentOutput.script, network);
56
+ const currentAmount = BigInt(currentOutput.value);
57
+ if (changeAddresses.includes(currentAddress)) {
58
+ // this is change
59
+ changeAmount += currentAmount;
60
+ const change = changeInfo?.find((change) => change.address === currentAddress);
61
+ if (!change) {
62
+ throw new Error('changeInfo must have change information for all change outputs');
63
+ }
64
+ changeOutputs.push({
65
+ address: currentAddress,
66
+ amount: currentAmount.toString(),
67
+ chain: change.chain,
68
+ index: change.index,
69
+ external: false,
70
+ });
71
+ return;
72
+ }
73
+ spendAmount += currentAmount;
74
+ outputs.push({
75
+ address: currentAddress,
76
+ amount: currentAmount.toString(),
77
+ // If changeInfo has a length greater than or equal to zero, it means that the change information
78
+ // was provided to the function but the output was not identified as change. In this case,
79
+ // the output is external, and we can set it as so. If changeInfo is undefined, it means we were
80
+ // given no information about change outputs, so we can't determine anything about the output,
81
+ // so we leave it undefined.
82
+ external: changeInfo ? true : undefined,
83
+ });
84
+ });
85
+ const outputDetails = {
86
+ outputAmount: spendAmount.toString(),
87
+ changeAmount: changeAmount.toString(),
88
+ outputs,
89
+ changeOutputs,
90
+ };
91
+ let fee;
92
+ let locktime;
93
+ if (params.feeInfo) {
94
+ displayOrder.push('fee');
95
+ fee = params.feeInfo;
96
+ }
97
+ if (Number.isInteger(tx.locktime) && tx.locktime > 0) {
98
+ displayOrder.push('locktime');
99
+ locktime = tx.locktime;
100
+ }
101
+ return { displayOrder, id: tx.getId(), ...outputDetails, fee, locktime };
102
+ }
103
+ function getRootWalletKeys(params) {
104
+ const keys = params.pubs?.map((xpub) => utxo_lib_1.bip32.fromBase58(xpub));
105
+ return keys && keys.length === 3 ? new utxo_lib_1.bitgo.RootWalletKeys(keys) : undefined;
106
+ }
107
+ function getPsbtInputSignaturesCount(psbt, params) {
108
+ const rootWalletKeys = getRootWalletKeys(params);
109
+ return rootWalletKeys
110
+ ? utxo_lib_1.bitgo.getSignatureValidationArrayPsbt(psbt, rootWalletKeys).map((sv) => sv[1].filter((v) => v).length)
111
+ : Array(psbt.data.inputs.length).fill(0);
112
+ }
113
+ function getTxInputSignaturesCount(tx, params, network) {
114
+ const prevOutputs = params.txInfo?.unspents?.map((u) => utxo_lib_1.bitgo.toOutput(u, network));
115
+ const rootWalletKeys = getRootWalletKeys(params);
116
+ const { unspents = [] } = params.txInfo ?? {};
117
+ // get the number of signatures per input
118
+ return tx.ins.map((input, idx) => {
119
+ if (unspents.length !== tx.ins.length) {
120
+ return 0;
121
+ }
122
+ if (!prevOutputs) {
123
+ throw new Error(`invalid state`);
124
+ }
125
+ if (!rootWalletKeys) {
126
+ // no pub keys or incorrect number of pub keys
127
+ return 0;
128
+ }
129
+ try {
130
+ return utxo_lib_1.bitgo.verifySignatureWithUnspent(tx, idx, unspents, rootWalletKeys).filter((v) => v).length;
131
+ }
132
+ catch (e) {
133
+ // some other error occurred and we can't validate the signatures
134
+ return 0;
135
+ }
136
+ });
137
+ }
138
+ /**
139
+ * Decompose a raw psbt into useful information, such as the total amounts,
140
+ * change amounts, and transaction outputs.
141
+ */
142
+ function explainPsbt(psbt, params, network, { strict = false } = {}) {
143
+ const txOutputs = psbt.txOutputs;
144
+ const txInputs = psbt.txInputs;
145
+ function getChainAndIndexFromBip32Derivations(output) {
146
+ const derivations = output.bip32Derivation ?? output.tapBip32Derivation ?? undefined;
147
+ if (!derivations) {
148
+ return undefined;
149
+ }
150
+ const paths = derivations.map((d) => d.path);
151
+ if (!paths || paths.length !== 3) {
152
+ throw new Error('expected 3 paths in bip32Derivation or tapBip32Derivation');
153
+ }
154
+ if (!paths.every((p) => paths[0] === p)) {
155
+ throw new Error('expected all paths to be the same');
156
+ }
157
+ paths.forEach((path) => {
158
+ if (paths[0] !== path) {
159
+ throw new Error('Unable to get a single chain and index on the output because there are different paths for different keys');
160
+ }
161
+ });
162
+ return utxolib.bitgo.getChainAndIndexFromPath(paths[0]);
163
+ }
164
+ function getChangeInfo() {
165
+ try {
166
+ return utxolib.bitgo.findInternalOutputIndices(psbt).map((i) => {
167
+ const derivationInformation = getChainAndIndexFromBip32Derivations(psbt.data.outputs[i]);
168
+ if (!derivationInformation) {
169
+ throw new Error('could not find derivation information on bip32Derivation or tapBip32Derivation');
170
+ }
171
+ return {
172
+ address: utxolib.address.fromOutputScript(txOutputs[i].script, network),
173
+ external: false,
174
+ ...derivationInformation,
175
+ };
176
+ });
177
+ }
178
+ catch (e) {
179
+ if (e instanceof utxolib.bitgo.ErrorNoMultiSigInputFound) {
180
+ return undefined;
181
+ }
182
+ throw e;
183
+ }
184
+ }
185
+ /**
186
+ * Extract PayGo address proof information from the PSBT if present
187
+ * @returns Information about the PayGo proof, including the output index and address
188
+ */
189
+ function getPayGoVerificationInfo() {
190
+ let outputIndex = undefined;
191
+ let address = undefined;
192
+ // Check if this PSBT has any PayGo address proofs
193
+ if (!utxocore.paygo.psbtOutputIncludesPaygoAddressProof(psbt)) {
194
+ return undefined;
195
+ }
196
+ // This pulls the pubkey depending on given network
197
+ const verificationPubkey = (0, getPayGoVerificationPubkey_1.getPayGoVerificationPubkey)(network);
198
+ // find which output index that contains the PayGo proof
199
+ outputIndex = utxocore.paygo.getPayGoAddressProofOutputIndex(psbt);
200
+ if (outputIndex === undefined || !verificationPubkey) {
201
+ return undefined;
202
+ }
203
+ const output = txOutputs[outputIndex];
204
+ address = utxolib.address.fromOutputScript(output.script, network);
205
+ if (!address) {
206
+ throw new Error(`Can not derive address ${address} Pay Go Attestation.`);
207
+ }
208
+ return { outputIndex, verificationPubkey };
209
+ }
210
+ /**
211
+ * Extract the BIP322 messages and addresses from the PSBT inputs and perform
212
+ * verification on the transaction to ensure that it meets the BIP322 requirements.
213
+ * @returns An array of objects containing the message and address for each input,
214
+ * or undefined if no BIP322 messages are found.
215
+ */
216
+ function getBip322MessageInfoAndVerify() {
217
+ const bip322Messages = [];
218
+ for (let i = 0; i < psbt.data.inputs.length; i++) {
219
+ const message = utxo_core_1.bip322.getBip322ProofMessageAtIndex(psbt, i);
220
+ if (message) {
221
+ const input = psbt.data.inputs[i];
222
+ if (!input.witnessUtxo) {
223
+ throw new Error(`Missing witnessUtxo for input index ${i}`);
224
+ }
225
+ if (!input.nonWitnessUtxo) {
226
+ throw new Error(`Missing nonWitnessUtxo for input index ${i}`);
227
+ }
228
+ const scriptPubKey = input.witnessUtxo.script;
229
+ // Verify that the toSpend transaction can be recreated in the PSBT and is encoded correctly in the nonWitnessUtxo
230
+ const toSpend = utxo_core_1.bip322.buildToSpendTransaction(scriptPubKey, message);
231
+ const toSpendB64 = toSpend.toBuffer().toString('base64');
232
+ if (input.nonWitnessUtxo.toString('base64') !== toSpendB64) {
233
+ throw new Error(`Non-witness UTXO does not match the expected toSpend transaction at input index ${i}`);
234
+ }
235
+ // Verify that the toSpend transaction ID matches the input's referenced transaction ID
236
+ if (toSpend.getId() !== utxolib.bitgo.getOutputIdForInput(txInputs[i]).txid) {
237
+ throw new Error(`ToSpend transaction ID does not match the input at index ${i}`);
238
+ }
239
+ // Verify the input specifics
240
+ if (txInputs[i].sequence !== 0) {
241
+ throw new Error(`Unexpected sequence number at input index ${i}: ${txInputs[i].sequence}. Expected 0.`);
242
+ }
243
+ if (txInputs[i].index !== 0) {
244
+ throw new Error(`Unexpected input index at position ${i}: ${txInputs[i].index}. Expected 0.`);
245
+ }
246
+ bip322Messages.push({
247
+ message: message.toString('utf8'),
248
+ address: utxolib.address.fromOutputScript(scriptPubKey, network),
249
+ });
250
+ }
251
+ }
252
+ if (bip322Messages.length > 0) {
253
+ // If there is a BIP322 message in any input, all inputs must have one.
254
+ if (bip322Messages.length !== psbt.data.inputs.length) {
255
+ throw new Error('Inconsistent BIP322 messages across inputs.');
256
+ }
257
+ // Verify the transaction specifics for BIP322
258
+ if (psbt.version !== 0 && psbt.version !== 2) {
259
+ throw new Error(`Unsupported PSBT version for BIP322: ${psbt.version}. Expected 0 `);
260
+ }
261
+ if (psbt.data.outputs.length !== 1 || txOutputs[0].script.toString('hex') !== '6a' || txOutputs[0].value !== 0n) {
262
+ throw new Error(`Invalid PSBT outputs for BIP322. Expected exactly one OP_RETURN output with zero value.`);
263
+ }
264
+ return bip322Messages;
265
+ }
266
+ return undefined;
267
+ }
268
+ const payGoVerificationInfo = getPayGoVerificationInfo();
269
+ if (payGoVerificationInfo) {
270
+ try {
271
+ utxocore.paygo.verifyPayGoAddressProof(psbt, payGoVerificationInfo.outputIndex, utxolib.bip32.fromBase58(payGoVerificationInfo.verificationPubkey, utxolib.networks.bitcoin).publicKey);
272
+ }
273
+ catch (e) {
274
+ if (strict) {
275
+ throw e;
276
+ }
277
+ console.error(e);
278
+ }
279
+ }
280
+ const messages = getBip322MessageInfoAndVerify();
281
+ const changeInfo = getChangeInfo();
282
+ const tx = psbt.getUnsignedTx();
283
+ const common = explainCommon(tx, { ...params, changeInfo }, network);
284
+ const inputSignaturesCount = getPsbtInputSignaturesCount(psbt, params);
285
+ // Set fee from subtracting inputs from outputs
286
+ const outputAmount = txOutputs.reduce((cumulative, curr) => cumulative + BigInt(curr.value), BigInt(0));
287
+ const inputAmount = psbt.txInputs.reduce((cumulative, txInput, i) => {
288
+ const data = psbt.data.inputs[i];
289
+ if (data.witnessUtxo) {
290
+ return cumulative + BigInt(data.witnessUtxo.value);
291
+ }
292
+ else if (data.nonWitnessUtxo) {
293
+ const tx = utxo_lib_1.bitgo.createTransactionFromBuffer(data.nonWitnessUtxo, network, { amountType: 'bigint' });
294
+ return cumulative + BigInt(tx.outs[txInput.index].value);
295
+ }
296
+ else {
297
+ throw new Error('could not find value on input');
298
+ }
299
+ }, BigInt(0));
300
+ return {
301
+ ...common,
302
+ fee: (inputAmount - outputAmount).toString(),
303
+ inputSignatures: inputSignaturesCount,
304
+ signatures: inputSignaturesCount.reduce((prev, curr) => (curr > prev ? curr : prev), 0),
305
+ messages,
306
+ };
307
+ }
308
+ function explainLegacyTx(tx, params, network) {
309
+ const common = explainCommon(tx, params, network);
310
+ const inputSignaturesCount = getTxInputSignaturesCount(tx, params, network);
311
+ return {
312
+ ...common,
313
+ inputSignatures: inputSignaturesCount,
314
+ signatures: inputSignaturesCount.reduce((prev, curr) => (curr > prev ? curr : prev), 0),
315
+ };
316
+ }
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1KQSxrQ0FrTUM7QUFFRCwwQ0FnQkM7QUF2V0QsOERBQWdEO0FBQ2hELHFEQUErQztBQUMvQyxtREFBb0U7QUFFcEUsZ0VBQWtEO0FBR2xELDRDQUF1RDtBQUN2RCw4RUFBMkU7QUFRM0UsU0FBUyxhQUFhLENBQ3BCLEVBQWtDLEVBQ2xDLE1BR0MsRUFDRCxPQUF3QjtJQUV4QixNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4RixJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sYUFBYSxHQUE4QixFQUFFLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDOUIsTUFBTSxlQUFlLEdBQUcsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV0RSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1FBQ2hDLHdIQUF3SDtRQUN4SCx5RUFBeUU7UUFDekUsTUFBTSxjQUFjLEdBQUcsSUFBQSxtQ0FBdUIsRUFBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlFLE1BQU0sYUFBYSxHQUFH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QUNULEdBQUcsRUFBRSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDNUMsZUFBZSxFQUFFLG9CQUFvQjtRQUNyQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixRQUFRO0tBQ2lCLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FDN0IsRUFBa0MsRUFDbEMsTUFJQyxFQUNELE9BQXdCO0lBRXhCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sb0JBQW9CLEdBQUcseUJBQXlCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsZUFBZSxFQUFFLG9CQUFvQjtRQUNyQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUM5RCxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UsIGJpdGdvIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgVHJpcGxlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdXR4b2NvcmUgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlJztcblxuaW1wb3J0IHsgT3V0cHV0LCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBCaXAzMjJNZXNzYWdlLCBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCB9IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQgfSBmcm9tICcuLi9yZWNpcGllbnQnO1xuaW1wb3J0IHsgZ2V0UGF5R29WZXJpZmljYXRpb25QdWJrZXkgfSBmcm9tICcuLi9nZXRQYXlHb1ZlcmlmaWNhdGlvblB1YmtleSc7XG5cbmV4cG9ydCB0eXBlIENoYW5nZUFkZHJlc3NJbmZvID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBleHBsYWluQ29tbW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICBwYXJhbXM6IHtcbiAgICBjaGFuZ2VJbmZvPzogQ2hhbmdlQWRkcmVzc0luZm9bXTtcbiAgICBmZWVJbmZvPzogc3RyaW5nO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbikge1xuICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJ107XG4gIGxldCBzcGVuZEFtb3VudCA9IEJpZ0ludCgwKTtcbiAgbGV0IGNoYW5nZUFtb3VudCA9IEJpZ0ludCgwKTtcbiAgY29uc3QgY2hhbmdlT3V0cHV0czogRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXRbXSA9IFtdO1xuICBjb25zdCBvdXRwdXRzOiBPdXRwdXRbXSA9IFtdO1xuXG4gIGNvbnN0IHsgY2hhbmdlSW5mbyB9ID0gcGFyYW1zO1xuICBjb25zdCBjaGFuZ2VBZGRyZXNzZXMgPSBjaGFuZ2VJbmZvPy5tYXAoKGluZm8pID0+IGluZm8uYWRkcmVzcykgPz8gW107XG5cbiAgdHgub3V0cy5mb3JFYWNoKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgLy8gVHJ5IHRvIGVuY29kZSB0aGUgc2NyaXB0IHB1YmtleSB3aXRoIGFuIGFkZHJlc3MuIElmIGl0IGZhaWxzLCB0cnkgdG8gcGFyc2UgaXQgYXMgYW4gT1BfUkVUVVJOIG91dHB1dCB3aXRoIHRoZSBwcmVmaXguXG4gICAgLy8gSWYgdGhhdCBmYWlscywgdGhlbiBpdCBpcyBhbiB1bnJlY29nbml6ZWQgc2NyaXB0UHVia2V5IGFuZCBzaG91bGQgZmFpbFxuICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQoY3VycmVudE91dHB1dC5zY3JpcHQsIG5ldHdvcmspO1xuICAgIGNvbnN0IGN1cnJlbnRBbW91bnQgPSBCaWdJbnQoY3VycmVudE91dHB1dC52YWx1ZSk7XG5cbiAgICBpZiAoY2hhbmdlQWRkcmVzc2VzLmluY2x1ZGVzKGN1cnJlbnRBZGRyZXNzKSkge1xuICAgICAgLy8gdGhpcyBpcyBjaGFuZ2VcbiAgICAgIGNoYW5nZUFtb3VudCArPSBjdXJyZW50QW1vdW50O1xuICAgICAgY29uc3QgY2hhbmdlID0gY2hhbmdlSW5mbz8uZmluZCgoY2hhbmdlKSA9PiBjaGFuZ2UuYWRkcmVzcyA9PT0gY3VycmVudEFkZHJlc3MpO1xuXG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYW5nZUluZm8gbXVzdCBoYXZlIGNoYW5nZSBpbmZvcm1hdGlvbiBmb3IgYWxsIGNoYW5nZSBvdXRwdXRzJyk7XG4gICAgICB9XG4gICAgICBjaGFuZ2VPdXRwdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBjdXJyZW50QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNoYWluOiBjaGFuZ2UuY2hhaW4sXG4gICAgICAgIGluZGV4OiBjaGFuZ2UuaW5kZXgsXG4gICAgICAgIGV4dGVybmFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNwZW5kQW1vdW50ICs9IGN1cnJlbnRBbW91bnQ7XG4gICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgYW1vdW50OiBjdXJyZW50QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAvLyBJZiBjaGFuZ2VJbmZvIGhhcyBhIGxlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGluZm9ybWF0aW9uXG4gICAgICAvLyB3YXMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGJ1dCB0aGUgb3V0cHV0IHdhcyBub3QgaWRlbnRpZmllZCBhcyBjaGFuZ2UuIEluIHRoaXMgY2FzZSxcbiAgICAgIC8vIHRoZSBvdXRwdXQgaXMgZXh0ZXJuYWwsIGFuZCB3ZSBjYW4gc2V0IGl0IGFzIHNvLiBJZiBjaGFuZ2VJbmZvIGlzIHVuZGVmaW5lZCwgaXQgbWVhbnMgd2Ugd2VyZVxuICAgICAgLy8gZ2l2ZW4gbm8gaW5mb3JtYXRpb24gYWJvdXQgY2hhbmdlIG91dHB1dHMsIHNvIHdlIGNhbid0IGRldGVybWluZSBhbnl0aGluZyBhYm91dCB0aGUgb3V0cHV0LFxuICAgICAgLy8gc28gd2UgbGVhdmUgaXQgdW5kZWZpbmVkLlxuICAgICAgZXh0ZXJuYWw6IGNoYW5nZUluZm8gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBvdXRwdXREZXRhaWxzID0ge1xuICAgIG91dHB1dEFtb3VudDogc3BlbmRBbW91bnQudG9TdHJpbmcoKSxcbiAgICBjaGFuZ2VBbW91bnQ6IGNoYW5nZUFtb3VudC50b1N0cmluZygpLFxuICAgIG91dHB1dHMsXG4gICAgY2hhbmdlT3V0cHV0cyxcbiAgfTtcblxuICBsZXQgZmVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBsb2NrdGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChwYXJhbXMuZmVlSW5mbykge1xuICAgIGRpc3BsYXlPcmRlci5wdXNoKCdmZWUnKTtcbiAgICBmZWUgPSBwYXJhbXMuZmVlSW5mbztcbiAgfVxuXG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHR4LmxvY2t0aW1lKSAmJiB0eC5sb2NrdGltZSA+IDApIHtcbiAgICBkaXNwbGF5T3JkZXIucHVzaCgnbG9ja3RpbWUnKTtcbiAgICBsb2NrdGltZSA9IHR4LmxvY2t0aW1lO1xuICB9XG5cbiAgcmV0dXJuIHsgZGlzcGxheU9yZGVyLCBpZDogdHguZ2V0SWQoKSwgLi4ub3V0cHV0RGV0YWlscywgZmVlLCBsb2NrdGltZSB9O1xufVxuXG5mdW5jdGlvbiBnZXRSb290V2FsbGV0S2V5cyhwYXJhbXM6IHsgcHVicz86IHN0cmluZ1tdIH0pIHtcbiAgY29uc3Qga2V5cyA9IHBhcmFtcy5wdWJzPy5tYXAoKHhwdWIpID0+IGJpcDMyLmZyb21CYXNlNTgoeHB1YikpO1xuICByZXR1cm4ga2V5cyAmJiBrZXlzLmxlbmd0aCA9PT0gMyA/IG5ldyBiaXRnby5Sb290V2FsbGV0S2V5cyhrZXlzIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4pIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRQc2J0SW5wdXRTaWduYXR1cmVzQ291bnQoXG4gIHBzYnQ6IGJpdGdvLlV0eG9Qc2J0LFxuICBwYXJhbXM6IHtcbiAgICBwdWJzPzogc3RyaW5nW107XG4gIH1cbikge1xuICBjb25zdCByb290V2FsbGV0S2V5cyA9IGdldFJvb3RXYWxsZXRLZXlzKHBhcmFtcyk7XG4gIHJldHVybiByb290V2FsbGV0S2V5c1xuICAgID8gYml0Z28uZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5UHNidChwc2J0LCByb290V2FsbGV0S2V5cykubWFwKChzdikgPT4gc3ZbMV0uZmlsdGVyKCh2KSA9PiB2KS5sZW5ndGgpXG4gICAgOiAoQXJyYXkocHNidC5kYXRhLmlucHV0cy5sZW5ndGgpIGFzIG51bWJlcltdKS5maWxsKDApO1xufVxuXG5mdW5jdGlvbiBnZXRUeElucHV0U2lnbmF0dXJlc0NvdW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICBwYXJhbXM6IHtcbiAgICB0eEluZm8/OiB7IHVuc3BlbnRzPzogYml0Z28uVW5zcGVudDxUTnVtYmVyPltdIH07XG4gICAgcHVicz86IHN0cmluZ1tdO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbikge1xuICBjb25zdCBwcmV2T3V0cHV0cyA9IHBhcmFtcy50eEluZm8/LnVuc3BlbnRzPy5tYXAoKHUpID0+IGJpdGdvLnRvT3V0cHV0PFROdW1iZXI+KHUsIG5ldHdvcmspKTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXRSb290V2FsbGV0S2V5cyhwYXJhbXMpO1xuICBjb25zdCB7IHVuc3BlbnRzID0gW10gfSA9IHBhcmFtcy50eEluZm8gPz8ge307XG5cbiAgLy8gZ2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBwZXIgaW5wdXRcbiAgcmV0dXJuIHR4Lmlucy5tYXAoKGlucHV0LCBpZHgpOiBudW1iZXIgPT4ge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggIT09IHR4Lmlucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoIXByZXZPdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc3RhdGVgKTtcbiAgICB9XG4gICAgaWYgKCFyb290V2FsbGV0S2V5cykge1xuICAgICAgLy8gbm8gcHViIGtleXMgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBwdWIga2V5c1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYml0Z28udmVyaWZ5U2lnbmF0dXJlV2l0aFVuc3BlbnQ8VE51bWJlcj4odHgsIGlkeCwgdW5zcGVudHMsIHJvb3RXYWxsZXRLZXlzKS5maWx0ZXIoKHYpID0+IHYpLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjYW4ndCB2YWxpZGF0ZSB0aGUgc2lnbmF0dXJlc1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWNvbXBvc2UgYSByYXcgcHNidCBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAqIGNoYW5nZSBhbW91bnRzLCBhbmQgdHJhbnNhY3Rpb24gb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Qc2J0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQsIFR4IGV4dGVuZHMgYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4+KFxuICBwc2J0OiBiaXRnby5VdHhvUHNidDxUeD4sXG4gIHBhcmFtczoge1xuICAgIHB1YnM/OiBzdHJpbmdbXTtcbiAgICB0eEluZm8/OiB7IHVuc3BlbnRzPzogYml0Z28uVW5zcGVudDxUTnVtYmVyPltdIH07XG4gIH0sXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgeyBzdHJpY3QgPSBmYWxzZSB9OiB7IHN0cmljdD86IGJvb2xlYW4gfSA9IHt9XG4pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgY29uc3QgdHhPdXRwdXRzID0gcHNidC50eE91dHB1dHM7XG4gIGNvbnN0IHR4SW5wdXRzID0gcHNidC50eElucHV0cztcblxuICBmdW5jdGlvbiBnZXRDaGFpbkFuZEluZGV4RnJvbUJpcDMyRGVyaXZhdGlvbnMob3V0cHV0OiBiaXRnby5Qc2J0T3V0cHV0KSB7XG4gICAgY29uc3QgZGVyaXZhdGlvbnMgPSBvdXRwdXQuYmlwMzJEZXJpdmF0aW9uID8/IG91dHB1dC50YXBCaXAzMkRlcml2YXRpb24gPz8gdW5kZWZpbmVkO1xuICAgIGlmICghZGVyaXZhdGlvbnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHBhdGhzID0gZGVyaXZhdGlvbnMubWFwKChkKSA9PiBkLnBhdGgpO1xuICAgIGlmICghcGF0aHMgfHwgcGF0aHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIDMgcGF0aHMgaW4gYmlwMzJEZXJpdmF0aW9uIG9yIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXBhdGhzLmV2ZXJ5KChwKSA9PiBwYXRoc1swXSA9PT0gcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYWxsIHBhdGhzIHRvIGJlIHRoZSBzYW1lJyk7XG4gICAgfVxuXG4gICAgcGF0aHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgaWYgKHBhdGhzWzBdICE9PSBwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnVW5hYmxlIHRvIGdldCBhIHNpbmdsZSBjaGFpbiBhbmQgaW5kZXggb24gdGhlIG91dHB1dCBiZWNhdXNlIHRoZXJlIGFyZSBkaWZmZXJlbnQgcGF0aHMgZm9yIGRpZmZlcmVudCBrZXlzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmdldENoYWluQW5kSW5kZXhGcm9tUGF0aChwYXRoc1swXSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDaGFuZ2VJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5maW5kSW50ZXJuYWxPdXRwdXRJbmRpY2VzKHBzYnQpLm1hcCgoaSkgPT4ge1xuICAgICAgICBjb25zdCBkZXJpdmF0aW9uSW5mb3JtYXRpb24gPSBnZXRDaGFpbkFuZEluZGV4RnJvbUJpcDMyRGVyaXZhdGlvbnMocHNidC5kYXRhLm91dHB1dHNbaV0pO1xuICAgICAgICBpZiAoIWRlcml2YXRpb25JbmZvcm1hdGlvbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBvbiBiaXAzMkRlcml2YXRpb24gb3IgdGFwQmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRyZXNzOiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdCh0eE91dHB1dHNbaV0uc2NyaXB0LCBuZXR3b3JrKSxcbiAgICAgICAgICBleHRlcm5hbDogZmFsc2UsXG4gICAgICAgICAgLi4uZGVyaXZhdGlvbkluZm9ybWF0aW9uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLkVycm9yTm9NdWx0aVNpZ0lucHV0Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgUGF5R28gYWRkcmVzcyBwcm9vZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBQU0JUIGlmIHByZXNlbnRcbiAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIFBheUdvIHByb29mLCBpbmNsdWRpbmcgdGhlIG91dHB1dCBpbmRleCBhbmQgYWRkcmVzc1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF5R29WZXJpZmljYXRpb25JbmZvKCk6IHsgb3V0cHV0SW5kZXg6IG51bWJlcjsgdmVyaWZpY2F0aW9uUHVia2V5OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IG91dHB1dEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvLyBDaGVjayBpZiB0aGlzIFBTQlQgaGFzIGFueSBQYXlHbyBhZGRyZXNzIHByb29mc1xuICAgIGlmICghdXR4b2NvcmUucGF5Z28ucHNidE91dHB1dEluY2x1ZGVzUGF5Z29BZGRyZXNzUHJvb2YocHNidCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBwdWxscyB0aGUgcHVia2V5IGRlcGVuZGluZyBvbiBnaXZlbiBuZXR3b3JrXG4gICAgY29uc3QgdmVyaWZpY2F0aW9uUHVia2V5ID0gZ2V0UGF5R29WZXJpZmljYXRpb25QdWJrZXkobmV0d29yayk7XG4gICAgLy8gZmluZCB3aGljaCBvdXRwdXQgaW5kZXggdGhhdCBjb250YWlucyB0aGUgUGF5R28gcHJvb2ZcbiAgICBvdXRwdXRJbmRleCA9IHV0eG9jb3JlLnBheWdvLmdldFBheUdvQWRkcmVzc1Byb29mT3V0cHV0SW5kZXgocHNidCk7XG4gICAgaWYgKG91dHB1dEluZGV4ID09PSB1bmRlZmluZWQgfHwgIXZlcmlmaWNhdGlvblB1YmtleSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gdHhPdXRwdXRzW291dHB1dEluZGV4XTtcbiAgICBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0LnNjcmlwdCwgbmV0d29yayk7XG4gICAgaWYgKCFhZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZGVyaXZlIGFkZHJlc3MgJHthZGRyZXNzfSBQYXkgR28gQXR0ZXN0YXRpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3V0cHV0SW5kZXgsIHZlcmlmaWNhdGlvblB1YmtleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdGhlIEJJUDMyMiBtZXNzYWdlcyBhbmQgYWRkcmVzc2VzIGZyb20gdGhlIFBTQlQgaW5wdXRzIGFuZCBwZXJmb3JtXG4gICAqIHZlcmlmaWNhdGlvbiBvbiB0aGUgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIHRoYXQgaXQgbWVldHMgdGhlIEJJUDMyMiByZXF1aXJlbWVudHMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUgbWVzc2FnZSBhbmQgYWRkcmVzcyBmb3IgZWFjaCBpbnB1dCxcbiAgICogICAgICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vIEJJUDMyMiBtZXNzYWdlcyBhcmUgZm91bmQuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRCaXAzMjJNZXNzYWdlSW5mb0FuZFZlcmlmeSgpOiBCaXAzMjJNZXNzYWdlW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGJpcDMyMk1lc3NhZ2VzOiB7IG1lc3NhZ2U6IHN0cmluZzsgYWRkcmVzczogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHNidC5kYXRhLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGJpcDMyMi5nZXRCaXAzMjJQcm9vZk1lc3NhZ2VBdEluZGV4KHBzYnQsIGkpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2ldO1xuICAgICAgICBpZiAoIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHdpdG5lc3NVdHhvIGZvciBpbnB1dCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBub25XaXRuZXNzVXR4byBmb3IgaW5wdXQgaW5kZXggJHtpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcmlwdFB1YktleSA9IGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdDtcblxuICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdG9TcGVuZCB0cmFuc2FjdGlvbiBjYW4gYmUgcmVjcmVhdGVkIGluIHRoZSBQU0JUIGFuZCBpcyBlbmNvZGVkIGNvcnJlY3RseSBpbiB0aGUgbm9uV2l0bmVzc1V0eG9cbiAgICAgICAgY29uc3QgdG9TcGVuZCA9IGJpcDMyMi5idWlsZFRvU3BlbmRUcmFuc2FjdGlvbihzY3JpcHRQdWJLZXksIG1lc3NhZ2UpO1xuICAgICAgICBjb25zdCB0b1NwZW5kQjY0ID0gdG9TcGVuZC50b0J1ZmZlcigpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgaWYgKGlucHV0Lm5vbldpdG5lc3NVdHhvLnRvU3RyaW5nKCdiYXNlNjQnKSAhPT0gdG9TcGVuZEI2NCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uLXdpdG5lc3MgVVRYTyBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdG9TcGVuZCB0cmFuc2FjdGlvbiBhdCBpbnB1dCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdG9TcGVuZCB0cmFuc2FjdGlvbiBJRCBtYXRjaGVzIHRoZSBpbnB1dCdzIHJlZmVyZW5jZWQgdHJhbnNhY3Rpb24gSURcbiAgICAgICAgaWYgKHRvU3BlbmQuZ2V0SWQoKSAhPT0gdXR4b2xpYi5iaXRnby5nZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2ldKS50eGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb1NwZW5kIHRyYW5zYWN0aW9uIElEIGRvZXMgbm90IG1hdGNoIHRoZSBpbnB1dCBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgdGhlIGlucHV0IHNwZWNpZmljc1xuICAgICAgICBpZiAodHhJbnB1dHNbaV0uc2VxdWVuY2UgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2UgbnVtYmVyIGF0IGlucHV0IGluZGV4ICR7aX06ICR7dHhJbnB1dHNbaV0uc2VxdWVuY2V9LiBFeHBlY3RlZCAwLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eElucHV0c1tpXS5pbmRleCAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBpbnB1dCBpbmRleCBhdCBwb3NpdGlvbiAke2l9OiAke3R4SW5wdXRzW2ldLmluZGV4fS4gRXhwZWN0ZWQgMC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpcDMyMk1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UudG9TdHJpbmcoJ3V0ZjgnKSxcbiAgICAgICAgICBhZGRyZXNzOiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHRQdWJLZXksIG5ldHdvcmspLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmlwMzIyTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBCSVAzMjIgbWVzc2FnZSBpbiBhbnkgaW5wdXQsIGFsbCBpbnB1dHMgbXVzdCBoYXZlIG9uZS5cbiAgICAgIGlmIChiaXAzMjJNZXNzYWdlcy5sZW5ndGggIT09IHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb25zaXN0ZW50IEJJUDMyMiBtZXNzYWdlcyBhY3Jvc3MgaW5wdXRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgdGhlIHRyYW5zYWN0aW9uIHNwZWNpZmljcyBmb3IgQklQMzIyXG4gICAgICBpZiAocHNidC52ZXJzaW9uICE9PSAwICYmIHBzYnQudmVyc2lvbiAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIFBTQlQgdmVyc2lvbiBmb3IgQklQMzIyOiAke3BzYnQudmVyc2lvbn0uIEV4cGVjdGVkIDAgYCk7XG4gICAgICB9XG4gICAgICBpZiAocHNidC5kYXRhLm91dHB1dHMubGVuZ3RoICE9PSAxIHx8IHR4T3V0cHV0c1swXS5zY3JpcHQudG9TdHJpbmcoJ2hleCcpICE9PSAnNmEnIHx8IHR4T3V0cHV0c1swXS52YWx1ZSAhPT0gMG4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgb3V0cHV0cyBmb3IgQklQMzIyLiBFeHBlY3RlZCBleGFjdGx5IG9uZSBPUF9SRVRVUk4gb3V0cHV0IHdpdGggemVybyB2YWx1ZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJpcDMyMk1lc3NhZ2VzO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXlHb1ZlcmlmaWNhdGlvbkluZm8gPSBnZXRQYXlHb1ZlcmlmaWNhdGlvbkluZm8oKTtcbiAgaWYgKHBheUdvVmVyaWZpY2F0aW9uSW5mbykge1xuICAgIHRyeSB7XG4gICAgICB1dHhvY29yZS5wYXlnby52ZXJpZnlQYXlHb0FkZHJlc3NQcm9vZihcbiAgICAgICAgcHNidCxcbiAgICAgICAgcGF5R29WZXJpZmljYXRpb25JbmZvLm91dHB1dEluZGV4LFxuICAgICAgICB1dHhvbGliLmJpcDMyLmZyb21CYXNlNTgocGF5R29WZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvblB1YmtleSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKS5wdWJsaWNLZXlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXNzYWdlcyA9IGdldEJpcDMyMk1lc3NhZ2VJbmZvQW5kVmVyaWZ5KCk7XG4gIGNvbnN0IGNoYW5nZUluZm8gPSBnZXRDaGFuZ2VJbmZvKCk7XG4gIGNvbnN0IHR4ID0gcHNidC5nZXRVbnNpZ25lZFR4KCkgYXMgYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+O1xuICBjb25zdCBjb21tb24gPSBleHBsYWluQ29tbW9uKHR4LCB7IC4uLnBhcmFtcywgY2hhbmdlSW5mbyB9LCBuZXR3b3JrKTtcbiAgY29uc3QgaW5wdXRTaWduYXR1cmVzQ291bnQgPSBnZXRQc2J0SW5wdXRTaWduYXR1cmVzQ291bnQocHNidCwgcGFyYW1zKTtcblxuICAvLyBTZXQgZmVlIGZyb20gc3VidHJhY3RpbmcgaW5wdXRzIGZyb20gb3V0cHV0c1xuICBjb25zdCBvdXRwdXRBbW91bnQgPSB0eE91dHB1dHMucmVkdWNlKChjdW11bGF0aXZlLCBjdXJyKSA9PiBjdW11bGF0aXZlICsgQmlnSW50KGN1cnIudmFsdWUpLCBCaWdJbnQoMCkpO1xuICBjb25zdCBpbnB1dEFtb3VudCA9IHBzYnQudHhJbnB1dHMucmVkdWNlKChjdW11bGF0aXZlLCB0eElucHV0LCBpKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHBzYnQuZGF0YS5pbnB1dHNbaV07XG4gICAgaWYgKGRhdGEud2l0bmVzc1V0eG8pIHtcbiAgICAgIHJldHVybiBjdW11bGF0aXZlICsgQmlnSW50KGRhdGEud2l0bmVzc1V0eG8udmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5ub25XaXRuZXNzVXR4bykge1xuICAgICAgY29uc3QgdHggPSBiaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXI8YmlnaW50PihkYXRhLm5vbldpdG5lc3NVdHhvLCBuZXR3b3JrLCB7IGFtb3VudFR5cGU6ICdiaWdpbnQnIH0pO1xuICAgICAgcmV0dXJuIGN1bXVsYXRpdmUgKyBCaWdJbnQodHgub3V0c1t0eElucHV0LmluZGV4XS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgdmFsdWUgb24gaW5wdXQnKTtcbiAgICB9XG4gIH0sIEJpZ0ludCgwKSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb21tb24sXG4gICAgZmVlOiAoaW5wdXRBbW91bnQgLSBvdXRwdXRBbW91bnQpLnRvU3RyaW5nKCksXG4gICAgaW5wdXRTaWduYXR1cmVzOiBpbnB1dFNpZ25hdHVyZXNDb3VudCxcbiAgICBzaWduYXR1cmVzOiBpbnB1dFNpZ25hdHVyZXNDb3VudC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IChjdXJyID4gcHJldiA/IGN1cnIgOiBwcmV2KSwgMCksXG4gICAgbWVzc2FnZXMsXG4gIH0gYXMgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5MZWdhY3lUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgcGFyYW1zOiB7XG4gICAgcHVicz86IHN0cmluZ1tdO1xuICAgIHR4SW5mbz86IHsgdW5zcGVudHM/OiBiaXRnby5VbnNwZW50PFROdW1iZXI+W10gfTtcbiAgICBjaGFuZ2VJbmZvPzogeyBhZGRyZXNzOiBzdHJpbmc7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICBjb25zdCBjb21tb24gPSBleHBsYWluQ29tbW9uKHR4LCBwYXJhbXMsIG5ldHdvcmspO1xuICBjb25zdCBpbnB1dFNpZ25hdHVyZXNDb3VudCA9IGdldFR4SW5wdXRTaWduYXR1cmVzQ291bnQodHgsIHBhcmFtcywgbmV0d29yayk7XG4gIHJldHVybiB7XG4gICAgLi4uY29tbW9uLFxuICAgIGlucHV0U2lnbmF0dXJlczogaW5wdXRTaWduYXR1cmVzQ291bnQsXG4gICAgc2lnbmF0dXJlczogaW5wdXRTaWduYXR1cmVzQ291bnQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoY3VyciA+IHByZXYgPyBjdXJyIDogcHJldiksIDApLFxuICB9IGFzIFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ export { explainPsbt, explainLegacyTx, ChangeAddressInfo } from './explainTransaction';
2
+ export { parseTransaction } from './parseTransaction';
3
+ export { CustomChangeOptions } from './parseOutput';
4
+ export { verifyTransaction } from './verifyTransaction';
5
+ export { signTransaction } from './signTransaction';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signTransaction = exports.verifyTransaction = exports.parseTransaction = exports.explainLegacyTx = exports.explainPsbt = void 0;
4
+ var explainTransaction_1 = require("./explainTransaction");
5
+ Object.defineProperty(exports, "explainPsbt", { enumerable: true, get: function () { return explainTransaction_1.explainPsbt; } });
6
+ Object.defineProperty(exports, "explainLegacyTx", { enumerable: true, get: function () { return explainTransaction_1.explainLegacyTx; } });
7
+ var parseTransaction_1 = require("./parseTransaction");
8
+ Object.defineProperty(exports, "parseTransaction", { enumerable: true, get: function () { return parseTransaction_1.parseTransaction; } });
9
+ var verifyTransaction_1 = require("./verifyTransaction");
10
+ Object.defineProperty(exports, "verifyTransaction", { enumerable: true, get: function () { return verifyTransaction_1.verifyTransaction; } });
11
+ var signTransaction_1 = require("./signTransaction");
12
+ Object.defineProperty(exports, "signTransaction", { enumerable: true, get: function () { return signTransaction_1.signTransaction; } });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQXVGO0FBQTlFLGlIQUFBLFdBQVcsT0FBQTtBQUFFLHFIQUFBLGVBQWUsT0FBQTtBQUNyQyx1REFBc0Q7QUFBN0Msb0hBQUEsZ0JBQWdCLE9BQUE7QUFFekIseURBQXdEO0FBQS9DLHNIQUFBLGlCQUFpQixPQUFBO0FBQzFCLHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBleHBsYWluUHNidCwgZXhwbGFpbkxlZ2FjeVR4LCBDaGFuZ2VBZGRyZXNzSW5mbyB9IGZyb20gJy4vZXhwbGFpblRyYW5zYWN0aW9uJztcbmV4cG9ydCB7IHBhcnNlVHJhbnNhY3Rpb24gfSBmcm9tICcuL3BhcnNlVHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucyB9IGZyb20gJy4vcGFyc2VPdXRwdXQnO1xuZXhwb3J0IHsgdmVyaWZ5VHJhbnNhY3Rpb24gfSBmcm9tICcuL3ZlcmlmeVRyYW5zYWN0aW9uJztcbmV4cG9ydCB7IHNpZ25UcmFuc2FjdGlvbiB9IGZyb20gJy4vc2lnblRyYW5zYWN0aW9uJztcbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { IRequestTracer, IWallet, TransactionPrebuild, VerificationOptions, ITransactionRecipient, Triple } from '@bitgo-beta/sdk-core';
2
+ import { AbstractUtxoCoin, Output } from '../../abstractUtxoCoin';
3
+ export interface CustomChangeOptions {
4
+ keys: Triple<{
5
+ pub: string;
6
+ }>;
7
+ signatures: Triple<string>;
8
+ }
9
+ export interface ParseOutputOptions {
10
+ currentOutput: Output;
11
+ coin: AbstractUtxoCoin;
12
+ txPrebuild: TransactionPrebuild;
13
+ verification: VerificationOptions;
14
+ keychainArray: Triple<{
15
+ pub: string;
16
+ }>;
17
+ wallet: IWallet;
18
+ txParams: {
19
+ recipients: ITransactionRecipient[];
20
+ changeAddress?: string;
21
+ };
22
+ customChange?: CustomChangeOptions;
23
+ reqId?: IRequestTracer;
24
+ }
25
+ export declare function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }: ParseOutputOptions): Promise<Output>;
26
+ //# sourceMappingURL=parseOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseOutput.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseOutput.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,cAAc,EAEd,OAAO,EACP,mBAAmB,EAEnB,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,EACP,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAkB,MAAM,wBAAwB,CAAC;AA0KlF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,mBAAmB,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE;QACR,UAAU,EAAE,qBAAqB,EAAE,CAAC;QACpC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,EAChC,aAAa,EACb,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,KAAK,GACN,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+GtC"}