Skip to content

Commit 36be989

Browse files
committed
feat(bidder_deposit)!: implement ClaimDepositSeller sub-validator
1 parent b01d7a8 commit 36be989

File tree

5 files changed

+102
-4
lines changed

5 files changed

+102
-4
lines changed

compiled/bidder_deposit_validator.plutus

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HydraAuctionOnchain/Errors/Validators/BidderDeposit.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ data PBidderDepositError (s :: S)
1818
| BidderDeposit'UseDepositWinner'Error'MissingAuctionEscrowInput
1919
| BidderDeposit'UseDepositWinner'Error'AuctionEscrowInputMissingToken
2020
| BidderDeposit'UseDepositWinner'Error'InvalidAuctionEscrowRedeemer
21+
| -- ClaimDepositSeller errors
22+
BidderDeposit'ClaimDepositSeller'Error'IncorrectValidityInterval
23+
| BidderDeposit'ClaimDepositSeller'Error'MissingStandingBidInput
24+
| BidderDeposit'ClaimDepositSeller'Error'StandingBidInputMissingToken
25+
| BidderDeposit'ClaimDepositSeller'Error'FailedToDecodeStandingBidState
26+
| BidderDeposit'ClaimDepositSeller'Error'BidderNotWinner
27+
| BidderDeposit'ClaimDepositSeller'Error'MissingAuctionEscrowInput
28+
| BidderDeposit'ClaimDepositSeller'Error'AuctionEscrowInputMissingToken
29+
| BidderDeposit'ClaimDepositSeller'Error'InvalidAuctionEscrowRedeemer
2130
| -- ReclaimDepositLoser errors
2231
BidderDeposit'ReclaimDepositLoser'Error'MissingStandingBidInput
2332
| BidderDeposit'ReclaimDepositLoser'Error'StandingBidInputMissingToken

src/HydraAuctionOnchain/Types/AuctionTerms.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module HydraAuctionOnchain.Types.AuctionTerms
66
, pcleanupPeriod
77
, ppenaltyPeriod
88
, ppostBiddingPeriod
9+
, ppostPurchasePeriod
910
, ppurchasePeriod
1011
, ptotalAuctionFees
1112
, pvalidateAuctionTerms
@@ -168,3 +169,8 @@ ppostBiddingPeriod :: Term s (PAuctionTerms :--> PPOSIXTimeRange)
168169
ppostBiddingPeriod = phoistAcyclic $
169170
plam $ \auctionTerms ->
170171
Interval.pfrom #$ pfield @"biddingEnd" # auctionTerms
172+
173+
ppostPurchasePeriod :: Term s (PAuctionTerms :--> PPOSIXTimeRange)
174+
ppostPurchasePeriod = phoistAcyclic $
175+
plam $ \auctionTerms ->
176+
Interval.pfrom #$ pfield @"purchaseDeadline" # auctionTerms

src/HydraAuctionOnchain/Validators/AuctionEscrow.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ pcheckStartBidding = phoistAcyclic $
255255
pcon PUnit
256256

257257
----------------------------------------------------------------------
258-
-- StartBidding
258+
-- BidderBuys
259259

260260
pcheckBidderBuys
261261
:: Term

