cooked-validators-4.0.0
Safe HaskellSafe-Inferred
LanguageHaskell2010

Cooked.MockChain.BlockChain

Description

This modules provides a specification for our blockchain monads, in three layers:

  1. MonadBlockChainBalancing provides what's needing for balancing purposes
  2. MonadBlockChainWithoutValidation adds up remaining primitives without transaction validation
  3. MonadBlockChain concludes with the addition of transaction validation, thus modifying the internal index of outputs

In addition, you will find here many helpers functions which can be derived from the core definition of our blockchain.

Synopsis

Documentation

data MockChainError Source #

The errors that can be produced by the MockChainT monad

Constructors

MCEValidationError ValidationPhase ValidationError

Validation errors, either in Phase 1 or Phase 2

MCEUnbalanceable Wallet Value TxSkel

Thrown when the balancing wallet does not have enough funds

MCENoSuitableCollateral Integer Integer Value

Thrown when not enough collateral are provided. Built upon the fee, the percentage and the expected minimal collateral value.

MCEGenerationError GenerateTxError

Thrown when an error occured during transaction generation

MCEUnknownOutRefError String TxOutRef

Thrown when an output reference is missing from the mockchain state

MCEUnknownValidator String ValidatorHash

Same as MCEUnknownOutRefError for validators.

MCEUnknownDatum String DatumHash

Same as MCEUnknownOutRefError for datums.

FailWith String

Used to provide MonadFail instances.

Instances

Instances details
Show MockChainError Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

PrettyCooked MockChainError Source # 
Instance details

Defined in Cooked.Pretty.Cooked

Eq MockChainError Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

MonadError MockChainError StagedMockChain Source # 
Instance details

Defined in Cooked.MockChain.Staged

Monad m => MonadError MockChainError (MockChainT m) Source # 
Instance details

Defined in Cooked.MockChain.Direct

