@btc-vision/transaction 1.7.13 → 1.7.15

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 (42) hide show
  1. package/browser/_version.d.ts +1 -1
  2. package/browser/generators/Features.d.ts +6 -0
  3. package/browser/generators/builders/CalldataGenerator.d.ts +1 -1
  4. package/browser/generators/builders/LegacyCalldataGenerator.d.ts +1 -1
  5. package/browser/generators/builders/P2WDAGenerator.d.ts +1 -1
  6. package/browser/index.js +1 -1
  7. package/browser/keypair/Address.d.ts +1 -0
  8. package/browser/transaction/mineable/TimelockGenerator.d.ts +3 -0
  9. package/build/_version.d.ts +1 -1
  10. package/build/_version.js +1 -1
  11. package/build/epoch/ChallengeSolution.js +1 -1
  12. package/build/generators/Features.d.ts +6 -0
  13. package/build/generators/Features.js +6 -0
  14. package/build/generators/builders/CalldataGenerator.d.ts +1 -1
  15. package/build/generators/builders/CalldataGenerator.js +9 -6
  16. package/build/generators/builders/DeploymentGenerator.js +3 -2
  17. package/build/generators/builders/LegacyCalldataGenerator.d.ts +1 -1
  18. package/build/generators/builders/LegacyCalldataGenerator.js +9 -6
  19. package/build/generators/builders/P2WDAGenerator.d.ts +1 -1
  20. package/build/generators/builders/P2WDAGenerator.js +2 -1
  21. package/build/keypair/Address.d.ts +1 -0
  22. package/build/keypair/Address.js +10 -0
  23. package/build/transaction/builders/DeploymentTransaction.js +2 -1
  24. package/build/transaction/builders/InteractionTransaction.js +3 -1
  25. package/build/transaction/builders/InteractionTransactionP2WDA.js +3 -1
  26. package/build/transaction/builders/TransactionBuilder.js +12 -1
  27. package/build/transaction/mineable/TimelockGenerator.d.ts +3 -0
  28. package/build/transaction/mineable/TimelockGenerator.js +26 -7
  29. package/package.json +1 -1
  30. package/src/_version.ts +1 -1
  31. package/src/epoch/ChallengeSolution.ts +5 -1
  32. package/src/generators/Features.ts +7 -0
  33. package/src/generators/builders/CalldataGenerator.ts +11 -7
  34. package/src/generators/builders/DeploymentGenerator.ts +6 -2
  35. package/src/generators/builders/LegacyCalldataGenerator.ts +11 -7
  36. package/src/generators/builders/P2WDAGenerator.ts +4 -2
  37. package/src/keypair/Address.ts +35 -1
  38. package/src/transaction/builders/DeploymentTransaction.ts +2 -1
  39. package/src/transaction/builders/InteractionTransaction.ts +3 -1
  40. package/src/transaction/builders/InteractionTransactionP2WDA.ts +3 -1
  41. package/src/transaction/builders/TransactionBuilder.ts +14 -1
  42. package/src/transaction/mineable/TimelockGenerator.ts +47 -7
@@ -3,7 +3,7 @@ import { TransactionType } from '../enums/TransactionType.js';
3
3
  import { TapLeafScript } from '../interfaces/Tap.js';
4
4
  import { IInteractionParameters } from '../interfaces/ITransactionParameters.js';
5
5
  import { SharedInteractionTransaction } from './SharedInteractionTransaction.js';
6
- import { Feature, Features } from '../../generators/Features.js';
6
+ import { Feature, FeaturePriority, Features } from '../../generators/Features.js';
7
7
 
