import Cardano.Address.Derivation
+
import Cardano.Wallet.DB.Store.Submissions.New.Operations
+
( SubmissionMeta (..) )
+
import Cardano.Wallet.DB.Store.Transactions.Decoration
+
import Cardano.Wallet.DB.Store.Transactions.TransactionInfo
+
( mkTransactionInfoFromReadTx )
import Cardano.Wallet.DB.WalletState
( DeltaMap, DeltaWalletState, ErrNoSuchWallet (..) )
import Cardano.Wallet.Primitive.AddressDerivation
import Cardano.Wallet.Primitive.Passphrase
import Cardano.Wallet.Primitive.Slotting
-
( TimeInterpreter, epochOf, interpretQuery )
+
( TimeInterpreter, epochOf, hoistTimeInterpreter, interpretQuery )
import Cardano.Wallet.Primitive.Types
+
import Cardano.Wallet.Primitive.Types.Tx.TransactionInfo
+
import Cardano.Wallet.Read.Eras
+
import Cardano.Wallet.Read.Tx.Cardano
+
import Cardano.Wallet.Submissions.Submissions
+
( TxStatusMeta (TxStatusMeta) )
import Control.Monad.IO.Class
import Control.Monad.Trans.Except
import UnliftIO.Exception
+
import qualified Cardano.Wallet.Primitive.Types.Tx.SealedTx as WST
+
import qualified Cardano.Wallet.Primitive.Types.Tx.TxMeta as WtxMeta
+
import qualified Cardano.Wallet.Primitive.Types.Tx.TxMeta as WTxMeta
+
import qualified Cardano.Wallet.Read.Tx as Read
+
import qualified Cardano.Wallet.Submissions.TxStatus as Subm
import qualified Data.Map.Strict as Map
-- | Instantiate database layers at will
-- If the wallet doesn't exist, this operation returns an error.
readDelegationRewardBalance_ (dbDelegation wid)
, putTxHistory = \wid a -> wrapNoSuchWallet wid $
putTxHistory_ dbTxHistory wid a
-
, readTxHistory = \wid minWithdrawal order range status ->
+
, readTransactions = \wid minWithdrawal order range status ->
readCurrentTip wid >>= \case
-
tinfos <- (readTxHistory_ dbTxHistory) wid range status tip
+
inLedgers <- readTxHistory_ dbTxHistory wid range status tip
+
getInSubmissionTransactionInfos_ dbPendingTxs wid
+
inSubmissions :: [TransactionInfo] <- fmap catMaybes
+
$ for inSubmissionsRaw $
+
(hoistTimeInterpreter liftIO ti)
+
(mkDecorator_ dbTxHistory) tip
. sortTransactionsBySlot order
. filterMinWithdrawal minWithdrawal
+
$ inLedgers <> filter (
+
<$> hasStatus WtxMeta.Pending
+
<*> hasStatus WTxMeta.Expired
, getTx = \wid txid -> wrapNoSuchWallet wid $ do
-- transaction isn't found.
-- If the wallet doesn't exist, this operation returns an error.
+
, mkDecorator_ :: TxInDecorator (EraValue Read.Tx) stm
+
-- ^ Resolve TxIn for a given Tx.
-- | A database layer for storing pending transactions.
-- Does nothing if the walletId does not exist.
+
, getInSubmissionTransactions_
+
-> stm [TxStatusMeta SubmissionMeta SlotNo SealedTx]
+
-- ^ Fetch the current pending transaction set for a known wallet.
+
-- Returns an empty list if the wallet isn't found.
, readLocalTxSubmissionPending_
-> stm [LocalTxSubmissionStatus SealedTx]
newtype ErrWalletAlreadyExists
= ErrWalletAlreadyExists WalletId -- Wallet already exists in db
+
-> TxInDecorator (EraValue Read.Tx) stm
+
-> TxStatusMeta SubmissionMeta SlotNo WST.SealedTx
+
-> stm (Maybe TransactionInfo)
+
mkTransactionInfo ti decorator tip = \case
+
( TxStatusMeta ( Subm.InSubmission _slot tx) meta)
+
-> make WTxMeta.Pending tx meta
+
( TxStatusMeta ( Subm.Expired _slot tx) meta)
+
-> make WTxMeta.Expired tx meta
+
( TxStatusMeta ( Subm.InLedger _ _slot tx) meta)
+
-> make WTxMeta.InLedger tx meta
+
let readTx = fromSealedTx tx
+
decorate <- decorator readTx
+
Just <$> mkTransactionInfoFromReadTx
+
ti tip decorate readTx meta s