Skip to content

Commit 185afce

Browse files
committed
test: Add a tx out multi-assets test
1 parent 850c5b1 commit 185afce

File tree

5 files changed

+105
-3
lines changed

5 files changed

+105
-3
lines changed

cardano-chain-gen/src/Cardano/Mock/Query.hs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
{-# LANGUAGE AllowAmbiguousTypes #-}
2+
{-# LANGUAGE DataKinds #-}
13
{-# LANGUAGE FlexibleContexts #-}
4+
{-# LANGUAGE RankNTypes #-}
5+
{-# LANGUAGE ScopedTypeVariables #-}
26
{-# LANGUAGE TypeApplications #-}
7+
{-# LANGUAGE TypeFamilies #-}
38

49
module Cardano.Mock.Query (
510
queryVersionMajorFromEpoch,
611
queryParamProposalFromEpoch,
712
queryParamFromEpoch,
813
queryNullTxDepositExists,
914
queryMultiAssetCount,
15+
queryTxOutMultiAssets,
1016
queryTxMetadataCount,
1117
queryDRepDistrAmount,
1218
queryGovActionCounts,
@@ -80,6 +86,35 @@ queryMultiAssetCount = do
8086

8187
pure $ maybe 0 unValue (listToMaybe res)
8288

89+
queryTxOutMultiAssets ::
90+
MonadIO io =>
91+
Db.TxOutTableType ->
92+
ByteString ->
93+
Word64 ->
94+
ReaderT SqlBackend io (Maybe Text)
95+
queryTxOutMultiAssets txOutVariant txHash index =
96+
case txOutVariant of
97+
Db.TxOutCore -> queryMultiAssetsValue @'Db.TxOutCore
98+
Db.TxOutVariantAddress -> queryMultiAssetsValue @'Db.TxOutVariantAddress
99+
where
100+
queryMultiAssetsValue ::
101+
forall (t :: Db.TxOutTableType) io.
102+
(MonadIO io, Db.TxOutFields t) =>
103+
ReaderT SqlBackend io (Maybe Text)
104+
queryMultiAssetsValue = do
105+
res <- selectOne $ do
106+
(tx :& txOut) <-
107+
from
108+
$ table @Db.Tx
109+
`innerJoin` table
110+
`on` (\(tx :& txOut) -> tx ^. Db.TxId ==. txOut ^. Db.txOutTxIdField @t)
111+
where_ $
112+
tx ^. Db.TxHash ==. val txHash
113+
&&. txOut ^. Db.txOutIndexField @t ==. val index
114+
pure (txOut ^. Db.txOutMaTxOutField @t)
115+
116+
pure (unValue =<< res)
117+
83118
queryTxMetadataCount :: MonadIO io => ReaderT SqlBackend io Word
84119
queryTxMetadataCount = do
85120
res <- selectOne $ do

cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ unitTests iom knownMigrations =
196196
, test "mint many multi assets" Plutus.mintMultiAssets
197197
, test "swap many multi assets" Plutus.swapMultiAssets
198198
, test "swap with multi assets disabled" Plutus.swapMultiAssetsDisabled
199+
, test "multi assets tx out" Plutus.multiAssetsTxOut
199200
]
200201
, testGroup
201202
"Pools and smash"

cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE CPP #-}
22
{-# LANGUAGE NumericUnderscores #-}
3+
{-# LANGUAGE OverloadedStrings #-}
34
{-# LANGUAGE TypeApplications #-}
45

56
#if __GLASGOW_HASKELL__ >= 908
@@ -33,14 +34,17 @@ module Test.Cardano.Db.Mock.Unit.Conway.Plutus (
3334
mintMultiAssets,
3435
swapMultiAssets,
3536
swapMultiAssetsDisabled,
37+
multiAssetsTxOut,
3638
) where
3739

3840
import Cardano.Crypto.Hash.Class (hashToBytes)
3941
import qualified Cardano.Db as DB
4042
import qualified Cardano.Db.Schema.Core.TxOut as C
4143
import qualified Cardano.Db.Schema.Variant.TxOut as V
42-
import Cardano.DbSync.Era.Shelley.Generic.Util (renderAddress)
44+
import Cardano.DbSync.Era.Shelley.Generic (TxOutMultiAsset (..))
45+
import Cardano.DbSync.Era.Shelley.Generic.Util (renderAddress, unTxHash)
4346
import Cardano.Ledger.Coin (Coin (..))
47+
import Cardano.Ledger.Core (txIdTx)
4448
import Cardano.Ledger.Mary.Value (MaryValue (..), MultiAsset (..), PolicyID (..))
4549
import Cardano.Ledger.Plutus.Data
4650
import Cardano.Ledger.SafeHash (extractHash)
@@ -49,8 +53,10 @@ import Cardano.Mock.Forging.Interpreter (withConwayLedgerState)
4953
import qualified Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples as Examples
5054
import qualified Cardano.Mock.Forging.Tx.Conway as Conway
5155
import Cardano.Mock.Forging.Types
52-
import Cardano.Mock.Query (queryMultiAssetCount)
56+
import Cardano.Mock.Query (queryMultiAssetCount, queryTxOutMultiAssets)
5357
import Cardano.Prelude hiding (head)
58+
import qualified Data.Aeson as Aeson
59+
import Data.ByteString.Lazy (fromStrict)
5460
import qualified Data.Map as Map
5561
import Data.Maybe.Strict (StrictMaybe (..))
5662
import GHC.Base (error)
@@ -70,7 +76,7 @@ import Test.Cardano.Db.Mock.Config (
7076
)
7177
import qualified Test.Cardano.Db.Mock.UnifiedApi as Api
7278
import Test.Cardano.Db.Mock.Validate
73-
import Test.Tasty.HUnit (Assertion ())
79+
import Test.Tasty.HUnit (Assertion)
7480
import Prelude (head, tail, (!!))
7581

7682
------------------------------------------------------------------------------
@@ -834,3 +840,59 @@ swapMultiAssetsDisabled =
834840

835841
testLabel = "conwayConfigMultiAssetsDisabled"
836842
cfgDir = conwayConfigDir
843+
844+
multiAssetsTxOut :: IOManager -> [(Text, Text)] -> Assertion
845+
multiAssetsTxOut =
846+
withFullConfig conwayConfigDir testLabel $ \interpreter server dbSync -> do
847+
let txOutVariant = txOutTableTypeFromConfig dbSync
848+
849+
startDBSync dbSync
850+
851+
-- Forge a multi-asset transaction
852+
let assetName = head Examples.assetNames
853+
policy = PolicyID Examples.alwaysMintScriptHash
854+
assets = Map.singleton (head Examples.assetNames) 5
855+
outValue = MaryValue (Coin 20) (MultiAsset $ Map.singleton policy assets)
856+
mintValue = MultiAsset $ Map.singleton policy assets
857+
858+
tx <- withConwayLedgerState interpreter $ \state' ->
859+
Conway.mkMultiAssetsScriptTx
860+
[UTxOIndex 0]
861+
(UTxOIndex 1)
862+
[(UTxOAddress Examples.alwaysMintScriptAddr, outValue)]
863+
[]
864+
mintValue
865+
True
866+
100
867+
state'
868+
869+
-- Submit it
870+
void $
871+
Api.withConwayFindLeaderAndSubmitTx interpreter server $
872+
const (Right tx)
873+
874+
let txHash = unTxHash (txIdTx tx)
875+
txIndex = 0
876+
expectedMultiAssets =
877+
Just
878+
[ TxOutMultiAsset
879+
{ txOutMaPolicyId = policy
880+
, txOutMaAssetName = assetName
881+
, txOutMaAmount = 5
882+
}
883+
]
884+
885+
-- Wait for it to sync
886+
assertBlockNoBackoff dbSync 1
887+
888+
-- Should now have tx_out.ma_tx_out
889+
assertEqBackoff dbSync queryMultiAssetCount 1 [] "Expected multi-assets"
890+
assertBackoff
891+
dbSync
892+
(queryTxOutMultiAssets txOutVariant txHash txIndex)
893+
[]
894+
((== expectedMultiAssets) . parseMultiAsset)
895+
(const "Unexpected multi-assets")
896+
where
897+
testLabel = "conwayMultiAssetsTxOut"
898+
parseMultiAsset = join . fmap (Aeson.decode . fromStrict . encodeUtf8)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[12]

cardano-db/src/Cardano/Db/Operations/Types.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class (PersistEntity (TxOutTable a), PersistField (TxOutIdFor a)) => TxOutFields
4747
txOutInlineDatumIdField :: EntityField (TxOutTable a) (Maybe DatumId)
4848
txOutReferenceScriptIdField :: EntityField (TxOutTable a) (Maybe ScriptId)
4949
txOutConsumedByTxIdField :: EntityField (TxOutTable a) (Maybe TxId)
50+
txOutMaTxOutField :: EntityField (TxOutTable a) (Maybe Text)
5051

5152
-- TxOutCore fields
5253
instance TxOutFields 'TxOutCore where
@@ -60,6 +61,7 @@ instance TxOutFields 'TxOutCore where
6061
txOutInlineDatumIdField = C.TxOutInlineDatumId
6162
txOutReferenceScriptIdField = C.TxOutReferenceScriptId
6263
txOutConsumedByTxIdField = C.TxOutConsumedByTxId
64+
txOutMaTxOutField = C.TxOutMaTxOut
6365

6466
-- TxOutVariantAddress fields
6567
instance TxOutFields 'TxOutVariantAddress where
@@ -73,6 +75,7 @@ instance TxOutFields 'TxOutVariantAddress where
7375
txOutInlineDatumIdField = V.TxOutInlineDatumId
7476
txOutReferenceScriptIdField = V.TxOutReferenceScriptId
7577
txOutConsumedByTxIdField = V.TxOutConsumedByTxId
78+
txOutMaTxOutField = V.TxOutMaTxOut
7679

7780
--------------------------------------------------------------------------------
7881
-- Address

0 commit comments

Comments
 (0)