@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.
- package/browser/_version.d.ts +1 -1
- package/browser/generators/Features.d.ts +6 -0
- package/browser/generators/builders/CalldataGenerator.d.ts +1 -1
- package/browser/generators/builders/LegacyCalldataGenerator.d.ts +1 -1
- package/browser/generators/builders/P2WDAGenerator.d.ts +1 -1
- package/browser/index.js +1 -1
- package/browser/keypair/Address.d.ts +1 -0
- package/browser/transaction/mineable/TimelockGenerator.d.ts +3 -0
- package/build/_version.d.ts +1 -1
- package/build/_version.js +1 -1
- package/build/epoch/ChallengeSolution.js +1 -1
- package/build/generators/Features.d.ts +6 -0
- package/build/generators/Features.js +6 -0
- package/build/generators/builders/CalldataGenerator.d.ts +1 -1
- package/build/generators/builders/CalldataGenerator.js +9 -6
- package/build/generators/builders/DeploymentGenerator.js +3 -2
- package/build/generators/builders/LegacyCalldataGenerator.d.ts +1 -1
- package/build/generators/builders/LegacyCalldataGenerator.js +9 -6
- package/build/generators/builders/P2WDAGenerator.d.ts +1 -1
- package/build/generators/builders/P2WDAGenerator.js +2 -1
- package/build/keypair/Address.d.ts +1 -0
- package/build/keypair/Address.js +10 -0
- package/build/transaction/builders/DeploymentTransaction.js +2 -1
- package/build/transaction/builders/InteractionTransaction.js +3 -1
- package/build/transaction/builders/InteractionTransactionP2WDA.js +3 -1
- package/build/transaction/builders/TransactionBuilder.js +12 -1
- package/build/transaction/mineable/TimelockGenerator.d.ts +3 -0
- package/build/transaction/mineable/TimelockGenerator.js +26 -7
- package/package.json +1 -1
- package/src/_version.ts +1 -1
- package/src/epoch/ChallengeSolution.ts +5 -1
- package/src/generators/Features.ts +7 -0
- package/src/generators/builders/CalldataGenerator.ts +11 -7
- package/src/generators/builders/DeploymentGenerator.ts +6 -2
- package/src/generators/builders/LegacyCalldataGenerator.ts +11 -7
- package/src/generators/builders/P2WDAGenerator.ts +4 -2
- package/src/keypair/Address.ts +35 -1
- package/src/transaction/builders/DeploymentTransaction.ts +2 -1
- package/src/transaction/builders/InteractionTransaction.ts +3 -1
- package/src/transaction/builders/InteractionTransactionP2WDA.ts +3 -1
- package/src/transaction/builders/TransactionBuilder.ts +14 -1
- 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 =
|
|
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
|
}
|