Skip to content

Commit ec8dada

Browse files
committed
feat: wip: implement standing bid validator
1 parent 9d3f9e7 commit ec8dada

File tree

11 files changed

+264
-6
lines changed

11 files changed

+264
-6
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build:
77
cabal v2-build all
88

99
repl:
10-
cabal v2-repl hydra-auction-onchain
10+
cabal v2-repl hydra-auction-onchain --ghc-options '-Wno-missing-import-lists'
1111

1212
format:
1313
fourmolu -m inplace ${hs-sources} && cabal-fmt -i ${cabal-sources} && nix run '.#nixFormat'

hydra-auction-onchain.cabal

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,12 @@ library
107107
HydraAuctionOnchain.Scripts
108108
HydraAuctionOnchain.Types.AuctionInfo
109109
HydraAuctionOnchain.Types.AuctionTerms
110+
HydraAuctionOnchain.Types.BidderInfo
111+
HydraAuctionOnchain.Types.BidTerms
112+
HydraAuctionOnchain.Types.Error
113+
HydraAuctionOnchain.Types.StandingBidState
110114
HydraAuctionOnchain.Validators.AuctionMetadata
115+
HydraAuctionOnchain.Validators.StandingBid
111116

112117
build-depends:
113118
, bytestring

src/HydraAuctionOnchain/Helpers.hs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,28 @@
1-
module HydraAuctionOnchain.Helpers () where
1+
{-# LANGUAGE PackageImports #-}
2+
3+
module HydraAuctionOnchain.Helpers
4+
( pfindUnique
5+
, pfindUniqueOutputWithAddress
6+
, putxoAddress
7+
) where
8+
9+
import Plutarch.Api.V2 (PAddress, PTxInInfo, PTxInfo, PTxOut)
10+
import "liqwid-plutarch-extra" Plutarch.Extra.List (pfromSingleton)
11+
12+
pfindUnique :: PIsListLike l a => Term s ((a :--> PBool) :--> l a :--> PMaybe a)
13+
pfindUnique = phoistAcyclic $
14+
plam $ \predicate list ->
15+
pfromSingleton #$ pfilter # predicate # list
16+
17+
pfindUniqueOutputWithAddress :: Term s (PAddress :--> PTxInfo :--> PMaybe PTxOut)
18+
pfindUniqueOutputWithAddress = phoistAcyclic $
19+
plam $ \addr txInfo ->
20+
pfindUnique
21+
# plam (\out -> (pfield @"address" # out) #== addr)
22+
#$ pfield @"outputs"
23+
# txInfo
24+
25+
putxoAddress :: Term s (PTxInInfo :--> PAddress)
26+
putxoAddress = phoistAcyclic $
27+
plam $ \utxo ->
28+
pfield @"address" #$ pfield @"resolved" # utxo

src/HydraAuctionOnchain/Scripts.hs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
module HydraAuctionOnchain.Scripts
22
( auctionMetadataValidatorScript
33
, auctionMetadataValidatorUntyped
4+
, standingBidValidatorScript
5+
, standingBidValidatorUntyped
46
, writeScript
57
) where
68

79
import Data.Text (Text)
810
import Data.Text qualified as T (unpack)
11+
import HydraAuctionOnchain.Types.AuctionTerms (PAuctionTerms)
912
import HydraAuctionOnchain.Validators.AuctionMetadata (auctionMetadataValidator)
13+
import HydraAuctionOnchain.Validators.StandingBid (standingBidValidator)
1014
import Plutarch (Config (Config), Script, TracingMode (DoTracingAndBinds), compile)
11-
import Plutarch.Api.V2 (PValidator)
15+
import Plutarch.Api.V2 (PCurrencySymbol, PValidator)
1216
import Plutarch.Unsafe (punsafeCoerce)
1317
import Ply.Plutarch.TypedWriter (TypedWriter, writeTypedScript)
1418

19+
--------------------------------------------------------------------------------
20+
-- AuctionMetadata
21+
--------------------------------------------------------------------------------
22+
1523
auctionMetadataValidatorUntyped :: ClosedTerm PValidator
1624
auctionMetadataValidatorUntyped =
1725
phoistAcyclic $ plam $ \datum redeemer ctx ->
@@ -24,6 +32,24 @@ auctionMetadataValidatorUntyped =
2432
auctionMetadataValidatorScript :: Script
2533
auctionMetadataValidatorScript = compileScript auctionMetadataValidatorUntyped
2634

35+
--------------------------------------------------------------------------------
36+
-- StandingBid
37+
--------------------------------------------------------------------------------
38+
39+
standingBidValidatorUntyped :: ClosedTerm (PCurrencySymbol :--> PAuctionTerms :--> PValidator)
40+
standingBidValidatorUntyped =
41+
phoistAcyclic $ plam $ \auctionCs auctionTerms datum redeemer ctx ->
42+
popaque $
43+
standingBidValidator
44+
# auctionCs
45+
# auctionTerms
46+
# punsafeCoerce datum
47+
# punsafeCoerce redeemer
48+
# ctx
49+
50+
standingBidValidatorScript :: Script
51+
standingBidValidatorScript = compileScript standingBidValidatorUntyped
52+
2753
config :: Config
2854
config = Config DoTracingAndBinds
2955

src/HydraAuctionOnchain/Types/AuctionTerms.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Plutarch.Api.V2
1010
, PValue
1111
)
1212
import Plutarch.DataRepr (PDataFields)
13+
import Ply.Plutarch (PlyArgOf)
1314

