@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.
Files changed (97) hide show
  1. package/build/_version.d.ts +1 -1
  2. package/build/_version.js +1 -1
  3. package/build/tests/unwrapReg.js +5 -2
  4. package/build/transaction/TransactionFactory.js +4 -1
  5. package/build/transaction/builders/UnwarpTransaction.d.ts +1 -3
  6. package/build/transaction/builders/UnwarpTransaction.js +1 -2
  7. package/build/transaction/interfaces/ITransactionParameters.d.ts +0 -1
  8. package/build/transaction/processor/PsbtTransaction.d.ts +8 -3
  9. package/build/transaction/processor/PsbtTransaction.js +33 -15
  10. package/cjs/_version.d.ts +1 -1
  11. package/cjs/_version.js +1 -1
  12. package/cjs/generators/AddressGenerator.js +1 -1
  13. package/cjs/keypair/AddressVerificator.d.ts +6 -0
  14. package/cjs/keypair/AddressVerificator.js +57 -0
  15. package/cjs/keypair/EcKeyPair.js +10 -7
  16. package/cjs/keypair/Wallet.d.ts +1 -0
  17. package/cjs/keypair/Wallet.js +3 -0
  18. package/cjs/metadata/contracts/wBTC.js +7 -7
  19. package/cjs/opnet.d.ts +11 -1
  20. package/cjs/opnet.js +11 -1
  21. package/cjs/signer/TweakedSigner.d.ts +2 -1
  22. package/cjs/signer/TweakedSigner.js +1 -1
  23. package/cjs/tests/adaptPSBT.d.ts +1 -0
  24. package/cjs/tests/adaptPSBT.js +62 -0
  25. package/cjs/tests/deploy.d.ts +1 -0
  26. package/cjs/tests/deploy.js +86 -0
  27. package/cjs/tests/deployReg.d.ts +1 -0
  28. package/cjs/tests/deployReg.js +87 -0
  29. package/cjs/tests/gen.js +10 -0
  30. package/cjs/tests/massWrapReg.d.ts +1 -0
  31. package/cjs/tests/massWrapReg.js +88 -0
  32. package/cjs/tests/mineReg.d.ts +1 -0
  33. package/cjs/tests/mineReg.js +24 -0
  34. package/cjs/tests/stakeReg.d.ts +1 -0
  35. package/cjs/tests/stakeReg.js +75 -0
  36. package/cjs/tests/stakedReg.d.ts +1 -0
  37. package/cjs/tests/stakedReg.js +30 -0
  38. package/cjs/tests/test.js +3 -3
  39. package/cjs/tests/testReg.d.ts +1 -0
  40. package/cjs/tests/testReg.js +93 -0
  41. package/cjs/tests/totalRewardReg.d.ts +1 -0
  42. package/cjs/tests/totalRewardReg.js +30 -0
  43. package/cjs/tests/transfer.js +3 -3
  44. package/cjs/tests/transferReg.d.ts +1 -0
  45. package/cjs/tests/transferReg.js +76 -0
  46. package/cjs/tests/unStakeReg.d.ts +1 -0
  47. package/cjs/tests/unStakeReg.js +74 -0
  48. package/cjs/tests/unwrapReg.d.ts +1 -0
  49. package/cjs/tests/unwrapReg.js +51 -0
  50. package/cjs/tests/wrapReg.d.ts +1 -0
  51. package/cjs/tests/wrapReg.js +69 -0
  52. package/cjs/tests/wrapTest.d.ts +1 -0
  53. package/cjs/tests/wrapTest.js +68 -0
  54. package/cjs/transaction/TransactionFactory.d.ts +23 -1
  55. package/cjs/transaction/TransactionFactory.js +151 -3
  56. package/cjs/transaction/builders/DeploymentTransaction.d.ts +36 -0
  57. package/cjs/transaction/builders/DeploymentTransaction.js +191 -0
  58. package/cjs/transaction/builders/FundingTransaction.js +4 -1
  59. package/cjs/transaction/builders/InteractionTransaction.d.ts +2 -35
  60. package/cjs/transaction/builders/InteractionTransaction.js +5 -208
  61. package/cjs/transaction/builders/SharedInteractionTransaction.d.ts +36 -0
  62. package/cjs/transaction/builders/SharedInteractionTransaction.js +183 -0
  63. package/cjs/transaction/builders/TransactionBuilder.d.ts +12 -19
  64. package/cjs/transaction/builders/TransactionBuilder.js +93 -96
  65. package/cjs/transaction/builders/UnwarpTransaction.d.ts +17 -0
  66. package/cjs/transaction/builders/UnwarpTransaction.js +46 -0
  67. package/cjs/transaction/builders/WrapTransaction.d.ts +29 -0
  68. package/cjs/transaction/builders/WrapTransaction.js +150 -0
  69. package/cjs/transaction/enums/TransactionType.d.ts +2 -1
  70. package/cjs/transaction/enums/TransactionType.js +1 -0
  71. package/cjs/transaction/interfaces/ITransactionParameters.d.ts +23 -17
  72. package/cjs/transaction/processor/PsbtTransaction.d.ts +51 -0
  73. package/cjs/transaction/processor/PsbtTransaction.js +162 -0
  74. package/cjs/transaction/psbt/PSBTTypes.d.ts +3 -0
  75. package/cjs/transaction/psbt/PSBTTypes.js +7 -0
  76. package/cjs/transaction/shared/TweakedTransaction.d.ts +48 -0
  77. package/cjs/transaction/shared/TweakedTransaction.js +154 -0
  78. package/cjs/utils/BitcoinUtils.d.ts +2 -0
  79. package/cjs/utils/BitcoinUtils.js +50 -1
  80. package/cjs/utxo/OPNetLimitedProvider.d.ts +14 -0
  81. package/cjs/utxo/OPNetLimitedProvider.js +136 -0
  82. package/cjs/utxo/interfaces/BroadcastResponse.d.ts +7 -0
  83. package/cjs/utxo/interfaces/BroadcastResponse.js +2 -0
  84. package/cjs/utxo/interfaces/IUTXO.d.ts +6 -0
  85. package/cjs/verification/TapscriptVerificator.js +3 -26
  86. package/cjs/wbtc/Generate.d.ts +13 -0
  87. package/cjs/wbtc/Generate.js +2 -0
  88. package/cjs/wbtc/WrappedGenerationParameters.d.ts +11 -0
  89. package/cjs/wbtc/WrappedGenerationParameters.js +20 -0
  90. package/package.json +1 -1
  91. package/src/_version.ts +1 -1
  92. package/src/tests/unwrapReg.ts +7 -2
  93. package/src/transaction/TransactionFactory.ts +5 -2
  94. package/src/transaction/builders/UnwarpTransaction.ts +2 -9
  95. package/src/transaction/interfaces/ITransactionParameters.ts +2 -2
  96. package/src/transaction/processor/PsbtTransaction.ts +64 -26
  97. package/src/transaction/shared/TweakedTransaction.ts +1 -1
