@btc-vision/transaction 1.0.44 → 1.0.45

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 (31) hide show
  1. package/browser/_version.d.ts +1 -1
  2. package/browser/index.js +1 -1
  3. package/browser/transaction/TransactionFactory.d.ts +6 -2
  4. package/browser/transaction/builders/TransactionBuilder.d.ts +1 -0
  5. package/browser/transaction/interfaces/ITransactionParameters.d.ts +1 -1
  6. package/build/_version.d.ts +1 -1
  7. package/build/_version.js +1 -1
  8. package/build/tests/Regtest.js +1 -1
  9. package/build/tests/btc/send.d.ts +1 -0
  10. package/build/tests/btc/send.js +36 -0
  11. package/build/tests/moto/airdropToken.js +3 -3
  12. package/build/tests/test.js +1 -1
  13. package/build/tests/wbtc/transferReg.js +2 -2
  14. package/build/tests/wbtc/unwrapReg.js +1 -1
  15. package/build/tests/wbtc/withdrawalRequestReg.js +1 -1
  16. package/build/tests/wbtc/wrapReg.js +2 -3
  17. package/build/transaction/TransactionFactory.d.ts +6 -2
  18. package/build/transaction/TransactionFactory.js +37 -32
  19. package/build/transaction/builders/FundingTransaction.js +1 -1
  20. package/build/transaction/builders/TransactionBuilder.d.ts +1 -0
  21. package/build/transaction/builders/TransactionBuilder.js +21 -5
  22. package/build/transaction/interfaces/ITransactionParameters.d.ts +1 -1
  23. package/build/transaction/shared/TweakedTransaction.js +0 -1
  24. package/package.json +2 -2
  25. package/src/_version.ts +1 -1
  26. package/src/transaction/TransactionFactory.ts +61 -51
  27. package/src/transaction/builders/FundingTransaction.ts +40 -40
  28. package/src/transaction/builders/InteractionTransaction.ts +1 -1
  29. package/src/transaction/builders/TransactionBuilder.ts +33 -5
  30. package/src/transaction/interfaces/ITransactionParameters.ts +1 -1
  31. package/src/transaction/shared/TweakedTransaction.ts +0 -1
@@ -1,4 +1,4 @@
1
- import { IDeploymentParameters, IInteractionParameters, IUnwrapParameters, IWrapParameters } from './interfaces/ITransactionParameters.js';
1
+ import { IDeploymentParameters, IFundingTransactionParameters, IInteractionParameters, IUnwrapParameters, IWrapParameters } from './interfaces/ITransactionParameters.js';
2
2
  import { Address } from '@btc-vision/bsi-binary';
