@btc-vision/transaction 1.0.7 → 1.0.9

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 (137) hide show
  1. package/Deploy.md +186 -0
  2. package/README.md +7 -0
  3. package/Wrap.md +192 -0
  4. package/browser/_version.d.ts +1 -1
  5. package/browser/index.js +1 -1
  6. package/browser/opnet.d.ts +6 -1
  7. package/browser/tests/deploy.d.ts +1 -0
  8. package/browser/tests/wrap.d.ts +1 -0
  9. package/browser/tests/wrapTest.d.ts +1 -0
  10. package/browser/transaction/TransactionFactory.d.ts +15 -1
  11. package/browser/transaction/builders/DeploymentTransaction.d.ts +40 -0
  12. package/browser/transaction/builders/InteractionTransaction.d.ts +2 -35
  13. package/browser/transaction/builders/SharedInteractionTransaction.d.ts +46 -0
  14. package/browser/transaction/builders/TransactionBuilder.d.ts +8 -1
  15. package/browser/transaction/builders/WrapTransaction.d.ts +27 -0
  16. package/browser/transaction/interfaces/ITransactionParameters.d.ts +16 -12
  17. package/browser/utils/BitcoinUtils.d.ts +1 -0
  18. package/browser/utxo/OPNetLimitedProvider.d.ts +10 -0
  19. package/browser/wbtc/Generate.d.ts +13 -0
  20. package/browser/wbtc/WrappedGenerationParameters.d.ts +11 -0
  21. package/build/_version.d.ts +1 -1
  22. package/build/_version.js +1 -1
  23. package/build/opnet.d.ts +6 -1
  24. package/build/opnet.js +6 -1
  25. package/build/tests/deploy.d.ts +1 -0
  26. package/build/tests/deploy.js +60 -0
  27. package/build/tests/test.js +3 -3
  28. package/build/tests/transfer.js +2 -2
  29. package/build/tests/wrap.d.ts +1 -0
  30. package/build/tests/wrap.js +64 -0
  31. package/build/tests/wrapTest.d.ts +1 -0
  32. package/build/tests/wrapTest.js +64 -0
  33. package/build/tests/wrapTestg.d.ts +1 -0
  34. package/build/tests/wrapTestg.js +66 -0
  35. package/build/transaction/TransactionFactory.d.ts +15 -1
  36. package/build/transaction/TransactionFactory.js +68 -0
  37. package/build/transaction/builders/DeploymentTransaction.d.ts +40 -0
  38. package/build/transaction/builders/DeploymentTransaction.js +216 -0
  39. package/build/transaction/builders/FundingTransaction.js +4 -1
  40. package/build/transaction/builders/InteractionTransaction.d.ts +2 -35
  41. package/build/transaction/builders/InteractionTransaction.js +4 -207
  42. package/build/transaction/builders/SharedInteractionTransaction.d.ts +46 -0
  43. package/build/transaction/builders/SharedInteractionTransaction.js +213 -0
  44. package/build/transaction/builders/TransactionBuilder.d.ts +8 -1
  45. package/build/transaction/builders/TransactionBuilder.js +19 -11
  46. package/build/transaction/builders/WrapTransaction.d.ts +27 -0
  47. package/build/transaction/builders/WrapTransaction.js +132 -0
  48. package/build/transaction/interfaces/ITransactionParameters.d.ts +16 -12
  49. package/build/utils/BitcoinUtils.d.ts +1 -0
  50. package/build/utils/BitcoinUtils.js +8 -1
  51. package/build/utxo/OPNetLimitedProvider.d.ts +10 -0
  52. package/build/utxo/OPNetLimitedProvider.js +85 -0
  53. package/build/utxo/OPNetUtils.d.ts +7 -0
  54. package/build/utxo/OPNetUtils.js +47 -0
  55. package/build/verification/TapscriptVerificator.js +3 -3
  56. package/build/wbtc/Generate.d.ts +13 -0
  57. package/build/wbtc/Generate.js +1 -0
  58. package/build/wbtc/WrappedGenerationParameters.d.ts +11 -0
  59. package/build/wbtc/WrappedGenerationParameters.js +16 -0
  60. package/bytecode/contract.wasm +0 -0
  61. package/docs/assets/navigation.js +1 -1
  62. package/docs/assets/search.js +1 -1
  63. package/docs/classes/AddressGenerator.html +2 -2
  64. package/docs/classes/BitcoinUtils.html +7 -3
  65. package/docs/classes/CalldataGenerator.html +10 -10
  66. package/docs/classes/Compressor.html +4 -4
  67. package/docs/classes/ContractBaseMetadata.html +4 -4
  68. package/docs/classes/DeploymentGenerator.html +9 -9
  69. package/docs/classes/DeploymentTransaction.html +368 -0
  70. package/docs/classes/EcKeyPair.html +16 -16
  71. package/docs/classes/FundingTransaction.html +50 -47
  72. package/docs/classes/Generator.html +9 -9
  73. package/docs/classes/InteractionTransaction.html +89 -109
  74. package/docs/classes/OPNetLimitedProvider.html +197 -0
  75. package/docs/classes/SharedInteractionTransaction.html +392 -0
  76. package/docs/classes/TapscriptVerificator.html +2 -2
  77. package/docs/classes/TransactionBuilder.html +53 -50
  78. package/docs/classes/TransactionFactory.html +11 -4
  79. package/docs/classes/TweakedSigner.html +2 -2
  80. package/docs/classes/Wallet.html +10 -10
  81. package/docs/classes/WrapTransaction.html +404 -0
  82. package/docs/classes/WrappedGeneration.html +187 -0
  83. package/docs/classes/wBTC.html +7 -7
  84. package/docs/enums/TransactionSequence.html +177 -0
  85. package/docs/enums/TransactionType.html +2 -2
  86. package/docs/hierarchy.html +1 -1
  87. package/docs/index.html +5 -1
  88. package/docs/interfaces/ContractAddressVerificationParams.html +2 -2
  89. package/docs/interfaces/DeploymentResult.html +177 -0
  90. package/docs/interfaces/FetchUTXOParams.html +2 -2
  91. package/docs/interfaces/GenerationConstraints.html +182 -0
  92. package/docs/interfaces/IDeploymentParameters.html +183 -0
  93. package/docs/interfaces/IFundingTransactionParameters.html +3 -3
  94. package/docs/interfaces/IInteractionParameters.html +4 -6
  95. package/docs/interfaces/ITransactionParameters.html +3 -3
  96. package/docs/interfaces/IWallet.html +4 -4
  97. package/docs/interfaces/IWrapParameters.html +186 -0
  98. package/docs/interfaces/NetworkInformation.html +2 -2
  99. package/docs/interfaces/PsbtInputExtended.html +1 -1
  100. package/docs/interfaces/PsbtOutputExtendedAddress.html +2 -2
  101. package/docs/interfaces/PsbtOutputExtendedScript.html +2 -2
  102. package/docs/interfaces/RawUTXOResponse.html +2 -2
  103. package/docs/interfaces/SharedInteractionParameters.html +183 -0
  104. package/docs/interfaces/TapLeafScript.html +2 -2
  105. package/docs/interfaces/TweakSettings.html +3 -3
  106. package/docs/interfaces/UTXO.html +2 -2
  107. package/docs/interfaces/UpdateInput.html +2 -2
  108. package/docs/interfaces/WrapResult.html +178 -0
  109. package/docs/interfaces/WrappedGenerationParameters.html +184 -0
  110. package/docs/modules.html +14 -4
  111. package/docs/types/PsbtOutputExtended.html +1 -1
  112. package/docs/variables/version.html +1 -1
  113. package/package.json +1 -1
  114. package/src/_version.ts +1 -1
  115. package/src/opnet.ts +8 -1
  116. package/src/tests/deploy.ts +81 -0
  117. package/src/tests/test.ts +3 -3
  118. package/src/tests/transfer.ts +2 -2
  119. package/src/tests/wrap.ts +89 -0
  120. package/src/tests/wrapTest.ts +88 -0
  121. package/src/transaction/TransactionFactory.ts +119 -1
  122. package/src/transaction/builders/DeploymentTransaction.ts +418 -0
  123. package/src/transaction/builders/FundingTransaction.ts +5 -1
  124. package/src/transaction/builders/InteractionTransaction.ts +5 -404
  125. package/src/transaction/builders/SharedInteractionTransaction.ts +432 -0
  126. package/src/transaction/builders/TransactionBuilder.ts +40 -15
  127. package/src/transaction/builders/WrapTransaction.ts +286 -0
  128. package/src/transaction/interfaces/ITransactionParameters.ts +20 -13
  129. package/src/utils/BitcoinUtils.ts +17 -1
  130. package/src/utxo/{UTXOManager.ts → OPNetLimitedProvider.ts} +53 -2
  131. package/src/verification/TapscriptVerificator.ts +3 -3
  132. package/src/wbtc/Generate.ts +30 -0
  133. package/src/wbtc/WrappedGenerationParameters.ts +33 -0
  134. package/tests/TransactionBuilder.test.ts +58 -58
  135. package/docs/classes/UTXOManager.html +0 -187
  136. package/docs/interfaces/ITransactionDataContractDeployment.html +0 -184
  137. package/docs/interfaces/ITransactionDataContractInteractionWrap.html +0 -186
