Skip to content

Commit 33f2272

Browse files
committed
allow whitelist for insertMultiAsset
1 parent 2f6c6ec commit 33f2272

File tree

1 file changed

+56
-28
lines changed
  • cardano-db-sync/src/Cardano/DbSync/Era/Shelley

1 file changed

+56
-28
lines changed

cardano-db-sync/src/Cardano/DbSync/Era/Shelley/Insert.hs

+56-28
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import Control.Monad.Extra (mapMaybeM, whenJust)
8484
import Control.Monad.Trans.Control (MonadBaseControl)
8585
import Control.Monad.Trans.Except.Extra (newExceptT)
8686
import qualified Data.Aeson as Aeson
87+
import qualified Data.Binary as Binary
8788
import qualified Data.ByteString.Lazy.Char8 as LBS
8889
import Data.Either.Extra (eitherToMaybe)
8990
import Data.Group (invert)
@@ -1335,29 +1336,32 @@ prepareMaTxMint ::
13351336
MultiAsset StandardCrypto ->
13361337
ExceptT SyncNodeError (ReaderT SqlBackend m) [DB.MaTxMint]
13371338
prepareMaTxMint syncEnv _tracer cache txId (MultiAsset mintMap) =
1338-
-- TODO: VINCE HERE
13391339
concatMapM (lift . prepareOuter) $ Map.toList mintMap
13401340
where
13411341
prepareOuter ::
13421342
(MonadBaseControl IO m, MonadIO m) =>
13431343
(PolicyID StandardCrypto, Map AssetName Integer) ->
13441344
ReaderT SqlBackend m [DB.MaTxMint]
13451345
prepareOuter (policy, aMap) =
1346-
mapM (prepareInner policy) $ Map.toList aMap
1346+
mapMaybeM (prepareInner policy) $ Map.toList aMap
13471347

13481348
prepareInner ::
13491349
(MonadBaseControl IO m, MonadIO m) =>
13501350
PolicyID StandardCrypto ->
13511351
(AssetName, Integer) ->
1352-
ReaderT SqlBackend m DB.MaTxMint
1352+
ReaderT SqlBackend m (Maybe DB.MaTxMint)
13531353
prepareInner policy (aname, amount) = do
1354-
maId <- insertMultiAsset syncEnv cache policy aname
1355-
pure $
1356-
DB.MaTxMint
1357-
{ DB.maTxMintIdent = maId
1358-
, DB.maTxMintQuantity = DB.integerToDbInt65 amount
1359-
, DB.maTxMintTxId = txId
1360-
}
1354+
maIdM <- insertMultiAsset syncEnv cache policy aname
1355+
case maIdM of
1356+
Just maId ->
1357+
pure $
1358+
Just $
1359+
DB.MaTxMint
1360+
{ DB.maTxMintIdent = maId
1361+
, DB.maTxMintQuantity = DB.integerToDbInt65 amount
1362+
, DB.maTxMintTxId = txId
1363+
}
1364+
Nothing -> pure Nothing
13611365

13621366
prepareMaTxOuts ::
13631367
(MonadBaseControl IO m, MonadIO m) =>
@@ -1374,39 +1378,63 @@ prepareMaTxOuts syncEnv _tracer cache maMap =
13741378
(PolicyID StandardCrypto, Map AssetName Integer) ->
13751379
ReaderT SqlBackend m [MissingMaTxOut]
13761380
prepareOuter (policy, aMap) =
1377-
mapM (prepareInner policy) $ Map.toList aMap
1381+
mapMaybeM (prepareInner policy) $ Map.toList aMap
13781382

13791383
prepareInner ::
13801384
(MonadBaseControl IO m, MonadIO m) =>
13811385
PolicyID StandardCrypto ->
13821386
(AssetName, Integer) ->
1383-
ReaderT SqlBackend m MissingMaTxOut
1387+
ReaderT SqlBackend m (Maybe MissingMaTxOut)
13841388
prepareInner policy (aname, amount) = do
1385-
maId <- insertMultiAsset syncEnv cache policy aname
1386-
pure $
1387-
MissingMaTxOut
1388-
{ mmtoIdent = maId
1389-
, mmtoQuantity = DbWord64 (fromIntegral amount)
1390-
}
1389+
maIdM <- insertMultiAsset syncEnv cache policy aname
1390+
case maIdM of
1391+
Just maId ->
1392+
pure $
1393+
Just $
1394+
MissingMaTxOut
1395+
{ mmtoIdent = maId
1396+
, mmtoQuantity = DbWord64 (fromIntegral amount)
1397+
}
1398+
Nothing -> pure Nothing
1399+
1400+
-- concatMapMaybe :: Monad m => (Maybe a -> m [b]) -> [Maybe a] -> m [b]
1401+
-- concatMapMaybe f xs = do
1402+
-- ys <- traverse f' xs
1403+
-- pure (concat ys)
1404+
-- where
1405+
-- f' (Just x) = f (Just x)
1406+
-- f' Nothing = pure []
13911407

13921408
insertMultiAsset ::
13931409
(MonadBaseControl IO m, MonadIO m) =>
13941410
SyncEnv ->
13951411
Cache ->
13961412
PolicyID StandardCrypto ->
13971413
AssetName ->
1398-
ReaderT SqlBackend m DB.MultiAssetId
1399-
insertMultiAsset _syncEnv cache policy aName = do
1414+
ReaderT SqlBackend m (Maybe DB.MultiAssetId)
1415+
insertMultiAsset syncEnv cache policy aName = do
14001416
mId <- queryMAWithCache cache policy aName
14011417
case mId of
1402-
Right maId -> pure maId
1403-
Left (policyBs, assetNameBs) ->
1404-
DB.insertMultiAssetUnchecked $
1405-
DB.MultiAsset
1406-
{ DB.multiAssetPolicy = policyBs
1407-
, DB.multiAssetName = assetNameBs
1408-
, DB.multiAssetFingerprint = DB.unAssetFingerprint (DB.mkAssetFingerprint policyBs assetNameBs)
1409-
}
1418+
Right maId -> pure $ Just maId
1419+
Left (policyBs, assetNameBs) -> do
1420+
-- check if current policyBs matches with any values in MYPolicies whitelist given by user
1421+
case ioWhitelistMAPolicies $ soptInsertOptions $ envOptions syncEnv of
1422+
Strict.Just whiteListWord64 -> do
1423+
let whiteListBS = map (LBS.toStrict . Binary.encode) whiteListWord64
1424+
if policyBs `elem` whiteListBS
1425+
then insertIntoDB policyBs assetNameBs
1426+
else pure Nothing
1427+
Strict.Nothing -> insertIntoDB policyBs assetNameBs
1428+
where
1429+
insertIntoDB policyBs assetNameBs = do
1430+
mid <-
1431+
DB.insertMultiAssetUnchecked $
1432+
DB.MultiAsset
1433+
{ DB.multiAssetPolicy = policyBs
1434+
, DB.multiAssetName = assetNameBs
1435+
, DB.multiAssetFingerprint = DB.unAssetFingerprint (DB.mkAssetFingerprint policyBs assetNameBs)
1436+
}
1437+
pure $ Just mid
14101438

14111439
insertScript ::
14121440
(MonadBaseControl IO m, MonadIO m) =>

0 commit comments

Comments
 (0)