src/HydraAuctionOnchain/Validators/BidderDeposit.hs

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module HydraAuctionOnchain.Validators.BidderDeposit
44
( PBidderDepositRedeemer
55
( UseDepositWinnerRedeemer
6+
, ClaimDepositSellerRedeemer
67
, ReclaimDepositLoserRedeemer
78
, ReclaimDepositAuctionConcludedRedeemer
89
, ReclaimDepositCleanupRedeemer
@@ -26,6 +27,7 @@ import HydraAuctionOnchain.Types.AuctionTerms
2627
( PAuctionTerms
2728
, pcleanupPeriod
2829
, ppostBiddingPeriod
30+
, ppostPurchasePeriod
2931
)
3032
import HydraAuctionOnchain.Types.BidderInfo (PBidderInfo)
3133
import HydraAuctionOnchain.Types.Error (errCode, passert, passertMaybe)
@@ -36,7 +38,7 @@ import HydraAuctionOnchain.Types.Tokens
3638
, ptxOutContainsStandingBidToken
3739
)
3840
import HydraAuctionOnchain.Validators.AuctionEscrow
39-
( PAuctionEscrowRedeemer (BidderBuysRedeemer)
41+
( PAuctionEscrowRedeemer (BidderBuysRedeemer, SellerReclaimsRedeemer)
4042
)
4143
import Plutarch.Api.V2 (PCurrencySymbol, PScriptContext, PTxInfo)
4244
import Plutarch.Extra.Interval (pcontains)
@@ -48,6 +50,7 @@ import Plutarch.Monadic qualified as P
4850

4951
data PBidderDepositRedeemer (s :: S)
5052
= UseDepositWinnerRedeemer (Term s (PDataRecord '[]))
53+
| ClaimDepositSellerRedeemer (Term s (PDataRecord '[]))
5154
| ReclaimDepositLoserRedeemer (Term s (PDataRecord '[]))
5255
| ReclaimDepositAuctionConcludedRedeemer (Term s (PDataRecord '[]))
5356
| ReclaimDepositCleanupRedeemer (Term s (PDataRecord '[]))
@@ -103,6 +106,14 @@ bidderDepositValidator = phoistAcyclic $
103106
# auctionEscrowSh
104107
# auctionCs
105108
# bidderInfo
109+
ClaimDepositSellerRedeemer _ ->
110+
pcheckClaimDepositSeller
111+
# txInfo
112+
# standingBidSh
113+
# auctionEscrowSh
114+
# auctionCs
115+
# auctionTerms
116+
# bidderInfo
106117
ReclaimDepositLoserRedeemer _ ->
107118
pcheckReclaimDepositLoser
108119
# txInfo
@@ -189,6 +200,78 @@ pcheckUseDepositWinner = phoistAcyclic $
189200

190201
pcon PUnit
191202

203+
----------------------------------------------------------------------
204+
-- ClaimDepositSeller
205+
--
206+
-- The bidder deposit is claimed by the seller if the auction lot has
207+
-- not been purchased before the purchase deadline.
208+
209+
pcheckClaimDepositSeller
210+
:: Term
211+
s
212+
( PTxInfo
213+
:--> PStandingBidScriptHash
214+
:--> PAuctionEscrowScriptHash
215+
:--> PCurrencySymbol
216+
:--> PAuctionTerms
217+
:--> PBidderInfo
218+
:--> PUnit
219+
)
220+
pcheckClaimDepositSeller = phoistAcyclic $
221+
plam $ \txInfo standingBidSh auctionEscrowSh auctionCs auctionTerms bidderInfo -> P.do
222+
-- This redeemer can only be used after the purchase deadline.
223+
validRange <- plet $ pfield @"validRange" # txInfo
224+
passert $(errCode BidderDeposit'ClaimDepositSeller'Error'IncorrectValidityInterval) $
225+
pcontains # (ppostPurchasePeriod # auctionTerms) # validRange
226+
227+
-- There should be exactly one standing bid input.
228+
standingBidInput <-
229+
plet $
230+
passertMaybe
231+
$(errCode BidderDeposit'ClaimDepositSeller'Error'MissingStandingBidInput)
232+
(pfindUniqueInputWithScriptHash # pto standingBidSh # txInfo)
233+
234+
-- The standing bid input should contain the standing
235+
-- bid token.
236+
standingBidInputResolved <- plet $ pfield @"resolved" # standingBidInput
237+
passert $(errCode BidderDeposit'ClaimDepositSeller'Error'StandingBidInputMissingToken) $
238+
ptxOutContainsStandingBidToken # auctionCs # standingBidInputResolved
239+
240+
-- The standing bid input contains a datum that can be decoded
241+
-- as a standing bid state.
242+
bidState <-
243+
plet $
244+
passertMaybe
245+
$(errCode BidderDeposit'ClaimDepositSeller'Error'FailedToDecodeStandingBidState)
246+
(pdecodeInlineDatum # standingBidInputResolved)
247+
248+
-- The bidder deposit's bidder won the auction.
249+
passert $(errCode BidderDeposit'ClaimDepositSeller'Error'BidderNotWinner) $
250+
pbidderWon # bidState # bidderInfo
251+
252+
-- There should be exactly one auction escrow input.
253+
auctionEscrowInput <-
254+
plet $
255+
passertMaybe
256+
$(errCode BidderDeposit'ClaimDepositSeller'Error'MissingAuctionEscrowInput)
257+
(pfindUniqueInputWithScriptHash # pto auctionEscrowSh # txInfo)
258+
259+
-- The auction escrow input should contain the auction
260+
-- escrow token.
261+
auctionEscrowInputResolved <- plet $ pfield @"resolved" # auctionEscrowInput
262+
passert $(errCode BidderDeposit'ClaimDepositSeller'Error'AuctionEscrowInputMissingToken) $
263+
ptxOutContainsAuctionEscrowToken # auctionCs # auctionEscrowInputResolved
264+
265+
-- The auction escrow input is being spent with
266+
-- the `SellerReclaims` redeemer.
267+
passert $(errCode BidderDeposit'ClaimDepositSeller'Error'InvalidAuctionEscrowRedeemer) $
268+
pinputSpentWithRedeemer
269+
# plam (\redeemer -> redeemer #== pcon (SellerReclaimsRedeemer pdnil))
270+
# txInfo
271+
# auctionEscrowInput
272+
273+
pcon PUnit
274+
192275
----------------------------------------------------------------------
193276
-- ReclaimDepositLoser
194277
--

0 commit comments

Comments
 (0)