@btc-vision/transaction 1.0.26 → 1.0.27
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.
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/tests/unwrapReg.js +5 -2
- package/build/transaction/TransactionFactory.js +4 -1
- package/build/transaction/builders/UnwarpTransaction.d.ts +1 -3
- package/build/transaction/builders/UnwarpTransaction.js +1 -2
- package/build/transaction/interfaces/ITransactionParameters.d.ts +0 -1
- package/build/transaction/processor/PsbtTransaction.d.ts +8 -3
- package/build/transaction/processor/PsbtTransaction.js +33 -15
- package/cjs/_version.d.ts +1 -1
- package/cjs/_version.js +1 -1
- package/cjs/generators/AddressGenerator.js +1 -1
- package/cjs/keypair/AddressVerificator.d.ts +6 -0
- package/cjs/keypair/AddressVerificator.js +57 -0
- package/cjs/keypair/EcKeyPair.js +10 -7
- package/cjs/keypair/Wallet.d.ts +1 -0
- package/cjs/keypair/Wallet.js +3 -0
- package/cjs/metadata/contracts/wBTC.js +7 -7
- package/cjs/opnet.d.ts +11 -1
- package/cjs/opnet.js +11 -1
- package/cjs/signer/TweakedSigner.d.ts +2 -1
- package/cjs/signer/TweakedSigner.js +1 -1
- package/cjs/tests/adaptPSBT.d.ts +1 -0
- package/cjs/tests/adaptPSBT.js +62 -0
- package/cjs/tests/deploy.d.ts +1 -0
- package/cjs/tests/deploy.js +86 -0
- package/cjs/tests/deployReg.d.ts +1 -0
- package/cjs/tests/deployReg.js +87 -0
- package/cjs/tests/gen.js +10 -0
- package/cjs/tests/massWrapReg.d.ts +1 -0
- package/cjs/tests/massWrapReg.js +88 -0
- package/cjs/tests/mineReg.d.ts +1 -0
- package/cjs/tests/mineReg.js +24 -0
- package/cjs/tests/stakeReg.d.ts +1 -0
- package/cjs/tests/stakeReg.js +75 -0
- package/cjs/tests/stakedReg.d.ts +1 -0
- package/cjs/tests/stakedReg.js +30 -0
- package/cjs/tests/test.js +3 -3
- package/cjs/tests/testReg.d.ts +1 -0
- package/cjs/tests/testReg.js +93 -0
- package/cjs/tests/totalRewardReg.d.ts +1 -0
- package/cjs/tests/totalRewardReg.js +30 -0
- package/cjs/tests/transfer.js +3 -3
- package/cjs/tests/transferReg.d.ts +1 -0
- package/cjs/tests/transferReg.js +76 -0
- package/cjs/tests/unStakeReg.d.ts +1 -0
- package/cjs/tests/unStakeReg.js +74 -0
- package/cjs/tests/unwrapReg.d.ts +1 -0
- package/cjs/tests/unwrapReg.js +51 -0
- package/cjs/tests/wrapReg.d.ts +1 -0
- package/cjs/tests/wrapReg.js +69 -0
- package/cjs/tests/wrapTest.d.ts +1 -0
- package/cjs/tests/wrapTest.js +68 -0
- package/cjs/transaction/TransactionFactory.d.ts +23 -1
- package/cjs/transaction/TransactionFactory.js +151 -3
- package/cjs/transaction/builders/DeploymentTransaction.d.ts +36 -0
- package/cjs/transaction/builders/DeploymentTransaction.js +191 -0
- package/cjs/transaction/builders/FundingTransaction.js +4 -1
- package/cjs/transaction/builders/InteractionTransaction.d.ts +2 -35
- package/cjs/transaction/builders/InteractionTransaction.js +5 -208
- package/cjs/transaction/builders/SharedInteractionTransaction.d.ts +36 -0
- package/cjs/transaction/builders/SharedInteractionTransaction.js +183 -0
- package/cjs/transaction/builders/TransactionBuilder.d.ts +12 -19
- package/cjs/transaction/builders/TransactionBuilder.js +93 -96
- package/cjs/transaction/builders/UnwarpTransaction.d.ts +17 -0
- package/cjs/transaction/builders/UnwarpTransaction.js +46 -0
- package/cjs/transaction/builders/WrapTransaction.d.ts +29 -0
- package/cjs/transaction/builders/WrapTransaction.js +150 -0
- package/cjs/transaction/enums/TransactionType.d.ts +2 -1
- package/cjs/transaction/enums/TransactionType.js +1 -0
- package/cjs/transaction/interfaces/ITransactionParameters.d.ts +23 -17
- package/cjs/transaction/processor/PsbtTransaction.d.ts +51 -0
- package/cjs/transaction/processor/PsbtTransaction.js +162 -0
- package/cjs/transaction/psbt/PSBTTypes.d.ts +3 -0
- package/cjs/transaction/psbt/PSBTTypes.js +7 -0
- package/cjs/transaction/shared/TweakedTransaction.d.ts +48 -0
- package/cjs/transaction/shared/TweakedTransaction.js +154 -0
- package/cjs/utils/BitcoinUtils.d.ts +2 -0
- package/cjs/utils/BitcoinUtils.js +50 -1
- package/cjs/utxo/OPNetLimitedProvider.d.ts +14 -0
- package/cjs/utxo/OPNetLimitedProvider.js +136 -0
- package/cjs/utxo/interfaces/BroadcastResponse.d.ts +7 -0
- package/cjs/utxo/interfaces/BroadcastResponse.js +2 -0
- package/cjs/utxo/interfaces/IUTXO.d.ts +6 -0
- package/cjs/verification/TapscriptVerificator.js +3 -26
- package/cjs/wbtc/Generate.d.ts +13 -0
- package/cjs/wbtc/Generate.js +2 -0
- package/cjs/wbtc/WrappedGenerationParameters.d.ts +11 -0
- package/cjs/wbtc/WrappedGenerationParameters.js +20 -0
- package/package.json +1 -1
- package/src/_version.ts +1 -1
- package/src/tests/unwrapReg.ts +7 -2
- package/src/transaction/TransactionFactory.ts +5 -2
- package/src/transaction/builders/UnwarpTransaction.ts +2 -9
- package/src/transaction/interfaces/ITransactionParameters.ts +2 -2
- package/src/transaction/processor/PsbtTransaction.ts +64 -26
- package/src/transaction/shared/TweakedTransaction.ts +1 -1
package/build/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "1.0.
|
|
1
|
+
export declare const version = "1.0.27";
|
package/build/_version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '1.0.
|
|
1
|
+
export const version = '1.0.27';
|
package/build/tests/unwrapReg.js
CHANGED
|
@@ -34,13 +34,16 @@ const unwrapParameters = {
|
|
|
34
34
|
utxos: utxos,
|
|
35
35
|
signer: wallet.keypair,
|
|
36
36
|
network: network,
|
|
37
|
-
feeRate:
|
|
37
|
+
feeRate: 100,
|
|
38
38
|
priorityFee: 10000n,
|
|
39
39
|
feeProvision: 100000n,
|
|
40
|
-
amount:
|
|
40
|
+
amount: 500000n,
|
|
41
41
|
};
|
|
42
42
|
const finalTx = await factory.unwrap(unwrapParameters);
|
|
43
43
|
console.log(`Final transaction:`, finalTx);
|
|
44
|
+
const tx = await opnet.broadcastTransaction(finalTx.fundingTransaction, false);
|
|
45
|
+
console.log(`Broadcasted:`, tx);
|
|
44
46
|
const broadcastedPSBT = await opnet.broadcastTransaction(finalTx.psbt, true);
|
|
45
47
|
console.log(`Broadcasted PSBT:`, broadcastedPSBT);
|
|
48
|
+
await mineBlock();
|
|
46
49
|
rpc.destroy();
|
|
@@ -119,7 +119,10 @@ export class TransactionFactory {
|
|
|
119
119
|
};
|
|
120
120
|
const preFundingTransaction = this.createFundTransaction(fundingParameters);
|
|
121
121
|
unwrapParameters.utxos = this.getUTXOAsTransaction(preFundingTransaction.tx, to, 0);
|
|
122
|
-
const preTransaction = new UnwrapTransaction(
|
|
122
|
+
const preTransaction = new UnwrapTransaction({
|
|
123
|
+
...unwrapParameters,
|
|
124
|
+
randomBytes: transaction.getRndBytes(),
|
|
125
|
+
});
|
|
123
126
|
preTransaction.signTransaction();
|
|
124
127
|
const parameters = preTransaction.getFundingTransactionParameters();
|
|
125
128
|
parameters.utxos = fundingParameters.utxos;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Taptree } from 'bitcoinjs-lib/src/types.js';
|
|
3
3
|
import { TransactionType } from '../enums/TransactionType.js';
|
|
4
|
-
import { TapLeafScript } from '../interfaces/Tap.js';
|
|
5
4
|
import { IUnwrapParameters } from '../interfaces/ITransactionParameters.js';
|
|
6
5
|
import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
|
|
7
6
|
export declare class UnwrapTransaction extends SharedInteractionTransaction<TransactionType.WBTC_UNWRAP> {
|
|
@@ -10,10 +9,9 @@ export declare class UnwrapTransaction extends SharedInteractionTransaction<Tran
|
|
|
10
9
|
readonly amount: bigint;
|
|
11
10
|
protected readonly compiledTargetScript: Buffer;
|
|
12
11
|
protected readonly scriptTree: Taptree;
|
|
13
|
-
protected tapLeafScript: TapLeafScript | null;
|
|
14
12
|
protected readonly sighashTypes: number[];
|
|
15
13
|
protected readonly contractSecret: Buffer;
|
|
16
14
|
private readonly wbtc;
|
|
17
15
|
constructor(parameters: IUnwrapParameters);
|
|
18
|
-
|
|
16
|
+
static generateBurnCalldata(amount: bigint): Buffer;
|
|
19
17
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TransactionType } from '../enums/TransactionType.js';
|
|
2
2
|
import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
|
|
3
|
-
import { Transaction } from 'bitcoinjs-lib';
|
|
4
3
|
import { TransactionBuilder } from './TransactionBuilder.js';
|
|
5
4
|
import { ABICoder, BinaryWriter } from '@btc-vision/bsi-binary';
|
|
6
5
|
import { wBTC } from '../../metadata/contracts/wBTC.js';
|
|
6
|
+
import { Transaction } from 'bitcoinjs-lib';
|
|
7
7
|
const abiCoder = new ABICoder();
|
|
8
8
|
export class UnwrapTransaction extends SharedInteractionTransaction {
|
|
9
9
|
static UNWRAP_SELECTOR = Number('0x' + abiCoder.encodeSelector('burn'));
|
|
@@ -11,7 +11,6 @@ export class UnwrapTransaction extends SharedInteractionTransaction {
|
|
|
11
11
|
amount;
|
|
12
12
|
compiledTargetScript;
|
|
13
13
|
scriptTree;
|
|
14
|
-
tapLeafScript = null;
|
|
15
14
|
sighashTypes = [
|
|
16
15
|
Transaction.SIGHASH_SINGLE,
|
|
17
16
|
Transaction.SIGHASH_ANYONECANPAY,
|
|
@@ -29,7 +29,6 @@ export interface IWrapParameters extends SharedInteractionParameters {
|
|
|
29
29
|
readonly generationParameters: WrappedGeneration;
|
|
30
30
|
}
|
|
31
31
|
export interface IUnwrapParameters extends SharedInteractionParameters {
|
|
32
|
-
readonly to?: undefined;
|
|
33
32
|
readonly feeProvision: bigint;
|
|
34
33
|
readonly amount: bigint;
|
|
35
34
|
}
|
|
@@ -30,7 +30,7 @@ export declare class PsbtTransaction extends TweakedTransaction {
|
|
|
30
30
|
readonly logColor: string;
|
|
31
31
|
feesAddition: bigint;
|
|
32
32
|
protected readonly transaction: Psbt;
|
|
33
|
-
protected readonly sighashTypes: number[];
|
|
33
|
+
protected readonly sighashTypes: number[] | undefined;
|
|
34
34
|
protected readonly receiver: Address;
|
|
35
35
|
protected readonly amountRequested: bigint;
|
|
36
36
|
constructor(data: PsbtTransactionData);
|
|
@@ -40,8 +40,13 @@ export declare class PsbtTransaction extends TweakedTransaction {
|
|
|
40
40
|
mergeVaults(input: VaultUTXOs[], firstSigner?: Signer): void;
|
|
41
41
|
attemptSignAllInputs(): boolean;
|
|
42
42
|
attemptFinalizeInputs(): boolean;
|
|
43
|
-
protected generateMultiSignRedeemScript(publicKeys: string[], minimum: number):
|
|
44
|
-
|
|
43
|
+
protected generateMultiSignRedeemScript(publicKeys: string[], minimum: number): {
|
|
44
|
+
witnessUtxo: Buffer;
|
|
45
|
+
redeemScript: Buffer;
|
|
46
|
+
witnessScript: Buffer;
|
|
47
|
+
};
|
|
48
|
+
private getTotalOutputAmount;
|
|
49
|
+
private calculateOutputLeftAmountFromVaults;
|
|
45
50
|
private addVaultInputs;
|
|
46
51
|
private addVaultUTXO;
|
|
47
52
|
}
|
|
@@ -6,7 +6,6 @@ export class PsbtTransaction extends TweakedTransaction {
|
|
|
6
6
|
transaction;
|
|
7
7
|
sighashTypes = [
|
|
8
8
|
Transaction.SIGHASH_ALL,
|
|
9
|
-
Transaction.SIGHASH_ANYONECANPAY,
|
|
10
9
|
];
|
|
11
10
|
receiver;
|
|
12
11
|
amountRequested;
|
|
@@ -37,6 +36,7 @@ export class PsbtTransaction extends TweakedTransaction {
|
|
|
37
36
|
this.transaction.addInput(input);
|
|
38
37
|
}
|
|
39
38
|
addOutput(output) {
|
|
39
|
+
console.log('Adding output', output);
|
|
40
40
|
this.transaction.addOutput(output);
|
|
41
41
|
}
|
|
42
42
|
mergeVaults(input, firstSigner) {
|
|
@@ -44,10 +44,11 @@ export class PsbtTransaction extends TweakedTransaction {
|
|
|
44
44
|
if (!firstVault) {
|
|
45
45
|
throw new Error('No vaults provided');
|
|
46
46
|
}
|
|
47
|
-
const outputLeftAmount = this.
|
|
47
|
+
const outputLeftAmount = this.calculateOutputLeftAmountFromVaults(input);
|
|
48
48
|
if (outputLeftAmount < 0) {
|
|
49
49
|
throw new Error(`Output left amount is negative ${outputLeftAmount} for vault ${firstVault.vault}`);
|
|
50
50
|
}
|
|
51
|
+
console.log('MAX is', this.getTotalOutputAmount(input));
|
|
51
52
|
this.addOutput({
|
|
52
53
|
address: firstVault.vault,
|
|
53
54
|
value: Number(outputLeftAmount),
|
|
@@ -84,57 +85,74 @@ export class PsbtTransaction extends TweakedTransaction {
|
|
|
84
85
|
return true;
|
|
85
86
|
}
|
|
86
87
|
catch (e) {
|
|
87
|
-
this.warn(e);
|
|
88
|
+
this.warn(e.stack);
|
|
88
89
|
return false;
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
generateMultiSignRedeemScript(publicKeys, minimum) {
|
|
92
|
-
const
|
|
93
|
+
const p2ms = payments.p2ms({
|
|
93
94
|
m: minimum,
|
|
94
95
|
pubkeys: publicKeys.map((key) => Buffer.from(key, 'base64')),
|
|
95
96
|
network: this.network,
|
|
96
|
-
})
|
|
97
|
-
|
|
97
|
+
});
|
|
98
|
+
const p2wsh = payments.p2wsh({
|
|
99
|
+
redeem: p2ms,
|
|
100
|
+
network: this.network,
|
|
101
|
+
});
|
|
102
|
+
const witnessUtxo = p2wsh.output;
|
|
103
|
+
const redeemScript = p2wsh.redeem?.output;
|
|
104
|
+
const witnessScript = p2ms.output;
|
|
105
|
+
if (!witnessUtxo || !redeemScript || !witnessScript) {
|
|
98
106
|
throw new Error('Failed to generate redeem script');
|
|
99
107
|
}
|
|
100
|
-
return
|
|
108
|
+
return {
|
|
109
|
+
witnessUtxo,
|
|
110
|
+
redeemScript,
|
|
111
|
+
witnessScript,
|
|
112
|
+
};
|
|
101
113
|
}
|
|
102
|
-
|
|
114
|
+
getTotalOutputAmount(vaults) {
|
|
103
115
|
let total = BigInt(0);
|
|
104
116
|
for (const vault of vaults) {
|
|
105
117
|
for (const utxo of vault.utxos) {
|
|
106
118
|
total += BigInt(utxo.value);
|
|
107
119
|
}
|
|
108
120
|
}
|
|
121
|
+
return total;
|
|
122
|
+
}
|
|
123
|
+
calculateOutputLeftAmountFromVaults(vaults) {
|
|
124
|
+
const total = this.getTotalOutputAmount(vaults);
|
|
109
125
|
return total - this.amountRequested;
|
|
110
126
|
}
|
|
111
127
|
addVaultInputs(vault, firstSigner = this.signer) {
|
|
112
|
-
const
|
|
128
|
+
const p2wshOutput = this.generateMultiSignRedeemScript(vault.publicKeys, vault.minimum);
|
|
113
129
|
for (const utxo of vault.utxos) {
|
|
114
130
|
const inputIndex = this.transaction.inputCount;
|
|
115
|
-
this.addVaultUTXO(utxo,
|
|
131
|
+
this.addVaultUTXO(utxo, p2wshOutput);
|
|
116
132
|
if (firstSigner) {
|
|
117
133
|
this.log(`Signing input ${inputIndex} with ${firstSigner.publicKey.toString('hex')}`);
|
|
118
134
|
try {
|
|
119
|
-
this.signInput(this.transaction, this.transaction.data.inputs[inputIndex], inputIndex,
|
|
135
|
+
this.signInput(this.transaction, this.transaction.data.inputs[inputIndex], inputIndex, this.signer);
|
|
136
|
+
this.log(`Signed input ${inputIndex} with ${firstSigner.publicKey.toString('hex')}`);
|
|
120
137
|
}
|
|
121
138
|
catch (e) {
|
|
139
|
+
console.log('can not sign.', e);
|
|
122
140
|
this.warn(`Failed to sign input ${inputIndex} with ${firstSigner.publicKey.toString('hex')}`);
|
|
123
141
|
}
|
|
124
142
|
}
|
|
125
143
|
}
|
|
126
144
|
}
|
|
127
|
-
addVaultUTXO(utxo,
|
|
145
|
+
addVaultUTXO(utxo, witness) {
|
|
128
146
|
const input = {
|
|
129
147
|
hash: Buffer.from(utxo.hash, 'hex'),
|
|
130
148
|
index: utxo.outputIndex,
|
|
131
149
|
witnessUtxo: {
|
|
132
|
-
script:
|
|
150
|
+
script: witness.witnessUtxo,
|
|
133
151
|
value: Number(utxo.value),
|
|
134
152
|
},
|
|
135
|
-
witnessScript:
|
|
136
|
-
partialSig: [],
|
|
153
|
+
witnessScript: witness.witnessScript,
|
|
137
154
|
};
|
|
155
|
+
console.log('Adding input2', input);
|
|
138
156
|
if (this.sighashTypes) {
|
|
139
157
|
input.sighashType = this.calculateSignHash();
|
|
140
158
|
}
|
package/cjs/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "1.0.
|
|
1
|
+
export declare const version = "1.0.26";
|
package/cjs/_version.js
CHANGED
|
@@ -27,7 +27,7 @@ exports.AddressGenerator = void 0;
|
|
|
27
27
|
const crypto_1 = require("crypto");
|
|
28
28
|
const bech32_1 = require("bech32");
|
|
29
29
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
30
|
-
const ecc = __importStar(require("
|
|
30
|
+
const ecc = __importStar(require("@bitcoinerlab/secp256k1"));
|
|
31
31
|
(0, bitcoinjs_lib_1.initEccLib)(ecc);
|
|
32
32
|
class AddressGenerator {
|
|
33
33
|
static generatePKSH(sha256Hash, network) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { networks } from 'bitcoinjs-lib';
|
|
2
|
+
import { Address } from '@btc-vision/bsi-binary';
|
|
3
|
+
export declare class AddressVerificator {
|
|
4
|
+
static isValidP2TRAddress(inAddress: Address, network: networks.Network): boolean;
|
|
5
|
+
static validatePKHAddress(inAddress: string, network: networks.Network): boolean;
|
|
6
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.AddressVerificator = void 0;
|
|
27
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
28
|
+
const ecc = __importStar(require("@bitcoinerlab/secp256k1"));
|
|
29
|
+
(0, bitcoinjs_lib_1.initEccLib)(ecc);
|
|
30
|
+
class AddressVerificator {
|
|
31
|
+
static isValidP2TRAddress(inAddress, network) {
|
|
32
|
+
if (!inAddress || inAddress.length < 50)
|
|
33
|
+
return false;
|
|
34
|
+
let isValidTapRootAddress = false;
|
|
35
|
+
try {
|
|
36
|
+
bitcoinjs_lib_1.address.toOutputScript(inAddress, network);
|
|
37
|
+
const decodedAddress = bitcoinjs_lib_1.address.fromBech32(inAddress);
|
|
38
|
+
isValidTapRootAddress = decodedAddress.version === 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) { }
|
|
41
|
+
return isValidTapRootAddress;
|
|
42
|
+
}
|
|
43
|
+
static validatePKHAddress(inAddress, network) {
|
|
44
|
+
if (!inAddress || inAddress.length < 20 || inAddress.length > 50)
|
|
45
|
+
return false;
|
|
46
|
+
let isValidSegWitAddress = false;
|
|
47
|
+
try {
|
|
48
|
+
const decodedAddress = bitcoinjs_lib_1.address.fromBech32(inAddress);
|
|
49
|
+
bitcoinjs_lib_1.address.toOutputScript(inAddress, network);
|
|
50
|
+
isValidSegWitAddress =
|
|
51
|
+
decodedAddress.version === 0 && decodedAddress.data.length === 20;
|
|
52
|
+
}
|
|
53
|
+
catch (e) { }
|
|
54
|
+
return isValidSegWitAddress;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.AddressVerificator = AddressVerificator;
|
package/cjs/keypair/EcKeyPair.js
CHANGED
|
@@ -30,7 +30,8 @@ exports.EcKeyPair = void 0;
|
|
|
30
30
|
const bip32_1 = __importDefault(require("bip32"));
|
|
31
31
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
32
32
|
const ecpair_1 = require("ecpair");
|
|
33
|
-
const ecc = __importStar(require("
|
|
33
|
+
const ecc = __importStar(require("@bitcoinerlab/secp256k1"));
|
|
34
|
+
const bip371_js_1 = require("bitcoinjs-lib/src/psbt/bip371.js");
|
|
34
35
|
(0, bitcoinjs_lib_1.initEccLib)(ecc);
|
|
35
36
|
const BIP32Factory = typeof bip32_1.default === 'function' ? bip32_1.default : bip32_1.default.BIP32Factory;
|
|
36
37
|
class EcKeyPair {
|
|
@@ -109,12 +110,14 @@ class EcKeyPair {
|
|
|
109
110
|
return this.BIP32.fromSeed(seed, network);
|
|
110
111
|
}
|
|
111
112
|
static getTaprootAddress(keyPair, network = bitcoinjs_lib_1.networks.bitcoin) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
const { address } = bitcoinjs_lib_1.payments.p2tr({
|
|
114
|
+
internalPubkey: (0, bip371_js_1.toXOnly)(keyPair.publicKey),
|
|
115
|
+
network: network,
|
|
116
|
+
});
|
|
117
|
+
if (!address) {
|
|
118
|
+
throw new Error(`Failed to generate sender address for transaction`);
|
|
119
|
+
}
|
|
120
|
+
return address;
|
|
118
121
|
}
|
|
119
122
|
static getTaprootAddressFromAddress(inAddr, network = bitcoinjs_lib_1.networks.bitcoin) {
|
|
120
123
|
const { address } = bitcoinjs_lib_1.payments.p2tr({
|
package/cjs/keypair/Wallet.d.ts
CHANGED
package/cjs/keypair/Wallet.js
CHANGED
|
@@ -36,5 +36,8 @@ class Wallet {
|
|
|
36
36
|
throw new Error('Keypair not set');
|
|
37
37
|
return (0, bip371_js_1.toXOnly)(this.keypair.publicKey);
|
|
38
38
|
}
|
|
39
|
+
static fromWif(wif, network = bitcoinjs_lib_1.networks.bitcoin) {
|
|
40
|
+
return new Wallet({ privateKey: wif, address: '', publicKey: '' }, network);
|
|
41
|
+
}
|
|
39
42
|
}
|
|
40
43
|
exports.Wallet = Wallet;
|
|
@@ -15,13 +15,13 @@ class wBTC extends ContractBaseMetadata_js_1.ContractBaseMetadata {
|
|
|
15
15
|
this.address = wBTC.getAddress(network);
|
|
16
16
|
}
|
|
17
17
|
static getAddress(network = bitcoinjs_lib_1.networks.bitcoin) {
|
|
18
|
-
switch (network) {
|
|
19
|
-
case bitcoinjs_lib_1.networks.bitcoin:
|
|
20
|
-
return '
|
|
21
|
-
case bitcoinjs_lib_1.networks.regtest:
|
|
22
|
-
return '
|
|
23
|
-
case bitcoinjs_lib_1.networks.testnet:
|
|
24
|
-
return '
|
|
18
|
+
switch (network.bech32) {
|
|
19
|
+
case bitcoinjs_lib_1.networks.bitcoin.bech32:
|
|
20
|
+
return 'unknown';
|
|
21
|
+
case bitcoinjs_lib_1.networks.regtest.bech32:
|
|
22
|
+
return 'bcrt1qmsx5vpm6yfwtex5ygag0nwktnmj7a48eew2qn0';
|
|
23
|
+
case bitcoinjs_lib_1.networks.testnet.bech32:
|
|
24
|
+
return 'tb1qs4d69qpw57cm3pxyeuamenkv0aswtnhpgxry06';
|
|
25
25
|
default:
|
|
26
26
|
throw new Error(`Invalid network: ${network}`);
|
|
27
27
|
}
|
package/cjs/opnet.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from './verification/TapscriptVerificator.js';
|
|
|
8
8
|
export * from './keypair/EcKeyPair.js';
|
|
9
9
|
export * from './keypair/Wallet.js';
|
|
10
10
|
export * from './keypair/interfaces/IWallet.js';
|
|
11
|
+
export * from './keypair/AddressVerificator.js';
|
|
11
12
|
export * from './metadata/contracts/wBTC.js';
|
|
12
13
|
export * from './metadata/ContractBaseMetadata.js';
|
|
13
14
|
export * from './network/NetworkInformation.js';
|
|
@@ -19,6 +20,15 @@ export * from './transaction/enums/TransactionType.js';
|
|
|
19
20
|
export * from './transaction/builders/InteractionTransaction.js';
|
|
20
21
|
export * from './transaction/builders/FundingTransaction.js';
|
|
21
22
|
export * from './transaction/builders/TransactionBuilder.js';
|
|
23
|
+
export * from './transaction/builders/WrapTransaction.js';
|
|
24
|
+
export * from './transaction/builders/SharedInteractionTransaction.js';
|
|
25
|
+
export * from './transaction/builders/DeploymentTransaction.js';
|
|
26
|
+
export * from './wbtc/WrappedGenerationParameters.js';
|
|
27
|
+
export * from './wbtc/Generate.js';
|
|
22
28
|
export * from './utils/BitcoinUtils.js';
|
|
23
29
|
export * from './utxo/interfaces/IUTXO.js';
|
|
24
|
-
export * from './utxo/
|
|
30
|
+
export * from './utxo/OPNetLimitedProvider.js';
|
|
31
|
+
export * from './transaction/processor/PsbtTransaction.js';
|
|
32
|
+
export * from './transaction/shared/TweakedTransaction.js';
|
|
33
|
+
export * from './utxo/interfaces/BroadcastResponse.js';
|
|
34
|
+
export * from './transaction/psbt/PSBTTypes.js';
|
package/cjs/opnet.js
CHANGED
|
@@ -26,6 +26,7 @@ __exportStar(require("./verification/TapscriptVerificator.js"), exports);
|
|
|
26
26
|
__exportStar(require("./keypair/EcKeyPair.js"), exports);
|
|
27
27
|
__exportStar(require("./keypair/Wallet.js"), exports);
|
|
28
28
|
__exportStar(require("./keypair/interfaces/IWallet.js"), exports);
|
|
29
|
+
__exportStar(require("./keypair/AddressVerificator.js"), exports);
|
|
29
30
|
__exportStar(require("./metadata/contracts/wBTC.js"), exports);
|
|
30
31
|
__exportStar(require("./metadata/ContractBaseMetadata.js"), exports);
|
|
31
32
|
__exportStar(require("./network/NetworkInformation.js"), exports);
|
|
@@ -37,6 +38,15 @@ __exportStar(require("./transaction/enums/TransactionType.js"), exports);
|
|
|
37
38
|
__exportStar(require("./transaction/builders/InteractionTransaction.js"), exports);
|
|
38
39
|
__exportStar(require("./transaction/builders/FundingTransaction.js"), exports);
|
|
39
40
|
__exportStar(require("./transaction/builders/TransactionBuilder.js"), exports);
|
|
41
|
+
__exportStar(require("./transaction/builders/WrapTransaction.js"), exports);
|
|
42
|
+
__exportStar(require("./transaction/builders/SharedInteractionTransaction.js"), exports);
|
|
43
|
+
__exportStar(require("./transaction/builders/DeploymentTransaction.js"), exports);
|
|
44
|
+
__exportStar(require("./wbtc/WrappedGenerationParameters.js"), exports);
|
|
45
|
+
__exportStar(require("./wbtc/Generate.js"), exports);
|
|
40
46
|
__exportStar(require("./utils/BitcoinUtils.js"), exports);
|
|
41
47
|
__exportStar(require("./utxo/interfaces/IUTXO.js"), exports);
|
|
42
|
-
__exportStar(require("./utxo/
|
|
48
|
+
__exportStar(require("./utxo/OPNetLimitedProvider.js"), exports);
|
|
49
|
+
__exportStar(require("./transaction/processor/PsbtTransaction.js"), exports);
|
|
50
|
+
__exportStar(require("./transaction/shared/TweakedTransaction.js"), exports);
|
|
51
|
+
__exportStar(require("./utxo/interfaces/BroadcastResponse.js"), exports);
|
|
52
|
+
__exportStar(require("./transaction/psbt/PSBTTypes.js"), exports);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Network, Signer } from 'bitcoinjs-lib';
|
|
3
|
+
import { ECPairInterface } from 'ecpair';
|
|
3
4
|
export interface TweakSettings {
|
|
4
5
|
readonly network?: Network;
|
|
5
6
|
tweakHash?: Buffer;
|
|
6
7
|
}
|
|
7
8
|
export declare class TweakedSigner {
|
|
8
|
-
static tweakSigner(signer:
|
|
9
|
+
static tweakSigner(signer: ECPairInterface, opts?: TweakSettings): Signer;
|
|
9
10
|
}
|
|
@@ -27,7 +27,7 @@ exports.TweakedSigner = void 0;
|
|
|
27
27
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
28
28
|
const bip341_js_1 = require("bitcoinjs-lib/src/payments/bip341.js");
|
|
29
29
|
const bip371_js_1 = require("bitcoinjs-lib/src/psbt/bip371.js");
|
|
30
|
-
const ecc = __importStar(require("
|
|
30
|
+
const ecc = __importStar(require("@bitcoinerlab/secp256k1"));
|
|
31
31
|
const EcKeyPair_js_1 = require("../keypair/EcKeyPair.js");
|
|
32
32
|
(0, bitcoinjs_lib_1.initEccLib)(ecc);
|
|
33
33
|
class TweakedSigner {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
4
|
+
const PsbtTransaction_js_1 = require("../transaction/processor/PsbtTransaction.js");
|
|
5
|
+
const Regtest_js_1 = require("./Regtest.js");
|
|
6
|
+
const Wallet_js_1 = require("../keypair/Wallet.js");
|
|
7
|
+
const utxos = [
|
|
8
|
+
{
|
|
9
|
+
vault: 'bcrt1qw68z902wcwsdvznmh55m4788k2jfvjl2kkjht2hx58dsysxws23s0yduvf',
|
|
10
|
+
publicKeys: [
|
|
11
|
+
'AtOOpbDsniLbs2QGuqPFu7AnCOK9lNSSl+pvPr0m0Yx3',
|
|
12
|
+
'AgPmjuI2/MNJM9STswWm8MdWEllHHRPs0Q3+DjdjOny+',
|
|
13
|
+
'A4JEwTBwTx5QaLCFORTow27UQvkLQWZguhz6N+d8FczI',
|
|
14
|
+
'A7ZKMoDQJlcQNbzIikCE5MPiFC81RvHHTeTMRx2/bFiO',
|
|
15
|
+
],
|
|
16
|
+
minimum: 2,
|
|
17
|
+
utxos: [
|
|
18
|
+
{
|
|
19
|
+
hash: 'e8aaf419315d5800510266bc62d5e12895a9905ae1c8b402a1d87b19e421eb0c',
|
|
20
|
+
blockId: 619n,
|
|
21
|
+
output: 'ACB2jiK9TsOg1gp7vSm6+OeypJZL6rWldarmodsCQM6Cow==',
|
|
22
|
+
outputIndex: 1,
|
|
23
|
+
value: 520000n,
|
|
24
|
+
vault: 'bcrt1qw68z902wcwsdvznmh55m4788k2jfvjl2kkjht2hx58dsysxws23s0yduvf',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
vault: 'bcrt1q5zdeytstgxt3c0ewuy9z2ykwvevcsdmwgzpl6ue2zmjzhz0qp5gsjncl5p',
|
|
30
|
+
publicKeys: [
|
|
31
|
+
'AtOOpbDsniLbs2QGuqPFu7AnCOK9lNSSl+pvPr0m0Yx3',
|
|
32
|
+
'AgPmjuI2/MNJM9STswWm8MdWEllHHRPs0Q3+DjdjOny+',
|
|
33
|
+
'A7ZKMoDQJlcQNbzIikCE5MPiFC81RvHHTeTMRx2/bFiO',
|
|
34
|
+
'A4JEwTBwTx5QaLCFORTow27UQvkLQWZguhz6N+d8FczI',
|
|
35
|
+
],
|
|
36
|
+
minimum: 2,
|
|
37
|
+
utxos: [
|
|
38
|
+
{
|
|
39
|
+
hash: '9511def32b3bbea5d6ee50b3825eb0d8e838ab981a5e829163aabc848dc2a5ec',
|
|
40
|
+
blockId: 619n,
|
|
41
|
+
output: 'ACCgm5IuC0GXHD8u4QolEs5mWYg3bkCD/XMqFuQrieANEQ==',
|
|
42
|
+
outputIndex: 1,
|
|
43
|
+
value: 520000n,
|
|
44
|
+
vault: 'bcrt1q5zdeytstgxt3c0ewuy9z2ykwvevcsdmwgzpl6ue2zmjzhz0qp5gsjncl5p',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
const base64 = 'cHNidP8BAH0CAAAAAUdiYjdBab0hn3CDAnAJUUeFsXC+nTgBHgd3BlcVVpuCAAAAAAD9////AhAnAAAAAAAAFgAU3A1GB3oiXLyahEdQ+brLnuXu1PmghgEAAAAAACJRIMvh+yrfgbFrpK+7OHQ/RzjMsoFw0u/DWjypNmzmTqRRAAAAAAABAP2LAQIAAAAAAQLJ1u4VYt2M7XGeYQ223+Okr2RVjjFdt5Kq+ubWPnOClAEAAAAA/f///yNwkEIOC2tiCZbPrZ7lfs+BcGeEZEPKinNQNGtpc10KAAAAAAD9////AjosBQAAAAAAIlEgec1Y5d7l/dP71V7KHFEPXSd4llP7tdYeMucuNgYdmtZeiG8lAAAAACJRIMvh+yrfgbFrpK+7OHQ/RzjMsoFw0u/DWjypNmzmTqRRAkcwRAIgQXhmsDC0uiqeUvNveohrw3HmmVa+Urj9S6BYk7JXZTgCIBXtWBMJKEb0XIkFGicZpZ6f8L3Jfsn1T+kXJKDEx3i/ASECA3NibTF66HiM4ygLSRBoYQ2EDCPstkwUB1u7n2cK9SwCSDBFAiEAkFZmXMvjpej9IaY7bClMmFJJvFfHz5wNgS3DMJX+/ikCIF7RuZGOloV6ywfBuEJAcG+aeUpj2G/wfbC5m1TdDIjKASECA3NibTF66HiM4ygLSRBoYQ2EDCPstkwUB1u7n2cK9SwAAAAAAQErOiwFAAAAAAAiUSB5zVjl3uX90/vVXsocUQ9dJ3iWU/u11h4y5y42Bh2a1gEI/ZsBBhTcDUYHeiJcvJqER1D5usue5e7U+SADc2JtMXroeIzjKAtJEGhhDYQMI+y2TBQHW7ufZwr1LEFeyYHJ1GDmnmyJY9/n9hPCq6QpPlIG5abUp3R0ajalW/3z7BzRC7x+2vYSxx0tXhPPhwz+pA6KrYn0KdKtrpw3g0H4LavHDy84AI5Arptj5p3KAPa4jXL9MWgqvs9EWkDxiCcZAAWHLhecOoHxFHHXS5zliunzyUK5kV9QFK5y4GW/g50gA3NibTF66HiM4ygLSRBoYQ2EDCPstkwUB1u7n2cK9SytIIDkAPmSwEXJSTK3JW+k+SStdu3V79DvhwkRW1zUE3TPrakUa+ERRyz/TfTCBSBhxsWSn73tjr2IqRRX071DozCmsIOX52feFv01Wogu+Yh0UZxjA2JzaU8eH4sIAAAAAAACCmudv+YoAz7A7+QAAOFe/R8kAAAAZ1FoQcEDc2JtMXroeIzjKAtJEGhhDYQMI+y2TBQHW7ufZwr1LOfk1ZP8tykm7tvg0eMR9BrNb27xYdy6CBp1Fo7E3NN5AAABBSADc2JtMXroeIzjKAtJEGhhDYQMI+y2TBQHW7ufZwr1LAA=';
|
|
50
|
+
const network = bitcoinjs_lib_1.networks.regtest;
|
|
51
|
+
const wallet = new Wallet_js_1.Wallet(Regtest_js_1.Regtest.wallet, network);
|
|
52
|
+
const psbtTransactionData = {
|
|
53
|
+
signer: wallet.keypair,
|
|
54
|
+
network: network,
|
|
55
|
+
amountRequested: 1000000n,
|
|
56
|
+
receiver: wallet.p2tr,
|
|
57
|
+
};
|
|
58
|
+
const myIndexerWallet1 = new Wallet_js_1.Wallet(Regtest_js_1.Regtest.wallet, network);
|
|
59
|
+
const psbtTransaction = PsbtTransaction_js_1.PsbtTransaction.fromBase64(base64, psbtTransactionData);
|
|
60
|
+
psbtTransaction.mergeVaults(utxos);
|
|
61
|
+
const signed = psbtTransaction.attemptSignAllInputs();
|
|
62
|
+
console.log(signed, psbtTransaction.toBase64(), base64 === psbtTransaction.toBase64());
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const Wallet_js_1 = require("../keypair/Wallet.js");
|
|
27
|
+
const Regtest_js_1 = require("./Regtest.js");
|
|
28
|
+
const OPNetLimitedProvider_js_1 = require("../utxo/OPNetLimitedProvider.js");
|
|
29
|
+
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
30
|
+
const TransactionFactory_js_1 = require("../transaction/TransactionFactory.js");
|
|
31
|
+
const bsi_bitcoin_rpc_1 = require("@btc-vision/bsi-bitcoin-rpc");
|
|
32
|
+
const fs = __importStar(require("node:fs"));
|
|
33
|
+
const network = bitcoinjs_lib_1.networks.testnet;
|
|
34
|
+
const rpc = new bsi_bitcoin_rpc_1.BitcoinRPC();
|
|
35
|
+
const wallet = new Wallet_js_1.Wallet(Regtest_js_1.Testnet.wallet, network);
|
|
36
|
+
const utxoManager = new OPNetLimitedProvider_js_1.OPNetLimitedProvider('https://testnet.opnet.org');
|
|
37
|
+
const factory = new TransactionFactory_js_1.TransactionFactory();
|
|
38
|
+
const shouldMineBlock = true;
|
|
39
|
+
async function mineBlock() {
|
|
40
|
+
const ok = await rpc.generateToAddress(1, wallet.p2wpkh, 'default');
|
|
41
|
+
if (!ok) {
|
|
42
|
+
throw new Error('Could not mine block');
|
|
43
|
+
}
|
|
44
|
+
console.log(`Mined block`, ok);
|
|
45
|
+
return !!ok.length;
|
|
46
|
+
}
|
|
47
|
+
await rpc.init(Regtest_js_1.Testnet.config);
|
|
48
|
+
const utxoSetting = {
|
|
49
|
+
addresses: [wallet.p2tr, wallet.p2wpkh],
|
|
50
|
+
minAmount: 10000n,
|
|
51
|
+
requestedAmount: 100000n,
|
|
52
|
+
};
|
|
53
|
+
console.log(utxoSetting);
|
|
54
|
+
const utxos = await utxoManager.fetchUTXOMultiAddr(utxoSetting);
|
|
55
|
+
if (!utxos) {
|
|
56
|
+
throw new Error('No UTXOs found');
|
|
57
|
+
}
|
|
58
|
+
const bytecode = fs.readFileSync('./bytecode/wbtc.wasm');
|
|
59
|
+
const deploymentParameters = {
|
|
60
|
+
from: wallet.p2wpkh,
|
|
61
|
+
utxos: utxos,
|
|
62
|
+
signer: wallet.keypair,
|
|
63
|
+
network: network,
|
|
64
|
+
feeRate: 1000,
|
|
65
|
+
priorityFee: 50000n,
|
|
66
|
+
bytecode: bytecode,
|
|
67
|
+
};
|
|
68
|
+
const finalTx = factory.signDeployment(deploymentParameters);
|
|
69
|
+
console.log(`Final transaction:`, finalTx);
|
|
70
|
+
const firstTxBroadcast = await rpc.sendRawTransaction({
|
|
71
|
+
hexstring: finalTx.transaction[0],
|
|
72
|
+
});
|
|
73
|
+
console.log(`First transaction broadcasted: ${firstTxBroadcast}`);
|
|
74
|
+
if (!firstTxBroadcast) {
|
|
75
|
+
throw new Error('Could not broadcast first transaction');
|
|
76
|
+
}
|
|
77
|
+
const secondTxBroadcast = await rpc.sendRawTransaction({
|
|
78
|
+
hexstring: finalTx.transaction[1],
|
|
79
|
+
});
|
|
80
|
+
console.log(`Second transaction broadcasted: ${secondTxBroadcast}`);
|
|
81
|
+
if (!secondTxBroadcast) {
|
|
82
|
+
throw new Error('Could not broadcast second transaction');
|
|
83
|
+
}
|
|
84
|
+
if (shouldMineBlock) {
|
|
85
|
+
await mineBlock();
|
|
86
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|