@@ -0,0 +1,132 @@
1
+ import { TransactionType } from '../enums/TransactionType.js';
2
+ import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
3
+ import { wBTC } from '../../metadata/contracts/wBTC.js';
4
+ import { ABICoder, BinaryWriter } from '@btc-vision/bsi-binary';
5
+ import { TransactionBuilder } from './TransactionBuilder.js';
6
+ import { EcKeyPair } from '../../keypair/EcKeyPair.js';
7
+ import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
8
+ const abiCoder = new ABICoder();
9
+ export class WrapTransaction extends SharedInteractionTransaction {
10
+ static WRAP_SELECTOR = Number('0x' + abiCoder.encodeSelector('mint'));
11
+ type = TransactionType.WBTC_WRAP;
12
+ vault;
13
+ amount;
14
+ receiver;
15
+ compiledTargetScript;
16
+ scriptTree;
17
+ tapLeafScript = null;
18
+ contractSecret;
19
+ wbtc;
20
+ constructor(parameters) {
21
+ if (parameters.amount < TransactionBuilder.MINIMUM_DUST) {
22
+ throw new Error('Amount is below dust limit');
23
+ }
24
+ const receiver = parameters.receiver ||
25
+ TransactionBuilder.getFrom(parameters.from, parameters.signer, parameters.network);
26
+ parameters.calldata = WrapTransaction.generateMintCalldata(parameters.amount, receiver);
27
+ super(parameters);
28
+ this.wbtc = new wBTC(parameters.network);
29
+ this.vault = parameters.generationParameters.vault;
30
+ this.to = this.wbtc.getAddress();
31
+ this.receiver = receiver;
32
+ this.amount = parameters.amount;
33
+ this.contractSecret = this.generateSecret();
34
+ if (!this.verifyPublicKeysConstraints(parameters.generationParameters)) {
35
+ throw new Error('Oops. Your wrapping request have been decline! It failed security checks!');
36
+ }
37
+ this.compiledTargetScript = this.calldataGenerator.compile(this.calldata, this.contractSecret, this.interactionPubKeys, this.minimumSignatures);
38
+ this.scriptTree = this.getScriptTree();
39
+ this.internalInit();
40
+ }
41
+ static generateMintCalldata(amount, to) {
42
+ if (!amount)
43
+ throw new Error('Amount is required');
44
+ if (!to)
45
+ throw new Error('To address is required');
46
+ const bufWriter = new BinaryWriter();
47
+ bufWriter.writeSelector(WrapTransaction.WRAP_SELECTOR);
48
+ bufWriter.writeAddress(to);
49
+ bufWriter.writeU256(amount);
50
+ return Buffer.from(bufWriter.getBuffer());
51
+ }
52
+ verifyPublicKeysConstraints(generation) {
53
+ if (generation.constraints.minimum < 2) {
54
+ throw new Error('Minimum signatures must be at least 2');
55
+ }
56
+ if (generation.keys.length < generation.constraints.transactionMinimum ||
57
+ generation.keys.length < generation.constraints.minimum) {
58
+ throw new Error('Not enough pub keys');
59
+ }
60
+ if (generation.keys.length > 255) {
61
+ throw new Error('Too many pub keys');
62
+ }
63
+ const generatedVault = this.generateVaultAddress(generation.pubKeys, generation.constraints.minimum);
64
+ if (generatedVault !== generation.vault) {
65
+ throw new Error(`Invalid vault address. Expected: ${generatedVault} Got: ${generation.vault}`);
66
+ }
67
+ const passChecksum = this.generateChecksumSalt(generation, this.amount, generation.vault);
68
+ const checksum = BitcoinUtils.opnetHash(passChecksum);
69
+ if (checksum !== generation.signature) {
70
+ throw new Error(`Invalid checksum. Expected: ${checksum} Got: ${generation.signature}`);
71
+ }
72
+ return true;
73
+ }
74
+ buildTransaction() {
75
+ if (!this.to)
76
+ throw new Error('To address is required');
77
+ const selectedRedeem = !!this.scriptSigner
78
+ ? this.targetScriptRedeem
79
+ : this.leftOverFundsScriptRedeem;
80
+ if (!selectedRedeem) {
81
+ throw new Error('Left over funds script redeem is required');
82
+ }
83
+ if (!selectedRedeem.redeemVersion) {
84
+ throw new Error('Left over funds script redeem version is required');
85
+ }
86
+ if (!selectedRedeem.output) {
87
+ throw new Error('Left over funds script redeem output is required');
88
+ }
89
+ this.tapLeafScript = {
90
+ leafVersion: selectedRedeem.redeemVersion,
91
+ script: selectedRedeem.output,
92
+ controlBlock: this.getWitness(),
93
+ };
94
+ this.addInputsFromUTXO();
95
+ const amountSpent = this.getTransactionOPNetFee();
96
+ this.addOutput({
97
+ value: Number(amountSpent),
98
+ address: this.to,
99
+ });
100
+ this.addVaultOutput();
101
+ this.addRefundOutput(amountSpent + this.amount);
102
+ }
103
+ addVaultOutput() {
104
+ if (!this.vault) {
105
+ throw new Error(`No vault address provided`);
106
+ }
107
+ const amountOutput = {
108
+ address: this.vault,
109
+ value: Number(this.amount),
110
+ };
111
+ this.addOutput(amountOutput);
112
+ }
113
+ generateVaultAddress(keys, minimumSignatureRequired) {
114
+ return EcKeyPair.generateMultiSigAddress(keys, minimumSignatureRequired, this.network);
115
+ }
116
+ generateChecksumSalt(param, amount, vault) {
117
+ const version = param.constraints.version;
118
+ const timestamp = param.constraints.timestamp;
119
+ const params = Buffer.alloc(12 + version.length);
120
+ params.writeBigInt64BE(BigInt(timestamp), 0);
121
+ params.writeInt16BE(param.constraints.minimum, 8);
122
+ params.writeInt16BE(param.constraints.transactionMinimum, 10);
123
+ params.write(version, 12, version.length, 'utf-8');
124
+ return Buffer.concat([
125
+ ...param.pubKeys,
126
+ ...param.entities.map((entity) => Buffer.from(entity, 'utf-8')),
127
+ params,
128
+ Buffer.from(amount.toString(), 'utf-8'),
129
+ Buffer.from(vault, 'utf-8'),
130
+ ]);
131
+ }
132
+ }
@@ -3,9 +3,10 @@ import { Signer } from 'bitcoinjs-lib';
3
3
  import { UTXO } from '../../utxo/interfaces/IUTXO.js';
