@@ -98,24 +98,27 @@ pub(crate) struct RevokedOutput {
98
98
weight : u64 ,
99
99
amount : u64 ,
100
100
on_counterparty_tx_csv : u16 ,
101
+ is_counterparty_balance_on_anchors : Option < ( ) > ,
101
102
}
102
103
103
104
impl RevokedOutput {
104
- pub ( crate ) fn build ( per_commitment_point : PublicKey , counterparty_delayed_payment_base_key : PublicKey , counterparty_htlc_base_key : PublicKey , per_commitment_key : SecretKey , amount : u64 , on_counterparty_tx_csv : u16 ) -> Self {
105
+ pub ( crate ) fn build ( per_commitment_point : PublicKey , counterparty_delayed_payment_base_key : PublicKey , counterparty_htlc_base_key : PublicKey , per_commitment_key : SecretKey , amount : u64 , on_counterparty_tx_csv : u16 , is_counterparty_balance_on_anchors : bool ) -> Self {
105
106
RevokedOutput {
106
107
per_commitment_point,
107
108
counterparty_delayed_payment_base_key,
108
109
counterparty_htlc_base_key,
109
110
per_commitment_key,
110
111
weight : WEIGHT_REVOKED_OUTPUT ,
111
112
amount,
112
- on_counterparty_tx_csv
113
+ on_counterparty_tx_csv,
114
+ is_counterparty_balance_on_anchors : if is_counterparty_balance_on_anchors { Some ( ( ) ) } else { None }
113
115
}
114
116
}
115
117
}
116
118
117
119
impl_writeable_tlv_based ! ( RevokedOutput , {
118
120
( 0 , per_commitment_point, required) ,
121
+ ( 1 , is_counterparty_balance_on_anchors, required) ,
119
122
( 2 , counterparty_delayed_payment_base_key, required) ,
120
123
( 4 , counterparty_htlc_base_key, required) ,
121
124
( 6 , per_commitment_key, required) ,
@@ -827,18 +830,7 @@ impl PackageTemplate {
827
830
}
828
831
829
832
pub ( crate ) fn build_package ( txid : Txid , vout : u32 , input_solving_data : PackageSolvingData , soonest_conf_deadline : u32 , aggregable : bool , height_original : u32 ) -> Self {
830
- let malleability = match input_solving_data {
831
- PackageSolvingData :: RevokedOutput ( ..) => PackageMalleability :: Malleable ,
832
- PackageSolvingData :: RevokedHTLCOutput ( ..) => PackageMalleability :: Malleable ,
833
- PackageSolvingData :: CounterpartyOfferedHTLCOutput ( ..) => PackageMalleability :: Malleable ,
834
- PackageSolvingData :: CounterpartyReceivedHTLCOutput ( ..) => PackageMalleability :: Malleable ,
835
- PackageSolvingData :: HolderHTLCOutput ( ref outp) => if outp. opt_anchors ( ) {
836
- PackageMalleability :: Malleable
837
- } else {
838
- PackageMalleability :: Untractable
839
- } ,
840
- PackageSolvingData :: HolderFundingOutput ( ..) => PackageMalleability :: Untractable ,
841
- } ;
833
+ let ( malleability, aggregable) = Self :: map_output_type_flags ( & input_solving_data) ;
842
834
let mut inputs = Vec :: with_capacity ( 1 ) ;
843
835
inputs. push ( ( BitcoinOutPoint { txid, vout } , input_solving_data) ) ;
844
836
PackageTemplate {
@@ -851,6 +843,19 @@ impl PackageTemplate {
851
843
height_original,
852
844
}
853
845
}
846
+
847
+ fn map_output_type_flags ( input_solving_data : & PackageSolvingData ) -> ( PackageMalleability , bool ) {
848
+ let ( malleability, aggregable) = match input_solving_data {
849
+ PackageSolvingData :: RevokedOutput ( RevokedOutput { is_counterparty_balance_on_anchors : Some ( ( ) ) , .. } ) => { ( PackageMalleability :: Malleable , false ) } ,
850
+ PackageSolvingData :: RevokedOutput ( RevokedOutput { is_counterparty_balance_on_anchors : None , .. } ) => { ( PackageMalleability :: Malleable , true ) } ,
851
+ PackageSolvingData :: RevokedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , true ) } ,
852
+ PackageSolvingData :: CounterpartyOfferedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , true ) } ,
853
+ PackageSolvingData :: CounterpartyReceivedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , false ) } ,
854
+ PackageSolvingData :: HolderHTLCOutput ( ..) => { ( PackageMalleability :: Untractable , false ) } ,
855
+ PackageSolvingData :: HolderFundingOutput ( ..) => { ( PackageMalleability :: Untractable , false ) } ,
856
+ } ;
857
+ ( malleability, aggregable)
858
+ }
854
859
}
855
860
856
861
impl Writeable for PackageTemplate {
@@ -880,18 +885,7 @@ impl Readable for PackageTemplate {
880
885
inputs. push ( ( outpoint, rev_outp) ) ;
881
886
}
882
887
let ( malleability, aggregable) = if let Some ( ( _, lead_input) ) = inputs. first ( ) {
883
- match lead_input {
884
- PackageSolvingData :: RevokedOutput ( ..) => { ( PackageMalleability :: Malleable , true ) } ,
885
- PackageSolvingData :: RevokedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , true ) } ,
886
- PackageSolvingData :: CounterpartyOfferedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , true ) } ,
887
- PackageSolvingData :: CounterpartyReceivedHTLCOutput ( ..) => { ( PackageMalleability :: Malleable , false ) } ,
888
- PackageSolvingData :: HolderHTLCOutput ( ref outp) => if outp. opt_anchors ( ) {
889
- ( PackageMalleability :: Malleable , outp. preimage . is_some ( ) )
890
- } else {
891
- ( PackageMalleability :: Untractable , false )
892
- } ,
893
- PackageSolvingData :: HolderFundingOutput ( ..) => { ( PackageMalleability :: Untractable , false ) } ,
894
- }
888
+ Self :: map_output_type_flags ( & lead_input)
895
889
} else { return Err ( DecodeError :: InvalidValue ) ; } ;
896
890
let mut soonest_conf_deadline = 0 ;
897
891
let mut feerate_previous = 0 ;
@@ -1029,11 +1023,11 @@ mod tests {
1029
1023
use bitcoin:: secp256k1:: Secp256k1 ;
1030
1024
1031
1025
macro_rules! dumb_revk_output {
1032
- ( $secp_ctx: expr) => {
1026
+ ( $secp_ctx: expr, $is_counterparty_balance_on_anchors : expr ) => {
1033
1027
{
1034
1028
let dumb_scalar = SecretKey :: from_slice( & hex:: decode( "0101010101010101010101010101010101010101010101010101010101010101" ) . unwrap( ) [ ..] ) . unwrap( ) ;
1035
1029
let dumb_point = PublicKey :: from_secret_key( & $secp_ctx, & dumb_scalar) ;
1036
- PackageSolvingData :: RevokedOutput ( RevokedOutput :: build( dumb_point, dumb_point, dumb_point, dumb_scalar, 0 , 0 ) )
1030
+ PackageSolvingData :: RevokedOutput ( RevokedOutput :: build( dumb_point, dumb_point, dumb_point, dumb_scalar, 0 , 0 , $is_counterparty_balance_on_anchors ) )
1037
1031
}
1038
1032
}
1039
1033
}
@@ -1077,7 +1071,7 @@ mod tests {
1077
1071
fn test_package_differing_heights ( ) {
1078
1072
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1079
1073
let secp_ctx = Secp256k1 :: new ( ) ;
1080
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1074
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1081
1075
1082
1076
let mut package_one_hundred = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
1083
1077
let package_two_hundred = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 , true , 200 ) ;
@@ -1089,7 +1083,7 @@ mod tests {
1089
1083
fn test_package_untractable_merge_to ( ) {
1090
1084
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1091
1085
let secp_ctx = Secp256k1 :: new ( ) ;
1092
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1086
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1093
1087
let htlc_outp = dumb_htlc_output ! ( ) ;
1094
1088
1095
1089
let mut untractable_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
@@ -1103,7 +1097,7 @@ mod tests {
1103
1097
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1104
1098
let secp_ctx = Secp256k1 :: new ( ) ;
1105
1099
let htlc_outp = dumb_htlc_output ! ( ) ;
1106
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1100
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1107
1101
1108
1102
let mut malleable_package = PackageTemplate :: build_package ( txid, 0 , htlc_outp. clone ( ) , 1000 , true , 100 ) ;
1109
1103
let untractable_package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
@@ -1115,7 +1109,7 @@ mod tests {
1115
1109
fn test_package_noaggregation_to ( ) {
1116
1110
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1117
1111
let secp_ctx = Secp256k1 :: new ( ) ;
1118
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1112
+ let revk_outp = dumb_revk_output ! ( secp_ctx, true ) ;
1119
1113
1120
1114
let mut noaggregation_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 , false , 100 ) ;
1121
1115
let aggregation_package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
@@ -1127,7 +1121,7 @@ mod tests {
1127
1121
fn test_package_noaggregation_from ( ) {
1128
1122
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1129
1123
let secp_ctx = Secp256k1 :: new ( ) ;
1130
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1124
+ let revk_outp = dumb_revk_output ! ( secp_ctx, true ) ;
1131
1125
1132
1126
let mut aggregation_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
1133
1127
let noaggregation_package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 , false , 100 ) ;
@@ -1139,7 +1133,7 @@ mod tests {
1139
1133
fn test_package_empty ( ) {
1140
1134
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1141
1135
let secp_ctx = Secp256k1 :: new ( ) ;
1142
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1136
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1143
1137
1144
1138
let mut empty_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 , true , 100 ) ;
1145
1139
empty_package. inputs = vec ! [ ] ;
@@ -1152,7 +1146,7 @@ mod tests {
1152
1146
fn test_package_differing_categories ( ) {
1153
1147
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1154
1148
let secp_ctx = Secp256k1 :: new ( ) ;
1155
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1149
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1156
1150
let counterparty_outp = dumb_counterparty_output ! ( secp_ctx, 0 , false ) ;
1157
1151
1158
1152
let mut revoked_package = PackageTemplate :: build_package ( txid, 0 , revk_outp, 1000 , true , 100 ) ;
@@ -1164,9 +1158,9 @@ mod tests {
1164
1158
fn test_package_split_malleable ( ) {
1165
1159
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1166
1160
let secp_ctx = Secp256k1 :: new ( ) ;
1167
- let revk_outp_one = dumb_revk_output ! ( secp_ctx) ;
1168
- let revk_outp_two = dumb_revk_output ! ( secp_ctx) ;
1169
- let revk_outp_three = dumb_revk_output ! ( secp_ctx) ;
1161
+ let revk_outp_one = dumb_revk_output ! ( secp_ctx, false ) ;
1162
+ let revk_outp_two = dumb_revk_output ! ( secp_ctx, false ) ;
1163
+ let revk_outp_three = dumb_revk_output ! ( secp_ctx, false ) ;
1170
1164
1171
1165
let mut package_one = PackageTemplate :: build_package ( txid, 0 , revk_outp_one, 1000 , true , 100 ) ;
1172
1166
let package_two = PackageTemplate :: build_package ( txid, 1 , revk_outp_two, 1000 , true , 100 ) ;
@@ -1202,7 +1196,7 @@ mod tests {
1202
1196
fn test_package_timer ( ) {
1203
1197
let txid = Txid :: from_hex ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1204
1198
let secp_ctx = Secp256k1 :: new ( ) ;
1205
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1199
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1206
1200
1207
1201
let mut package = PackageTemplate :: build_package ( txid, 0 , revk_outp, 1000 , true , 100 ) ;
1208
1202
assert_eq ! ( package. timer( ) , 100 ) ;
@@ -1229,7 +1223,7 @@ mod tests {
1229
1223
let weight_sans_output = ( 4 + 4 + 1 + 36 + 4 + 1 + 1 + 8 + 1 ) * WITNESS_SCALE_FACTOR + 2 ;
1230
1224
1231
1225
{
1232
- let revk_outp = dumb_revk_output ! ( secp_ctx) ;
1226
+ let revk_outp = dumb_revk_output ! ( secp_ctx, false ) ;
1233
1227
let package = PackageTemplate :: build_package ( txid, 0 , revk_outp, 0 , true , 100 ) ;
1234
1228
assert_eq ! ( package. package_weight( & Script :: new( ) ) , weight_sans_output + WEIGHT_REVOKED_OUTPUT as usize ) ;
1235
1229
}
0 commit comments