@@ -11,10 +11,13 @@ import BotPlutusInterface.Effects (PABEffect, createDirectoryIfMissingCLI, print
1111import BotPlutusInterface.Files (DummyPrivKey , unDummyPrivateKey )
1212import BotPlutusInterface.Files qualified as Files
1313import BotPlutusInterface.Types (LogLevel (Debug ), PABConfig )
14+ import Cardano.Api (ExecutionUnitPrices (ExecutionUnitPrices ))
15+ import Cardano.Api.Shelley (ProtocolParameters (protocolParamPrices ))
1416import Control.Monad (foldM , void , zipWithM )
1517import Control.Monad.Freer (Eff , Member )
1618import Control.Monad.Trans.Class (lift )
1719import Control.Monad.Trans.Either (EitherT , hoistEither , newEitherT , runEitherT )
20+ import Data.Coerce (coerce )
1821import Data.Either.Combinators (rightToMaybe )
1922import Data.Kind (Type )
2023import Data.List (partition , (\\) )
@@ -25,6 +28,7 @@ import Data.Set (Set)
2528import Data.Set qualified as Set
2629import Data.Text (Text )
2730import Data.Text qualified as Text
31+ import GHC.Real (Ratio ((:%) ))
2832import Ledger qualified
2933import Ledger.Ada qualified as Ada
3034import Ledger.Address (Address (.. ))
@@ -128,8 +132,10 @@ balanceTxIO pabConf ownPkh unbalancedTx =
128132 txWithoutFees <-
129133 hoistEither $ balanceTxStep minUtxos utxoIndex ownPkh $ tx `withFee` 0
130134
131- newEitherT $ CardanoCLI. buildTx @ w pabConf privKeys txWithoutFees
132- fees <- newEitherT $ CardanoCLI. calculateMinFee @ w pabConf txWithoutFees
135+ exBudget <- newEitherT $ CardanoCLI. buildTx @ w pabConf privKeys txWithoutFees
136+ nonBudgettedFees <- newEitherT $ CardanoCLI. calculateMinFee @ w pabConf txWithoutFees
137+
138+ let fees = nonBudgettedFees + getBudgetPrice (getExecutionUnitPrices pabConf) exBudget
133139
134140 lift $ printLog @ w Debug $ " Fees: " ++ show fees
135141
@@ -140,6 +146,19 @@ balanceTxIO pabConf ownPkh unbalancedTx =
140146 then pure (balancedTx, minUtxos)
141147 else loop utxoIndex privKeys minUtxos balancedTx
142148
149+ getExecutionUnitPrices :: PABConfig -> ExecutionUnitPrices
150+ getExecutionUnitPrices pabConf = fromMaybe (ExecutionUnitPrices 0 0 ) $ protocolParamPrices pabConf. pcProtocolParams
151+
152+ getBudgetPrice :: ExecutionUnitPrices -> Ledger. ExBudget -> Integer
153+ getBudgetPrice (ExecutionUnitPrices cpuPrice memPrice) (Ledger. ExBudget cpuUsed memUsed) =
154+ round cpuCost + round memCost
155+ where
156+ cpuCost = cpuPrice `multRational` (toInteger @ Ledger. SatInt $ coerce cpuUsed)
157+ memCost = memPrice `multRational` (toInteger @ Ledger. SatInt $ coerce memUsed)
158+
159+ multRational :: Rational -> Integer -> Rational
160+ multRational (num :% denom) s = (s * num) :% denom
161+
143162withFee :: Tx -> Integer -> Tx
144163withFee tx fee = tx {txFee = Ada. lovelaceValueOf fee}
145164
0 commit comments