Skip to content

Commit f3f3838

Browse files
committed
feat(bidder_deposit): implement ReclaimDepositLoser sub-validator
1 parent 1b8152b commit f3f3838

File tree

5 files changed

+117
-9
lines changed

5 files changed

+117
-9
lines changed

src/HydraAuctionOnchain/Errors/Validators/BidderDeposit.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ data PBidderDepositError (s :: S)
1818
| BidderDeposit'UseDepositWinner'Error'MissingAuctionEscrowInput
1919
| BidderDeposit'UseDepositWinner'Error'AuctionEscrowInputMissingToken
2020
| BidderDeposit'UseDepositWinner'Error'InvalidAuctionEscrowRedeemer
21+
| -- ReclaimDepositLoser errors
22+
BidderDeposit'ReclaimDepositLoser'Error'MissingStandingBidInput
23+
| BidderDeposit'ReclaimDepositLoser'Error'StandingBidInputMissingToken
24+
| BidderDeposit'ReclaimDepositLoser'Error'FailedToDecodeStandingBidState
25+
| BidderDeposit'ReclaimDepositLoser'Error'BidderNotLoser
26+
| BidderDeposit'ReclaimDepositLoser'Error'IncorrectValidityInterval
27+
| BidderDeposit'ReclaimDepositLoser'Error'InvalidBidderAddress
28+
| BidderDeposit'ReclaimDepositLoser'Error'NoBidderConsent
2129
deriving stock (Generic, Eq)
2230
deriving anyclass (PlutusType)
2331

src/HydraAuctionOnchain/Helpers.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module HydraAuctionOnchain.Helpers
99
, pfindUniqueInputWithToken
1010
, pfindUniqueOutputWithAddress
1111
, pfindUniqueOutputWithScriptHash
12+
, pfindUniqueRefInputWithScriptHash
1213
, pgetOwnInput
1314
, pintervalFiniteClosedOpen
1415
, ponlyOneInputFromAddress
@@ -88,6 +89,18 @@ pfindUniqueInputWithScriptHash = phoistAcyclic $
8889
#$ pfield @"inputs"
8990
# txInfo
9091

92+
pfindUniqueRefInputWithScriptHash :: Term s (PScriptHash :--> PTxInfo :--> PMaybe PTxInInfo)
93+
pfindUniqueRefInputWithScriptHash = phoistAcyclic $
94+
plam $ \sh txInfo ->
95+
pfindUnique
96+
# plam
97+
( \utxo -> P.do
98+
addr <- plet $ pfield @"address" #$ pfield @"resolved" # utxo
99+
paddressHasScriptHash # addr # sh
100+
)
101+
#$ pfield @"referenceInputs"
102+
# txInfo
103+
91104
pfindUniqueInputWithToken
92105
:: Term
93106
s

src/HydraAuctionOnchain/Types/AuctionTerms.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module HydraAuctionOnchain.Types.AuctionTerms
55
, pbiddingPeriod
66
, pcleanupPeriod
77
, ppenaltyPeriod
8+
, ppostBiddingPeriod
89
, ppurchasePeriod
910
, ptotalAuctionFees
1011
, pvalidateAuctionTerms
@@ -162,3 +163,8 @@ pcleanupPeriod :: Term s (PAuctionTerms :--> PPOSIXTimeRange)
162163
pcleanupPeriod = phoistAcyclic $
163164
plam $ \auctionTerms ->
164165
Interval.pfrom #$ pfield @"cleanup" # auctionTerms
166+
167+
ppostBiddingPeriod :: Term s (PAuctionTerms :--> PPOSIXTimeRange)
168+
ppostBiddingPeriod = phoistAcyclic $
169+
plam $ \auctionTerms ->
170+
Interval.pfrom #$ pfield @"biddingEnd" # auctionTerms

src/HydraAuctionOnchain/Types/StandingBidState.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ instance PTryFrom PData PStandingBidState
2727
pbidderLost :: Term s (PStandingBidState :--> PBidderInfo :--> PBool)
2828
pbidderLost = phoistAcyclic $
2929
plam $ \bidState bidderInfo ->
30-
pmaybeData
31-
# pcon PTrue
32-
# plam (\bidTerms -> pbidderMadeBid # bidTerms # bidderInfo)
33-
# pto bidState
30+
pnot #$ pbidderWon # bidState # bidderInfo
3431

