Skip to content

Commit 6636b2e

Browse files
committed
Add tests coverage for the transaction balancing with stake withdrawal
1 parent b545f50 commit 6636b2e

3 files changed

Lines changed: 288 additions & 76 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
project: cardano-api
2+
pr: 1186
3+
kind:
4+
- bugfix
5+
description: |
6+
`makeTransactionBodyAutoBalance` now returns `TxBodyErrorBalanceNegative` when the transaction balance is negative, instead of crashing with an `Illegal Value in TxOut` runtime error from `toCompact` on a negative `Coin`.

cardano-api/src/Cardano/Api/Experimental/Tx/Internal/Fee.hs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import Cardano.Ledger.Credential as Ledger (Credential)
7676
import Cardano.Ledger.Val qualified as L
7777

7878
import Control.Monad
79+
import Control.Monad.Except (throwError)
7980
import Data.Bifunctor
8081
import Data.Function (on, (&))
8182
import Data.List (sortBy)
@@ -1433,9 +1434,17 @@ makeTransactionBodyAutoBalance
14331434
useEra
14341435
txbodycontent
14351436

1436-
let initialChangeTxOutValue :: Ledger.Value (LedgerEra era) =
1437-
evaluateTransactionBalance pp poolids stakeDelegDeposits drepDelegDeposits utxo txbodyForChange
1438-
initialChangeTxOut :: TxOut (LedgerEra era) =
1437+
-- Check the balance before constructing the TxOut. L.mkBasicTxOut calls toCompact, which throws an irrecoverable
1438+
-- error on negative Coin values, so checkNonNegative would never get to return Left for the negative case.
1439+
initialChangeTxOutValue :: Ledger.Value (LedgerEra era) <- do
1440+
let val = evaluateTransactionBalance pp poolids stakeDelegDeposits drepDelegDeposits utxo txbodyForChange
1441+
L.MaryValue initialCoin initialMultiAsset = obtainCommonConstraints (useEra @era) val
1442+
val
1443+
<$ unless
1444+
(obtainCommonConstraints (useEra @era) $ L.pointwise (>=) val mempty)
1445+
(throwError $ TxBodyErrorBalanceNegative initialCoin initialMultiAsset)
1446+
1447+
let initialChangeTxOut :: TxOut (LedgerEra era) =
14391448
obtainCommonConstraints (useEra @era) $
14401449
TxOut (L.mkBasicTxOut (toShelleyAddr changeaddr) initialChangeTxOutValue)
14411450

0 commit comments

Comments
 (0)