@@ -30,7 +30,7 @@ import Data.Functor ((<&>))
30
30
31
31
import Data.Set (Set )
32
32
import Data.Maybe (mapMaybe , fromMaybe , fromJust )
33
- import Data.List (sortBy , minimumBy , find )
33
+ import Data.List (sortBy ,find , intercalate )
34
34
import qualified Data.Foldable as Foldable
35
35
import PlutusLedgerApi.V2 (PubKeyHash (PubKeyHash ), fromBuiltin )
36
36
import Cardano.Kuber.Core.TxBuilder
@@ -313,7 +313,7 @@ txBuilderToTxBody network pParam systemStart eraHistory
313
313
Just tis -> pure tis
314
314
)
315
315
else pure []
316
-
316
+ Debug. traceM $ " collaterals: " ++ intercalate " \n " ( map show collaterals)
317
317
(txCerts,cDeposits) <- ( if null certs
318
318
then pure $ (TxCertificatesNone ,zeroValue)
319
319
else inEonForEra
@@ -622,9 +622,26 @@ txBuilderToTxBody network pParam systemStart eraHistory
622
622
maybeCollaterals = case txContextCollaterals of
623
623
[] -> case mapMaybe canBeCollateral $ Map. toList spendableUtxos of
624
624
[] -> Nothing
625
- v -> let (tin,pkh,_) = minimumBy sortingFunc v in Just [(tin,pkh)]
625
+ v -> let sorted = sortBy collateralSortingFunc v
626
+ selected = collectCollateral 0 sorted []
627
+ in
628
+ Debug. trace (" sorted: " ++ ( intercalate " \n " $ map show sorted )
629
+ ++ " selected: " ++ ( intercalate " \n " $ map show selected)) $ Just $ selected
630
+
626
631
v-> Just v
627
632
where
633
+ collectCollateral _ [] selected = selected
634
+ collectCollateral amount (v@ (ti,to,quantity): rest) selected =
635
+ let
636
+ newAmount= quantity + amount
637
+ in
638
+ if length selected > 2
639
+ then selected
640
+ else if newAmount > 8
641
+ then (ti,to): selected
642
+ else collectCollateral newAmount rest selected
643
+
644
+
628
645
canBeCollateral :: (IsShelleyBasedEra era ) => (TxIn , TxOut ctx era ) -> Maybe (TxIn , Hash PaymentKey , Integer )
629
646
canBeCollateral v@ (ti, to@ (TxOut addr val mDatumHash _)) = case mDatumHash of
630
647
TxOutDatumNone -> case val of
@@ -636,14 +653,16 @@ txBuilderToTxBody network pParam systemStart eraHistory
636
653
Just pkh -> Just ( ti,pkh,case snd $ head _list of { Quantity n -> n } )
637
654
else Nothing
638
655
_ -> Nothing
639
- filterCollateral = mapMaybe canBeCollateral $ Map. toList spendableUtxos
640
656
641
657
-- sort based on following conditions => Utxos having >4ada come eariler and the lesser ones come later.
642
- sortingFunc :: (TxIn ,a ,Integer ) -> (TxIn ,a ,Integer )-> Ordering
643
- sortingFunc (_,_,v1) (_,_,v2)
644
- | v1 < 5 = if v2 < 5 then v1 `compare` v2 else GT
645
- | v2 < 5 = LT
646
- | otherwise = v1 `compare` v2
658
+ collateralSortingFunc :: (TxIn ,a ,Integer ) -> (TxIn ,a ,Integer )-> Ordering
659
+ collateralSortingFunc (_,_,v1) (_,_,v2)=
660
+ Debug. trace (show v1 ++ " compare " ++ show v2 ++ " =" ++ show doCompare ) doCompare
661
+ where
662
+ doCompare
663
+ | v1 <= 5_000_000 = if v2 <= 5_000_000 then v2 `compare` v1 else GT
664
+ | v2 <= 5_000_000 = LT
665
+ | otherwise = v1 `compare` v2
647
666
648
667
txContextCollaterals = foldl getCollaterals [] _collaterals
649
668
getCollaterals accum x = case x of
0 commit comments