Skip to content

Commit 5eff0bd

Browse files
committed
Extendend whitelist options
1 parent 37a1b44 commit 5eff0bd

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

+1697
-823
lines changed

cardano-chain-gen/cardano-chain-gen.cabal

Lines changed: 2 additions & 0 deletions
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

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

Lines changed: 11 additions & 0 deletions
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

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

Lines changed: 17 additions & 0 deletions
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,
@@ -644,6 +645,22 @@ mkDummyTxBody =
644645
(Withdrawals mempty)
645646
mempty
646647

648+
mkDummyTxBodyWithFee ::
649+
Coin ->
650+
ConwayTxBody StandardConway
651+
mkDummyTxBodyWithFee coin' =
652+
consTxBody
653+
mempty
654+
mempty
655+
mempty
656+
mempty
657+
SNothing
658+
coin'
659+
mempty
660+
mempty
661+
(Withdrawals mempty)
662+
mempty
663+
647664
mkFullTx ::
648665
Int ->
649666
Integer ->

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

Lines changed: 93 additions & 1 deletion
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 (
@@ -12,12 +13,25 @@ module Cardano.Mock.Query (
1213
queryGovActionCounts,
1314
queryConstitutionAnchor,
1415
queryRewardRests,
16+
queryCollateralTxOutCount,
17+
queryMultiAssetMetadataPolicy,
18+
queryPoolUpdateCount,
19+
queryStakeAddressCount,
20+
queryStakeAddressHashRaw,
21+
queryStakeDeRegCount,
22+
queryStakeRegCount,
1523
queryTreasuryDonations,
1624
queryVoteCounts,
25+
countTxOutNonNullStakeAddrIds,
1726
) where
1827

28+
import Cardano.Db (TxOutTableType (..))
1929
import qualified Cardano.Db as Db
20-
import Cardano.Prelude hiding (from, on)
30+
import qualified Cardano.Db.Schema.Core.TxOut as C
31+
import qualified Cardano.Db.Schema.Variant.TxOut as V
32+
import Cardano.Prelude hiding (from, isNothing, on)
33+
import qualified Data.ByteString.Base16 as Base16
34+
import Data.ByteString.Short (ShortByteString, toShort)
2135
import Database.Esqueleto.Experimental
2236
import Prelude ()
2337

@@ -201,3 +215,81 @@ queryVoteCounts txHash idx = do
201215
&&. vote ^. Db.VotingProcedureIndex ==. val idx
202216
pure countRows
203217
pure (maybe 0 unValue res)
218+
219+
queryMultiAssetMetadataPolicy :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
220+
queryMultiAssetMetadataPolicy = do
221+
res <- selectOne $ do
222+
metadataPolicy <- from $ table @Db.MultiAsset
223+
pure $ metadataPolicy ^. Db.MultiAssetPolicy
224+
pure $ toShort . Base16.encode . unValue <$> res
225+
226+
queryStakeAddressHashRaw :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
227+
queryStakeAddressHashRaw = do
228+
res <- selectOne $ do
229+
stakeAddress <- from $ table @Db.StakeAddress
230+
pure $ stakeAddress ^. Db.StakeAddressHashRaw
231+
pure $ toShort . Base16.encode . unValue <$> res
232+
233+
queryStakeAddressCount :: MonadIO io => ReaderT SqlBackend io Word
234+
queryStakeAddressCount = do
235+
res <- selectOne $ do
236+
_ <- from (table @Db.StakeAddress)
237+
pure countRows
238+
pure $ maybe 0 unValue res
239+
240+
queryCollateralTxOutCount :: MonadIO io => ReaderT SqlBackend io Word
241+
queryCollateralTxOutCount = do
242+
res <- selectOne $ do
243+
_ <- from (table @Db.CollateralTxOut)
244+
pure countRows
245+
pure $ maybe 0 unValue res
246+
247+
queryPoolUpdateCount :: MonadIO io => ReaderT SqlBackend io Word
248+
queryPoolUpdateCount = do
249+
res <- selectOne $ do
250+
_ <- from (table @Db.PoolUpdate)
251+
pure countRows
252+
pure $ maybe 0 unValue res
253+
254+
queryStakeDeRegCount :: MonadIO io => ReaderT SqlBackend io Word
255+
queryStakeDeRegCount = do
256+
res <- selectOne $ do
257+
_ <- from (table @Db.StakeDeregistration)
258+
pure countRows
259+
pure $ maybe 0 unValue res
260+
261+
queryStakeRegCount :: MonadIO io => ReaderT SqlBackend io Word
262+
queryStakeRegCount = do
263+
res <- selectOne $ do
264+
_ <- from (table @Db.StakeRegistration)
265+
pure countRows
266+
pure $ maybe 0 unValue res
267+
268+
countTxOutNonNullStakeAddrIds ::
269+
MonadIO m =>
270+
TxOutTableType ->
271+
ReaderT SqlBackend m Word
272+
countTxOutNonNullStakeAddrIds txOutTableType = do
273+
case txOutTableType of
274+
TxOutCore -> queryCore
275+
TxOutVariantAddress -> queryVariant
276+
where
277+
queryCore ::
278+
MonadIO m =>
279+
ReaderT SqlBackend m Word
280+
queryCore = do
281+
result <- selectOne $ do
282+
txOut <- from $ table @C.TxOut
283+
where_ $ not_ (isNothing $ txOut ^. C.TxOutStakeAddressId)
284+
pure countRows
285+
pure $ maybe 0 unValue result
286+
287+
queryVariant ::
288+
MonadIO m =>
289+
ReaderT SqlBackend m Word
290+
queryVariant = do
291+
result <- selectOne $ do
292+
txOut <- from $ table @V.Address
293+
where_ $ not_ (isNothing $ txOut ^. V.AddressStakeAddressId)
294+
pure countRows
295+
pure $ maybe 0 unValue result

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

Lines changed: 23 additions & 0 deletions
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

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

Lines changed: 15 additions & 1 deletion
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

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

Lines changed: 33 additions & 2 deletions
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\"]"

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

Lines changed: 1 addition & 0 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

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

Lines changed: 1 addition & 1 deletion
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

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

Lines changed: 0 additions & 25 deletions
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)