@@ -84,6 +84,7 @@ import Control.Monad.Extra (mapMaybeM, whenJust)
84
84
import Control.Monad.Trans.Control (MonadBaseControl )
85
85
import Control.Monad.Trans.Except.Extra (newExceptT )
86
86
import qualified Data.Aeson as Aeson
87
+ import qualified Data.Binary as Binary
87
88
import qualified Data.ByteString.Lazy.Char8 as LBS
88
89
import Data.Either.Extra (eitherToMaybe )
89
90
import Data.Group (invert )
@@ -1335,29 +1336,32 @@ prepareMaTxMint ::
1335
1336
MultiAsset StandardCrypto ->
1336
1337
ExceptT SyncNodeError (ReaderT SqlBackend m ) [DB. MaTxMint ]
1337
1338
prepareMaTxMint syncEnv _tracer cache txId (MultiAsset mintMap) =
1338
- -- TODO: VINCE HERE
1339
1339
concatMapM (lift . prepareOuter) $ Map. toList mintMap
1340
1340
where
1341
1341
prepareOuter ::
1342
1342
(MonadBaseControl IO m , MonadIO m ) =>
1343
1343
(PolicyID StandardCrypto , Map AssetName Integer ) ->
1344
1344
ReaderT SqlBackend m [DB. MaTxMint ]
1345
1345
prepareOuter (policy, aMap) =
1346
- mapM (prepareInner policy) $ Map. toList aMap
1346
+ mapMaybeM (prepareInner policy) $ Map. toList aMap
1347
1347
1348
1348
prepareInner ::
1349
1349
(MonadBaseControl IO m , MonadIO m ) =>
1350
1350
PolicyID StandardCrypto ->
1351
1351
(AssetName , Integer ) ->
1352
- ReaderT SqlBackend m DB. MaTxMint
1352
+ ReaderT SqlBackend m ( Maybe DB. MaTxMint)
1353
1353
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
1361
1365
1362
1366
prepareMaTxOuts ::
1363
1367
(MonadBaseControl IO m , MonadIO m ) =>
@@ -1374,39 +1378,63 @@ prepareMaTxOuts syncEnv _tracer cache maMap =
1374
1378
(PolicyID StandardCrypto , Map AssetName Integer ) ->
1375
1379
ReaderT SqlBackend m [MissingMaTxOut ]
1376
1380
prepareOuter (policy, aMap) =
1377
- mapM (prepareInner policy) $ Map. toList aMap
1381
+ mapMaybeM (prepareInner policy) $ Map. toList aMap
1378
1382
1379
1383
prepareInner ::
1380
1384
(MonadBaseControl IO m , MonadIO m ) =>
1381
1385
PolicyID StandardCrypto ->
1382
1386
(AssetName , Integer ) ->
1383
- ReaderT SqlBackend m MissingMaTxOut
1387
+ ReaderT SqlBackend m ( Maybe MissingMaTxOut )
1384
1388
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 []
1391
1407
1392
1408
insertMultiAsset ::
1393
1409
(MonadBaseControl IO m , MonadIO m ) =>
1394
1410
SyncEnv ->
1395
1411
Cache ->
1396
1412
PolicyID StandardCrypto ->
1397
1413
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
1400
1416
mId <- queryMAWithCache cache policy aName
1401
1417
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
1410
1438
1411
1439
insertScript ::
1412
1440
(MonadBaseControl IO m , MonadIO m ) =>
0 commit comments