@@ -828,18 +828,18 @@ impl PackageTemplate {
828
828
}
829
829
}
830
830
}
831
- pub ( crate ) fn merge_package ( & mut self , mut merge_from : PackageTemplate ) {
831
+ pub ( crate ) fn merge_package ( & mut self , mut merge_from : PackageTemplate ) -> Result < ( ) , PackageTemplate > {
832
832
if self . malleability == PackageMalleability :: Untractable || merge_from. malleability == PackageMalleability :: Untractable {
833
- panic ! ( "Merging template on untractable packages" ) ;
833
+ return Err ( merge_from ) ;
834
834
}
835
835
if !self . aggregable || !merge_from. aggregable {
836
- panic ! ( "Merging non aggregatable packages" ) ;
836
+ return Err ( merge_from ) ;
837
837
}
838
838
if let Some ( ( _, lead_input) ) = self . inputs . first ( ) {
839
839
for ( _, v) in merge_from. inputs . iter ( ) {
840
- if !lead_input. is_compatible ( v) { panic ! ( "Merging outputs from differing types !" ) ; }
840
+ if !lead_input. is_compatible ( v) { return Err ( merge_from ) ; }
841
841
}
842
- } else { panic ! ( "Merging template on an empty package" ) ; }
842
+ } else { return Err ( merge_from ) ; }
843
843
for ( k, v) in merge_from. inputs . drain ( ..) {
844
844
self . inputs . push ( ( k, v) ) ;
845
845
}
@@ -851,6 +851,7 @@ impl PackageTemplate {
851
851
self . feerate_previous = merge_from. feerate_previous ;
852
852
}
853
853
self . height_timer = cmp:: min ( self . height_timer , merge_from. height_timer ) ;
854
+ Ok ( ( ) )
854
855
}
855
856
/// Gets the amount of all outptus being spent by this package, only valid for malleable
856
857
/// packages.
@@ -1320,7 +1321,6 @@ mod tests {
1320
1321
}
1321
1322
1322
1323
#[ test]
1323
- #[ should_panic]
1324
1324
fn test_package_untractable_merge_to ( ) {
1325
1325
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1326
1326
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1329,11 +1329,10 @@ mod tests {
1329
1329
1330
1330
let mut untractable_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 ) ;
1331
1331
let malleable_package = PackageTemplate :: build_package ( txid, 1 , htlc_outp. clone ( ) , 1000 ) ;
1332
- untractable_package. merge_package ( malleable_package) ;
1332
+ assert ! ( untractable_package. merge_package( malleable_package) . is_err ( ) ) ;
1333
1333
}
1334
1334
1335
1335
#[ test]
1336
- #[ should_panic]
1337
1336
fn test_package_untractable_merge_from ( ) {
1338
1337
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1339
1338
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1342,11 +1341,10 @@ mod tests {
1342
1341
1343
1342
let mut malleable_package = PackageTemplate :: build_package ( txid, 0 , htlc_outp. clone ( ) , 1000 ) ;
1344
1343
let untractable_package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 ) ;
1345
- malleable_package. merge_package ( untractable_package) ;
1344
+ assert ! ( malleable_package. merge_package( untractable_package) . is_err ( ) ) ;
1346
1345
}
1347
1346
1348
1347
#[ test]
1349
- #[ should_panic]
1350
1348
fn test_package_noaggregation_to ( ) {
1351
1349
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1352
1350
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1355,11 +1353,10 @@ mod tests {
1355
1353
1356
1354
let mut noaggregation_package = PackageTemplate :: build_package ( txid, 0 , revk_outp_counterparty_balance. clone ( ) , 1000 ) ;
1357
1355
let aggregation_package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 ) ;
1358
- noaggregation_package. merge_package ( aggregation_package) ;
1356
+ assert ! ( noaggregation_package. merge_package( aggregation_package) . is_err ( ) ) ;
1359
1357
}
1360
1358
1361
1359
#[ test]
1362
- #[ should_panic]
1363
1360
fn test_package_noaggregation_from ( ) {
1364
1361
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1365
1362
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1368,11 +1365,10 @@ mod tests {
1368
1365
1369
1366
let mut aggregation_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 ) ;
1370
1367
let noaggregation_package = PackageTemplate :: build_package ( txid, 1 , revk_outp_counterparty_balance. clone ( ) , 1000 ) ;
1371
- aggregation_package. merge_package ( noaggregation_package) ;
1368
+ assert ! ( aggregation_package. merge_package( noaggregation_package) . is_err ( ) ) ;
1372
1369
}
1373
1370
1374
1371
#[ test]
1375
- #[ should_panic]
1376
1372
fn test_package_empty ( ) {
1377
1373
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1378
1374
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1381,11 +1377,10 @@ mod tests {
1381
1377
let mut empty_package = PackageTemplate :: build_package ( txid, 0 , revk_outp. clone ( ) , 1000 ) ;
1382
1378
empty_package. inputs = vec ! [ ] ;
1383
1379
let package = PackageTemplate :: build_package ( txid, 1 , revk_outp. clone ( ) , 1000 ) ;
1384
- empty_package. merge_package ( package) ;
1380
+ assert ! ( empty_package. merge_package( package) . is_err ( ) ) ;
1385
1381
}
1386
1382
1387
1383
#[ test]
1388
- #[ should_panic]
1389
1384
fn test_package_differing_categories ( ) {
1390
1385
let txid = Txid :: from_str ( "c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e" ) . unwrap ( ) ;
1391
1386
let secp_ctx = Secp256k1 :: new ( ) ;
@@ -1394,7 +1389,7 @@ mod tests {
1394
1389
1395
1390
let mut revoked_package = PackageTemplate :: build_package ( txid, 0 , revk_outp, 1000 ) ;
1396
1391
let counterparty_package = PackageTemplate :: build_package ( txid, 1 , counterparty_outp, 1000 ) ;
1397
- revoked_package. merge_package ( counterparty_package) ;
1392
+ assert ! ( revoked_package. merge_package( counterparty_package) . is_err ( ) ) ;
1398
1393
}
1399
1394
1400
1395
#[ test]
@@ -1409,8 +1404,8 @@ mod tests {
1409
1404
let package_two = PackageTemplate :: build_package ( txid, 1 , revk_outp_two, 1000 ) ;
1410
1405
let package_three = PackageTemplate :: build_package ( txid, 2 , revk_outp_three, 1000 ) ;
1411
1406
1412
- package_one. merge_package ( package_two) ;
1413
- package_one. merge_package ( package_three) ;
1407
+ assert ! ( package_one. merge_package( package_two) . is_ok ( ) ) ;
1408
+ assert ! ( package_one. merge_package( package_three) . is_ok ( ) ) ;
1414
1409
assert_eq ! ( package_one. outpoints( ) . len( ) , 3 ) ;
1415
1410
1416
1411
if let Some ( split_package) = package_one. split_package ( & BitcoinOutPoint { txid, vout : 1 } ) {
0 commit comments