@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.
- package/browser/_version.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/transaction/TransactionFactory.d.ts +6 -2
- package/browser/transaction/builders/TransactionBuilder.d.ts +1 -0
- package/browser/transaction/interfaces/ITransactionParameters.d.ts +1 -1
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/tests/Regtest.js +1 -1
- package/build/tests/btc/send.d.ts +1 -0
- package/build/tests/btc/send.js +36 -0
- package/build/tests/moto/airdropToken.js +3 -3
- package/build/tests/test.js +1 -1
- package/build/tests/wbtc/transferReg.js +2 -2
- package/build/tests/wbtc/unwrapReg.js +1 -1
- package/build/tests/wbtc/withdrawalRequestReg.js +1 -1
- package/build/tests/wbtc/wrapReg.js +2 -3
- package/build/transaction/TransactionFactory.d.ts +6 -2
- package/build/transaction/TransactionFactory.js +37 -32
- package/build/transaction/builders/FundingTransaction.js +1 -1
- package/build/transaction/builders/TransactionBuilder.d.ts +1 -0
- package/build/transaction/builders/TransactionBuilder.js +21 -5
- package/build/transaction/interfaces/ITransactionParameters.d.ts +1 -1
- package/build/transaction/shared/TweakedTransaction.js +0 -1
- package/package.json +2 -2
- package/src/_version.ts +1 -1
- package/src/transaction/TransactionFactory.ts +61 -51
- package/src/transaction/builders/FundingTransaction.ts +40 -40
- package/src/transaction/builders/InteractionTransaction.ts +1 -1
- package/src/transaction/builders/TransactionBuilder.ts +33 -5
- package/src/transaction/interfaces/ITransactionParameters.ts +1 -1
- 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
|
-
|
|
17
|
+
amount: bigint;
|
|
18
18
|
}
|
|
19
19
|
export interface SharedInteractionParameters extends ITransactionParameters {
|
|
20
20
|
calldata?: Buffer | undefined;
|
package/build/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "1.0.
|
|
1
|
+
export declare const version = "1.0.47";
|
package/build/_version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '1.0.
|
|
1
|
+
export const version = '1.0.47';
|
package/build/tests/Regtest.js
CHANGED
|
@@ -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:
|
|
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
|
|
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(
|
|
18
|
-
const receiver =
|
|
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);
|
package/build/tests/test.js
CHANGED
|
@@ -36,7 +36,7 @@ async function mineBlock() {
|
|
|
36
36
|
network: network,
|
|
37
37
|
feeRate: 150,
|
|
38
38
|
priorityFee: 1000n,
|
|
39
|
-
|
|
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('
|
|
16
|
-
await interact(contract, calldata,
|
|
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 =
|
|
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(
|
|
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 =
|
|
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:
|
|
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
|
|
17
|
-
await transaction.signTransaction();
|
|
18
|
-
const estimatedGas = await transaction.estimateTransactionFees();
|
|
19
|
-
const fundingParameters = {
|
|
16
|
+
const preTransaction = new InteractionTransaction({
|
|
20
17
|
...interactionParameters,
|
|
21
|
-
|
|
22
|
-
};
|
|
23
|
-
|
|
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 =
|
|
29
|
-
parameters.
|
|
30
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
78
|
-
this.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
17
|
+
amount: bigint;
|
|
18
18
|
}
|
|
19
19
|
export interface SharedInteractionParameters extends ITransactionParameters {
|
|
20
20
|
calldata?: Buffer | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
|
-
"version": "1.0.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
interactionParameters,
|
|
86
|
-
);
|
|
69
|
+
// we don't sign that transaction, we just need the parameters.
|
|
87
70
|
|
|
88
|
-
|
|
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 =
|
|
95
|
-
parameters.
|
|
96
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
}
|