@atomiqlabs/lp-lib 14.0.0-dev.31 → 14.0.0-dev.33

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.
@@ -80,35 +80,40 @@ class SpvVaults {
80
80
  const address = await this.vaultSigner.getAddress(chainId, vaultId);
81
81
  vaultAddreses.push({ vaultId, address });
82
82
  }
83
- //Construct transaction
84
- const txResult = await this.bitcoin.getSignedMultiTransaction(vaultAddreses.map(val => {
85
- return { address: val.address, amount: exports.VAULT_DUST_AMOUNT };
86
- }), feeRate);
87
83
  const nativeToken = chainInterface.getNativeCurrencyAddress();
88
- const vaults = await Promise.all(vaultAddreses.map(async (val, index) => {
89
- const vaultData = await spvVaultContract.createVaultData(signerAddress, val.vaultId, txResult.txId + ":" + index, confirmations, [
90
- { token, multiplier: tokenMultipliers?.[token] ?? 1n },
91
- { token: nativeToken, multiplier: tokenMultipliers?.[nativeToken] ?? 1n }
92
- ]);
93
- return new SpvVault_1.SpvVault(chainId, vaultData, val.address);
94
- }));
95
- //Save vaults
96
- if (this.vaultStorage.saveDataArr != null) {
97
- await this.vaultStorage.saveDataArr(vaults.map(val => {
98
- return { id: val.getIdentifier(), object: val };
84
+ let txId = null;
85
+ let vaults = null;
86
+ await this.bitcoin.execute(async () => {
87
+ //Construct transaction
88
+ const txResult = await this.bitcoin.getSignedMultiTransaction(vaultAddreses.map(val => {
89
+ return { address: val.address, amount: exports.VAULT_DUST_AMOUNT };
90
+ }), feeRate);
91
+ vaults = await Promise.all(vaultAddreses.map(async (val, index) => {
92
+ const vaultData = await spvVaultContract.createVaultData(signerAddress, val.vaultId, txResult.txId + ":" + index, confirmations, [
93
+ { token, multiplier: tokenMultipliers?.[token] ?? 1n },
94
+ { token: nativeToken, multiplier: tokenMultipliers?.[nativeToken] ?? 1n }
95
+ ]);
96
+ return new SpvVault_1.SpvVault(chainId, vaultData, val.address);
99
97
  }));
100
- }
101
- else {
102
- for (let vault of vaults) {
103
- await this.vaultStorage.saveData(vault.getIdentifier(), vault);
98
+ //Save vaults
99
+ if (this.vaultStorage.saveDataArr != null) {
100
+ await this.vaultStorage.saveDataArr(vaults.map(val => {
101
+ return { id: val.getIdentifier(), object: val };
102
+ }));
104
103
  }
105
- }
106
- //Send bitcoin tx
107
- await this.bitcoin.sendRawTransaction(txResult.raw);
108
- this.logger.info("createVaults(): Funding " + count + " vaults, bitcoin txId: " + txResult.txId);
104
+ else {
105
+ for (let vault of vaults) {
106
+ await this.vaultStorage.saveData(vault.getIdentifier(), vault);
107
+ }
108
+ }
109
+ //Send bitcoin tx
110
+ await this.bitcoin.sendRawTransaction(txResult.raw);
111
+ txId = txResult.txId;
112
+ });
113
+ this.logger.info("createVaults(): Funding " + count + " vaults, bitcoin txId: " + txId);
109
114
  return {
110
115
  vaultsCreated: vaults.map(val => val.data.getVaultId()),
111
- btcTxId: txResult.txId
116
+ btcTxId: txId
112
117
  };
113
118
  }
114
119
  async listVaults(chainId, token) {
@@ -172,32 +177,36 @@ class SpvVaults {
172
177
  amount: 0n,
173
178
  script: opReturnScript
174
179
  });
175
- psbt = await this.bitcoin.fundPsbt(psbt, feeRate);
176
- if (psbt.inputsLength < 2)
177
- throw new Error("PSBT needs at least 2 inputs!");
178
- psbt.updateInput(0, { sequence: 0x80000000 });
179
- psbt.updateInput(1, { sequence: 0x80000000 });
180
- psbt = await this.vaultSigner.signPsbt(vault.chainId, vault.data.getVaultId(), psbt, [0]);
181
- const res = await this.bitcoin.signPsbt(psbt);
182
- const parsedTransaction = await this.bitcoinRpc.parseTransaction(res.raw);
183
- const withdrawalData = await spvVaultContract.getWithdrawalData(parsedTransaction);
184
- if (withdrawalData.getSpentVaultUtxo() !== vault.getLatestUtxo()) {
185
- throw new Error("Latest vault UTXO already spent! Please try again later.");
186
- }
187
- withdrawalData.sending = true;
188
- vault.addWithdrawal(withdrawalData);
189
- await this.saveVault(vault);
190
- try {
191
- await this.bitcoin.sendRawTransaction(res.raw);
192
- withdrawalData.sending = false;
193
- }
194
- catch (e) {
195
- withdrawalData.sending = false;
196
- vault.removeWithdrawal(withdrawalData);
180
+ let withdrawalTxId = null;
181
+ await this.bitcoin.execute(async () => {
182
+ psbt = await this.bitcoin.fundPsbt(psbt, feeRate);
183
+ if (psbt.inputsLength < 2)
184
+ throw new Error("PSBT needs at least 2 inputs!");
185
+ psbt.updateInput(0, { sequence: 0x80000000 });
186
+ psbt.updateInput(1, { sequence: 0x80000000 });
187
+ psbt = await this.vaultSigner.signPsbt(vault.chainId, vault.data.getVaultId(), psbt, [0]);
188
+ const res = await this.bitcoin.signPsbt(psbt);
189
+ withdrawalTxId = res.txId;
190
+ const parsedTransaction = await this.bitcoinRpc.parseTransaction(res.raw);
191
+ const withdrawalData = await spvVaultContract.getWithdrawalData(parsedTransaction);
192
+ if (withdrawalData.getSpentVaultUtxo() !== vault.getLatestUtxo()) {
193
+ throw new Error("Latest vault UTXO already spent! Please try again later.");
194
+ }
195
+ withdrawalData.sending = true;
196
+ vault.addWithdrawal(withdrawalData);
197
197
  await this.saveVault(vault);
198
- throw e;
199
- }
200
- return res.txId;
198
+ try {
199
+ await this.bitcoin.sendRawTransaction(res.raw);
200
+ withdrawalData.sending = false;
201
+ }
202
+ catch (e) {
203
+ withdrawalData.sending = false;
204
+ vault.removeWithdrawal(withdrawalData);
205
+ await this.saveVault(vault);
206
+ throw e;
207
+ }
208
+ });
209
+ return withdrawalTxId;
201
210
  }
202
211
  async checkVaults() {
203
212
  const vaults = Object.keys(this.vaultStorage.data).map(key => this.vaultStorage.data[key]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atomiqlabs/lp-lib",
3
- "version": "14.0.0-dev.31",
3
+ "version": "14.0.0-dev.33",
4
4
  "description": "Main functionality implementation for atomiq LP node",
5
5
  "main": "./dist/index.js",
6
6
  "types:": "./dist/index.d.ts",
@@ -115,40 +115,46 @@ export class SpvVaults {
115
115
  vaultAddreses.push({vaultId, address});
116
116
  }
117
117
 
118
- //Construct transaction
119
- const txResult = await this.bitcoin.getSignedMultiTransaction(vaultAddreses.map(val => {
120
- return {address: val.address, amount: VAULT_DUST_AMOUNT}
121
- }), feeRate);
122
-
123
118
  const nativeToken = chainInterface.getNativeCurrencyAddress();
124
119
 
125
- const vaults = await Promise.all(vaultAddreses.map(async (val, index) => {
126
- const vaultData = await spvVaultContract.createVaultData(signerAddress, val.vaultId, txResult.txId+":"+index, confirmations, [
127
- {token, multiplier: tokenMultipliers?.[token] ?? 1n},
128
- {token: nativeToken, multiplier: tokenMultipliers?.[nativeToken] ?? 1n}
129
- ]);
130
- return new SpvVault(chainId, vaultData, val.address);
131
- }));
132
-
133
- //Save vaults
134
- if(this.vaultStorage.saveDataArr!=null) {
135
- await this.vaultStorage.saveDataArr(vaults.map(val => {
136
- return {id: val.getIdentifier(), object: val}
120
+ let txId: string = null;
121
+ let vaults: SpvVault[] = null;
122
+ await this.bitcoin.execute(async () => {
123
+ //Construct transaction
124
+ const txResult = await this.bitcoin.getSignedMultiTransaction(vaultAddreses.map(val => {
125
+ return {address: val.address, amount: VAULT_DUST_AMOUNT}
126
+ }), feeRate);
127
+
128
+ vaults = await Promise.all(vaultAddreses.map(async (val, index) => {
129
+ const vaultData = await spvVaultContract.createVaultData(signerAddress, val.vaultId, txResult.txId+":"+index, confirmations, [
130
+ {token, multiplier: tokenMultipliers?.[token] ?? 1n},
131
+ {token: nativeToken, multiplier: tokenMultipliers?.[nativeToken] ?? 1n}
132
+ ]);
133
+ return new SpvVault(chainId, vaultData, val.address);
137
134
  }));
138
- } else {
139
- for(let vault of vaults) {
140
- await this.vaultStorage.saveData(vault.getIdentifier(), vault);
135
+
136
+ //Save vaults
137
+ if(this.vaultStorage.saveDataArr!=null) {
138
+ await this.vaultStorage.saveDataArr(vaults.map(val => {
139
+ return {id: val.getIdentifier(), object: val}
140
+ }));
141
+ } else {
142
+ for(let vault of vaults) {
143
+ await this.vaultStorage.saveData(vault.getIdentifier(), vault);
144
+ }
141
145
  }
142
- }
143
146
 
144
- //Send bitcoin tx
145
- await this.bitcoin.sendRawTransaction(txResult.raw);
147
+ //Send bitcoin tx
148
+ await this.bitcoin.sendRawTransaction(txResult.raw);
149
+
150
+ txId = txResult.txId;
151
+ });
146
152
 
147
- this.logger.info("createVaults(): Funding "+count+" vaults, bitcoin txId: "+txResult.txId);
153
+ this.logger.info("createVaults(): Funding "+count+" vaults, bitcoin txId: "+txId);
148
154
 
149
155
  return {
150
156
  vaultsCreated: vaults.map(val => val.data.getVaultId()),
151
- btcTxId: txResult.txId
157
+ btcTxId: txId
152
158
  };
153
159
  }
154
160
 
@@ -221,34 +227,38 @@ export class SpvVaults {
221
227
  script: opReturnScript
222
228
  });
223
229
 
224
- psbt = await this.bitcoin.fundPsbt(psbt, feeRate);
225
- if(psbt.inputsLength<2) throw new Error("PSBT needs at least 2 inputs!");
226
- psbt.updateInput(0, {sequence: 0x80000000});
227
- psbt.updateInput(1, {sequence: 0x80000000});
228
- psbt = await this.vaultSigner.signPsbt(vault.chainId, vault.data.getVaultId(), psbt, [0]);
229
- const res = await this.bitcoin.signPsbt(psbt);
230
-
231
- const parsedTransaction = await this.bitcoinRpc.parseTransaction(res.raw);
232
- const withdrawalData = await spvVaultContract.getWithdrawalData(parsedTransaction);
233
-
234
- if(withdrawalData.getSpentVaultUtxo()!==vault.getLatestUtxo()) {
235
- throw new Error("Latest vault UTXO already spent! Please try again later.");
236
- }
237
- (withdrawalData as any).sending = true;
238
- vault.addWithdrawal(withdrawalData);
239
- await this.saveVault(vault);
240
-
241
- try {
242
- await this.bitcoin.sendRawTransaction(res.raw);
243
- (withdrawalData as any).sending = false;
244
- } catch (e) {
245
- (withdrawalData as any).sending = false;
246
- vault.removeWithdrawal(withdrawalData);
230
+ let withdrawalTxId: string = null;
231
+ await this.bitcoin.execute(async () => {
232
+ psbt = await this.bitcoin.fundPsbt(psbt, feeRate);
233
+ if(psbt.inputsLength<2) throw new Error("PSBT needs at least 2 inputs!");
234
+ psbt.updateInput(0, {sequence: 0x80000000});
235
+ psbt.updateInput(1, {sequence: 0x80000000});
236
+ psbt = await this.vaultSigner.signPsbt(vault.chainId, vault.data.getVaultId(), psbt, [0]);
237
+ const res = await this.bitcoin.signPsbt(psbt);
238
+ withdrawalTxId = res.txId;
239
+
240
+ const parsedTransaction = await this.bitcoinRpc.parseTransaction(res.raw);
241
+ const withdrawalData = await spvVaultContract.getWithdrawalData(parsedTransaction);
242
+
243
+ if(withdrawalData.getSpentVaultUtxo()!==vault.getLatestUtxo()) {
244
+ throw new Error("Latest vault UTXO already spent! Please try again later.");
245
+ }
246
+ (withdrawalData as any).sending = true;
247
+ vault.addWithdrawal(withdrawalData);
247
248
  await this.saveVault(vault);
248
- throw e;
249
- }
250
249
 
251
- return res.txId;
250
+ try {
251
+ await this.bitcoin.sendRawTransaction(res.raw);
252
+ (withdrawalData as any).sending = false;
253
+ } catch (e) {
254
+ (withdrawalData as any).sending = false;
255
+ vault.removeWithdrawal(withdrawalData);
256
+ await this.saveVault(vault);
257
+ throw e;
258
+ }
259
+ });
260
+
261
+ return withdrawalTxId;
252
262
  }
253
263
 
254
264
  async checkVaults() {