Skip to content

Commit 9d2590c

Browse files
committed
Extendend whitelist options
1 parent f77ebe9 commit 9d2590c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1656
-812
lines changed

Diff for: cardano-chain-gen/cardano-chain-gen.cabal

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ library
6161
build-depends: base >= 4.14 && < 5
6262
, async
6363
, aeson
64+
, base16-bytestring
6465
, bytestring
6566
, cardano-binary
6667
, cardano-crypto-class
@@ -166,6 +167,7 @@ test-suite cardano-chain-gen
166167
Test.Cardano.Db.Mock.Unit.Conway.Simple
167168
Test.Cardano.Db.Mock.Unit.Conway.Stake
168169
Test.Cardano.Db.Mock.Unit.Conway.Tx
170+
Test.Cardano.Db.Mock.Unit.Conway.Whitelist
169171
Test.Cardano.Db.Mock.UnifiedApi
170172
Test.Cardano.Db.Mock.Validate
171173

Diff for: cardano-chain-gen/src/Cardano/Mock/Forging/Tx/Alonzo/ScriptsExamples.hs

+11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples (
2323
alwaysMintScriptHash,
2424
alwaysMintScriptAddr,
2525
alwaysMintScriptStake,
26+
alwaysMintScriptHashRandomPolicyVal,
2627
scriptHash,
2728
assetNames,
2829
plutusData2,
@@ -47,6 +48,7 @@ import Codec.Serialise
4748
import Codec.Serialise.Encoding
4849
import Data.ByteString.Short
4950
import Data.Maybe
51+
import Numeric.Natural (Natural)
5052
import Ouroboros.Consensus.Cardano.Block (StandardAlonzo)
5153
import qualified PlutusCore.Data as Plutus
5254
import qualified PlutusLedgerApi.Test.Examples as Plutus
@@ -103,6 +105,15 @@ alwaysMintScriptStake = ScriptHashObj alwaysMintScriptHash
103105
mkPlutusScriptEra :: AlonzoEraScript era => PlutusBinary -> AlonzoScript era
104106
mkPlutusScriptEra sh = PlutusScript $ fromJust $ mkBinaryPlutusScript PlutusV1 sh
105107

108+
alwaysMintScriptHashRandomPolicyVal :: Natural -> ScriptHash StandardCrypto
109+
alwaysMintScriptHashRandomPolicyVal n = scriptHash @StandardAlonzo $ alwaysMintRandomScript n
110+
111+
alwaysMintRandomScript :: AlonzoEraScript era => Natural -> AlonzoScript era
112+
alwaysMintRandomScript n = mkPlutusScriptEra $ alwaysMintRandomPlutusBinary n
113+
114+
alwaysMintRandomPlutusBinary :: Natural -> PlutusBinary
115+
alwaysMintRandomPlutusBinary n = PlutusBinary $ Plutus.alwaysFailingNAryFunction n
116+
106117
scriptHash ::
107118
forall era.
108119
( EraCrypto era ~ StandardCrypto

Diff for: cardano-chain-gen/src/Cardano/Mock/Forging/Tx/Conway.hs

+17
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ module Cardano.Mock.Forging.Tx.Conway (
4343
mkNewConstitutionTx,
4444
mkDummyRegisterTx,
4545
mkDummyTxBody,
46+
mkDummyTxBodyWithFee,
4647
mkTxDelegCert,
4748
mkRegTxCert,
4849
mkUnRegTxCert,
@@ -614,6 +615,22 @@ mkDummyTxBody =
614615
(Withdrawals mempty)
615616
mempty
616617

618+
mkDummyTxBodyWithFee ::
619+
Coin ->
620+
ConwayTxBody StandardConway
621+
mkDummyTxBodyWithFee coin' =
622+
consTxBody
623+
mempty
624+
mempty
625+
mempty
626+
mempty
627+
SNothing
628+
coin'
629+
mempty
630+
mempty
631+
(Withdrawals mempty)
632+
mempty
633+
617634
mkFullTx ::
618635
Int ->
619636
Integer ->

Diff for: cardano-chain-gen/src/Cardano/Mock/Query.hs

+93-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE FlexibleContexts #-}
2+
{-# LANGUAGE RankNTypes #-}
23
{-# LANGUAGE TypeApplications #-}
34

45
module Cardano.Mock.Query (
@@ -11,11 +12,24 @@ module Cardano.Mock.Query (
1112
queryGovActionCounts,
1213
queryConstitutionAnchor,
1314
queryRewardRests,
15+
queryCollateralTxOutCount,
16+
queryMultiAssetMetadataPolicy,
17+
queryPoolUpdateCount,
18+
queryStakeAddressCount,
19+
queryStakeAddressHashRaw,
20+
queryStakeDeRegCount,
21+
queryStakeRegCount,
1422
queryTreasuryDonations,
23+
countTxOutNonNullStakeAddrIds,
1524
) where
1625

26+
import Cardano.Db (TxOutTableType (..))
1727
import qualified Cardano.Db as Db
18-
import Cardano.Prelude hiding (from, on)
28+
import qualified Cardano.Db.Schema.Core.TxOut as C
29+
import qualified Cardano.Db.Schema.Variant.TxOut as V
30+
import Cardano.Prelude hiding (from, isNothing, on)
31+
import qualified Data.ByteString.Base16 as Base16
32+
import Data.ByteString.Short (ShortByteString, toShort)
1933
import Database.Esqueleto.Experimental
2034
import Prelude ()
2135

@@ -162,3 +176,81 @@ queryTreasuryDonations = do
162176

163177
let total = join (unValue <$> res)
164178
pure $ maybe 0 Db.unDbLovelace total
179+
180+
queryMultiAssetMetadataPolicy :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
181+
queryMultiAssetMetadataPolicy = do
182+
res <- selectOne $ do
183+
metadataPolicy <- from $ table @Db.MultiAsset
184+
pure $ metadataPolicy ^. Db.MultiAssetPolicy
185+
pure $ toShort . Base16.encode . unValue <$> res
186+
187+
queryStakeAddressHashRaw :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
188+
queryStakeAddressHashRaw = do
189+
res <- selectOne $ do
190+
stakeAddress <- from $ table @Db.StakeAddress
191+
pure $ stakeAddress ^. Db.StakeAddressHashRaw
192+
pure $ toShort . Base16.encode . unValue <$> res
193+
194+
queryStakeAddressCount :: MonadIO io => ReaderT SqlBackend io Word
195+
queryStakeAddressCount = do
196+
res <- selectOne $ do
197+
_ <- from (table @Db.StakeAddress)
198+
pure countRows
199+
pure $ maybe 0 unValue res
200+
201+
queryCollateralTxOutCount :: MonadIO io => ReaderT SqlBackend io Word
202+
queryCollateralTxOutCount = do
203+
res <- selectOne $ do
204+
_ <- from (table @Db.CollateralTxOut)
205+
pure countRows
206+
pure $ maybe 0 unValue res
207+
208+
queryPoolUpdateCount :: MonadIO io => ReaderT SqlBackend io Word
209+
queryPoolUpdateCount = do
210+
res <- selectOne $ do
211+
_ <- from (table @Db.PoolUpdate)
212+
pure countRows
213+
pure $ maybe 0 unValue res
214+
215+
queryStakeDeRegCount :: MonadIO io => ReaderT SqlBackend io Word
216+
queryStakeDeRegCount = do
217+
res <- selectOne $ do
218+
_ <- from (table @Db.StakeDeregistration)
219+
pure countRows
220+
pure $ maybe 0 unValue res
221+
222+
queryStakeRegCount :: MonadIO io => ReaderT SqlBackend io Word
223+
queryStakeRegCount = do
224+
res <- selectOne $ do
225+
_ <- from (table @Db.StakeRegistration)
226+
pure countRows
227+
pure $ maybe 0 unValue res
228+
229+
countTxOutNonNullStakeAddrIds ::
230+
MonadIO m =>
231+
TxOutTableType ->
232+
ReaderT SqlBackend m Word
233+
countTxOutNonNullStakeAddrIds txOutTableType = do
234+
case txOutTableType of
235+
TxOutCore -> queryCore
236+
TxOutVariantAddress -> queryVariant
237+
where
238+
queryCore ::
239+
MonadIO m =>
240+
ReaderT SqlBackend m Word
241+
queryCore = do
242+
result <- selectOne $ do
243+
txOut <- from $ table @C.TxOut
244+
where_ $ not_ (isNothing $ txOut ^. C.TxOutStakeAddressId)
245+
pure countRows
246+
pure $ maybe 0 unValue result
247+
248+
queryVariant ::
249+
MonadIO m =>
250+
ReaderT SqlBackend m Word
251+
queryVariant = do
252+
result <- selectOne $ do
253+
txOut <- from $ table @V.Address
254+
where_ $ not_ (isNothing $ txOut ^. V.AddressStakeAddressId)
255+
pure countRows
256+
pure $ maybe 0 unValue result

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Config.hs

+23
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ module Test.Cardano.Db.Mock.Config (
3535
configMetadataEnable,
3636
configMetadataDisable,
3737
configMetadataKeys,
38+
configMultipleMetadataKeys,
39+
configMulitiAssetPoliciesKeys,
40+
configShelleyStakeAddrKeys,
41+
configMultipleShelleyStakeAddrKeys,
42+
43+
-- * Make Functions
3844
mkFingerPrint,
3945
mkMutableDir,
4046
mkDBSyncEnv,
@@ -90,6 +96,7 @@ import Control.Monad.Extra (eitherM)
9096
import Control.Monad.Logger (NoLoggingT, runNoLoggingT)
9197
import Control.Monad.Trans.Except.Extra (runExceptT)
9298
import Control.Tracer (nullTracer)
99+
import Data.ByteString.Short (ShortByteString)
93100
import Data.Text (Text)
94101
import Database.Persist.Postgresql (createPostgresqlPool)
95102
import Database.Persist.Sql (SqlBackend)
@@ -354,6 +361,22 @@ configMetadataKeys :: SyncNodeConfig -> SyncNodeConfig
354361
configMetadataKeys cfg = do
355362
cfg {dncInsertOptions = (dncInsertOptions cfg) {sioMetadata = MetadataKeys $ 1 :| []}}
356363

364+
configMultipleMetadataKeys :: SyncNodeConfig -> SyncNodeConfig
365+
configMultipleMetadataKeys cfg = do
366+
cfg {dncInsertOptions = (dncInsertOptions cfg) {sioMetadata = MetadataKeys $ 1 :| [6]}}
367+
368+
configMulitiAssetPoliciesKeys :: ShortByteString -> SyncNodeConfig -> SyncNodeConfig
369+
configMulitiAssetPoliciesKeys maPolicyShortBs cfg = do
370+
cfg {dncInsertOptions = (dncInsertOptions cfg) {sioMultiAsset = MultiAssetPolicies $ maPolicyShortBs :| []}}
371+
372+
configShelleyStakeAddrKeys :: ShortByteString -> SyncNodeConfig -> SyncNodeConfig
373+
configShelleyStakeAddrKeys shelleyStakeAddrShortBs cfg = do
374+
cfg {dncInsertOptions = (dncInsertOptions cfg) {sioShelley = ShelleyStakeAddrs $ shelleyStakeAddrShortBs :| []}}
375+
376+
configMultipleShelleyStakeAddrKeys :: NonEmpty ShortByteString -> SyncNodeConfig -> SyncNodeConfig
377+
configMultipleShelleyStakeAddrKeys shelleyStakeAddrShortBs cfg = do
378+
cfg {dncInsertOptions = (dncInsertOptions cfg) {sioShelley = ShelleyStakeAddrs shelleyStakeAddrShortBs}}
379+
357380
initCommandLineArgs :: CommandLineArgs
358381
initCommandLineArgs =
359382
CommandLineArgs

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import qualified Test.Cardano.Db.Mock.Unit.Conway.Rollback as Rollback
1616
import qualified Test.Cardano.Db.Mock.Unit.Conway.Simple as Simple
1717
import qualified Test.Cardano.Db.Mock.Unit.Conway.Stake as Stake
1818
import qualified Test.Cardano.Db.Mock.Unit.Conway.Tx as Tx
19+
import qualified Test.Cardano.Db.Mock.Unit.Conway.Whitelist as Whitelist
1920
import Test.Cardano.Db.Mock.Validate (expectFailSilent)
2021
import Test.Tasty (TestTree (), testGroup)
2122
import Test.Tasty.HUnit (Assertion (), testCase)
@@ -42,6 +43,12 @@ unitTests iom knownMigrations =
4243
"remove jsonb from schema and add back"
4344
Config.configJsonbInSchemaShouldRemoveThenAdd
4445
]
46+
, testGroup
47+
"invalid whitelist hashes"
48+
[ testCase "Fail if Shelley stake address hash is invalid" Config.invalidShelleyStkAddrHash
49+
, testCase "Fail if multi-asset policies hash is invalid" Config.invalidMultiAssetPoliciesHash
50+
, testCase "Fail if Plutus script hash invalid" Config.invalidPlutusScriptHash
51+
]
4552
, testGroup
4653
"tx-out"
4754
[ test "basic prune" MigrateConsumedPruneTxOut.basicPrune
@@ -135,7 +142,6 @@ unitTests iom knownMigrations =
135142
, test "consume utxo same block" Tx.consumeSameBlock
136143
, test "tx with metadata" Tx.addTxMetadata
137144
, test "tx with metadata disabled" Tx.addTxMetadataDisabled
138-
, test "tx with metadata whitelist" Tx.addTxMetadataWhitelist
139145
]
140146
, testGroup
141147
"stake addresses"
@@ -197,6 +203,14 @@ unitTests iom knownMigrations =
197203
, test "swap many multi assets" Plutus.swapMultiAssets
198204
, test "swap with multi assets disabled" Plutus.swapMultiAssetsDisabled
199205
]
206+
, testGroup
207+
"Whitelist"
208+
[ test "add tx with whitelist" Whitelist.addTxMultiAssetsWhitelist
209+
, test "tx with metadata whitelist" Whitelist.addTxMetadataWhitelist
210+
, test "tx with metadata whitelist multiple" Whitelist.addTxMetadataWhitelistMultiple
211+
, test "add simple tx, whitelist tx address" Whitelist.addSimpleTxStakeAddrsWhitelist
212+
, test "add full tx, with stake address whitelist" Whitelist.fullTxStakeAddressWhitelist
213+
]
200214
, testGroup
201215
"Pools and smash"
202216
[ test "pool registration" Other.poolReg

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Config/Parse.hs

+33-2
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,29 @@ module Test.Cardano.Db.Mock.Unit.Conway.Config.Parse (
88
wrongConwayGenesisHash,
99
insertConfig,
1010
defaultInsertConfig,
11-
) where
11+
invalidShelleyStkAddrHash,
12+
invalidMultiAssetPoliciesHash,
13+
invalidPlutusScriptHash,
14+
)
15+
where
1216

1317
import Cardano.DbSync.Config
1418
import Cardano.DbSync.Config.Types
1519
import Cardano.DbSync.Error
1620
import Cardano.Prelude hiding (from, isNothing)
1721
import qualified Data.Aeson as Aeson
1822
import Data.Default.Class (Default (..))
23+
import Data.String (String)
24+
import Data.Text (pack)
1925
import Test.Cardano.Db.Mock.Config
2026
import Test.Tasty.HUnit (Assertion (), assertBool, (@?=))
2127
import Prelude ()
2228

2329
conwayGenesis :: Assertion
2430
conwayGenesis =
2531
mkSyncNodeConfig configDir initCommandLineArgs
26-
>>= void . mkConfig configDir mutableDir cmdLineArgs
32+
>>= void
33+
. mkConfig configDir mutableDir cmdLineArgs
2734
where
2835
configDir = "config-conway"
2936
mutableDir = mkMutableDir "conwayConfigSimple"
@@ -109,3 +116,27 @@ insertConfig = do
109116
dncInsertOptions cfg @?= expected
110117
where
111118
configDir = "config-conway-insert-options"
119+
120+
invalidShelleyStkAddrHash :: Assertion
121+
invalidShelleyStkAddrHash =
122+
let invalidJson = "{ \"enable\": true, \"stake_addresses\": " <> invalidHash <> " }"
123+
decodedResult :: Either String ShelleyInsertConfig
124+
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
125+
in assertBool "Decoding should fail for invalid Shelley stake address hash" (isLeft decodedResult)
126+
127+
invalidMultiAssetPoliciesHash :: Assertion
128+
invalidMultiAssetPoliciesHash =
129+
let invalidJson = "{ \"enable\": true, \"policies\": " <> invalidHash <> " }"
130+
decodedResult :: Either String MultiAssetConfig
131+
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
132+
in assertBool "Decoding should fail for invalid MultiAsset policies hash" (isLeft decodedResult)
133+
134+
invalidPlutusScriptHash :: Assertion
135+
invalidPlutusScriptHash =
136+
let invalidJson = "{ \"enable\": true, \"script_hashes\": " <> invalidHash <> " }"
137+
decodedResult :: Either String PlutusConfig
138+
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
139+
in assertBool "Decoding should fail for invalid Plutus script hash" (isLeft decodedResult)
140+
141+
invalidHash :: String
142+
invalidHash = "[\"\\xe0758b08dea05dabd1cd3510689ebd9efb6a49316acb30eead750e2e9e\"]"

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

+1
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

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Stake.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ registerStakeCreds = do
416416

417417
registerStakeCredsNoShelley :: IOManager -> [(Text, Text)] -> Assertion
418418
registerStakeCredsNoShelley = do
419-
withCustomConfig args (Just configShelleyDisable) cfgDir testLabel $ \interpreter mockServer dbSync -> do
419+
withCustomConfigAndDropDB args (Just configShelleyDisable) cfgDir testLabel $ \interpreter mockServer dbSync -> do
420420
startDBSync dbSync
421421

422422
-- These should not be saved when shelley is disabled

Diff for: cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Tx.hs

-25
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ module Test.Cardano.Db.Mock.Unit.Conway.Tx (
1313
consumeSameBlock,
1414
addTxMetadata,
1515
addTxMetadataDisabled,
16-
addTxMetadataWhitelist,
1716
) where
1817

1918
import Cardano.Ledger.Shelley.TxAuxData (Metadatum (..))
@@ -143,30 +142,6 @@ addTxMetadata = do
143142
testLabel = "conwayConfigMetadataEnabled"
144143
cfgDir = conwayConfigDir
145144

146-
addTxMetadataWhitelist :: IOManager -> [(Text, Text)] -> Assertion
147-
addTxMetadataWhitelist = do
148-
withCustomConfigAndDropDB args (Just configMetadataKeys) cfgDir testLabel $ \interpreter mockServer dbSync -> do
149-
startDBSync dbSync
150-
151-
-- Add blocks with transactions
152-
void $ do
153-
UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ ->
154-
let txBody = Conway.mkDummyTxBody
155-
auxData = Map.fromList [(1, I 1), (2, I 2)]
156-
in Right (Conway.mkAuxDataTx True txBody auxData)
157-
158-
-- Wait for it to sync
159-
assertBlockNoBackoff dbSync 1
160-
-- Should have tx metadata
161-
assertEqBackoff dbSync queryTxMetadataCount 1 [] "Expected tx metadata"
162-
where
163-
args =
164-
initCommandLineArgs
165-
{ claFullMode = False
166-
}
167-
testLabel = "conwayConfigMetadataKeep"
168-
cfgDir = conwayConfigDir
169-
170145
addTxMetadataDisabled :: IOManager -> [(Text, Text)] -> Assertion
171146
addTxMetadataDisabled = do
172147
withCustomConfigAndDropDB args (Just configMetadataDisable) cfgDir testLabel $

0 commit comments

Comments
 (0)