(MonadTransControl t, MonadError MockChainError m, Monad (t m)) => MonadError MockChainError (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

throwError :: MockChainError -> AsTrans t m a #

catchError :: AsTrans t m a -> (MockChainError -> AsTrans t m a) -> AsTrans t m a #

Show a => PrettyCooked (MockChainReturn a UtxoState) Source # 
Instance details

Defined in Cooked.Pretty.Cooked

data MockChainLogEntry Source #

This represents the specific events that should be logged when processing transactions. If a new kind of event arises, then a new constructor should be provided here.

Constructors

MCLogSubmittedTxSkel SkelContext TxSkel

Logging a Skeleton as it is submitted by the user.

MCLogAdjustedTxSkel SkelContext TxSkel Integer (Maybe (Set TxOutRef, Wallet))

Logging a Skeleton as it has been adjusted by the balancing mechanism, alongside fee, and possible collateral utxos and return collateral wallet.

MCLogNewTx TxId

Logging the appearance of a new transaction, after a skeleton has been successfully sent for validation.

MCLogDiscardedUtxos Integer String

Logging the fact that utxos provided by the user for balancing have to be discarded for a specific reason.

MCLogUnusedCollaterals (Either Wallet (Set TxOutRef))

Logging the fact that utxos provided as collaterals will not be used because the transaction does not involve scripts. There are 2 cases, depending on whether the user has provided an explicit wallet or a set of utxos to be used as collaterals.

MCLogAddedReferenceScript Redeemer TxOutRef ScriptHash

Logging the automatic addition of a reference script

Instances

Instances details
PrettyCooked MockChainLogEntry Source #

This pretty prints a MockChainLog that usually consists of the list of validated or submitted transactions. In the log, we know a transaction has been validated if the MCLogSubmittedTxSkel is followed by a MCLogNewTx.

Instance details

Defined in Cooked.Pretty.Cooked

Monad m => MonadWriter [MockChainLogEntry] (MockChainT m) Source # 
Instance details

Defined in Cooked.MockChain.Direct

Show a => PrettyCooked (MockChainReturn a UtxoState) Source # 
Instance details

Defined in Cooked.Pretty.Cooked

class (MonadFail m, MonadError MockChainError m) => MonadBlockChainBalancing m where Source #

Contains methods needed for balancing.

Methods

getParams :: m Params Source #

Returns the emulator parameters, including protocol parameters

utxosAt :: Address -> m [(TxOutRef, TxOut)] Source #

Returns a list of all UTxOs at a certain address.

datumFromHash :: DatumHash -> m (Maybe Datum) Source #

Returns the datum with the given hash if present.

validatorFromHash :: ValidatorHash -> m (Maybe (Versioned Validator)) Source #

Returns the full validator corresponding to hash, if that validator owns something or if it is stored in the reference script field of some UTxO.

txOutByRef :: TxOutRef -> m (Maybe TxOut) Source #

Returns an output given a reference to it

logEvent :: MockChainLogEntry -> m () Source #

Logs an event that occured during a BlockChain run

Instances

Instances details
MonadBlockChainBalancing StagedMockChain Source # 
Instance details

Defined in Cooked.MockChain.Staged

Monad m => MonadBlockChainBalancing (MockChainT m) Source # 
Instance details

Defined in Cooked.MockChain.Direct

MonadBlockChainBalancing m => MonadBlockChainBalancing (ListT m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(MonadTrans t, MonadBlockChainBalancing m, Monad (t m), MonadError MockChainError (AsTrans t m)) => MonadBlockChainBalancing (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

MonadBlockChainBalancing m => MonadBlockChainBalancing (ReaderT r m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

MonadBlockChainBalancing m => MonadBlockChainBalancing (StateT s m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(Monoid w, MonadBlockChainBalancing m) => MonadBlockChainBalancing (WriterT w m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

class MonadBlockChainBalancing m => MonadBlockChainWithoutValidation m where Source #

Methods

allUtxos :: m [(TxOutRef, TxOut)] Source #

Returns a list of all currently known outputs.

setParams :: Params -> m () Source #

Updates parameters

currentSlot :: m Slot Source #

Returns the current slot number

awaitSlot :: Slot -> m Slot Source #

Waits until the current slot becomes greater or equal to the given slot, and returns the current slot after waiting.

Note that it might not wait for anything if the current slot is large enough.

Instances

Instances details
MonadBlockChainWithoutValidation StagedMockChain Source # 
Instance details

Defined in Cooked.MockChain.Staged

Monad m => MonadBlockChainWithoutValidation (MockChainT m) Source # 
Instance details

Defined in Cooked.MockChain.Direct

MonadBlockChainWithoutValidation m => MonadBlockChainWithoutValidation (ListT m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(MonadTrans t, MonadBlockChainWithoutValidation m, Monad (t m), MonadError MockChainError (AsTrans t m)) => MonadBlockChainWithoutValidation (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

MonadBlockChainWithoutValidation m => MonadBlockChainWithoutValidation (ReaderT r m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

MonadBlockChainWithoutValidation m => MonadBlockChainWithoutValidation (StateT s m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(Monoid w, MonadBlockChainWithoutValidation m) => MonadBlockChainWithoutValidation (WriterT w m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

class MonadBlockChainWithoutValidation m => MonadBlockChain m where Source #

The main abstraction of the blockchain.

Methods

validateTxSkel :: TxSkel -> m CardanoTx Source #

Generates, balances and validates a transaction from a skeleton. It returns the validated transaction and updates the state of the blockchain. In MockChainT, this means:

  • deletes the consumed outputs from mcstIndex
  • adds the produced outputs to msctIndex
  • deletes the consumed datums from mcstDatums
  • adds the produced datums to mcstDatums
  • adds the validators on outputs to the mcstValidators.

newtype AsTrans t (m :: Type -> Type) a Source #

A newtype wrapper to be used with '-XDerivingVia' to derive instances of MonadBlockChain for any MonadTransControl.

For example, to derive 'MonadBlockChain m => MonadBlockChain (ReaderT r m)', you'd write

deriving via (AsTrans (ReaderT r) m) instance MonadBlockChain m => MonadBlockChain (ReaderT r m)

and avoid the trouble of defining all the class methods yourself.

Constructors

AsTrans 

Fields

Instances

Instances details
(MonadTransControl t, MonadError MockChainError m, Monad (t m)) => MonadError MockChainError (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

throwError :: MockChainError -> AsTrans t m a #

catchError :: AsTrans t m a -> (MockChainError -> AsTrans t m a) -> AsTrans t m a #

MonadTransControl t => MonadTransControl (AsTrans t) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Associated Types

type StT (AsTrans t) a #

Methods

liftWith :: Monad m => (Run (AsTrans t) -> m a) -> AsTrans t m a #

restoreT :: Monad m => m (StT (AsTrans t) a) -> AsTrans t m a #

MonadTrans t => MonadTrans (AsTrans t) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

lift :: Monad m => m a -> AsTrans t m a #

(MonadTrans t, MonadFail m, Monad (t m)) => MonadFail (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

fail :: String -> AsTrans t m a #

Applicative (t m) => Applicative (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

pure :: a -> AsTrans t m a #

(<*>) :: AsTrans t m (a -> b) -> AsTrans t m a -> AsTrans t m b #

liftA2 :: (a -> b -> c) -> AsTrans t m a -> AsTrans t m b -> AsTrans t m c #

(*>) :: AsTrans t m a -> AsTrans t m b -> AsTrans t m b #

(<*) :: AsTrans t m a -> AsTrans t m b -> AsTrans t m a #

Functor (t m) => Functor (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

fmap :: (a -> b) -> AsTrans t m a -> AsTrans t m b #

(<$) :: a -> AsTrans t m b -> AsTrans t m a #

Monad (t m) => Monad (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

Methods

(>>=) :: AsTrans t m a -> (a -> AsTrans t m b) -> AsTrans t m b #

(>>) :: AsTrans t m a -> AsTrans t m b -> AsTrans t m b #

return :: a -> AsTrans t m a #

(MonadTrans t, MonadBlockChain m, MonadBlockChainWithoutValidation (AsTrans t m)) => MonadBlockChain (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(MonadTrans t, MonadBlockChainBalancing m, Monad (t m), MonadError MockChainError (AsTrans t m)) => MonadBlockChainBalancing (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

(MonadTrans t, MonadBlockChainWithoutValidation m, Monad (t m), MonadError MockChainError (AsTrans t m)) => MonadBlockChainWithoutValidation (AsTrans t m) Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

type StT (AsTrans t) a Source # 
Instance details

Defined in Cooked.MockChain.BlockChain

type StT (AsTrans t) a = StT t a

currentTime :: MonadBlockChainWithoutValidation m => m (POSIXTime, POSIXTime) Source #

Returns the closed ms interval corresponding to the current slot

utxosFromCardanoTx :: CardanoTx -> [(TxOutRef, TxOut)] Source #

Retrieve the ordered list of outputs of the given CardanoTx.

This is useful when writing endpoints and/or traces to fetch utxos of interest right from the start and avoid querying the chain for them afterwards using allUtxos or similar functions.

resolveDatum :: (IsAbstractOutput out, ToOutputDatum (DatumType out), MonadBlockChainBalancing m) => out -> m (Maybe (ConcreteOutput (OwnerType out) Datum (ValueType out) (ReferenceScriptType out))) Source #

Try to resolve the datum on the output: If there's an inline datum, take that; if there's a datum hash, look the corresponding datum up (with datumFromHash), returning Nothing if it can't be found; if there's no datum or hash at all, return Nothing.

resolveTypedDatum :: (IsAbstractOutput out, ToOutputDatum (DatumType out), MonadBlockChainBalancing m, FromData a) => out -> m (Maybe (ConcreteOutput (OwnerType out) a (ValueType out) (ReferenceScriptType out))) Source #

Like resolveDatum, but also tries to use fromBuiltinData to extract a datum of the suitable type.

resolveValidator :: (IsAbstractOutput out, ToCredential (OwnerType out), MonadBlockChainBalancing m) => out -> m (Maybe (ConcreteOutput (Versioned Validator) (DatumType out) (ValueType out) (ReferenceScriptType out))) Source #

Try to resolve the validator that owns an output: If the output is owned by a public key, or if the validator's hash is not known (i.e. if validatorFromHash returns Nothing) return Nothing.

resolveReferenceScript :: (IsAbstractOutput out, ToScriptHash (ReferenceScriptType out), MonadBlockChainBalancing m) => out -> m (Maybe (ConcreteOutput (OwnerType out) (DatumType out) (ValueType out) (Versioned Validator))) Source #

Try to resolve the reference script on an output: If the output has no reference script, or if the reference script's hash is not known (i.e. if validatorFromHash returns Nothing), this function will return Nothing.

getEnclosingSlot :: MonadBlockChainWithoutValidation m => POSIXTime -> m Slot Source #

Return the slot that contains the given time. See slotToTimeInterval for some satisfied equational properties.

awaitEnclosingSlot :: MonadBlockChainWithoutValidation m => POSIXTime -> m Slot Source #

Waits until the current slot becomes greater or equal to the slot containing the given POSIX time. Note that that it might not wait for anything if the current slot is large enough.

awaitDurationFromLowerBound :: MonadBlockChainWithoutValidation m => Integer -> m Slot Source #

Wait a given number of ms from the lower bound of the current slot and returns the current slot after waiting.

awaitDurationFromUpperBound :: MonadBlockChainWithoutValidation m => Integer -> m Slot Source #

Wait a given number of ms from the upper bound of the current slot and returns the current slot after waiting.

slotRangeBefore :: MonadBlockChainWithoutValidation m => POSIXTime -> m SlotRange Source #

The infinite range of slots ending before or at the given time

slotRangeAfter :: MonadBlockChainWithoutValidation m => POSIXTime -> m SlotRange Source #

The infinite range of slots starting after or at the given time

slotToTimeInterval :: MonadBlockChainWithoutValidation m => Slot -> m (POSIXTime, POSIXTime) Source #

Returns the closed ms interval corresponding to the slot with the given number. It holds that

slotToTimeInterval (getEnclosingSlot t) == (a, b)    ==>   a <= t <= b

and

slotToTimeInterval n == (a, b)   ==>   getEnclosingSlot a == n && getEnclosingSlot b == n

and

slotToTimeInterval n == (a, b)   ==>   getEnclosingSlot (a-1) == n-1 && getEnclosingSlot (b+1) == n+1

txSkelInputValidators :: MonadBlockChainBalancing m => TxSkel -> m (Map ValidatorHash (Versioned Validator)) Source #

All validators which protect transaction inputs

txSkelInputValue :: MonadBlockChainBalancing m => TxSkel -> m Value Source #

look up the UTxOs the transaction consumes, and sum their values.

txSkelHashedData :: MonadBlockChainBalancing m => TxSkel -> m (Map DatumHash Datum) Source #

Looks up and resolves the hashed datums on UTxOs the transaction consumes or references, which will be needed by the transaction body.

txSkelInputDataAsHashes :: MonadBlockChainBalancing m => TxSkel -> m [DatumHash] Source #

Looks up the data on UTxOs the transaction consumes and returns their hashes. This corresponds to the keys of what should be removed from the stored datums in our mockchain. There can be duplicates, which is expected.

lookupUtxos :: MonadBlockChainBalancing m => [TxOutRef] -> m (Map TxOutRef TxOut) Source #

Go through all of the TxOutRefs in the list and look them up in the state of the blockchain, throwing an error if one of them cannot be resolved.

validateTxSkel' :: MonadBlockChain m => TxSkel -> m [TxOutRef] Source #

Validates a skeleton, and retuns the ordered list of produced output references

validateTxSkel_ :: MonadBlockChain m => TxSkel -> m () Source #

Validates a skeleton, and erases the outputs

txSkelProposalsDeposit :: MonadBlockChainBalancing m => TxSkel -> m Lovelace Source #

Retrieves the total amount of lovelace deposited in proposals in this skeleton (equal to govActionDeposit times the number of proposals).

govActionDeposit :: MonadBlockChainBalancing m => m Lovelace Source #

Retrieves the required deposit amount for issuing governance actions.