@@ -1 +1 @@
1
- export declare const version = "1.0.26";
1
+ export declare const version = "1.0.27";
package/build/_version.js CHANGED
@@ -1 +1 @@
1
- export const version = '1.0.26';
1
+ export const version = '1.0.27';
@@ -34,13 +34,16 @@ const unwrapParameters = {
34
34
  utxos: utxos,
35
35
  signer: wallet.keypair,
36
36
  network: network,
37
- feeRate: 1000,
37
+ feeRate: 100,
38
38
  priorityFee: 10000n,
39
39
  feeProvision: 100000n,
40
- amount: 1000000n,
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(unwrapParameters);
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
- private static generateBurnCalldata;
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): Buffer;
44
- private calculateOuputLeftAmountFromVaults;
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.calculateOuputLeftAmountFromVaults(input);
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 redeemBuffer = payments.p2ms({
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
- }).output;
97
- if (!redeemBuffer) {
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 redeemBuffer;
108
+ return {
109
+ witnessUtxo,
110
+ redeemScript,
111
+ witnessScript,
112
+ };
101
113
  }
102
- calculateOuputLeftAmountFromVaults(vaults) {
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 vaultRedeem = this.generateMultiSignRedeemScript(vault.publicKeys, vault.minimum);
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, vaultRedeem);
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, firstSigner);
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, redeem) {
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: Buffer.from(utxo.output, 'base64'),
150
+ script: witness.witnessUtxo,
133
151
  value: Number(utxo.value),
134
152
  },
135
- witnessScript: redeem,
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.6";
1
+ export declare const version = "1.0.26";
package/cjs/_version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
- exports.version = '1.0.6';
4
+ exports.version = '1.0.26';
@@ -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("tiny-secp256k1"));
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;
@@ -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("tiny-secp256k1"));
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 myXOnlyPubkey = keyPair.publicKey.slice(1, 33);
113
- const output = Buffer.concat([
114
- Buffer.from([0x51, 0x20]),
115
- myXOnlyPubkey,
116
- ]);
117
- return bitcoinjs_lib_1.address.fromOutputScript(output, network);
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({
@@ -14,4 +14,5 @@ export declare class Wallet {
14
14
  get p2tr(): Address;
15
15
  get publicKey(): Buffer;
16
16
  get xOnly(): Buffer;
17
+ static fromWif(wif: string, network?: Network): Wallet;
17
18
  }
@@ -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 'bcrt1pcw0828yjrtlrc6mkp3lkq30j7wc7slsh7k7dyh53mrs4f8d74l6qumhqp4';
21
- case bitcoinjs_lib_1.networks.regtest:
22
- return 'bcrt1pcw0828yjrtlrc6mkp3lkq30j7wc7slsh7k7dyh53mrs4f8d74l6qumhqp4';
23
- case bitcoinjs_lib_1.networks.testnet:
24
- return 'tb1pq64lx73fwyrdp4asvl7xt5r5qvxvt9wy82x75taqtzvd64f58nasansurj';
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/UTXOManager.js';
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/UTXOManager.js"), exports);
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: Signer, opts?: TweakSettings): 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("tiny-secp256k1"));
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 {};