3532
pbidderWon :: Term s (PStandingBidState :--> PBidderInfo :--> PBool)
3633
pbidderWon = phoistAcyclic $
3734
plam $ \bidState bidderInfo ->
38-
pnot #$ pbidderLost # bidState # bidderInfo
35+
pmaybeData
36+
# pcon PFalse
37+
# plam (\bidTerms -> pbidderMadeBid # bidTerms # bidderInfo)
38+
# pto bidState
3939

4040
----------------------------------------------------------------------
4141
-- Standing bid state transition validation

src/HydraAuctionOnchain/Validators/BidderDeposit.hs

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module HydraAuctionOnchain.Validators.BidderDeposit
44
( PBidderDepositRedeemer
55
( UseDepositWinnerRedeemer
6-
, DepositReclaimedByLoserRedeemer
6+
, ReclaimDepositLoserRedeemer
77
, DepositReclaimedAuctionConcludedRedeemer
88
, DepositCleanupRedeemer
99
)
@@ -14,14 +14,17 @@ import HydraAuctionOnchain.Errors.Validators.BidderDeposit (PBidderDepositError
1414
import HydraAuctionOnchain.Helpers
1515
( pdecodeInlineDatum
1616
, pfindUniqueInputWithScriptHash
17+
, pfindUniqueRefInputWithScriptHash
1718
, pgetOwnInput
1819
, ponlyOneInputFromAddress
1920
, putxoAddress
2021
)
22+
import HydraAuctionOnchain.Lib.Address (paddrPaymentKeyHash)
2123
import HydraAuctionOnchain.Lib.ScriptContext (pinputSpentWithRedeemer)
24+
import HydraAuctionOnchain.Types.AuctionTerms (PAuctionTerms, ppostBiddingPeriod)
2225
import HydraAuctionOnchain.Types.BidderInfo (PBidderInfo)
2326
import HydraAuctionOnchain.Types.Error (errCode, passert, passertMaybe)
24-
import HydraAuctionOnchain.Types.StandingBidState (PStandingBidState, pbidderWon)
27+
import HydraAuctionOnchain.Types.StandingBidState (PStandingBidState, pbidderLost, pbidderWon)
2528
import HydraAuctionOnchain.Types.Tokens
2629
( ptxOutContainsAuctionEscrowToken
2730
, ptxOutContainsStandingBidToken
@@ -30,14 +33,16 @@ import HydraAuctionOnchain.Validators.AuctionEscrow
3033
( PAuctionEscrowRedeemer (BidderBuysRedeemer)
3134
)
3235
import Plutarch.Api.V2 (PCurrencySymbol, PScriptContext, PScriptHash, PTxInfo)
36+
import Plutarch.Extra.Interval (pcontains)
37+
import Plutarch.Extra.ScriptContext (ptxSignedBy)
3338
import Plutarch.Monadic qualified as P
3439

3540
----------------------------------------------------------------------
3641
-- Redeemers
3742

3843
data PBidderDepositRedeemer (s :: S)
3944
= UseDepositWinnerRedeemer (Term s (PDataRecord '[]))
40-
| DepositReclaimedByLoserRedeemer (Term s (PDataRecord '[]))
45+
| ReclaimDepositLoserRedeemer (Term s (PDataRecord '[]))
4146
| DepositReclaimedAuctionConcludedRedeemer (Term s (PDataRecord '[]))
4247
| DepositCleanupRedeemer (Term s (PDataRecord '[]))
4348
deriving stock (Generic)
@@ -57,13 +62,14 @@ bidderDepositValidator
5762
( PScriptHash
5863
:--> PScriptHash
5964
:--> PCurrencySymbol
65+
:--> PAuctionTerms
6066
:--> PBidderInfo
6167
:--> PBidderDepositRedeemer
6268
:--> PScriptContext
6369
:--> PUnit
6470
)
6571
bidderDepositValidator = phoistAcyclic $
66-
plam $ \standingBidSh auctionEscrowSh auctionCs bidderInfo redeemer ctx -> P.do
72+
plam $ \standingBidSh auctionEscrowSh auctionCs auctionTerms bidderInfo redeemer ctx -> P.do
6773
txInfo <- plet $ pfield @"txInfo" # ctx
6874

6975
-- The validator's own input should exist.
@@ -91,8 +97,21 @@ bidderDepositValidator = phoistAcyclic $
9197
# auctionEscrowSh
9298
# auctionCs
9399
# bidderInfo
100+
ReclaimDepositLoserRedeemer _ ->
101+
pcheckReclaimDepositLoser
102+
# txInfo
103+
# standingBidSh
104+
# auctionCs
105+
# auctionTerms
106+
# bidderInfo
94107
_ -> undefined
95108

109+
----------------------------------------------------------------------
110+
-- UseDepositWinner
111+
--
112+
-- Deposit is used by the bidder who won the auction to buy
113+
-- the auction lot.
114+
96115
pcheckUseDepositWinner
97116
:: Term
98117
s
@@ -152,3 +171,65 @@ pcheckUseDepositWinner = phoistAcyclic $
152171
# auctionEscrowInput
153172

154173
pcon PUnit
174+
175+
----------------------------------------------------------------------
176+
-- ReclaimDepositLoser
177+
--
178+
-- The bidder deposit is reclaimed by a bidder that did not win
179+
-- the auction.
180+
181+
pcheckReclaimDepositLoser
182+
:: Term
183+
s
184+
( PTxInfo
185+
:--> PScriptHash
186+
:--> PCurrencySymbol
187+
:--> PAuctionTerms
188+
:--> PBidderInfo
189+
:--> PUnit
190+
)
191+
pcheckReclaimDepositLoser = phoistAcyclic $
192+
plam $ \txInfo standingBidSh auctionCs auctionTerms bidderInfo -> P.do
193+
txInfoFields <- pletFields @["signatories", "validRange"] txInfo
194+
195+
-- There should be exactly one standing bid reference input.
196+
standingBidInput <-
197+
plet $
198+
passertMaybe
199+
$(errCode BidderDeposit'ReclaimDepositLoser'Error'MissingStandingBidInput)
200+
(pfindUniqueRefInputWithScriptHash # standingBidSh # txInfo)
201+
202+
-- The standing bid reference input should contain the standing
203+
-- bid token.
204+
standingBidInputResolved <- plet $ pfield @"resolved" # standingBidInput
205+
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'StandingBidInputMissingToken) $
206+
ptxOutContainsStandingBidToken # auctionCs # standingBidInputResolved
207+
208+
-- The standing bid input contains a datum that can be decoded
209+
-- as a standing bid state.
210+
bidState <-
211+
plet $
212+
passertMaybe
213+
$(errCode BidderDeposit'ReclaimDepositLoser'Error'FailedToDecodeStandingBidState)
214+
(pdecodeInlineDatum @PStandingBidState # standingBidInputResolved)
215+
216+
-- The bidder deposit's bidder lost the auction.
217+
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'BidderNotLoser) $
218+
pbidderLost # bidState # bidderInfo
219+
220+
-- This redeemer can only be used after the bidding period.
221+
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'IncorrectValidityInterval) $
222+
pcontains # (ppostBiddingPeriod # auctionTerms) # txInfoFields.validRange
223+
224+
-- The payment part of the bidder address should be pkh.
225+
bidderPkh <-
226+
plet $
227+
passertMaybe
228+
$(errCode BidderDeposit'ReclaimDepositLoser'Error'InvalidBidderAddress)
229+
(paddrPaymentKeyHash #$ pfield @"biBidderAddress" # bidderInfo)
230+
231+
-- The bidder deposit's bidder signed the transaction.
232+
passert $(errCode BidderDeposit'ReclaimDepositLoser'Error'NoBidderConsent) $
233+
ptxSignedBy # txInfoFields.signatories # pdata bidderPkh
234+
235+
pcon PUnit

0 commit comments

Comments
 (0)