@atomicfinance/bitcoin-wallet-provider 2.2.3

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.
@@ -0,0 +1,87 @@
1
+ import Provider from '@atomicfinance/provider';
2
+ import { CreateMultisigResponse, finalizePSBTResponse, FinanceWalletProvider, Input, Output } from '@atomicfinance/types';
3
+ import { BitcoinNetwork } from '@liquality/bitcoin-networks';
4
+ import { Address, bitcoin as bT, Transaction } from '@liquality/types';
5
+ import * as bitcoin from 'bitcoinjs-lib';
6
+ declare type UnusedAddressesBlacklist = {
7
+ [address: string]: true;
8
+ };
9
+ export default class BitcoinWalletProvider extends Provider implements Partial<FinanceWalletProvider> {
10
+ _network: BitcoinNetwork;
11
+ _unusedAddressesBlacklist: UnusedAddressesBlacklist;
12
+ constructor(network: BitcoinNetwork);
13
+ buildSweepTransactionWithSetOutputs(externalChangeAddress: string, feePerByte: number, _outputs: Output[], fixedInputs: Input[]): Promise<{
14
+ hex: string;
15
+ fee: number;
16
+ }>;
17
+ getUnusedAddressesBlacklist(): UnusedAddressesBlacklist;
18
+ setUnusedAddressesBlacklist(unusedAddressesBlacklist: UnusedAddressesBlacklist): void;
19
+ _createMultisigPayment(m: number, pubkeys: string[]): bitcoin.Payment;
20
+ /**
21
+ * Creates a native-segwit multi-signature address (P2MS in P2WSH) with n signatures of m required keys
22
+ * https://developer.bitcoin.org/reference/rpc/createmultisig.html
23
+ * @param m the number of required signatures
24
+ * @param pubkeys n possible pubkeys in total
25
+ * @returns a json object containing the `address` and `redeemScript`
26
+ */
27
+ createMultisig(m: number, pubkeys: string[]): CreateMultisigResponse;
28
+ /**
29
+ * Creates a PSBT of a native-segwit multi-signature address (P2MS in P2WSH) with n signatures of m required keys
30
+ * https://developer.bitcoin.org/reference/rpc/createmultisig.html
31
+ * https://developer.bitcoin.org/reference/rpc/createpsbt.html
32
+ * @param m the number of required signatures
33
+ * @param pubkeys n possible pubkeys in total
34
+ * @param inputs the Inputs to the PSBT
35
+ * @param ouputs the Outputs to the PSBT
36
+ * @returns a base64 encoded psbt string
37
+ */
38
+ buildMultisigPSBT(m: number, pubkeys: string[], inputs: Input[], outputs: Output[]): string;
39
+ /**
40
+ * Update a PSBT with input information from our wallet and then sign inputs that we can sign for
41
+ * https://developer.bitcoin.org/reference/rpc/walletprocesspsbt.html
42
+ * @param psbt a base64 encoded psbt string (P2WSH only)
43
+ * @returns a base64 encoded signed psbt string
44
+ */
45
+ walletProcessPSBT(psbtString: string): Promise<string>;
46
+ /**
47
+ * Finalize the inputs of a PSBT. If the transaction is fully signed, it will
48
+ * produce a network serialized transaction which can be broadcast with sendrawtransaction
49
+ * https://developer.bitcoin.org/reference/rpc/finalizepsbt.html
50
+ * @param psbt a base64 encoded psbt string
51
+ * @returns a json object containing `psbt` in base64, `hex` for transaction and `complete` for if
52
+ * the transaction has a complete set of signatures
53
+ */
54
+ finalizePSBT(psbtString: string): finalizePSBTResponse;
55
+ getUnusedAddress(change?: boolean, numAddressPerCall?: number): Promise<any>;
56
+ _getUsedUnusedAddresses(numAddressPerCall: number, addressType: any): Promise<{
57
+ usedAddresses: any[];
58
+ unusedAddress: {
59
+ change: any;
60
+ nonChange: any;
61
+ };
62
+ firstUnusedAddress: any;
63
+ }>;
64
+ sendSweepTransactionWithSetOutputs(externalChangeAddress: string, feePerByte: number, _outputs: Output[], fixedInputs: Input[]): Promise<Transaction<bT.Transaction>>;
65
+ _buildSweepTransaction(externalChangeAddress: string, feePerByte: number, _outputs: Output[], fixedInputs: Input[]): Promise<{
66
+ hex: string;
67
+ fee: number;
68
+ }>;
69
+ _getInputForAmountWithoutUtxoCheck(_outputs: Output[], _feePerByte: number, fixedInputs: Input[]): {
70
+ inputs: bT.UTXO[];
71
+ outputs: {
72
+ value: number;
73
+ id?: string;
74
+ }[];
75
+ fee: number;
76
+ change: {
77
+ value: number;
78
+ id?: string;
79
+ };
80
+ };
81
+ _buildTransactionWithoutUtxoCheck(outputs: Output[], feePerByte: number, fixedInputs: Input[]): Promise<{
82
+ hex: string;
83
+ fee: number;
84
+ }>;
85
+ quickFindAddress(addresses: string[]): Promise<Address>;
86
+ }
87
+ export {};
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ const provider_1 = __importDefault(require("@atomicfinance/provider"));
26
+ const types_1 = require("@atomicfinance/types");
27
+ const bitcoin_utils_1 = require("@liquality/bitcoin-utils");
28
+ const assert_1 = __importDefault(require("assert"));
29
+ const bitcoin = __importStar(require("bitcoinjs-lib"));
30
+ const secp256k1_1 = __importDefault(require("secp256k1"));
31
+ const FEE_PER_BYTE_FALLBACK = 5;
32
+ const ADDRESS_GAP = 20;
33
+ const NONCHANGE_ADDRESS = 0;
34
+ const CHANGE_ADDRESS = 1;
35
+ const NONCHANGE_OR_CHANGE_ADDRESS = 2;
36
+ class BitcoinWalletProvider extends provider_1.default {
37
+ constructor(network) {
38
+ super();
39
+ this._network = network;
40
+ this._unusedAddressesBlacklist = {};
41
+ }
42
+ async buildSweepTransactionWithSetOutputs(externalChangeAddress, feePerByte, _outputs, fixedInputs) {
43
+ return this._buildSweepTransaction(externalChangeAddress, feePerByte, _outputs, fixedInputs);
44
+ }
45
+ getUnusedAddressesBlacklist() {
46
+ return this._unusedAddressesBlacklist;
47
+ }
48
+ setUnusedAddressesBlacklist(unusedAddressesBlacklist) {
49
+ this._unusedAddressesBlacklist = unusedAddressesBlacklist;
50
+ }
51
+ _createMultisigPayment(m, pubkeys) {
52
+ if (m > pubkeys.length) {
53
+ throw new Error(`not enough keys supplied (got ${pubkeys.length} keys, but need at least ${m} to redeem)`);
54
+ }
55
+ // Create m-of-n multisig
56
+ const p2ms = bitcoin.payments.p2ms({
57
+ m: m,
58
+ pubkeys: pubkeys.map((key) => Buffer.from(key, 'hex')),
59
+ network: this._network,
60
+ });
61
+ // Create p2wsh for multisig
62
+ const p2wsh = bitcoin.payments.p2wsh({
63
+ redeem: p2ms,
64
+ network: this._network,
65
+ });
66
+ return p2wsh;
67
+ }
68
+ /**
69
+ * Creates a native-segwit multi-signature address (P2MS in P2WSH) with n signatures of m required keys
70
+ * https://developer.bitcoin.org/reference/rpc/createmultisig.html
71
+ * @param m the number of required signatures
72
+ * @param pubkeys n possible pubkeys in total
73
+ * @returns a json object containing the `address` and `redeemScript`
74
+ */
75
+ createMultisig(m, pubkeys) {
76
+ const p2wsh = this._createMultisigPayment(m, pubkeys);
77
+ return {
78
+ address: p2wsh.address,
79
+ redeemScript: p2wsh.redeem?.output?.toString('hex'),
80
+ };
81
+ }
82
+ /**
83
+ * Creates a PSBT of a native-segwit multi-signature address (P2MS in P2WSH) with n signatures of m required keys
84
+ * https://developer.bitcoin.org/reference/rpc/createmultisig.html
85
+ * https://developer.bitcoin.org/reference/rpc/createpsbt.html
86
+ * @param m the number of required signatures
87
+ * @param pubkeys n possible pubkeys in total
88
+ * @param inputs the Inputs to the PSBT
89
+ * @param ouputs the Outputs to the PSBT
90
+ * @returns a base64 encoded psbt string
91
+ */
92
+ buildMultisigPSBT(m, pubkeys, inputs, outputs) {
93
+ assert_1.default(inputs.length > 0, 'no inputs found');
94
+ assert_1.default(outputs.length > 0, 'no outputs found');
95
+ const p2wsh = this._createMultisigPayment(m, pubkeys);
96
+ // Verify pubkeyhash for all inputs matches the p2wsh hash
97
+ assert_1.default(inputs.every((input) => p2wsh.output.toString('hex') === input.scriptPubKey), 'address pubkeyhash does not match input scriptPubKey');
98
+ // creator
99
+ const psbt = new bitcoin.Psbt({ network: this._network });
100
+ // updater
101
+ inputs.forEach((input) => {
102
+ psbt.addInput({
103
+ hash: input.txid,
104
+ index: input.vout,
105
+ witnessUtxo: { script: p2wsh.output, value: input.value },
106
+ witnessScript: p2wsh.redeem.output,
107
+ });
108
+ });
109
+ outputs.forEach((output) => {
110
+ psbt.addOutput({
111
+ address: output.to,
112
+ value: output.value,
113
+ });
114
+ });
115
+ return psbt.toBase64();
116
+ }
117
+ /**
118
+ * Update a PSBT with input information from our wallet and then sign inputs that we can sign for
119
+ * https://developer.bitcoin.org/reference/rpc/walletprocesspsbt.html
120
+ * @param psbt a base64 encoded psbt string (P2WSH only)
121
+ * @returns a base64 encoded signed psbt string
122
+ */
123
+ async walletProcessPSBT(psbtString) {
124
+ const psbt = bitcoin.Psbt.fromBase64(psbtString);
125
+ await Promise.all(psbt.data.inputs.map(async (input, i) => {
126
+ assert_1.default(psbt.getInputType(i).slice(0, 5) === 'p2wsh', 'only accepts P2WSH inputs');
127
+ const scriptStack = bitcoin.script.decompile(input.witnessScript);
128
+ const pubkeys = scriptStack.filter((data) => Buffer.isBuffer(data) && secp256k1_1.default.publicKeyVerify(data));
129
+ await Promise.all(pubkeys.map(async (key) => {
130
+ // create address using pubkey
131
+ const { address: addressString } = bitcoin.payments.p2wpkh({
132
+ pubkey: key,
133
+ network: this._network,
134
+ });
135
+ // Retrieve address object from wallet using address
136
+ const address = await this.quickFindAddress([
137
+ addressString,
138
+ ]);
139
+ // exit if address doesn't exist in wallet
140
+ if (!address)
141
+ return;
142
+ // derive keypair
143
+ const keyPair = await this.getMethod('keyPair')(address.derivationPath);
144
+ // sign PSBT using keypair
145
+ psbt.signInput(i, keyPair);
146
+ }));
147
+ }));
148
+ psbt.validateSignaturesOfAllInputs(); // ensure all signatures are valid!
149
+ return psbt.toBase64();
150
+ }
151
+ /**
152
+ * Finalize the inputs of a PSBT. If the transaction is fully signed, it will
153
+ * produce a network serialized transaction which can be broadcast with sendrawtransaction
154
+ * https://developer.bitcoin.org/reference/rpc/finalizepsbt.html
155
+ * @param psbt a base64 encoded psbt string
156
+ * @returns a json object containing `psbt` in base64, `hex` for transaction and `complete` for if
157
+ * the transaction has a complete set of signatures
158
+ */
159
+ finalizePSBT(psbtString) {
160
+ const psbt = bitcoin.Psbt.fromBase64(psbtString);
161
+ try {
162
+ psbt.validateSignaturesOfAllInputs(); // ensure all signatures are valid!
163
+ psbt.finalizeAllInputs();
164
+ }
165
+ catch (error) {
166
+ return {
167
+ psbt: psbt.toBase64(),
168
+ complete: false,
169
+ };
170
+ }
171
+ return {
172
+ psbt: psbt.toBase64(),
173
+ hex: psbt.extractTransaction().toHex(),
174
+ complete: true,
175
+ };
176
+ }
177
+ async getUnusedAddress(change = false, numAddressPerCall = 100) {
178
+ const addressType = change ? CHANGE_ADDRESS : NONCHANGE_ADDRESS;
179
+ const key = change ? 'change' : 'nonChange';
180
+ const address = await this._getUsedUnusedAddresses(numAddressPerCall, addressType).then(({ unusedAddress }) => unusedAddress[key]);
181
+ this._unusedAddressesBlacklist[address.address] = true;
182
+ return address;
183
+ }
184
+ async _getUsedUnusedAddresses(numAddressPerCall = 100, addressType) {
185
+ const usedAddresses = [];
186
+ const addressCountMap = { change: 0, nonChange: 0 };
187
+ const unusedAddressMap = { change: null, nonChange: null };
188
+ let addrList;
189
+ let addressIndex = 0;
190
+ let changeAddresses = [];
191
+ let nonChangeAddresses = [];
192
+ /* eslint-disable no-unmodified-loop-condition */
193
+ while ((addressType === NONCHANGE_OR_CHANGE_ADDRESS &&
194
+ (addressCountMap.change < ADDRESS_GAP ||
195
+ addressCountMap.nonChange < ADDRESS_GAP)) ||
196
+ (addressType === NONCHANGE_ADDRESS &&
197
+ addressCountMap.nonChange < ADDRESS_GAP) ||
198
+ (addressType === CHANGE_ADDRESS && addressCountMap.change < ADDRESS_GAP)) {
199
+ /* eslint-enable no-unmodified-loop-condition */
200
+ addrList = [];
201
+ if ((addressType === NONCHANGE_OR_CHANGE_ADDRESS ||
202
+ addressType === CHANGE_ADDRESS) &&
203
+ addressCountMap.change < ADDRESS_GAP) {
204
+ // Scanning for change addr
205
+ changeAddresses = await this.client.wallet.getAddresses(addressIndex, numAddressPerCall, true);
206
+ addrList = addrList.concat(changeAddresses);
207
+ }
208
+ else {
209
+ changeAddresses = [];
210
+ }
211
+ if ((addressType === NONCHANGE_OR_CHANGE_ADDRESS ||
212
+ addressType === NONCHANGE_ADDRESS) &&
213
+ addressCountMap.nonChange < ADDRESS_GAP) {
214
+ // Scanning for non change addr
215
+ nonChangeAddresses = await this.client.wallet.getAddresses(addressIndex, numAddressPerCall, false);
216
+ addrList = addrList.concat(nonChangeAddresses);
217
+ }
218
+ const transactionCounts = await this.getMethod('getAddressTransactionCounts')(addrList);
219
+ for (const address of addrList) {
220
+ const isUsed = transactionCounts[address.address] > 0 ||
221
+ this._unusedAddressesBlacklist[address.address];
222
+ const isChangeAddress = changeAddresses.find((a) => address.address === a.address);
223
+ const key = isChangeAddress ? 'change' : 'nonChange';
224
+ if (isUsed) {
225
+ usedAddresses.push(address);
226
+ addressCountMap[key] = 0;
227
+ unusedAddressMap[key] = null;
228
+ }
229
+ else {
230
+ addressCountMap[key]++;
231
+ if (!unusedAddressMap[key]) {
232
+ unusedAddressMap[key] = address;
233
+ }
234
+ }
235
+ }
236
+ addressIndex += numAddressPerCall;
237
+ }
238
+ let firstUnusedAddress;
239
+ const indexNonChange = unusedAddressMap.nonChange
240
+ ? unusedAddressMap.nonChange.index
241
+ : Infinity;
242
+ const indexChange = unusedAddressMap.change
243
+ ? unusedAddressMap.change.index
244
+ : Infinity;
245
+ if (indexNonChange <= indexChange)
246
+ firstUnusedAddress = unusedAddressMap.nonChange;
247
+ else
248
+ firstUnusedAddress = unusedAddressMap.change;
249
+ return {
250
+ usedAddresses,
251
+ unusedAddress: unusedAddressMap,
252
+ firstUnusedAddress,
253
+ };
254
+ }
255
+ async sendSweepTransactionWithSetOutputs(externalChangeAddress, feePerByte, _outputs, fixedInputs) {
256
+ const { hex, fee } = await this._buildSweepTransaction(externalChangeAddress, feePerByte, _outputs, fixedInputs);
257
+ await this.getMethod('sendRawTransaction')(hex);
258
+ return bitcoin_utils_1.normalizeTransactionObject(bitcoin_utils_1.decodeRawTransaction(hex, this._network), fee);
259
+ }
260
+ async _buildSweepTransaction(externalChangeAddress, feePerByte, _outputs = [], fixedInputs) {
261
+ const _feePerByte = feePerByte ||
262
+ (await this.getMethod('getFeePerByte')()) ||
263
+ FEE_PER_BYTE_FALLBACK;
264
+ const inputs = [];
265
+ const outputs = [];
266
+ try {
267
+ const inputsForAmount = await this.getMethod('getInputsForAmount')(_outputs, _feePerByte, fixedInputs, 100, true);
268
+ if (inputsForAmount.change) {
269
+ throw Error('There should not be any change for sweeping transaction');
270
+ }
271
+ inputs.push(...(inputsForAmount.inputs || []));
272
+ outputs.push(...(inputsForAmount.outputs || []));
273
+ }
274
+ catch (e) {
275
+ if (fixedInputs.length === 0) {
276
+ throw Error(`Inputs for amount doesn't exist and no fixedInputs provided`);
277
+ }
278
+ const inputsForAmount = await this._getInputForAmountWithoutUtxoCheck(_outputs, _feePerByte, fixedInputs);
279
+ inputs.push(...(inputsForAmount.inputs.map((utxo) => types_1.Input.fromUTXO(utxo)) || []));
280
+ outputs.push(...(inputsForAmount.outputs || []));
281
+ }
282
+ _outputs.forEach((output) => {
283
+ const spliceIndex = outputs.findIndex((sweepOutput) => output.value === sweepOutput.value);
284
+ outputs.splice(spliceIndex, 1);
285
+ });
286
+ _outputs.push({
287
+ to: externalChangeAddress,
288
+ value: outputs[0].value,
289
+ });
290
+ return this._buildTransactionWithoutUtxoCheck(_outputs, _feePerByte, inputs);
291
+ }
292
+ _getInputForAmountWithoutUtxoCheck(_outputs, _feePerByte, fixedInputs) {
293
+ const utxoBalance = fixedInputs.reduce((a, b) => a + (b['value'] || 0), 0);
294
+ const outputBalance = _outputs.reduce((a, b) => a + (b['value'] || 0), 0);
295
+ const amountToSend = utxoBalance -
296
+ _feePerByte * ((_outputs.length + 1) * 39 + fixedInputs.length * 153); // todo better calculation
297
+ const targets = _outputs.map((target, i) => ({
298
+ id: 'main',
299
+ value: target.value,
300
+ }));
301
+ if (amountToSend - outputBalance > 0) {
302
+ targets.push({ id: 'main', value: amountToSend - outputBalance });
303
+ }
304
+ return bitcoin_utils_1.selectCoins(fixedInputs, targets, Math.ceil(_feePerByte), fixedInputs);
305
+ }
306
+ async _buildTransactionWithoutUtxoCheck(outputs, feePerByte, fixedInputs) {
307
+ const network = this._network;
308
+ const { fee } = this._getInputForAmountWithoutUtxoCheck(outputs, feePerByte, fixedInputs);
309
+ const inputs = fixedInputs;
310
+ const txb = new bitcoin.TransactionBuilder(network);
311
+ for (const output of outputs) {
312
+ const to = output.to; // Allow for OP_RETURN
313
+ txb.addOutput(to, output.value);
314
+ }
315
+ const prevOutScriptType = 'p2wpkh';
316
+ for (let i = 0; i < inputs.length; i++) {
317
+ const wallet = await this.getMethod('getWalletAddress')(inputs[i].address);
318
+ const keyPair = await this.getMethod('keyPair')(wallet.derivationPath);
319
+ const paymentVariant = this.getMethod('getPaymentVariantFromPublicKey')(keyPair.publicKey);
320
+ txb.addInput(inputs[i].txid, inputs[i].vout, 0, paymentVariant.output);
321
+ }
322
+ for (let i = 0; i < inputs.length; i++) {
323
+ const wallet = await this.getMethod('getWalletAddress')(inputs[i].address);
324
+ const keyPair = await this.getMethod('keyPair')(wallet.derivationPath);
325
+ const paymentVariant = this.getMethod('getPaymentVariantFromPublicKey')(keyPair.publicKey);
326
+ const needsWitness = true;
327
+ const signParams = {
328
+ prevOutScriptType,
329
+ vin: i,
330
+ keyPair,
331
+ witnessValue: 0,
332
+ };
333
+ if (needsWitness) {
334
+ signParams.witnessValue = inputs[i].value;
335
+ }
336
+ txb.sign(signParams);
337
+ }
338
+ return { hex: txb.build().toHex(), fee };
339
+ }
340
+ async quickFindAddress(addresses) {
341
+ const maxAddresses = 500;
342
+ const addressesPerCall = 5;
343
+ let index = 0;
344
+ while (index < maxAddresses) {
345
+ const walletNonChangeAddresses = await this.getMethod('getAddresses')(index, addressesPerCall, true);
346
+ const walletChangeAddresses = await this.getMethod('getAddresses')(index, addressesPerCall, false);
347
+ const walletAddresses = [
348
+ ...walletNonChangeAddresses,
349
+ ...walletChangeAddresses,
350
+ ];
351
+ const walletAddress = walletAddresses.find((walletAddr) => addresses.find((addr) => walletAddr.address === addr));
352
+ if (walletAddress)
353
+ return walletAddress;
354
+ index += addressesPerCall;
355
+ }
356
+ }
357
+ }
358
+ exports.default = BitcoinWalletProvider;
359
+ //# sourceMappingURL=BitcoinWalletProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitcoinWalletProvider.js","sourceRoot":"","sources":["../lib/BitcoinWalletProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { default } from './BitcoinWalletProvider';
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = void 0;
7
+ var BitcoinWalletProvider_1 = require("./BitcoinWalletProvider");
8
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(BitcoinWalletProvider_1).default; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAkD;AAAzC,iIAAA,OAAO,OAAA"}