packages feed

blockfrost-api-0.2.0.0: src/Blockfrost/Types/Cardano/Scripts.hs

-- | Cardano Scripts responses

module Blockfrost.Types.Cardano.Scripts
  ( Script (..)
  , ScriptType (..)
  , ScriptRedeemer (..)
  , ScriptDatum (..)
  , ScriptJSON (..)
  , ScriptCBOR (..)
  ) where

import Data.Aeson (Value)
import Data.Text (Text)
import Deriving.Aeson
import Servant.Docs (ToSample (..), samples, singleSample)

import Blockfrost.Types.Shared
import Blockfrost.Types.Cardano.Transactions (ValidationPurpose(Spend))

-- | Script type
data ScriptType = Plutus | Timelock
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[ConstructorTagModifier '[ToLower]] ScriptType

instance ToSample ScriptType where
  toSamples = pure $ samples [ Plutus, Timelock ]

-- | Script info
data Script = Script
  { _scriptScriptHash     :: ScriptHash -- ^ Hash of the script
  , _scriptType           :: ScriptType -- ^ Type of the script language
  , _scriptSerialisedSize :: Maybe Integer -- ^ The size of the CBOR serialised script, if a Plutus script
  }
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_script", CamelToSnake]] Script

instance ToSample Script where
  toSamples = pure $ singleSample
    Script
      { _scriptScriptHash = "67f33146617a5e61936081db3b2117cbf59bd2123748f58ac9678656"
      , _scriptType = Plutus
      , _scriptSerialisedSize = Just 3119
      }

-- | Script redeemer
data ScriptRedeemer = ScriptRedeemer
  { _scriptRedeemerTxHash    :: TxHash -- ^ Hash of the transaction
  , _scriptRedeemerTxIndex   :: Integer -- ^ Index of the redeemer within a transaction
  , _scriptRedeemerPurpose   :: ValidationPurpose -- ^ Validation purpose
  , _scriptRedeemerDatumHash :: Text -- ^ Datum hash
  , _scriptRedeemerUnitMem   :: Quantity -- ^ The budget in Memory to run a script
  , _scriptRedeemerUnitSteps :: Quantity -- ^ The budget in Steps to run a script
  , _scriptRedeemerFee       :: Lovelaces -- ^ The fee consumed to run the script
  }
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_scriptRedeemer", CamelToSnake]] ScriptRedeemer

instance ToSample ScriptRedeemer where
  toSamples = pure $ singleSample
    ScriptRedeemer
      { _scriptRedeemerTxHash = "1a0570af966fb355a7160e4f82d5a80b8681b7955f5d44bec0dce628516157f0"
      , _scriptRedeemerTxIndex = 0
      , _scriptRedeemerPurpose = Spend
      , _scriptRedeemerDatumHash = "923918e403bf43c34b4ef6b48eb2ee04babed17320d8d1b9ff9ad086e86f44ec"
      , _scriptRedeemerUnitMem = 1700
      , _scriptRedeemerUnitSteps = 476468
      , _scriptRedeemerFee = 172033
      }

newtype ScriptDatum = ScriptDatum { _scriptDatumJsonValue :: Value }
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_scriptDatum", CamelToSnake]] ScriptDatum

newtype ScriptJSON = ScriptJSON { _scriptJsonJson :: Maybe Value }
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_scriptJson", CamelToSnake]] ScriptJSON

newtype ScriptCBOR = ScriptCBOR { _scriptCborCbor :: Maybe Text }
  deriving stock (Show, Eq, Generic)
  deriving (FromJSON, ToJSON)
  via CustomJSON '[FieldLabelModifier '[StripPrefix "_scriptCbor", CamelToSnake]] ScriptCBOR