module Singular.Registry.Wire.Request
(
Edge
, edgeInsertAbsent
, edgeInsertActive
, edgeUpdateActive
, edgeUpdateTerminal
, edgeDeleteAbsent
, edgeDeleteActive
, edgeWitnessTerminal
, edgeName
, OnChainRequest (..)
, RequestDestination
, RequestPhase (..)
, requestPhase
) where
import Cardano.Ledger.BaseTypes (SlotNo (..))
import Data.ByteString (ByteString)
import PlutusCore.Data (Data (..))
import PlutusTx.Builtins.Internal
( BuiltinByteString (..)
)
import PlutusTx.IsData.Class
( FromData (..)
, ToData (..)
, UnsafeFromData (..)
)
import Singular.Registry.Wire.Primitive
( OnChainTokenId (..)
, bbsFromD
, bbsToD
, bsFromD
, bsToD
, mkD
, unD
)
type Edge = Integer
edgeInsertAbsent :: Edge
edgeInsertAbsent :: Integer
edgeInsertAbsent = Integer
0
edgeInsertActive :: Edge
edgeInsertActive :: Integer
edgeInsertActive = Integer
1
edgeUpdateActive :: Edge
edgeUpdateActive :: Integer
edgeUpdateActive = Integer
2
edgeUpdateTerminal :: Edge
edgeUpdateTerminal :: Integer
edgeUpdateTerminal = Integer
3
edgeDeleteAbsent :: Edge
edgeDeleteAbsent :: Integer
edgeDeleteAbsent = Integer
4
edgeDeleteActive :: Edge
edgeDeleteActive :: Integer
edgeDeleteActive = Integer
5
edgeWitnessTerminal :: Edge
edgeWitnessTerminal :: Integer
edgeWitnessTerminal = Integer
6
edgeName :: Edge -> String
edgeName :: Integer -> String
edgeName Integer
e = case Integer
e of
Integer
0 -> String
"insertAbsent"
Integer
1 -> String
"insertActive"
Integer
2 -> String
"updateActive"
Integer
3 -> String
"updateTerminal"
Integer
4 -> String
"deleteAbsent"
Integer
5 -> String
"deleteActive"
Integer
6 -> String
"witnessTerminal"
Integer
_ -> String
"edge-" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Integer -> String
forall a. Show a => a -> String
show Integer
e
type RequestDestination = (ByteString, Maybe Data)
data OnChainRequest = OnChainRequest
{ OnChainRequest -> OnChainTokenId
requestToken :: !OnChainTokenId
, OnChainRequest -> BuiltinByteString
requestOwner :: !BuiltinByteString
, OnChainRequest -> ByteString
requestKey :: !ByteString
, OnChainRequest -> Integer
requestEdge :: !Edge
, OnChainRequest -> Integer
requestDeposit :: !Integer
, OnChainRequest -> Integer
requestSubmittedAt :: !Integer
, OnChainRequest -> RequestDestination
requestDestination :: !RequestDestination
}
deriving stock (Int -> OnChainRequest -> String -> String
[OnChainRequest] -> String -> String
OnChainRequest -> String
(Int -> OnChainRequest -> String -> String)
-> (OnChainRequest -> String)
-> ([OnChainRequest] -> String -> String)
-> Show OnChainRequest
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> OnChainRequest -> String -> String
showsPrec :: Int -> OnChainRequest -> String -> String
$cshow :: OnChainRequest -> String
show :: OnChainRequest -> String
$cshowList :: [OnChainRequest] -> String -> String
showList :: [OnChainRequest] -> String -> String
Show, OnChainRequest -> OnChainRequest -> Bool
(OnChainRequest -> OnChainRequest -> Bool)
-> (OnChainRequest -> OnChainRequest -> Bool) -> Eq OnChainRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OnChainRequest -> OnChainRequest -> Bool
== :: OnChainRequest -> OnChainRequest -> Bool
$c/= :: OnChainRequest -> OnChainRequest -> Bool
/= :: OnChainRequest -> OnChainRequest -> Bool
Eq)
data RequestPhase = PhaseAccept | PhaseRetract | PhaseReject
deriving stock (Int -> RequestPhase -> String -> String
[RequestPhase] -> String -> String
RequestPhase -> String
(Int -> RequestPhase -> String -> String)
-> (RequestPhase -> String)
-> ([RequestPhase] -> String -> String)
-> Show RequestPhase
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> RequestPhase -> String -> String
showsPrec :: Int -> RequestPhase -> String -> String
$cshow :: RequestPhase -> String
show :: RequestPhase -> String
$cshowList :: [RequestPhase] -> String -> String
showList :: [RequestPhase] -> String -> String
Show, RequestPhase -> RequestPhase -> Bool
(RequestPhase -> RequestPhase -> Bool)
-> (RequestPhase -> RequestPhase -> Bool) -> Eq RequestPhase
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RequestPhase -> RequestPhase -> Bool
== :: RequestPhase -> RequestPhase -> Bool
$c/= :: RequestPhase -> RequestPhase -> Bool
/= :: RequestPhase -> RequestPhase -> Bool
Eq)
requestPhase
:: SlotNo
-> SlotNo
-> SlotNo
-> RequestPhase
requestPhase :: SlotNo -> SlotNo -> SlotNo -> RequestPhase
requestPhase SlotNo
acceptDeadline SlotNo
retractDeadline SlotNo
tip
| SlotNo
tip SlotNo -> SlotNo -> Bool
forall a. Ord a => a -> a -> Bool
< SlotNo
acceptDeadline = RequestPhase
PhaseAccept
| SlotNo
tip SlotNo -> SlotNo -> Bool
forall a. Ord a => a -> a -> Bool
< SlotNo
retractDeadline = RequestPhase
PhaseRetract
| Bool
otherwise = RequestPhase
PhaseReject
instance ToData OnChainRequest where
toBuiltinData :: OnChainRequest -> BuiltinData
toBuiltinData OnChainRequest{Integer
RequestDestination
ByteString
BuiltinByteString
OnChainTokenId
requestToken :: OnChainRequest -> OnChainTokenId
requestOwner :: OnChainRequest -> BuiltinByteString
requestKey :: OnChainRequest -> ByteString
requestEdge :: OnChainRequest -> Integer
requestDeposit :: OnChainRequest -> Integer
requestSubmittedAt :: OnChainRequest -> Integer
requestDestination :: OnChainRequest -> RequestDestination
requestToken :: OnChainTokenId
requestOwner :: BuiltinByteString
requestKey :: ByteString
requestEdge :: Integer
requestDeposit :: Integer
requestSubmittedAt :: Integer
requestDestination :: RequestDestination
..} =
Data -> BuiltinData
mkD (Data -> BuiltinData) -> Data -> BuiltinData
forall a b. (a -> b) -> a -> b
$
Integer -> [Data] -> Data
Constr
Integer
0
[ BuiltinData -> Data
unD (OnChainTokenId -> BuiltinData
forall a. ToData a => a -> BuiltinData
toBuiltinData OnChainTokenId
requestToken)
, BuiltinByteString -> Data
bbsToD BuiltinByteString
requestOwner
, ByteString -> Data
bsToD ByteString
requestKey
, Integer -> Data
I Integer
requestEdge
, Integer -> Data
I Integer
requestDeposit
, Integer -> Data
I Integer
requestSubmittedAt
, [Data] -> Data
List
[ ByteString -> Data
bsToD (RequestDestination -> ByteString
forall a b. (a, b) -> a
fst RequestDestination
requestDestination)
, Data -> (Data -> Data) -> Maybe Data -> Data
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Integer -> [Data] -> Data
Constr Integer
1 []) (Integer -> [Data] -> Data
Constr Integer
0 ([Data] -> Data) -> (Data -> [Data]) -> Data -> Data
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Data -> [Data]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure) (RequestDestination -> Maybe Data
forall a b. (a, b) -> b
snd RequestDestination
requestDestination)
]
]
instance FromData OnChainRequest where
fromBuiltinData :: BuiltinData -> Maybe OnChainRequest
fromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
Constr
Integer
0
[Data
tok, Data
own, Data
k, I Integer
edge, I Integer
dep, I Integer
sub, List [Data
da, Data
dd]] -> do
requestToken <-
BuiltinData -> Maybe OnChainTokenId
forall a. FromData a => BuiltinData -> Maybe a
fromBuiltinData (Data -> BuiltinData
mkD Data
tok)
requestOwner <- bbsFromD own
requestKey <- bsFromD k
destAddress <- bsFromD da
destDatum <- carriedDatum dd
let requestEdge = Integer
edge
requestDeposit = Integer
dep
requestSubmittedAt = Integer
sub
requestDestination = (ByteString
destAddress, Maybe Data
destDatum)
Just OnChainRequest{..}
Data
_ -> Maybe OnChainRequest
forall a. Maybe a
Nothing
instance UnsafeFromData OnChainRequest where
unsafeFromBuiltinData :: BuiltinData -> OnChainRequest
unsafeFromBuiltinData BuiltinData
bd = case BuiltinData -> Data
unD BuiltinData
bd of
Constr
Integer
0
[Data
tok, B ByteString
own, B ByteString
k, I Integer
edge, I Integer
dep, I Integer
sub, List [B ByteString
da, Data
dd]]
| Just Maybe Data
datum <- Data -> Maybe (Maybe Data)
carriedDatum Data
dd ->
OnChainRequest
{ requestToken :: OnChainTokenId
requestToken =
BuiltinData -> OnChainTokenId
forall a. UnsafeFromData a => BuiltinData -> a
unsafeFromBuiltinData (Data -> BuiltinData
mkD Data
tok)
, requestOwner :: BuiltinByteString
requestOwner =
ByteString -> BuiltinByteString
BuiltinByteString ByteString
own
, requestKey :: ByteString
requestKey = ByteString
k
, requestEdge :: Integer
requestEdge = Integer
edge
, requestDeposit :: Integer
requestDeposit = Integer
dep
, requestSubmittedAt :: Integer
requestSubmittedAt = Integer
sub
, requestDestination :: RequestDestination
requestDestination = (ByteString
da, Maybe Data
datum)
}
Data
_ ->
String -> OnChainRequest
forall a. HasCallStack => String -> a
error
String
"unsafeFromBuiltinData:\
\ OnChainRequest"
carriedDatum :: Data -> Maybe (Maybe Data)
carriedDatum :: Data -> Maybe (Maybe Data)
carriedDatum Data
option = case Data
option of
Constr Integer
0 [Data
datum] -> Maybe Data -> Maybe (Maybe Data)
forall a. a -> Maybe a
Just (Data -> Maybe Data
forall a. a -> Maybe a
Just Data
datum)
Constr Integer
1 [] -> Maybe Data -> Maybe (Maybe Data)
forall a. a -> Maybe a
Just Maybe Data
forall a. Maybe a
Nothing
Data
_ -> Maybe (Maybe Data)
forall a. Maybe a
Nothing