Skip to content

Commit 5de79d8

Browse files
committed
feat(bidder_deposit): implement ReclaimDepositConcluded sub-validator
1 parent b0304b2 commit 5de79d8

File tree

2 files changed

+104
-22
lines changed

2 files changed

+104
-22
lines changed

src/HydraAuctionOnchain/Errors/Validators/BidderDeposit.hs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,18 @@ data PBidderDepositError (s :: S)
2626
| BidderDeposit'ReclaimDepositLoser'Error'IncorrectValidityInterval
2727
| BidderDeposit'ReclaimDepositLoser'Error'InvalidBidderAddress
2828
| BidderDeposit'ReclaimDepositLoser'Error'NoBidderConsent
29-
| -- DepositCleanup errors
30-
BidderDeposit'DepositCleanup'Error'IncorrectValidityInterval
31-
| BidderDeposit'DepositCleanup'Error'InvalidBidderAddress
32-
| BidderDeposit'DepositCleanup'Error'NoBidderConsent
29+
| -- ReclaimDepositAuctionConcluded errors
30+
BidderDeposit'ReclaimDepositConcluded'Error'MissingAuctionRefInput
31+
| BidderDeposit'ReclaimDepositConcluded'Error'AuctionRefInputMissingToken
32+
| BidderDeposit'ReclaimDepositConcluded'Error'FailedToDecodeAuctionState
33+
| BidderDeposit'ReclaimDepositConcluded'Error'AuctionNotConcluded
34+
| BidderDeposit'ReclaimDepositConcluded'Error'IncorrectValidityInterval
35+
| BidderDeposit'ReclaimDepositConcluded'Error'InvalidBidderAddress
36+
| BidderDeposit'ReclaimDepositConcluded'Error'NoBidderConsent
37+
| -- ReclaimDepositCleanup errors
38+
BidderDeposit'ReclaimDepositCleanup'Error'IncorrectValidityInterval
39+
| BidderDeposit'ReclaimDepositCleanup'Error'InvalidBidderAddress
40+
| BidderDeposit'ReclaimDepositCleanup'Error'NoBidderConsent
3341
deriving stock (Generic, Eq)
3442
deriving anyclass (PlutusType)
3543

