@@ -7,6 +7,7 @@ module BotPlutusInterface.Contract (runContract, handleContract) where
77import BotPlutusInterface.Balance qualified as Balance
88import BotPlutusInterface.BodyBuilder qualified as BodyBuilder
99import BotPlutusInterface.CardanoCLI qualified as CardanoCLI
10+ import BotPlutusInterface.CardanoNode.Effects (NodeQuery (MinUtxo , UtxosAt ))
1011import BotPlutusInterface.Collateral qualified as Collateral
1112import BotPlutusInterface.Effects (
1213 PABEffect ,
@@ -44,15 +45,9 @@ import BotPlutusInterface.Types (
4445import Cardano.Api (
4546 AsType (.. ),
4647 EraInMode (.. ),
47- ShelleyBasedEra (ShelleyBasedEraBabbage ),
4848 Tx (Tx ),
49- toLedgerPParams ,
5049 )
51- import Cardano.Api.Shelley (toShelleyTxOut )
52- import Cardano.Ledger.Shelley.API.Wallet (
53- CLI (evaluateMinLovelaceOutput ),
54- )
55- import Cardano.Prelude (liftA2 , maybeToEither )
50+ import Cardano.Prelude (liftA2 )
5651import Control.Lens (preview , (.~) , (^.) )
5752import Control.Monad (join , void , when )
5853import Control.Monad.Freer (Eff , Member , interpret , reinterpret , runM , subsume , type (~> ))
@@ -76,20 +71,13 @@ import Data.Text qualified as Text
7671import Data.Vector qualified as V
7772import Ledger (POSIXTime , getCardanoTxId )
7873import Ledger qualified
79- import Ledger.Ada qualified as Ada
8074import Ledger.Address (PaymentPubKeyHash (PaymentPubKeyHash ))
8175import Ledger.Constraints.OffChain (UnbalancedTx (.. ), tx )
8276import Ledger.Slot (Slot (Slot ))
8377import Ledger.Tx (CardanoTx (CardanoApiTx , EmulatorTx ), outputs )
8478import Ledger.Tx qualified as Tx
85- import Ledger.Tx.CardanoAPI (toCardanoTxOut , toCardanoTxOutDatumHash )
86- import Ledger.Validation (Coin (Coin ))
8779import Plutus.ChainIndex.TxIdState (fromTx , transactionStatus )
8880import Plutus.ChainIndex.Types (RollbackState (.. ), TxIdState , TxStatus )
89-
90- -- import Plutus.Contract.CardanoAPI (toCardanoTxOutBabbage, toCardanoTxOutDatumHashBabbage)
91-
92- import BotPlutusInterface.CardanoNode.Effects (NodeQuery (UtxosAt ))
9381import Plutus.Contract.Checkpoint (Checkpoint (.. ))
9482import Plutus.Contract.Effects (
9583 BalanceTxResponse (.. ),
@@ -101,7 +89,6 @@ import Plutus.Contract.Effects (
10189 )
10290import Plutus.Contract.Resumable (Resumable (.. ))
10391import Plutus.Contract.Types (Contract (.. ), ContractEffs )
104- import Plutus.V1.Ledger.Tx (TxOut (txOutValue ))
10592import PlutusTx.Builtins (fromBuiltin )
10693import Prettyprinter (Pretty (pretty ), (<+>) )
10794import Prettyprinter qualified as PP
@@ -223,7 +210,7 @@ handlePABReq contractEnv req = do
223210 either (error . show ) (PosixTimeRangeToContainedSlotRangeResp . Right )
224211 <$> posixTimeRangeToContainedSlotRange @ w posixTimeRange
225212 AwaitTxStatusChangeReq txId -> AwaitTxStatusChangeResp txId <$> awaitTxStatusChange @ w contractEnv txId
226- AdjustUnbalancedTxReq unbalancedTx -> AdjustUnbalancedTxResp <$> adjustUnbalancedTx' @ w contractEnv unbalancedTx
213+ AdjustUnbalancedTxReq unbalancedTx -> AdjustUnbalancedTxResp <$> adjustUnbalancedTx' @ w @ effs unbalancedTx
227214 ------------------------
228215 -- Unhandled requests --
229216 ------------------------
@@ -255,36 +242,17 @@ handlePABReq contractEnv req = do
255242
256243adjustUnbalancedTx' ::
257244 forall (w :: Type ) (effs :: [Type -> Type ]).
258- ContractEnvironment w - >
245+ Member ( PABEffect w ) effs = >
259246 UnbalancedTx ->
260247 Eff effs (Either Tx. ToCardanoError UnbalancedTx )
261- adjustUnbalancedTx' contractEnv unbalancedTx = pure $ do
262- pparams <- getPParams
263- let networkId = contractEnv. cePABConfig. pcNetwork
248+ adjustUnbalancedTx' unbalancedTx = runEitherT $ do
249+ -- traverse (queryNode . MinUtxo)
250+ updatedOuts <-
251+ firstEitherT (Tx. TxBodyError . show ) $
252+ newEitherT $
253+ sequence <$> traverse (queryNode @ w . MinUtxo ) (unbalancedTx ^. tx . outputs)
264254
265- updatedOuts <- traverse (adjustTxOut networkId pparams) (unbalancedTx ^. tx . outputs)
266255 return $ unbalancedTx & (tx . outputs .~ updatedOuts)
267- where
268- getPParams =
269- maybeToEither (Tx. TxBodyError " No protocol params found in PAB config" ) $
270- asBabbageBased toLedgerPParams
271- <$> contractEnv. cePABConfig. pcProtocolParams
272- -- increasing the Ada amount can also increase the size in bytes,
273- -- so adjustment loops till no missing Ada left after evaluation
274- -- implementation mostly taken from `plutus-apps`
275- adjustTxOut networkId pparams txOut = do
276- txOut' <- toCardanoTxOut networkId toCardanoTxOutDatumHash txOut
277- let (Coin minTxOut) = evaluateMinLovelaceOutput pparams (asBabbageBased toShelleyTxOut txOut')
278- missingLovelace = Ada. lovelaceOf minTxOut - Ada. fromValue (txOutValue txOut)
279- if missingLovelace > 0
280- then
281- adjustTxOut
282- networkId
283- pparams
284- (txOut {txOutValue = txOutValue txOut <> Ada. toValue missingLovelace})
285- else Right txOut
286-
287- asBabbageBased f = f ShelleyBasedEraBabbage
288256
289257{- | Await till transaction status change to something from `Unknown`.
290258 Uses `chain-index` to query transaction by id.
0 commit comments