4
4
  import { Network } from 'bitcoinjs-lib/src/networks.js';
5
5
  import { Address } from '@btc-vision/bsi-binary';
6
+ import { WrappedGeneration } from '../../wbtc/WrappedGenerationParameters.js';
6
7
  export interface ITransactionParameters {
7
8
  readonly from?: Address;
8
- readonly to: Address;
9
+ readonly to?: Address | undefined;
9
10
  utxos: UTXO[];
10
11
  readonly signer: Signer;
11
12
  readonly network: Network;
@@ -13,21 +14,24 @@ export interface ITransactionParameters {
13
14
  readonly priorityFee: bigint;
14
15
  }
15
16
  export interface IFundingTransactionParameters extends ITransactionParameters {
16
- readonly childTransactionRequiredFees: bigint;
17
+ childTransactionRequiredValue: bigint;
17
18
  }
18
- export interface IInteractionParameters extends ITransactionParameters {
19
- readonly calldata: Buffer;
20
- readonly pubKeys?: Buffer[];
21
- readonly minimumSignatures?: number;
19
+ export interface SharedInteractionParameters extends ITransactionParameters {
20
+ calldata?: Buffer | undefined;
22
21
  readonly randomBytes?: Buffer;
23
22
  }
24
- export interface ITransactionDataContractInteractionWrap extends IInteractionParameters {
23
+ export interface IInteractionParameters extends SharedInteractionParameters {
24
+ readonly calldata: Buffer;
25
+ readonly to: Address;
26
+ }
27
+ export interface IWrapParameters extends SharedInteractionParameters {
28
+ readonly to?: undefined;
25
29
  readonly amount: bigint;
26
- readonly minimumSignatures: number;
27
- readonly pubKeys: Buffer[];
30
+ readonly receiver?: Address;
31
+ readonly generationParameters: WrappedGeneration;
28
32
  }
29
- export interface ITransactionDataContractDeployment extends ITransactionParameters {
33
+ export interface IDeploymentParameters extends ITransactionParameters {
30
34
  readonly bytecode: Buffer;
31
- readonly salt: Buffer;
32
- readonly customSigner: Signer;
35
+ readonly to?: undefined;
36
+ readonly randomBytes?: Buffer;
33
37
  }
@@ -2,4 +2,5 @@
2
2
  export declare class BitcoinUtils {
3
3
  static btcToSatoshi(btc: number): BigInt;
4
4
  static rndBytes(): Buffer;
5
+ static opnetHash(data: Buffer): string;
5
6
  }
@@ -1,9 +1,16 @@
1
+ import { createHash, getRandomValues } from 'crypto';
1
2
  export class BitcoinUtils {
2
3
  static btcToSatoshi(btc) {
3
4
  return BigInt(btc * 100000000);
4
5
  }
5
6
  static rndBytes() {
6
- const buf = crypto.getRandomValues(new Uint8Array(64));
7
+ const buf = getRandomValues(new Uint8Array(64));
7
8
  return Buffer.from(buf);
8
9
  }
10
+ static opnetHash(data) {
11
+ const hashed = createHash('sha512');
12
+ hashed.update(data);
13
+ const hash = hashed.digest();
14
+ return `0x${hash.toString('hex')}`;
15
+ }
9
16
  }
@@ -0,0 +1,10 @@
1
+ import { FetchUTXOParams, UTXO } from './interfaces/IUTXO.js';
2
+ import { WrappedGeneration } from '../wbtc/WrappedGenerationParameters.js';
3
+ export declare class OPNetLimitedProvider {
4
+ private readonly opnetAPIUrl;
5
+ private readonly utxoPath;
6
+ private readonly rpc;
7
+ constructor(opnetAPIUrl: string);
8
+ fetchUTXO(settings: FetchUTXOParams): Promise<UTXO[]>;
9
+ fetchWrapParameters(amount: bigint): Promise<WrappedGeneration | undefined>;
10
+ }
@@ -0,0 +1,85 @@
1
+ import { WrappedGeneration } from '../wbtc/WrappedGenerationParameters.js';
2
+ export class OPNetLimitedProvider {
3
+ opnetAPIUrl;
4
+ utxoPath = 'address/utxos';
5
+ rpc = 'json-rpc';
6
+ constructor(opnetAPIUrl) {
7
+ this.opnetAPIUrl = opnetAPIUrl;
8
+ }
9
+ async fetchUTXO(settings) {
10
+ const params = {
11
+ method: 'GET',
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ };
16
+ const url = `${this.opnetAPIUrl}/api/v1/${this.utxoPath}?address=${settings.address}`;
17
+ const resp = await fetch(url, params);
18
+ if (!resp.ok) {
19
+ throw new Error(`Failed to fetch UTXO data: ${resp.statusText}`);
20
+ }
21
+ const fetchedData = await resp.json();
22
+ if (fetchedData.length === 0) {
23
+ throw new Error('No UTXO found');
24
+ }
25
+ const meetCriteria = fetchedData.filter((utxo) => {
26
+ return BigInt(utxo.value) >= settings.minAmount;
27
+ });
28
+ if (meetCriteria.length === 0) {
29
+ throw new Error('No UTXO found (minAmount)');
30
+ }
31
+ let finalUTXOs = [];
32
+ let currentAmount = 0n;
33
+ const amountRequested = settings.requestedAmount;
34
+ for (const utxo of meetCriteria) {
35
+ const utxoValue = BigInt(utxo.value);
36
+ currentAmount += utxoValue;
37
+ finalUTXOs.push({
38
+ transactionId: utxo.transactionId,
39
+ outputIndex: utxo.outputIndex,
40
+ value: utxoValue,
41
+ scriptPubKey: utxo.scriptPubKey,
42
+ });
43
+ if (currentAmount > amountRequested) {
44
+ break;
45
+ }
46
+ }
47
+ return finalUTXOs;
48
+ }
49
+ async fetchWrapParameters(amount) {
50
+ const params = {
51
+ method: 'POST',
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ },
55
+ body: JSON.stringify({
56
+ jsonrpc: '2.0',
57
+ method: 'btc_generate',
58
+ params: [0, amount.toString()],
59
+ id: 1,
60
+ }),
61
+ };
62
+ const url = `${this.opnetAPIUrl}/api/v1/${this.rpc}`;
63
+ try {
64
+ const resp = await fetch(url, params);
65
+ if (!resp.ok) {
66
+ throw new Error(`Failed to fetch wrap parameters: ${resp.statusText}`);
67
+ }
68
+ const fetchedData = await resp.json();
69
+ if (!fetchedData) {
70
+ throw new Error('No wrap parameters found');
71
+ }
72
+ const result = fetchedData.result;
73
+ if (!result) {
74
+ throw new Error('No wrap parameters found');
75
+ }
76
+ if ('error' in result) {
77
+ throw new Error('Something went wrong while fetching wrap parameters');
78
+ }
79
+ return new WrappedGeneration(result);
80
+ }
81
+ catch (e) {
82
+ console.error(`Failed to fetch wrap parameters: ${e.stack}`);
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,7 @@
1
+ import { FetchUTXOParams, UTXO } from './interfaces/IUTXO.js';
2
+ export declare class UTXOManager {
3
+ private readonly opnetAPIUrl;
4
+ private readonly utxoPath;
5
+ constructor(opnetAPIUrl: string);
6
+ fetchUTXO(settings: FetchUTXOParams): Promise<UTXO[]>;
7
+ }
@@ -0,0 +1,47 @@
1
+ export class UTXOManager {
2
+ opnetAPIUrl;
3
+ utxoPath = 'address/utxos';
4
+ constructor(opnetAPIUrl) {
5
+ this.opnetAPIUrl = opnetAPIUrl;
6
+ }
7
+ async fetchUTXO(settings) {
8
+ const params = {
9
+ method: 'GET',
10
+ headers: {
11
+ 'Content-Type': 'application/json',
12
+ },
13
+ };
14
+ const url = `${this.opnetAPIUrl}/api/v1/${this.utxoPath}?address=${settings.address}`;
15
+ const resp = await fetch(url, params);
16
+ if (!resp.ok) {
17
+ throw new Error(`Failed to fetch UTXO data: ${resp.statusText}`);
18
+ }
19
+ const fetchedData = await resp.json();
20
+ if (fetchedData.length === 0) {
21
+ throw new Error('No UTXO found');
22
+ }
23
+ const meetCriteria = fetchedData.filter((utxo) => {
24
+ return BigInt(utxo.value) >= settings.minAmount;
25
+ });
26
+ if (meetCriteria.length === 0) {
27
+ throw new Error('No UTXO found (minAmount)');
28
+ }
29
+ let finalUTXOs = [];
30
+ let currentAmount = 0n;
31
+ const amountRequested = settings.requestedAmount;
32
+ for (const utxo of meetCriteria) {
33
+ const utxoValue = BigInt(utxo.value);
34
+ currentAmount += utxoValue;
35
+ finalUTXOs.push({
36
+ transactionId: utxo.transactionId,
37
+ outputIndex: utxo.outputIndex,
38
+ value: utxoValue,
39
+ scriptPubKey: utxo.scriptPubKey,
40
+ });
41
+ if (currentAmount + utxoValue > amountRequested) {
42
+ break;
43
+ }
44
+ }
45
+ return finalUTXOs;
46
+ }
47
+ }
@@ -1,4 +1,4 @@
1
- import bitcoin, { networks, payments } from 'bitcoinjs-lib';
1
+ import { crypto as bitCrypto, networks, payments } from 'bitcoinjs-lib';
2
2
  import { toXOnly } from 'bitcoinjs-lib/src/psbt/bip371.js';
3
3
  import { DeploymentGenerator } from '../generators/builders/DeploymentGenerator.js';
4
4
  import { TransactionBuilder } from '../transaction/builders/TransactionBuilder.js';
@@ -22,9 +22,9 @@ export class TapscriptVerificator {
22
22
  return TapscriptVerificator.generateAddressFromScript(params, scriptTree);
23
23
  }
24
24
  static getContractSeed(deployerPubKey, bytecode, saltHash) {
25
- const sha256OfBytecode = bitcoin.crypto.hash256(bytecode);
25
+ const sha256OfBytecode = bitCrypto.hash256(bytecode);
26
26
  const buf = Buffer.concat([deployerPubKey, saltHash, sha256OfBytecode]);
27
- return bitcoin.crypto.hash256(buf);
27
+ return bitCrypto.hash256(buf);
28
28
  }
29
29
  static generateContractVirtualAddress(deployerPubKey, bytecode, saltHash, network = networks.bitcoin) {
30
30
  const virtualAddress = TapscriptVerificator.getContractSeed(deployerPubKey, bytecode, saltHash);
@@ -0,0 +1,13 @@
1
+ export interface GenerationConstraints {
2
+ readonly timestamp: number;
3
+ readonly version: string;
4
+ readonly minimum: number;
5
+ readonly transactionMinimum: number;
6
+ }
7
+ export interface WrappedGenerationParameters {
8
+ readonly keys: string[];
9
+ readonly vault: string;
10
+ readonly entities: string[];
11
+ readonly signature: string;
12
+ readonly constraints: GenerationConstraints;
13
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ import { GenerationConstraints, WrappedGenerationParameters } from './Generate.js';
3
+ export declare class WrappedGeneration implements WrappedGenerationParameters {
4
+ readonly constraints: GenerationConstraints;
5
+ readonly entities: string[];
6
+ readonly keys: string[];
7
+ readonly signature: string;
8
+ readonly vault: string;
9
+ readonly pubKeys: Buffer[];
10
+ constructor(params: WrappedGenerationParameters);
11
+ }
@@ -0,0 +1,16 @@
1
+ export class WrappedGeneration {
2
+ constraints;
3
+ entities;
4
+ keys;
5
+ signature;
6
+ vault;
7
+ pubKeys;
8
+ constructor(params) {
9
+ this.constraints = params.constraints;
10
+ this.entities = params.entities;
11
+ this.keys = params.keys;
12
+ this.signature = params.signature;
13
+ this.vault = params.vault;
14
+ this.pubKeys = this.keys.map((key) => Buffer.from(key, 'base64'));
15
+ }
16
+ }
Binary file
@@ -1 +1 @@
1
- window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACp2VW2/aQBCF/4ufUWmo0gtvJZcKtWlQcJpKUR4m9gAr7PVqdxxiVfnvlYmL197JAH31nPOd2cus7/9EhM8UjaPYgnaQkCp0XBmMBpEBWkXjCHWZu2Gv/G5FeRYNorXSaTT+/DLYcb6mqUXnvqFGC1TYFpRk4By6YV/RZZ2MfNpEUVIofUsqcyHJr0qUM8iyFAiEpgKJyCtyUy+BBe1qMkGThYQm4PAKCepojhWqJOo5mqyoctQkrJQRScyL5DtWM1AMaVeS/JelTpVeevcnBIUaiSis7aAVTTWhba6y1BWvk8gxGJdYZegXWrVQCd8kpxKpbfikVFmKHDPQHEi8hIQKW4nERiMSNwhrTOdqqdn2/LLEuY1/X1+BhiVH8YoS4w6yDCm0v36XnJtJfBb66q+HzHLzru1OVRV6BhZy7+FS9ZVaQOLN9puubuTo9KM/VEjJqt4OIaCnkXDTcAC3JiS0PFx0iFHeVO3LYKUi3GvnHAj+7XH75PFBe23/E+p1f2fBHJXc8x4av29Djz+t/iz5NG6euvafSJvCrqd6Udgcuq+sRwplEnTmHmmqTUkXz4Q6xZRlBqp9yOuSPHUzlW+iWfVxEfPtP+DAhFexFHADm3rYb9CZQjtkuT2NhIvB/EBYCE12FCKqfvznSKT0kt/RjkJC1d2zhLogGk0KhNsLwfvb+nGn2NKoMuzR9Xjvv3w6OR15zCe0rjMZT2AVPGbohk2pS/gwenn4C/vJ5J23CwAA"
1
+ window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpWV247aMBBA/yXPqHSpthfeCl0q1O2CINtWqvowGw9gkTiuPYFF1f57FTYit2ECr5njM2Nnxv79LyB8pmAYhA6Mh4h0apb4N0MTYdALLNAmGAZossT3GeTNhpI46AVbbVQw/PjS43zhwUquPHze81kph95/RYMOKHWlKIrBe/T9JlF33QyqtpGmKNXmkXTs26ZqVLKMIY4VEAhFtRDRlyY23wIrOsVkgyEHEY3A43ckyFNzrjYlWb+gjdNDgoaEnTLQZc5KC0jWCiZ576JveJiDZio8haT1k8wobdZiUW1GMgpndtFJTQ2hK0ZEqornJPNs/oB0rxNNqOYu3WmFTJEcJVmXG3CoLq1aoqUsIVgfOW3pBzq90hF/wBwlWsvko0zH7Hm0mQuNE4godQfRWDCicY+wRbXUa8OWVw1Lnp8Qx0htwet3caUDK/7UBtDlsqiKSThrqyGSbz8Kx21F/vWSe7N4Q07dolMzBwdJ5ZHQeauuIKrco2dX1VMObt+zF+ACfRYTm6EJScIJUrR5DH/NhIobjKQrj3ucGk8OtCFeypKSelpu61gHEjpezZKiun03d6WQVoipKpdWVw4WFeVXbOD6ypujX7Vx499c7sB2FVVnJN0D0j5126lZpS5pXAEVYxuTpHP/RFNjM7p7JjQKFetsUV3KWUYVupj7s2qWvi7F8vh6XZjhFZYSLGCfT/8CvU2NR9bbYCRd6/Hu6AqBl9KEYO8RVsJZ1AhRlb+OSyTSZs3XWCMkVX5IrCEPiAutAsJj3/Hry7ikySdMeDrKcJek9rZ2/EGBv66xSzsdLNvNDd/bTx9ubgcV5w6dr10WO3AanmL0/SJUN7wbvPz5D9aZERroDgAA"
@@ -1 +1 @@
1
- window.searchData = "data:application/octet-stream;base64,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";
1
+ window.searchData = "data:application/octet-stream;base64,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";