src/HydraAuctionOnchain/Validators/BidderDeposit.hs

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ module HydraAuctionOnchain.Validators.BidderDeposit
44
( PBidderDepositRedeemer
55
( UseDepositWinnerRedeemer
66
, ReclaimDepositLoserRedeemer
7-
, DepositReclaimedAuctionConcludedRedeemer
8-
, DepositCleanupRedeemer
7+
, ReclaimDepositAuctionConcludedRedeemer
8+
, ReclaimDepositCleanupRedeemer
99
)
1010
, bidderDepositValidator
1111
) where
@@ -21,6 +21,7 @@ import HydraAuctionOnchain.Helpers
2121
)
2222
import HydraAuctionOnchain.Lib.Address (paddrPaymentKeyHash)
2323
import HydraAuctionOnchain.Lib.ScriptContext (pinputSpentWithRedeemer)
24+
import HydraAuctionOnchain.Types.AuctionEscrowState (PAuctionEscrowState (AuctionConcluded))
2425
import HydraAuctionOnchain.Types.AuctionTerms
2526
( PAuctionTerms
2627
, pcleanupPeriod
@@ -47,8 +48,8 @@ import Plutarch.Monadic qualified as P
4748
data PBidderDepositRedeemer (s :: S)
4849
= UseDepositWinnerRedeemer (Term s (PDataRecord '[]))
4950
| ReclaimDepositLoserRedeemer (Term s (PDataRecord '[]))
50-
| DepositReclaimedAuctionConcludedRedeemer (Term s (PDataRecord '[]))
51-
| DepositCleanupRedeemer (Term s (PDataRecord '[]))
51+
| ReclaimDepositAuctionConcludedRedeemer (Term s (PDataRecord '[]))
52+
| ReclaimDepositCleanupRedeemer (Term s (PDataRecord '[]))
5253
deriving stock (Generic)
5354
deriving anyclass (PlutusType, PIsData, PShow, PEq)
5455

@@ -108,12 +109,18 @@ bidderDepositValidator = phoistAcyclic $
108109
# auctionCs
109110
# auctionTerms
110111
# bidderInfo
111-
DepositCleanupRedeemer _ ->
112-
pcheckDepositCleanup
112+
ReclaimDepositAuctionConcludedRedeemer _ ->
113+
pcheckReclaimDepositAuctionConcluded
114+
# txInfo
115+
# auctionEscrowSh
116+
# auctionCs
117+
# auctionTerms
118+
# bidderInfo
119+
ReclaimDepositCleanupRedeemer _ ->
120+
pcheckReclaimDepositCleanup
113121
# txInfo
114122
# auctionTerms
115123
# bidderInfo
116-
_ -> undefined
117124

118125
----------------------------------------------------------------------
119126
-- UseDepositWinner
@@ -152,7 +159,7 @@ pcheckUseDepositWinner = phoistAcyclic $
152159
plet $
153160
passertMaybe
154161
$(errCode BidderDeposit'UseDepositWinner'Error'FailedToDecodeStandingBidState)
155-
(pdecodeInlineDatum @PStandingBidState # standingBidInputResolved)
162+
(pdecodeInlineDatum # standingBidInputResolved)
156163

157164
-- The bidder deposit's bidder won the auction.
158165
passert $(errCode BidderDeposit'UseDepositWinner'Error'BidderNotWinner) $
@@ -202,25 +209,25 @@ pcheckReclaimDepositLoser = phoistAcyclic $
202209
txInfoFields <- pletFields @["signatories", "validRange"] txInfo
203210

204211
-- There should be exactly one standing bid reference input.
205-
standingBidInput <-
212+
standingBidRefInput <-
206213
plet $
207214
passertMaybe
208215
$(errCode BidderDeposit'ReclaimDepositLoser'Error'MissingStandingBidInput)
209216
(pfindUniqueRefInputWithScriptHash # standingBidSh # txInfo)
210217

211218
-- The standing bid reference input should contain the standing
212219
-- bid token.
213-
standingBidInputResolved <- plet $ pfield @"resolved" # standingBidInput
220+
standingBidRefInputResolved <- plet $ pfield @"resolved" # standingBidRefInput
214221
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'StandingBidInputMissingToken) $
215-
ptxOutContainsStandingBidToken # auctionCs # standingBidInputResolved
222+
ptxOutContainsStandingBidToken # auctionCs # standingBidRefInputResolved
216223

217224
-- The standing bid input contains a datum that can be decoded
218225
-- as a standing bid state.
219226
bidState <-
220227
plet $
221228
passertMaybe
222229
$(errCode BidderDeposit'ReclaimDepositLoser'Error'FailedToDecodeStandingBidState)
223-
(pdecodeInlineDatum @PStandingBidState # standingBidInputResolved)
230+
(pdecodeInlineDatum @PStandingBidState # standingBidRefInputResolved)
224231

225232
-- The bidder deposit's bidder lost the auction.
226233
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'BidderNotLoser) $
@@ -244,30 +251,97 @@ pcheckReclaimDepositLoser = phoistAcyclic $
244251
pcon PUnit
245252

246253
----------------------------------------------------------------------
247-
-- DepositCleanup
254+
-- ReclaimDepositAuctionConcluded
255+
--
256+
-- The bidder deposit is reclaimed by a bidder after the auction
257+
-- conclusion. If the auction has concluded then the seller and the
258+
-- winning bidder have already had an opportunity to claim
259+
-- whichever deposits they are entitled to.
260+
261+
pcheckReclaimDepositAuctionConcluded
262+
:: Term
263+
s
264+
( PTxInfo
265+
:--> PScriptHash
266+
:--> PCurrencySymbol
267+
:--> PAuctionTerms
268+
:--> PBidderInfo
269+
:--> PUnit
270+
)
271+
pcheckReclaimDepositAuctionConcluded = phoistAcyclic $
272+
plam $ \txInfo auctionEscrowSh auctionCs auctionTerms bidderInfo -> P.do
273+
txInfoFields <- pletFields @["signatories", "validRange"] txInfo
274+
275+
-- There should be exactly one auction escrow reference input.
276+
auctionEscrowRefInput <-
277+
plet $
278+
passertMaybe
279+
$(errCode BidderDeposit'ReclaimDepositConcluded'Error'MissingAuctionRefInput)
280+
(pfindUniqueRefInputWithScriptHash # auctionEscrowSh # txInfo)
281+
282+
-- The auction escrow reference input should contain the auction
283+
-- escrow token.
284+
auctionEscrowRefInputResolved <- plet $ pfield @"resolved" # auctionEscrowRefInput
285+
passert $(errCode BidderDeposit'ReclaimDepositConcluded'Error'AuctionRefInputMissingToken) $
286+
ptxOutContainsStandingBidToken # auctionCs # auctionEscrowRefInputResolved
287+
288+
-- The auction escrow input contains a datum that can be
289+
-- decoded as an auction escrow state.
290+
auctionState <-
291+
plet $
292+
passertMaybe
293+
$(errCode BidderDeposit'ReclaimDepositConcluded'Error'FailedToDecodeAuctionState)
294+
(pdecodeInlineDatum # auctionEscrowRefInputResolved)
295+
296+
-- The auction is concluded.
297+
passert $(errCode BidderDeposit'ReclaimDepositConcluded'Error'AuctionNotConcluded) $
298+
auctionState #== pcon (AuctionConcluded pdnil)
299+
300+
-- This redeemer can only be used after the bidding period.
301+
-- TODO: Remove this check? It is probably redundant since the
302+
-- auction can only conclude after the bidding end time, which is
303+
-- enforced by the auction escrow validator.
304+
passert $(errCode BidderDeposit'ReclaimDepositConcluded'Error'IncorrectValidityInterval) $
305+
pcontains # (ppostBiddingPeriod # auctionTerms) # txInfoFields.validRange
306+
307+
-- The payment part of the bidder address should be pkh.
308+
bidderPkh <-
309+
plet $
310+
passertMaybe
311+
$(errCode BidderDeposit'ReclaimDepositConcluded'Error'InvalidBidderAddress)
312+
(paddrPaymentKeyHash #$ pfield @"biBidderAddress" # bidderInfo)
313+
314+
-- The bidder deposit's bidder signed the transaction.
315+
passert $(errCode BidderDeposit'ReclaimDepositConcluded'Error'NoBidderConsent) $
316+
ptxSignedBy # txInfoFields.signatories # pdata bidderPkh
317+
318+
pcon PUnit
319+
320+
----------------------------------------------------------------------
321+
-- ReclaimDepositCleanup
248322
--
249323
-- If, for whatever reason, there are bidder deposits left during
250324
-- the cleanup period, then whoever placed a deposit can freely
251325
-- reclaim it.
252326

253-
pcheckDepositCleanup :: Term s (PTxInfo :--> PAuctionTerms :--> PBidderInfo :--> PUnit)
254-
pcheckDepositCleanup = phoistAcyclic $
327+
pcheckReclaimDepositCleanup :: Term s (PTxInfo :--> PAuctionTerms :--> PBidderInfo :--> PUnit)
328+
pcheckReclaimDepositCleanup = phoistAcyclic $
255329
plam $ \txInfo auctionTerms bidderInfo -> P.do
256330
txInfoFields <- pletFields @["signatories", "validRange"] txInfo
257331

258332
-- This redeemer can only be used during the cleanup period.
259-
passert $(errCode BidderDeposit'DepositCleanup'Error'IncorrectValidityInterval) $
333+
passert $(errCode BidderDeposit'ReclaimDepositCleanup'Error'IncorrectValidityInterval) $
260334
pcontains # (pcleanupPeriod # auctionTerms) # txInfoFields.validRange
261335

262336
-- The payment part of the bidder address should be pkh.
263337
bidderPkh <-
264338
plet $
265339
passertMaybe
266-
$(errCode BidderDeposit'DepositCleanup'Error'InvalidBidderAddress)
340+
$(errCode BidderDeposit'ReclaimDepositCleanup'Error'InvalidBidderAddress)
267341
(paddrPaymentKeyHash #$ pfield @"biBidderAddress" # bidderInfo)
268342

269343
-- The bidder deposit's bidder signed the transaction.
270-
passert $(errCode BidderDeposit'DepositCleanup'Error'NoBidderConsent) $
344+
passert $(errCode BidderDeposit'ReclaimDepositCleanup'Error'NoBidderConsent) $
271345
ptxSignedBy # txInfoFields.signatories # pdata bidderPkh
272346

273347
pcon PUnit

0 commit comments

Comments
 (0)