3
3
  export interface DeploymentResult {
4
4
  readonly transaction: [string, string];
@@ -23,10 +23,14 @@ export declare class TransactionFactory {
23
23
  wrap(warpParameters: IWrapParameters): Promise<WrapResult>;
24
24
  unwrapSegwit(unwrapParameters: IUnwrapParameters): Promise<UnwrapResult>;
25
25
  unwrap(unwrapParameters: IUnwrapParameters): Promise<UnwrapResult>;
26
+ createBTCTransfer(parameters: IFundingTransactionParameters): Promise<{
27
+ estimatedFees: bigint;
28
+ tx: string;
29
+ }>;
30
+ private createFundTransaction;
26
31
  private calculateNumSignatures;
27
32
  private calculateNumInputs;
28
33
  private maxPubKeySize;
29
34
  private writePSBTHeader;
30
35
  private getUTXOAsTransaction;
31
- private createFundTransaction;
32
36
  }
@@ -35,6 +35,7 @@ export declare abstract class TransactionBuilder<T extends TransactionType> exte
35
35
  setDestinationAddress(address: Address): void;
36
36
  setMaximumFeeRate(feeRate: number): void;
37
37
  signTransaction(): Promise<Transaction>;
38
+ generateTransactionMinimalSignatures(): Promise<void>;
38
39
  signPSBT(): Promise<Psbt>;
39
40
  addInput(input: PsbtInputExtended): void;
40
41
  addOutput(output: PsbtOutputExtended): void;
@@ -14,7 +14,7 @@ export interface ITransactionParameters extends ITweakedTransactionData {
14
14
  readonly priorityFee: bigint;
15
15
  }
16
16
  export interface IFundingTransactionParameters extends ITransactionParameters {
17
- childTransactionRequiredValue: bigint;
17
+ amount: bigint;
18
18
  }
19
19
  export interface SharedInteractionParameters extends ITransactionParameters {
20
20
  calldata?: Buffer | undefined;
@@ -1 +1 @@
1
- export declare const version = "1.0.44";
1
+ export declare const version = "1.0.47";
package/build/_version.js CHANGED
@@ -1 +1 @@
1
- export const version = '1.0.44';
1
+ export const version = '1.0.47';
@@ -8,7 +8,7 @@ export const Regtest = {
8
8
  config: {
9
9
  BITCOIND_NETWORK: BitcoinNetwork.Regtest,
10
10
  BITCOIND_HOST: '51.81.67.34',
11
- BITCOIND_PORT: 9242,
11
+ BITCOIND_PORT: 8001,
12
12
  BITCOIND_USERNAME: 'HJSiowseujhs',
13
13
  BITCOIND_PASSWORD: 'YHEFHSDJ23JOIhjjef2ied9u290efu2930u90U',
14
14
  },
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ import { TransactionFactory } from '../../transaction/TransactionFactory.js';
2
+ import { OPNetLimitedProvider } from '../../utxo/OPNetLimitedProvider.js';
3
+ import { Wallet } from '../../keypair/Wallet.js';
4
+ import { Regtest } from '../Regtest.js';
5
+ import { networks } from 'bitcoinjs-lib';
6
+ const network = networks.regtest;
7
+ const utxoManager = new OPNetLimitedProvider('http://localhost:9001');
8
+ const factory = new TransactionFactory();
9
+ const wallet = new Wallet(Regtest.wallet, network);
10
+ const amount = 100000000n;
11
+ const utxoSetting = {
12
+ addresses: [wallet.p2wpkh, wallet.p2tr],
13
+ minAmount: 10000n,
14
+ requestedAmount: amount,
15
+ };
16
+ const utxos = await utxoManager.fetchUTXOMultiAddr(utxoSetting);
17
+ if (!utxos) {
18
+ throw new Error('No UTXOs found');
19
+ }
20
+ const fundingTransactionParameters = {
21
+ amount: amount,
22
+ feeRate: 500,
23
+ from: wallet.p2wpkh,
24
+ utxos: utxos,
25
+ signer: wallet.keypair,
26
+ network: network,
27
+ priorityFee: 0n,
28
+ to: 'bcrt1p2m2yz9hae5lkypuf8heh6udnt0tchmxhaftcfslqsr5vrwzh34yqgn6hs6',
29
+ };
30
+ const fundingTx = await factory.createBTCTransfer(fundingTransactionParameters);
31
+ console.log(fundingTx);
32
+ const broadcastResponse = await utxoManager.broadcastTransaction(fundingTx.tx, false);
33
+ if (!broadcastResponse) {
34
+ throw new Error('Could not broadcast transaction');
35
+ }
36
+ console.log(broadcastResponse);
@@ -1,5 +1,5 @@
1
1
  import { ABICoder, BinaryWriter } from '@btc-vision/bsi-binary';
2
- import { interact, wallet } from '../shared/interaction.js';
2
+ import { interact } from '../shared/interaction.js';
3
3
  import { MOTO_ADDRESS } from '../shared/tokens.js';
4
4
  const abiCoder = new ABICoder();
5
5
  const airdropSelector = Number(`0x` + abiCoder.encodeSelector('airdrop'));
@@ -14,8 +14,8 @@ function airdropToken(amount, to) {
14
14
  calldata.writeAddressValueTupleMap(aidropToken);
15
15
  return Buffer.from(calldata.getBuffer());
16
16
  }
17
- const tokenAmount = expandToDecimals(10000, 8n);
18
- const receiver = wallet.p2tr;
17
+ const tokenAmount = expandToDecimals(1000, 8n);
18
+ const receiver = 'bcrt1p2m2yz9hae5lkypuf8heh6udnt0tchmxhaftcfslqsr5vrwzh34yqgn6hs6';
19
19
  const calldata = airdropToken(tokenAmount, receiver);
20
20
  console.log('airdrop ->', calldata.toString('hex'));
21
21
  await interact(MOTO_ADDRESS, calldata);
@@ -36,7 +36,7 @@ async function mineBlock() {
36
36
  network: network,
37
37
  feeRate: 150,
38
38
  priorityFee: 1000n,
39
- childTransactionRequiredValue: 0n,
39
+ amount: 0n,
40
40
  };
41
41
  const fundingTransaction = new FundingTransaction(interactionParameters);
42
42
  const fundingTx = await fundingTransaction.signTransaction();
@@ -12,5 +12,5 @@ function getTransferToCalldata(to, amount) {
12
12
  return Buffer.from(addCalldata.getBuffer());
13
13
  }
14
14
  const contract = wBTC.getAddress(networks.regtest);
15
- const calldata = getTransferToCalldata('bcrt1pmc2dz8fy4rwghzmfz4hdsennusld8cwgtr0mjxl45wt8cnqcm3psssc327', 10000n);
16
- await interact(contract, calldata, true);
15
+ const calldata = getTransferToCalldata('bcrt1p2m2yz9hae5lkypuf8heh6udnt0tchmxhaftcfslqsr5vrwzh34yqgn6hs6', 50000000n);
16
+ await interact(contract, calldata, false);
@@ -28,7 +28,7 @@ const utxos = await opnet.fetchUTXOMultiAddr(utxoSetting);
28
28
  if (!utxos) {
29
29
  throw new Error('No UTXOs found');
30
30
  }
31
- const unwrapAmount = 97410676n;
31
+ const unwrapAmount = 600000n;
32
32
  const unwrapUtxos = await opnet.fetchUnWrapParameters(unwrapAmount, wallet.p2tr);
33
33
  if (!unwrapUtxos) {
34
34
  throw new Error('No UTXOs found for unwrap');
@@ -39,7 +39,7 @@ const utxos = await utxoManager.fetchUTXOMultiAddr(utxoSetting);
39
39
  if (!utxos) {
40
40
  throw new Error('No UTXOs found');
41
41
  }
42
- const calldata = generateCalldata(97410676n);
42
+ const calldata = generateCalldata(600000n);
43
43
  const interactionParameters = {
44
44
  from: wallet.p2wpkh,
45
45
  to: wBtc.getAddress(),
@@ -20,7 +20,7 @@ async function mineBlock() {
20
20
  return !!ok.length;
21
21
  }
22
22
  await rpc.init(Regtest.config);
23
- const wrapAmount = (currentConsensusConfig.VAULT_MINIMUM_AMOUNT * 30n) / 10n;
23
+ const wrapAmount = 1n * 100000000n;
24
24
  const utxoSetting = {
25
25
  addresses: [wallet.p2wpkh, wallet.p2tr],
26
26
  minAmount: 10000n,
@@ -34,13 +34,12 @@ const generationParameters = await opnet.fetchWrapParameters(wrapAmount);
34
34
  if (!generationParameters) {
35
35
  throw new Error('No generation parameters found');
36
36
  }
37
- console.log(`UTXOs:`, utxos);
38
37
  const wrapParameters = {
39
38
  from: wallet.p2wpkh,
40
39
  utxos: utxos,
41
40
  signer: wallet.keypair,
42
41
  network: network,
43
- feeRate: 1000,
42
+ feeRate: 500,
44
43
  priorityFee: 100000n,
45
44
  receiver: wallet.p2tr,
46
45
  amount: wrapAmount,
@@ -1,4 +1,4 @@
1
- import { IDeploymentParameters, IInteractionParameters, IUnwrapParameters, IWrapParameters } from './interfaces/ITransactionParameters.js';
1
+ import { IDeploymentParameters, IFundingTransactionParameters, IInteractionParameters, IUnwrapParameters, IWrapParameters } from './interfaces/ITransactionParameters.js';
2
2
  import { Address } from '@btc-vision/bsi-binary';
3
3
  export interface DeploymentResult {
4
4
  readonly transaction: [string, string];
@@ -23,10 +23,14 @@ export declare class TransactionFactory {
23
23
  wrap(warpParameters: IWrapParameters): Promise<WrapResult>;
24
24
  unwrapSegwit(unwrapParameters: IUnwrapParameters): Promise<UnwrapResult>;
25
25
  unwrap(unwrapParameters: IUnwrapParameters): Promise<UnwrapResult>;
26
+ createBTCTransfer(parameters: IFundingTransactionParameters): Promise<{
27
+ estimatedFees: bigint;
28
+ tx: string;
29
+ }>;
30
+ private createFundTransaction;
26
31
  private calculateNumSignatures;
27
32
  private calculateNumInputs;
28
33
  private maxPubKeySize;
29
34
  private writePSBTHeader;
30
35
  private getUTXOAsTransaction;
31
- private createFundTransaction;
32
36
  }
@@ -13,25 +13,24 @@ export class TransactionFactory {
13
13
  if (!interactionParameters.to) {
14
14
  throw new Error('Field "to" not provided.');
15
15
  }
16
- const transaction = new InteractionTransaction(interactionParameters);
17
- await transaction.signTransaction();
18
- const estimatedGas = await transaction.estimateTransactionFees();
19
- const fundingParameters = {
16
+ const preTransaction = new InteractionTransaction({
20
17
  ...interactionParameters,
21
- childTransactionRequiredValue: estimatedGas,
22
- };
23
- const preFundingTransaction = await this.createFundTransaction(fundingParameters);
24
- interactionParameters.utxos = this.getUTXOAsTransaction(preFundingTransaction.tx, interactionParameters.to, 0);
25
- const preTransaction = new InteractionTransaction(interactionParameters);
26
- await preTransaction.signTransaction();
18
+ utxos: [interactionParameters.utxos[0]],
19
+ });
20
+ await preTransaction.generateTransactionMinimalSignatures();
27
21
  const parameters = await preTransaction.getFundingTransactionParameters();
28
- parameters.utxos = fundingParameters.utxos;
29
- parameters.childTransactionRequiredValue = await preTransaction.estimateTransactionFees();
30
- parameters.estimatedFees = preFundingTransaction.estimatedFees;
22
+ parameters.utxos = interactionParameters.utxos;
23
+ parameters.amount = await preTransaction.estimateTransactionFees();
24
+ const feeEstimationFundingTransaction = await this.createFundTransaction({ ...parameters });
25
+ if (!feeEstimationFundingTransaction) {
26
+ throw new Error('Could not sign funding transaction.');
27
+ }
28
+ parameters.estimatedFees = feeEstimationFundingTransaction.estimatedFees;
31
29
  const signedTransaction = await this.createFundTransaction(parameters);
32
30
  if (!signedTransaction) {
33
31
  throw new Error('Could not sign funding transaction.');
34
32
  }
33
+ interactionParameters.utxos = this.getUTXOAsTransaction(signedTransaction.tx, interactionParameters.to, 0);
35
34
  const newParams = {
36
35
  ...interactionParameters,
37
36
  utxos: this.getUTXOAsTransaction(signedTransaction.tx, interactionParameters.to, 0),
@@ -85,7 +84,7 @@ export class TransactionFactory {
85
84
  const to = wbtc.getAddress();
86
85
  const fundingParameters = {
87
86
  ...warpParameters,
88
- childTransactionRequiredValue: childTransactionRequiredValue,
87
+ amount: childTransactionRequiredValue,
89
88
  to: to,
90
89
  };
91
90
  const preFundingTransaction = await this.createFundTransaction(fundingParameters);
@@ -93,7 +92,7 @@ export class TransactionFactory {
93
92
  const preTransaction = new WrapTransaction(warpParameters);
94
93
  await preTransaction.signTransaction();
95
94
  const parameters = await preTransaction.getFundingTransactionParameters();
96
- parameters.childTransactionRequiredValue += childTransactionRequiredValue;
95
+ parameters.amount += childTransactionRequiredValue;
97
96
  parameters.utxos = fundingParameters.utxos;
98
97
  const signedTransaction = await this.createFundTransaction(parameters);
99
98
  if (!signedTransaction) {
@@ -125,7 +124,7 @@ export class TransactionFactory {
125
124
  const estimatedFees = transaction.preEstimateTransactionFees(BigInt(unwrapParameters.feeRate), this.calculateNumInputs(unwrapParameters.unwrapUTXOs), 2n, this.calculateNumSignatures(unwrapParameters.unwrapUTXOs), this.maxPubKeySize(unwrapParameters.unwrapUTXOs));
126
125
  const fundingParameters = {
127
126
  ...unwrapParameters,
128
- childTransactionRequiredValue: estimatedGas + estimatedFees,
127
+ amount: estimatedGas + estimatedFees,
129
128
  to: to,
130
129
  };
131
130
  const preFundingTransaction = await this.createFundTransaction(fundingParameters);
@@ -137,8 +136,7 @@ export class TransactionFactory {
137
136
  await preTransaction.signTransaction();
138
137
  const parameters = await preTransaction.getFundingTransactionParameters();
139
138
  parameters.utxos = fundingParameters.utxos;
140
- parameters.childTransactionRequiredValue =
141
- (await preTransaction.estimateTransactionFees()) + estimatedFees;
139
+ parameters.amount = (await preTransaction.estimateTransactionFees()) + estimatedFees;
142
140
  const signedTransaction = await this.createFundTransaction(parameters);
143
141
  if (!signedTransaction) {
144
142
  throw new Error('Could not sign funding transaction.');
@@ -168,7 +166,7 @@ export class TransactionFactory {
168
166
  const estimatedGas = await transaction.estimateTransactionFees();
169
167
  const fundingParameters = {
170
168
  ...unwrapParameters,
171
- childTransactionRequiredValue: estimatedGas,
169
+ amount: estimatedGas,
172
170
  to: to,
173
171
  };
174
172
  const preFundingTransaction = await this.createFundTransaction(fundingParameters);
@@ -180,7 +178,7 @@ export class TransactionFactory {
180
178
  await preTransaction.signTransaction();
181
179
  const parameters = await preTransaction.getFundingTransactionParameters();
182
180
  parameters.utxos = fundingParameters.utxos;
183
- parameters.childTransactionRequiredValue = await preTransaction.estimateTransactionFees();
181
+ parameters.amount = await preTransaction.estimateTransactionFees();
184
182
  const signedTransaction = await this.createFundTransaction(parameters);
185
183
  if (!signedTransaction) {
186
184
  throw new Error('Could not sign funding transaction.');
@@ -201,6 +199,25 @@ export class TransactionFactory {
201
199
  feeRefundOrLoss: finalTransaction.getFeeLossOrRefund(),
202
200
  };
203
201
  }
202
+ async createBTCTransfer(parameters) {
203
+ const resp = await this.createFundTransaction(parameters);
204
+ return {
205
+ estimatedFees: resp.estimatedFees,
206
+ tx: resp.tx.toHex(),
207
+ };
208
+ }
209
+ async createFundTransaction(parameters) {
210
+ const fundingTransaction = new FundingTransaction(parameters);
211
+ const signedTransaction = await fundingTransaction.signTransaction();
212
+ if (!signedTransaction) {
213
+ throw new Error('Could not sign funding transaction.');
214
+ }
215
+ return {
216
+ tx: signedTransaction,
217
+ original: fundingTransaction,
218
+ estimatedFees: await fundingTransaction.estimateTransactionFees(),
219
+ };
220
+ }
204
221
  calculateNumSignatures(vault) {
205
222
  let numSignatures = 0n;
206
223
  for (const v of vault) {
@@ -242,16 +259,4 @@ export class TransactionFactory {
242
259
  };
243
260
  return [newUtxo];
244
261
  }
245
- async createFundTransaction(parameters) {
246
- const fundingTransaction = new FundingTransaction(parameters);
247
- const signedTransaction = await fundingTransaction.signTransaction();
248
- if (!signedTransaction) {
249
- throw new Error('Could not sign funding transaction.');
250
- }
251
- return {
252
- tx: signedTransaction,
253
- original: fundingTransaction,
254
- estimatedFees: await fundingTransaction.estimateTransactionFees(),
255
- };
256
- }
257
262
  }
@@ -5,7 +5,7 @@ export class FundingTransaction extends TransactionBuilder {
5
5
  childTransactionRequiredFees;
6
6
  constructor(parameters) {
7
7
  super(parameters);
8
- this.childTransactionRequiredFees = parameters.childTransactionRequiredValue;
8
+ this.childTransactionRequiredFees = parameters.amount;
9
9
  this.internalInit();
10
10
  }
11
11
  async buildTransaction() {
@@ -35,6 +35,7 @@ export declare abstract class TransactionBuilder<T extends TransactionType> exte
35
35
  setDestinationAddress(address: Address): void;
36
36
  setMaximumFeeRate(feeRate: number): void;
37
37
  signTransaction(): Promise<Transaction>;
38
+ generateTransactionMinimalSignatures(): Promise<void>;
38
39
  signPSBT(): Promise<Psbt>;
39
40
  addInput(input: PsbtInputExtended): void;
40
41
  addOutput(output: PsbtOutputExtended): void;
@@ -74,8 +74,8 @@ export class TransactionBuilder extends TweakedTransaction {
74
74
  return buffer;
75
75
  }
76
76
  async getFundingTransactionParameters() {
77
- if (!this.transactionFee) {
78
- this.transactionFee = await this.estimateTransactionFees();
77
+ if (!this.estimatedFees) {
78
+ this.estimatedFees = await this.estimateTransactionFees();
79
79
  }
80
80
  return {
81
81
  utxos: this.utxos,
@@ -85,7 +85,7 @@ export class TransactionBuilder extends TweakedTransaction {
85
85
  feeRate: this.feeRate,
86
86
  priorityFee: this.priorityFee,
87
87
  from: this.from,
88
- childTransactionRequiredValue: this.transactionFee,
88
+ amount: this.estimatedFees,
89
89
  };
90
90
  }
91
91
  setDestinationAddress(address) {
@@ -111,6 +111,22 @@ export class TransactionBuilder extends TweakedTransaction {
111
111
  }
112
112
  throw new Error('Could not sign transaction');
113
113
  }
114
+ async generateTransactionMinimalSignatures() {
115
+ if (this.to && !EcKeyPair.verifyContractAddress(this.to, this.network)) {
116
+ throw new Error('Invalid contract address. The contract address must be a taproot address.');
117
+ }
118
+ await this.buildTransaction();
119
+ if (this.transaction.data.inputs.length === 0) {
120
+ const inputs = this.getInputs();
121
+ const outputs = this.getOutputs();
122
+ this.transaction.setMaximumFeeRate(this._maximumFeeRate);
123
+ this.transaction.addInputs(inputs);
124
+ for (let i = 0; i < this.updateInputs.length; i++) {
125
+ this.transaction.updateInput(i, this.updateInputs[i]);
126
+ }
127
+ this.transaction.addOutputs(outputs);
128
+ }
129
+ }
114
130
  async signPSBT() {
115
131
  if (await this.signTransaction()) {
116
132
  return this.transaction;
@@ -142,9 +158,9 @@ export class TransactionBuilder extends TweakedTransaction {
142
158
  });
143
159
  const builtTx = await this.internalBuildTransaction(fakeTx);
144
160
  if (builtTx) {
145
- const tx = fakeTx.extractTransaction(false);
161
+ const tx = fakeTx.extractTransaction(false, true);
146
162
  const size = tx.virtualSize();
147
- const fee = this.feeRate * size + 1;
163
+ const fee = this.feeRate * size;
148
164
  this.estimatedFees = BigInt(Math.ceil(fee) + 1);
149
165
  return this.estimatedFees;
150
166
  }
@@ -14,7 +14,7 @@ export interface ITransactionParameters extends ITweakedTransactionData {
14
14
  readonly priorityFee: bigint;
15
15
  }
16
16
  export interface IFundingTransactionParameters extends ITransactionParameters {
17
- childTransactionRequiredValue: bigint;
17
+ amount: bigint;
18
18
  }
19
19
  export interface SharedInteractionParameters extends ITransactionParameters {
20
20
  calldata?: Buffer | undefined;
@@ -205,7 +205,6 @@ export class TweakedTransaction extends Logger {
205
205
  await this.signInput(transaction, input, i);
206
206
  }
207
207
  catch (e) {
208
- console.log(e);
209
208
  this.log(`Failed to sign input ${i}: ${e.stack}`);
210
209
  }
211
210
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "type": "module",
3
- "version": "1.0.44",
3
+ "version": "1.0.45",
4
4
  "author": "BlobMaster41",
5
5
  "description": "OPNet transaction library allows you to create and sign transactions for the OPNet network.",
6
6
  "engines": {
@@ -91,7 +91,7 @@
91
91
  "dependencies": {
92
92
  "@babel/plugin-proposal-object-rest-spread": "^7.20.7",
93
93
  "@bitcoinerlab/secp256k1": "^1.1.1",
94
- "@btc-vision/bsi-binary": "^1.0.26",
94
+ "@btc-vision/bsi-binary": "^1.0.28",
95
95
  "@btc-vision/bsi-bitcoin-rpc": "^1.0.20",
96
96
  "@btc-vision/bsi-common": "^1.0.14",
97
97
  "@btc-vision/logger": "^1.0.2",
package/src/_version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '1.0.44';
1
+ export const version = '1.0.45';
@@ -61,45 +61,39 @@ export class TransactionFactory {
61
61
  throw new Error('Field "to" not provided.');
62
62
  }
63
63
 
64
- const transaction: InteractionTransaction = new InteractionTransaction(
65
- interactionParameters,
66
- );
67
-
68
- await transaction.signTransaction();
69
-
70
- // Initial generation
71
- const estimatedGas = await transaction.estimateTransactionFees();
72
- const fundingParameters: IFundingTransactionParameters = {
64
+ const preTransaction: InteractionTransaction = new InteractionTransaction({
73
65
  ...interactionParameters,
74
- childTransactionRequiredValue: estimatedGas,
75
- };
76
-
77
- const preFundingTransaction = await this.createFundTransaction(fundingParameters);
78
- interactionParameters.utxos = this.getUTXOAsTransaction(
79
- preFundingTransaction.tx,
80
- interactionParameters.to,
81
- 0,
82
- );
66
+ utxos: [interactionParameters.utxos[0]], // we simulate one input here.
67
+ });
83
68
 
84
- const preTransaction: InteractionTransaction = new InteractionTransaction(
85
- interactionParameters,
86
- );
69
+ // we don't sign that transaction, we just need the parameters.
87
70
 
88
- // Initial generation
89
- await preTransaction.signTransaction();
71
+ await preTransaction.generateTransactionMinimalSignatures();
90
72
 
91
73
  const parameters: IFundingTransactionParameters =
92
74
  await preTransaction.getFundingTransactionParameters();
93
75
 
94
- parameters.utxos = fundingParameters.utxos;
95
- parameters.childTransactionRequiredValue = await preTransaction.estimateTransactionFees();
96
- parameters.estimatedFees = preFundingTransaction.estimatedFees;
76
+ parameters.utxos = interactionParameters.utxos;
77
+ parameters.amount = await preTransaction.estimateTransactionFees();
78
+
79
+ const feeEstimationFundingTransaction = await this.createFundTransaction({ ...parameters });
80
+ if (!feeEstimationFundingTransaction) {
81
+ throw new Error('Could not sign funding transaction.');
82
+ }
83
+
84
+ parameters.estimatedFees = feeEstimationFundingTransaction.estimatedFees;
97
85
 
98
86
  const signedTransaction = await this.createFundTransaction(parameters);
99
87
  if (!signedTransaction) {
100
88
  throw new Error('Could not sign funding transaction.');
101
89
  }
102
90
 
91
+ interactionParameters.utxos = this.getUTXOAsTransaction(
92
+ signedTransaction.tx,
93
+ interactionParameters.to,
94
+ 0,
95
+ );
96
+
103
97
  const newParams: IInteractionParameters = {
104
98
  ...interactionParameters,
105
99
  utxos: this.getUTXOAsTransaction(signedTransaction.tx, interactionParameters.to, 0), // always 0
@@ -190,7 +184,7 @@ export class TransactionFactory {
190
184
  const to = wbtc.getAddress();
191
185
  const fundingParameters: IFundingTransactionParameters = {
192
186
  ...warpParameters,
193
- childTransactionRequiredValue: childTransactionRequiredValue,
187
+ amount: childTransactionRequiredValue,
194
188
  to: to,
195
189
  };
196
190
 
@@ -206,7 +200,7 @@ export class TransactionFactory {
206
200
  await preTransaction.getFundingTransactionParameters();
207
201
 
208
202
  // We add the amount
209
- parameters.childTransactionRequiredValue += childTransactionRequiredValue;
203
+ parameters.amount += childTransactionRequiredValue;
210
204
  parameters.utxos = fundingParameters.utxos;
211
205
 
212
206
  const signedTransaction = await this.createFundTransaction(parameters);
@@ -261,7 +255,7 @@ export class TransactionFactory {
261
255
 
262
256
  const fundingParameters: IFundingTransactionParameters = {
263
257
  ...unwrapParameters,
264
- childTransactionRequiredValue: estimatedGas + estimatedFees,
258
+ amount: estimatedGas + estimatedFees,
265
259
  to: to,
266
260
  };
267
261
 
@@ -280,8 +274,7 @@ export class TransactionFactory {
280
274
  await preTransaction.getFundingTransactionParameters();
281
275
 
282
276
  parameters.utxos = fundingParameters.utxos;
283
- parameters.childTransactionRequiredValue =
284
- (await preTransaction.estimateTransactionFees()) + estimatedFees;
277
+ parameters.amount = (await preTransaction.estimateTransactionFees()) + estimatedFees;
285
278
 
286
279
  const signedTransaction = await this.createFundTransaction(parameters);
287
280
  if (!signedTransaction) {
@@ -326,7 +319,7 @@ export class TransactionFactory {
326
319
  const estimatedGas = await transaction.estimateTransactionFees();
327
320
  const fundingParameters: IFundingTransactionParameters = {
328
321
  ...unwrapParameters,
329
- childTransactionRequiredValue: estimatedGas,
322
+ amount: estimatedGas,
330
323
  to: to,
331
324
  };
332
325
 
@@ -345,7 +338,7 @@ export class TransactionFactory {
345
338
  await preTransaction.getFundingTransactionParameters();
346
339
 
347
340
  parameters.utxos = fundingParameters.utxos;
348
- parameters.childTransactionRequiredValue = await preTransaction.estimateTransactionFees();
341
+ parameters.amount = await preTransaction.estimateTransactionFees();
349
342
 
350
343
  const signedTransaction = await this.createFundTransaction(parameters);
351
344
  if (!signedTransaction) {
@@ -373,6 +366,41 @@ export class TransactionFactory {
373
366
  };
374
367
  }
375
368
 
369
+ /**
370
+ * @description Creates a funding transaction.
371
+ * @param {IFundingTransactionParameters} parameters - The funding transaction parameters
372
+ * @returns {Promise<{ estimatedFees: bigint; tx: string }>} - The signed transaction
373
+ */
374
+ public async createBTCTransfer(parameters: IFundingTransactionParameters): Promise<{
375
+ estimatedFees: bigint;
376
+ tx: string;
377
+ }> {
378
+ const resp = await this.createFundTransaction(parameters);
379
+
380
+ return {
381
+ estimatedFees: resp.estimatedFees,
382
+ tx: resp.tx.toHex(),
383
+ };
384
+ }
385
+
386
+ private async createFundTransaction(parameters: IFundingTransactionParameters): Promise<{
387
+ tx: Transaction;
388
+ original: FundingTransaction;
389
+ estimatedFees: bigint;
390
+ }> {
391
+ const fundingTransaction: FundingTransaction = new FundingTransaction(parameters);
392
+ const signedTransaction: Transaction = await fundingTransaction.signTransaction();
393
+ if (!signedTransaction) {
394
+ throw new Error('Could not sign funding transaction.');
395
+ }
396
+
397
+ return {
398
+ tx: signedTransaction,
399
+ original: fundingTransaction,
400
+ estimatedFees: await fundingTransaction.estimateTransactionFees(),
401
+ };
402
+ }
403
+
376
404
  private calculateNumSignatures(vault: VaultUTXOs[]): bigint {
377
405
  let numSignatures = 0n;
378
406
 
@@ -427,22 +455,4 @@ export class TransactionFactory {
427
455
 
428
456
  return [newUtxo];
429
457
  }
430
-
431
- private async createFundTransaction(parameters: IFundingTransactionParameters): Promise<{
432
- tx: Transaction;
433
- original: FundingTransaction;
434
- estimatedFees: bigint;
435
- }> {
436
- const fundingTransaction: FundingTransaction = new FundingTransaction(parameters);
437
- const signedTransaction: Transaction = await fundingTransaction.signTransaction();
438
- if (!signedTransaction) {
439
- throw new Error('Could not sign funding transaction.');
440
- }
441
-
442
- return {
443
- tx: signedTransaction,
444
- original: fundingTransaction,
445
- estimatedFees: await fundingTransaction.estimateTransactionFees(),
446
- };
447
- }
448
458
  }