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