55
66module Wst.Offchain.BuildTx.TransferLogic
77 ( transferSmartTokens ,
8+ FindProofResult (.. ),
89 issueSmartTokens ,
910 SeizeReason (.. ),
1011 seizeSmartTokens ,
@@ -14,6 +15,7 @@ module Wst.Offchain.BuildTx.TransferLogic
1415 removeBlacklistNode ,
1516 paySmartTokensToDestination ,
1617 registerTransferScripts ,
18+ blacklistInitialNode
1719 )
1820where
1921
@@ -54,7 +56,7 @@ import SmartTokens.Contracts.ExampleTransferLogic (BlacklistProof (..))
5456import SmartTokens.Types.ProtocolParams
5557import SmartTokens.Types.PTokenDirectory (BlacklistNode (.. ),
5658 DirectorySetNode (.. ))
57- import Wst.AppError (AppError (BlacklistNodeNotFound , DuplicateBlacklistNode , TransferBlacklistedCredential ))
59+ import Wst.AppError (AppError (BlacklistNodeNotFound , DuplicateBlacklistNode ))
5860import Wst.Offchain.BuildTx.ProgrammableLogic (issueProgrammableToken ,
5961 seizeProgrammableToken ,
6062 transferProgrammableToken )
@@ -222,7 +224,7 @@ issueSmartTokens paramsTxOut (an, q) directoryList destinationCred = Utils.inBab
222224 paySmartTokensToDestination (an, q) issuedPolicyId destinationCred
223225 pure $ C. AssetId issuedPolicyId an
224226
225- transferSmartTokens :: forall env era a m . (MonadReader env m , Env. HasTransferLogicEnv env , Env. HasDirectoryEnv env , C. IsBabbageBasedEra era , MonadBlockchain era m , C. HasScriptLanguageInEra C. PlutusScriptV3 era , MonadBuildTx era m , Env. HasOperatorEnv era env , MonadError (AppError era ) m ) => UTxODat era ProgrammableLogicGlobalParams -> [UTxODat era BlacklistNode ] -> [UTxODat era DirectorySetNode ] -> [UTxODat era a ] -> (C. AssetId , C. Quantity ) -> C. PaymentCredential -> m ()
227+ transferSmartTokens :: forall env era a m . (MonadReader env m , Env. HasTransferLogicEnv env , Env. HasDirectoryEnv env , C. IsBabbageBasedEra era , MonadBlockchain era m , C. HasScriptLanguageInEra C. PlutusScriptV3 era , MonadBuildTx era m , Env. HasOperatorEnv era env , MonadError (AppError era ) m ) => UTxODat era ProgrammableLogicGlobalParams -> [UTxODat era BlacklistNode ] -> [UTxODat era DirectorySetNode ] -> [UTxODat era a ] -> (C. AssetId , C. Quantity ) -> C. PaymentCredential -> m (FindProofResult era )
226228transferSmartTokens paramsTxIn blacklistNodes directoryList spendingUserOutputs (assetId, q) destinationCred = Utils. inBabbage @ era $ do
227229 nid <- queryNetworkId
228230 userCred <- Env. operatorPaymentCredential
@@ -238,7 +240,7 @@ transferSmartTokens paramsTxIn blacklistNodes directoryList spendingUserOutputs
238240 C. AdaAssetId -> error " Ada is not programmable"
239241
240242 transferProgrammableToken paramsTxIn txins (transPolicyId programmablePolicyId) directoryList -- Invoking the programmableBase and global scripts
241- addTransferWitness blacklistNodes -- Proof of non-membership of the blacklist
243+ result <- addTransferWitness blacklistNodes -- Proof of non-membership of the blacklist
242244
243245 -- Send outputs to destinationCred
244246 destStakeCred <- either (error . (" Could not unTrans credential: " <> ) . show ) pure $ unTransStakeCredential $ transCredential destinationCred
@@ -255,6 +257,7 @@ transferSmartTokens paramsTxIn blacklistNodes directoryList spendingUserOutputs
255257 returnAddr = C. makeShelleyAddressInEra C. shelleyBasedEra nid progLogicBaseCred (C. StakeAddressByValue srcStakeCred)
256258 returnOutput = C. TxOut returnAddr returnVal C. TxOutDatumNone C. ReferenceScriptNone
257259 prependTxOut returnOutput -- Add the seized output to the transaction
260+ pure result
258261
259262{-| Reason for adding an address to the blacklist
260263-}
@@ -338,6 +341,7 @@ tryFindProof :: [UTxODat era BlacklistNode] -> Credential -> UTxODat era Blackli
338341tryFindProof blacklistNodes cred =
339342 case findProof blacklistNodes cred of
340343 CredentialNotBlacklisted r -> r
344+ CredentialBlacklisted r -> r
341345 _ -> error $ " tryFindProof failed for " <> show cred
342346
343347{-| Find the blacklist node that covers the credential.
@@ -352,18 +356,10 @@ findProof blacklistNodes cred =
352356 then CredentialBlacklisted node
353357 else CredentialNotBlacklisted node
354358
355- {-| Check that the credential is not blacklisted. Throw an error if the
356- credential is blacklisted.
357- -}
358- checkNotBlacklisted :: forall era m . MonadError (AppError era ) m => [UTxODat era BlacklistNode ] -> Credential -> m ()
359- checkNotBlacklisted nodes cred = case findProof nodes cred of
360- CredentialNotBlacklisted {} -> pure ()
361- _ -> throwError (TransferBlacklistedCredential cred)
362-
363359{-| Add a proof that the user is allowed to transfer programmable tokens.
364360Uses the user from 'HasOperatorEnv env'. Fails if the user is blacklisted.
365361-}
366- addTransferWitness :: forall env era m . (MonadError (AppError era ) m , MonadReader env m , Env. HasOperatorEnv era env , Env. HasTransferLogicEnv env , C. IsBabbageBasedEra era , MonadBlockchain era m , C. HasScriptLanguageInEra C. PlutusScriptV3 era , MonadBuildTx era m ) => [UTxODat era BlacklistNode ] -> m ()
362+ addTransferWitness :: forall env era m . (MonadError (AppError era ) m , MonadReader env m , Env. HasOperatorEnv era env , Env. HasTransferLogicEnv env , C. IsBabbageBasedEra era , MonadBlockchain era m , C. HasScriptLanguageInEra C. PlutusScriptV3 era , MonadBuildTx era m ) => [UTxODat era BlacklistNode ] -> m (FindProofResult era )
367363addTransferWitness blacklistNodes = Utils. inBabbage @ era $ do
368364 opPkh <- asks (fst . Env. bteOperator . Env. operatorEnv) -- In this case 'operator' is the user
369365 nid <- queryNetworkId
@@ -390,20 +386,20 @@ addTransferWitness blacklistNodes = Utils.inBabbage @era $ do
390386 -- This means we're traversing the list of blacklist nodes an additional time.
391387 -- But here is the only place where we can use MonadError. So we have to do it
392388 -- here to allow the client code to handle the error properly.
393- checkNotBlacklisted blacklistNodes (transCredential $ C. PaymentCredentialByKey opPkh)
389+ let proofResult = findProof blacklistNodes (transCredential $ C. PaymentCredentialByKey opPkh)
394390
395391 addRequiredSignature opPkh
396392 addReferencesWithTxBody witnessReferences
397393 addWithdrawalWithTxBody -- Add the global script witness to the transaction
398394 (C. makeStakeAddress nid transferStakeCred)
399395 (C. Quantity 0 )
400396 $ C. ScriptWitness C. ScriptWitnessForStakeAddr . transferStakeWitness
397+ pure proofResult
401398
402399addReferencesWithTxBody :: (MonadBuildTx era m , C. IsBabbageBasedEra era ) => (C. TxBodyContent C. BuildTx era -> [C. TxIn ]) -> m ()
403400addReferencesWithTxBody f =
404401 addTxBuilder (TxBuilder $ \ body -> over (L. txInsReference . L. _TxInsReferenceIso) (nub . (f body <> )))
405402
406-
407403addSeizeWitness :: forall env era m . (MonadReader env m , Env. HasOperatorEnv era env , Env. HasTransferLogicEnv env , C. IsBabbageBasedEra era , MonadBlockchain era m , C. HasScriptLanguageInEra C. PlutusScriptV3 era , MonadBuildTx era m ) => m ()
408404addSeizeWitness = Utils. inBabbage @ era $ do
409405 opPkh <- asks (fst . Env. bteOperator . Env. operatorEnv)
0 commit comments