Skip to content

Commit 038c333

Browse files
committed
WIP use MinUtxo effect from NodeQuery in adjustUnBalanceTx
1 parent 89644e5 commit 038c333

File tree

2 files changed

+11
-42
lines changed

2 files changed

+11
-42
lines changed

src/BotPlutusInterface/Contract.hs

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module BotPlutusInterface.Contract (runContract, handleContract) where
77
import BotPlutusInterface.Balance qualified as Balance
88
import BotPlutusInterface.BodyBuilder qualified as BodyBuilder
99
import BotPlutusInterface.CardanoCLI qualified as CardanoCLI
10+
import BotPlutusInterface.CardanoNode.Effects (NodeQuery (MinUtxo, UtxosAt))
1011
import BotPlutusInterface.Collateral qualified as Collateral
1112
import BotPlutusInterface.Effects (
1213
PABEffect,
@@ -44,15 +45,9 @@ import BotPlutusInterface.Types (
4445
import 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)
5651
import Control.Lens (preview, (.~), (^.))
5752
import Control.Monad (join, void, when)
5853
import Control.Monad.Freer (Eff, Member, interpret, reinterpret, runM, subsume, type (~>))
@@ -76,20 +71,13 @@ import Data.Text qualified as Text
7671
import Data.Vector qualified as V
7772
import Ledger (POSIXTime, getCardanoTxId)
7873
import Ledger qualified
79-
import Ledger.Ada qualified as Ada
8074
import Ledger.Address (PaymentPubKeyHash (PaymentPubKeyHash))
8175
import Ledger.Constraints.OffChain (UnbalancedTx (..), tx)
8276
import Ledger.Slot (Slot (Slot))
8377
import Ledger.Tx (CardanoTx (CardanoApiTx, EmulatorTx), outputs)
8478
import Ledger.Tx qualified as Tx
85-
import Ledger.Tx.CardanoAPI (toCardanoTxOut, toCardanoTxOutDatumHash)
86-
import Ledger.Validation (Coin (Coin))
8779
import Plutus.ChainIndex.TxIdState (fromTx, transactionStatus)
8880
import Plutus.ChainIndex.Types (RollbackState (..), TxIdState, TxStatus)
89-
90-
-- import Plutus.Contract.CardanoAPI (toCardanoTxOutBabbage, toCardanoTxOutDatumHashBabbage)
91-
92-
import BotPlutusInterface.CardanoNode.Effects (NodeQuery (UtxosAt))
9381
import Plutus.Contract.Checkpoint (Checkpoint (..))
9482
import Plutus.Contract.Effects (
9583
BalanceTxResponse (..),
@@ -101,7 +89,6 @@ import Plutus.Contract.Effects (
10189
)
10290
import Plutus.Contract.Resumable (Resumable (..))
10391
import Plutus.Contract.Types (Contract (..), ContractEffs)
104-
import Plutus.V1.Ledger.Tx (TxOut (txOutValue))
10592
import PlutusTx.Builtins (fromBuiltin)
10693
import Prettyprinter (Pretty (pretty), (<+>))
10794
import 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

256243
adjustUnbalancedTx' ::
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.

test/Spec/MockContract.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ runPABEffectPure initState req =
375375
go (POSIXTimeRangeToSlotRange ptr) = mockSlotRange ptr
376376
go GetInMemCollateral = _collateralUtxo <$> get @(MockContractState w)
377377
go (SetInMemCollateral collateral) = modify @(MockContractState w) $ set collateralUtxo (Just collateral)
378+
-- FIXME: These tests are temporary, a proper method is required to tests `NodeQuery` effect.
378379
go (QueryNode (UtxosAt _addr)) = do
379380
state <- get @(MockContractState w)
380381
return $ Right $ Map.fromList (state ^. utxos)

0 commit comments

Comments
 (0)