8
8
  /**
9
9
  * Class for interaction transactions
@@ -63,6 +63,7 @@ export class InteractionTransaction extends SharedInteractionTransaction<Transac
63
63
 
64
64
  if (parameters.loadedStorage) {
65
65
  features.push({
66
+ priority: FeaturePriority.ACCESS_LIST,
66
67
  opcode: Features.ACCESS_LIST,
67
68
  data: parameters.loadedStorage,
68
69
  });
@@ -71,6 +72,7 @@ export class InteractionTransaction extends SharedInteractionTransaction<Transac
71
72
  const submission = parameters.challenge.getSubmission();
72
73
  if (submission) {
73
74
  features.push({
75
+ priority: FeaturePriority.EPOCH_SUBMISSION,
74
76
  opcode: Features.EPOCH_SUBMISSION,
75
77
  data: submission,
76
78
  });
@@ -6,7 +6,7 @@ import { TransactionBuilder } from './TransactionBuilder.js';
6
6
  import { MessageSigner } from '../../keypair/MessageSigner.js';
7
7
  import { Compressor } from '../../bytecode/Compressor.js';
8
8
  import { P2WDAGenerator } from '../../generators/builders/P2WDAGenerator.js';
9
- import { Feature, Features } from '../../generators/Features.js';
9
+ import { Feature, FeaturePriority, Features } from '../../generators/Features.js';
10
10
  import { BitcoinUtils } from '../../utils/BitcoinUtils.js';
11
11
  import { EcKeyPair } from '../../keypair/EcKeyPair.js';
12
12
  import { ChallengeSolution } from '../../epoch/ChallengeSolution.js';
@@ -200,6 +200,7 @@ export class InteractionTransactionP2WDA extends TransactionBuilder<TransactionT
200
200
 
201
201
  if (parameters.loadedStorage) {
202
202
  features.push({
203
+ priority: FeaturePriority.ACCESS_LIST,
203
204
  opcode: Features.ACCESS_LIST,
204
205
  data: parameters.loadedStorage,
205
206
  });
@@ -208,6 +209,7 @@ export class InteractionTransactionP2WDA extends TransactionBuilder<TransactionT
208
209
  const submission = parameters.challenge.getSubmission();
209
210
  if (submission) {
210
211
  features.push({
212
+ priority: FeaturePriority.EPOCH_SUBMISSION,
211
213
  opcode: Features.EPOCH_SUBMISSION,
212
214
  data: submission,
213
215
  });
@@ -27,7 +27,7 @@ import { TweakedTransaction } from '../shared/TweakedTransaction.js';
27
27
  import { UnisatSigner } from '../browser/extensions/UnisatSigner.js';
28
28
  import { IP2WSHAddress } from '../mineable/IP2WSHAddress.js';
29
29
  import { P2WDADetector } from '../../p2wda/P2WDADetector.js';
30
- import { Feature, Features, MLDSALinkRequest } from '../../generators/Features.js';
30
+ import { Feature, FeaturePriority, Features, MLDSALinkRequest } from '../../generators/Features.js';
31
31
  import { BITCOIN_PROTOCOL_ID, getChainId } from '../../chain/ChainData.js';
32
32
  import { BinaryWriter } from '../../buffer/BinaryWriter.js';
33
33
  import { MLDSASecurityLevel } from '@btc-vision/bip32';
@@ -889,6 +889,11 @@ export abstract class TransactionBuilder<T extends TransactionType> extends Twea
889
889
  }
890
890
 
891
891
  const tweakedKey = toXOnly(this.tweakedSigner.publicKey);
892
+ const originalKey = this.signer.publicKey;
893
+ if (originalKey.length !== 33) {
894
+ throw new Error('Original public key must be compressed (33 bytes)');
895
+ }
896
+
892
897
  const chainId = getChainId(this.network);
893
898
 
894
899
  const writer = new BinaryWriter();
@@ -897,6 +902,7 @@ export abstract class TransactionBuilder<T extends TransactionType> extends Twea
897
902
  writer.writeU8(MLDSASecurityLevel.LEVEL2);
898
903
  writer.writeBytes(this.hashedPublicKey);
899
904
  writer.writeBytes(tweakedKey);
905
+ writer.writeBytes(originalKey);
900
906
  writer.writeBytes(BITCOIN_PROTOCOL_ID);
901
907
  writer.writeBytes(chainId);
902
908
 
@@ -923,6 +929,11 @@ export abstract class TransactionBuilder<T extends TransactionType> extends Twea
923
929
  }
924
930
 
925
931
  const tweakedKey = toXOnly(this.tweakedSigner.publicKey);
932
+ const originalKey = this.signer.publicKey;
933
+ if (originalKey.length !== 33) {
934
+ throw new Error('Original public key must be compressed (33 bytes)');
935
+ }
936
+
926
937
  const chainId = getChainId(this.network);
927
938
  const level = getLevelFromPublicKeyLength(this.mldsaSigner.publicKey.length);
928
939
 
@@ -935,6 +946,7 @@ export abstract class TransactionBuilder<T extends TransactionType> extends Twea
935
946
  writer.writeBytes(this.hashedPublicKey);
936
947
  writer.writeBytes(this.mldsaSigner.publicKey);
937
948
  writer.writeBytes(tweakedKey);
949
+ writer.writeBytes(originalKey);
938
950
  writer.writeBytes(BITCOIN_PROTOCOL_ID);
939
951
  writer.writeBytes(chainId);
940
952
 
@@ -967,6 +979,7 @@ export abstract class TransactionBuilder<T extends TransactionType> extends Twea
967
979
  }
968
980
 
969
981
  const mldsaRequest: MLDSALinkRequest = {
982
+ priority: FeaturePriority.MLDSA_LINK_PUBKEY,
970
983
  opcode: Features.MLDSA_LINK_PUBKEY,
971
984
  data: {
972
985
  verifyRequest: !!parameters.revealMLDSAPublicKey,
@@ -2,6 +2,11 @@ import bitcoin, { Network, networks, opcodes, script } from '@btc-vision/bitcoin
2
2
  import { IP2WSHAddress } from './IP2WSHAddress.js';
3
3
 
4
4
  export class TimeLockGenerator {
5
+ private static readonly UNSPENDABLE_INTERNAL_KEY = Buffer.from(
6
+ '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0',
7
+ 'hex',
8
+ );
9
+
5
10
  private static readonly CSV_BLOCKS = 75;
6
11
 
7
12
  /**
@@ -13,13 +18,7 @@ export class TimeLockGenerator {
13
18
  network: Network = networks.bitcoin,
14
19
  csvBlocks: number = TimeLockGenerator.CSV_BLOCKS,
15
20
  ): IP2WSHAddress {
16
- const witnessScript = script.compile([
17
- script.number.encode(csvBlocks),
18
- opcodes.OP_CHECKSEQUENCEVERIFY,
19
- opcodes.OP_DROP,
20
- publicKey,
21
- opcodes.OP_CHECKSIG,
22
- ]);
21
+ const witnessScript = this.generateTimeLockScript(publicKey, csvBlocks);
23
22
 
24
23
  const p2wsh = bitcoin.payments.p2wsh({
25
24
  redeem: { output: witnessScript },
@@ -35,4 +34,45 @@ export class TimeLockGenerator {
35
34
  witnessScript: witnessScript,
36
35
  };
37
36
  }
37
+
38
+ /**
39
+ * Generate a P2TR address with CSV time lock
40
+ * Note: This uses Schnorr signatures
41
+ */
42
+ public static generateTimeLockAddressP2TR(
43
+ publicKey: Buffer,
44
+ network: Network = networks.bitcoin,
45
+ csvBlocks: number = TimeLockGenerator.CSV_BLOCKS,
46
+ ): string {
47
+ if (publicKey.length !== 32) {
48
+ throw new Error('Public key must be 32 bytes for Taproot');
49
+ }
50
+
51
+ const witnessScript = this.generateTimeLockScript(publicKey, csvBlocks);
52
+
53
+ const taproot = bitcoin.payments.p2tr({
54
+ redeem: { output: witnessScript },
55
+ network,
56
+ internalPubkey: TimeLockGenerator.UNSPENDABLE_INTERNAL_KEY,
57
+ });
58
+
59
+ if (!taproot.address) {
60
+ throw new Error('Failed to generate P2TR address');
61
+ }
62
+
63
+ return taproot.address;
64
+ }
65
+
66
+ private static generateTimeLockScript(
67
+ publicKey: Buffer,
68
+ csvBlocks: number = TimeLockGenerator.CSV_BLOCKS,
69
+ ): Buffer {
70
+ return script.compile([
71
+ script.number.encode(csvBlocks),
72
+ opcodes.OP_CHECKSEQUENCEVERIFY,
73
+ opcodes.OP_DROP,
74
+ publicKey,
75
+ opcodes.OP_CHECKSIG,
76
+ ]);
77
+ }
38
78
  }