1
+ {-# LANGUAGE PackageImports #-}
2
+
1
3
module HydraAuctionOnchain.Types.BidTerms
2
4
( PBidTerms (PBidTerms )
3
5
, psellerPayout
4
6
, pvalidateBidTerms
5
7
) where
6
8
7
9
import HydraAuctionOnchain.Helpers (pserialise )
10
+ import HydraAuctionOnchain.Lib.Address (paddrPaymentKeyHashUnsafe )
11
+ import HydraAuctionOnchain.Lib.Cose (pmkSigStructure )
8
12
import HydraAuctionOnchain.Types.AuctionTerms (PAuctionTerms , ptotalAuctionFees )
9
13
import HydraAuctionOnchain.Types.BidderInfo (PBidderInfo )
10
14
import Plutarch.Api.V2 (PCurrencySymbol , PPubKeyHash )
11
15
import Plutarch.Crypto (pverifyEd25519Signature )
12
16
import Plutarch.DataRepr (PDataFields )
17
+ import Plutarch.Maybe (pfromJust )
13
18
import Plutarch.Monadic qualified as P
19
+ import "liqwid-plutarch-extra" Plutarch.Extra.List (preplicate )
14
20
15
21
data PBidTerms (s :: S )
16
22
= PBidTerms
@@ -46,34 +52,52 @@ psellerPayout = phoistAcyclic $
46
52
pvalidateBidTerms :: Term s (PCurrencySymbol :--> PAuctionTerms :--> PBidTerms :--> PBool )
47
53
pvalidateBidTerms = phoistAcyclic $
48
54
plam $ \ auctionCs auctionTerms bidTerms -> P. do
55
+ sellerAddr <- plet $ pfield @ " sellerAddress" # auctionTerms
49
56
bidTermsFields <-
50
57
pletFields
51
58
@ [" btBidder" , " btPrice" , " btBidderSignature" , " btSellerSignature" ]
52
59
bidTerms
53
- bidderInfo <- pletFields @ [" biBidderPkh " , " biBidderVk" ] bidTermsFields. btBidder
60
+ bidderInfo <- pletFields @ [" biBidderAddress " , " biBidderVk" ] bidTermsFields. btBidder
54
61
55
62
let sellerSignature = bidTermsFields. btSellerSignature
56
63
sellerVk <- plet $ pfield @ " sellerVk" # auctionTerms
57
- sellerSignatureMsg <-
64
+ sellerSigMsg <-
58
65
plet $
59
66
sellerSignatureMessage
60
67
# auctionCs
61
68
# bidderInfo. biBidderVk
62
69
70
+ sellerSigStruct <-
71
+ plet $ pfromJust #$ pmkSigStructure # sellerAddr # sellerSigMsg # sellerSigMsgLengthHex
72
+
63
73
let
64
74
bidderSignature = bidTermsFields. btBidderSignature
65
75
bidderVk = bidderInfo. biBidderVk
66
- bidderSignatureMsg <-
76
+ bidderAddr = bidderInfo. biBidderAddress
77
+ bidderSigMsg <-
67
78
plet $
68
79
bidderSignatureMessage
69
80
# auctionCs
70
81
# bidTermsFields. btPrice
71
- # bidderInfo. biBidderPkh
82
+ # (paddrPaymentKeyHashUnsafe # bidderAddr)
83
+
84
+ bidderSigStruct <-
85
+ plet $ pfromJust #$ pmkSigStructure # bidderAddr # bidderSigMsg # bidderSigMsgLengthHex
72
86
73
87
-- The seller authorized the bidder to participate in the auction.
74
- (pverifyEd25519Signature # sellerVk # sellerSignatureMsg # sellerSignature)
88
+ (pverifyEd25519Signature # sellerVk # sellerSigStruct # sellerSignature)
75
89
-- The bidder authorized the bid to be submitted in the auction.
76
- #&& (pverifyEd25519Signature # bidderVk # bidderSignatureMsg # bidderSignature)
90
+ #&& (pverifyEd25519Signature # bidderVk # bidderSigStruct # bidderSignature)
91
+
92
+ bidderSigMsgLengthHex :: Term s PByteString
93
+ bidderSigMsgLengthHex =
94
+ -- 69 = 2 (cbor) + 28 (cs) + 2 (cbor) + 28 (pkh) + 9 (lovelace)
95
+ phoistAcyclic $ phexByteStr " 45"
96
+
97
+ sellerSigMsgLengthHex :: Term s PByteString
98
+ sellerSigMsgLengthHex =
99
+ -- 64 = 2 (cbor) + 28 (cs) + 2 (cbor) + 32 (vk)
100
+ phoistAcyclic $ phexByteStr " 40"
77
101
78
102
bidderSignatureMessage
79
103
:: Term
@@ -85,9 +109,19 @@ bidderSignatureMessage
85
109
)
86
110
bidderSignatureMessage = phoistAcyclic $
87
111
plam $ \ auctionCs bidPrice bidderPkh ->
88
- (pserialise # auctionCs) <> (pserialise # bidderPkh) <> (pserialise # bidPrice)
112
+ padMessage # 69 #$ (pserialise # auctionCs)
113
+ <> (pserialise # bidderPkh)
114
+ <> (pserialise # bidPrice)
89
115
90
116
sellerSignatureMessage :: Term s (PCurrencySymbol :--> PByteString :--> PByteString )
91
117
sellerSignatureMessage = phoistAcyclic $
92
118
plam $ \ auctionCs bidderVk ->
93
119
(pserialise # auctionCs) <> (pserialise # bidderVk)
120
+
121
+ padMessage :: Term s (PInteger :--> PByteString :--> PByteString )
122
+ padMessage = phoistAcyclic $
123
+ plam $ \ targetSize message -> P. do
124
+ padSize <- plet $ targetSize - (plengthBS # message)
125
+ let nul = phexByteStr " 00"
126
+ let padding = pfoldl # plam (<>) # mempty #$ preplicate @ PBuiltinList # padSize # nul
127
+ pif (padSize #<= 0 ) message (padding <> message)
0 commit comments