1415
newtype PAuctionTerms (s :: S)
1516
= PAuctionTerms
@@ -36,3 +37,7 @@ newtype PAuctionTerms (s :: S)
3637

3738
instance DerivePlutusType PAuctionTerms where
3839
type DPTStrat _ = PlutusTypeData
40+
41+
data AuctionTerms
42+
43+
type instance PlyArgOf PAuctionTerms = AuctionTerms
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module HydraAuctionOnchain.Types.BidTerms
2+
( PBidTerms (PBidTerms)
3+
) where
4+
5+
import HydraAuctionOnchain.Types.BidderInfo (PBidderInfo)
6+
import Plutarch.DataRepr (PDataFields)
7+
8+
data PBidTerms (s :: S)
9+
= PBidTerms
10+
( Term
11+
s
12+
( PDataRecord
13+
'[ "btBidder" ':= PBidderInfo
14+
, "btPrice" ':= PInteger
15+
, "btBidderSignature" ':= PByteString
16+
, "btSellerSignature" ':= PByteString
17+
]
18+
)
19+
)
20+
deriving stock (Generic)
21+
deriving anyclass (PlutusType, PIsData, PDataFields, PShow, PEq)
22+
23+
instance DerivePlutusType PBidTerms where
24+
type DPTStrat _ = PlutusTypeData
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module HydraAuctionOnchain.Types.BidderInfo
2+
( PBidderInfo (PBidderInfo)
3+
) where
4+
5+
import Plutarch.Api.V2 (PPubKeyHash)
6+
import Plutarch.DataRepr (PDataFields)
7+
8+
data PBidderInfo (s :: S)
9+
= PBidderInfo
10+
( Term
11+
s
12+
( PDataRecord
13+
'[ "biBidderPkh" ':= PPubKeyHash
14+
, "biBidderVk" ':= PByteString
15+
]
16+
)
17+
)
18+
deriving stock (Generic)
19+
deriving anyclass (PlutusType, PIsData, PDataFields, PShow, PEq)
20+
21+
instance DerivePlutusType PBidderInfo where
22+
type DPTStrat _ = PlutusTypeData
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module HydraAuctionOnchain.Types.Error
2+
( ToErrorCode (toErrorCode)
3+
, err
4+
, perrMaybe
5+
) where
6+
7+
import Plutarch.Extra.Bool (passert)
8+
9+
class ToErrorCode a where
10+
toErrorCode :: Term s (a :--> PString)
11+
12+
err :: (PlutusType e, ToErrorCode e) => e s -> Term s PBool -> Term s a -> Term s a
13+
err e = passert (toErrorCode # pcon e)
14+
15+
perrMaybe :: ToErrorCode e => Term s (e :--> PMaybe a :--> a)
16+
perrMaybe = phoistAcyclic $
17+
plam $ \err mval -> pmatch mval $ \case
18+
PJust val -> val
19+
PNothing -> ptraceError $ toErrorCode # err
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module HydraAuctionOnchain.Types.StandingBidState
2+
( PStandingBidState (PStandingBidState)
3+
) where
4+
5+
import HydraAuctionOnchain.Types.BidTerms (PBidTerms)
6+
import Plutarch.Api.V2 (PMaybeData)
7+
8+
newtype PStandingBidState (s :: S) = PStandingBidState (Term s (PMaybeData PBidTerms))
9+
deriving stock (Generic)
10+
deriving anyclass (PlutusType, PIsData, PShow, PEq)
11+
12+
instance DerivePlutusType PStandingBidState where
13+
type DPTStrat _ = PlutusTypeNewtype

src/HydraAuctionOnchain/Validators/AuctionMetadata.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ instance DerivePlutusType PAuctionMetadataRedeemer where
2323
type DPTStrat _ = PlutusTypeData
2424

2525
auctionMetadataValidator
26-
:: ClosedTerm
26+
:: Term
27+
s
2728
( PAuctionInfo
2829
:--> PAuctionMetadataRedeemer
2930
:--> PScriptContext
3031
:--> PUnit
3132
)
32-
auctionMetadataValidator =
33-
phoistAcyclic $ plam $ \auctionInfo redeemer ctx ->
33+
auctionMetadataValidator = phoistAcyclic $
34+
plam $ \auctionInfo redeemer ctx ->
3435
pmatch redeemer $ \case
3536
RemoveAuctionRedeemer _ -> P.do
3637
auctionCurrencySymbol <- plet $ pfield @"auctionId" # auctionInfo

0 commit comments

Comments
 (0)