@@ -2,6 +2,7 @@ import 'dart:typed_data';
2
2
import 'package:coinlib/src/common/serial.dart' ;
3
3
import 'package:coinlib/src/crypto/hash.dart' ;
4
4
import 'package:coinlib/src/tx/sign_details.dart' ;
5
+ import 'package:coinlib/src/tx/transaction.dart' ;
5
6
import 'precomputed_signature_hashes.dart' ;
6
7
import 'signature_hasher.dart' ;
7
8
@@ -20,7 +21,11 @@ final class TaprootSignatureHasher extends SignatureHasher with Writable {
20
21
: txHashes = TransactionSignatureHashes (details.tx),
21
22
prevOutHashes = details.hashType.allInputs
22
23
? PrevOutSignatureHashes (details.prevOuts)
23
- : null ;
24
+ : null {
25
+ if (details is TaprootScriptSignDetails ) {
26
+ throw CannotSignInput ("Missing leaf hash for tapscript sign details" );
27
+ }
28
+ }
24
29
25
30
@override
26
31
void write (Writer writer) {
@@ -49,12 +54,23 @@ final class TaprootSignatureHasher extends SignatureHasher with Writable {
49
54
// Data specific to spending input
50
55
writer.writeUInt8 (extFlag << 1 );
51
56
52
- if (hashType.anyOneCanPay) {
53
- thisInput.prevOut.write (writer);
54
- details.prevOuts.first.write (writer);
55
- writer.writeUInt32 (thisInput.sequence);
56
- } else {
57
+ if (hashType.allInputs) {
57
58
writer.writeUInt32 (inputN);
59
+ } else {
60
+
61
+ // ANYONECANPAY commits to the prevout point
62
+ if (hashType.anyOneCanPay) {
63
+ thisInput.prevOut.write (writer);
64
+ }
65
+
66
+ // Commit to the output value and script unless ANYPREVOUTANYSCRIPT
67
+ if (! hashType.anyPrevOutAnyScript) {
68
+ details.prevOuts.first.write (writer);
69
+ }
70
+
71
+ // Always include sequence
72
+ writer.writeUInt32 (thisInput.sequence);
73
+
58
74
}
59
75
60
76
// Data specific to matched output
@@ -66,8 +82,11 @@ final class TaprootSignatureHasher extends SignatureHasher with Writable {
66
82
67
83
// Data specific to the script
68
84
if (leafHash != null ) {
69
- writer.writeSlice (leafHash);
70
- writer.writeUInt8 (0 ); // Key version = 0
85
+ if (! hashType.anyPrevOutAnyScript) {
86
+ writer.writeSlice (leafHash);
87
+ }
88
+ final keyVersion = hashType.requiresApo ? 1 : 0 ;
89
+ writer.writeUInt8 (keyVersion);
71
90
writer.writeUInt32 (details.codeSeperatorPos);
72
91
}
73
92
0 commit comments