1
1
package rfqmessages
2
2
3
3
import (
4
- "bytes"
5
- "encoding/binary"
6
- "fmt"
4
+ "crypto/sha256"
7
5
"io"
8
6
9
7
"github.com/btcsuite/btcd/btcec/v2"
@@ -26,14 +24,51 @@ func QuoteRequestIDRecord(id *[32]byte) tlv.Record {
26
24
return tlv .MakePrimitiveRecord (QuoteRequestIDType , id )
27
25
}
28
26
29
- func QuoteRequestAssetIDRecord (assetID * asset.ID ) tlv.Record {
30
- assetIdBytes := assetID [:]
31
- return tlv .MakePrimitiveRecord (QuoteRequestAssetIDType , & assetIdBytes )
27
+ func QuoteRequestAssetIDRecord (assetID * * asset.ID ) tlv.Record {
28
+ const recordSize = sha256 .Size
29
+
30
+ return tlv .MakeStaticRecord (
31
+ QuoteRequestAssetIDType , assetID , recordSize ,
32
+ IDEncoder , IDDecoder ,
33
+ )
32
34
}
33
35
34
- func QuoteRequestGroupKeyRecord (groupKey * btcec.PublicKey ) tlv.Record {
35
- return tlv .MakePrimitiveRecord (
36
- QuoteRequestGroupKeyType , & groupKey ,
36
+ func IDEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
37
+ if t , ok := val .(* * asset.ID ); ok {
38
+ id := [sha256 .Size ]byte (* * t )
39
+ return tlv .EBytes32 (w , & id , buf )
40
+ }
41
+
42
+ return tlv .NewTypeForEncodingErr (val , "AssetID" )
43
+ }
44
+
45
+ func IDDecoder (r io.Reader , val any , buf * [8 ]byte , l uint64 ) error {
46
+ const assetIDBytesLen = sha256 .Size
47
+
48
+ if typ , ok := val .(* * asset.ID ); ok {
49
+ var idBytes [assetIDBytesLen ]byte
50
+
51
+ err := tlv .DBytes32 (r , & idBytes , buf , assetIDBytesLen )
52
+ if err != nil {
53
+ return err
54
+ }
55
+
56
+ id := asset .ID (idBytes )
57
+ assetId := & id
58
+
59
+ * typ = assetId
60
+ return nil
61
+ }
62
+
63
+ return tlv .NewTypeForDecodingErr (val , "AssetID" , l , sha256 .Size )
64
+ }
65
+
66
+ func QuoteRequestGroupKeyRecord (groupKey * * btcec.PublicKey ) tlv.Record {
67
+ const recordSize = btcec .PubKeyBytesLenCompressed
68
+
69
+ return tlv .MakeStaticRecord (
70
+ QuoteRequestGroupKeyType , groupKey , recordSize ,
71
+ asset .CompressedPubKeyEncoder , asset .CompressedPubKeyDecoder ,
37
72
)
38
73
}
39
74
@@ -91,11 +126,11 @@ func (q *QuoteRequest) EncodeRecords() []tlv.Record {
91
126
records = append (records , QuoteRequestIDRecord (& q .ID ))
92
127
93
128
if q .AssetID != nil {
94
- records = append (records , QuoteRequestAssetIDRecord (q .AssetID ))
129
+ records = append (records , QuoteRequestAssetIDRecord (& q .AssetID ))
95
130
}
96
131
97
132
if q .AssetGroupKey != nil {
98
- record := QuoteRequestGroupKeyRecord (q .AssetGroupKey )
133
+ record := QuoteRequestGroupKeyRecord (& q .AssetGroupKey )
99
134
records = append (records , record )
100
135
}
101
136
@@ -120,8 +155,8 @@ func (q *QuoteRequest) Encode(writer io.Writer) error {
120
155
func (q * QuoteRequest ) DecodeRecords () []tlv.Record {
121
156
return []tlv.Record {
122
157
QuoteRequestIDRecord (& q .ID ),
123
- QuoteRequestAssetIDRecord (q .AssetID ),
124
- QuoteRequestGroupKeyRecord (q .AssetGroupKey ),
158
+ QuoteRequestAssetIDRecord (& q .AssetID ),
159
+ QuoteRequestGroupKeyRecord (& q .AssetGroupKey ),
125
160
QuoteRequestAssetAmountRecord (& q .AssetAmount ),
126
161
QuoteRequestAmtCharacteristicRecord (& q .SuggestedRateTick ),
127
162
}
@@ -135,71 +170,3 @@ func (q *QuoteRequest) Decode(r io.Reader) error {
135
170
}
136
171
return stream .Decode (r )
137
172
}
138
-
139
- // EncodeNonTlv serializes the QuoteRequest struct into a byte slice.
140
- func (q * QuoteRequest ) EncodeNonTlv () ([]byte , error ) {
141
- buf := new (bytes.Buffer )
142
-
143
- _ , err := buf .Write (q .ID [:])
144
- if err != nil {
145
- return nil , err
146
- }
147
-
148
- _ , err = buf .Write (q .AssetID [:])
149
- if err != nil {
150
- return nil , err
151
- }
152
-
153
- var groupKeyBytes [33 ]byte
154
- if q .AssetGroupKey != nil {
155
- k := q .AssetGroupKey .SerializeCompressed ()
156
- copy (groupKeyBytes [:], k )
157
- }
158
- _ , err = buf .Write (groupKeyBytes [:])
159
- if err != nil {
160
- return nil , err
161
- }
162
-
163
- err = binary .Write (buf , binary .BigEndian , q .AssetAmount )
164
- if err != nil {
165
- return nil , err
166
- }
167
-
168
- err = binary .Write (buf , binary .BigEndian , q .SuggestedRateTick )
169
- if err != nil {
170
- return nil , err
171
- }
172
-
173
- return buf .Bytes (), nil
174
- }
175
-
176
- // DecodeNonTlv populates a QuoteRequest instance from a byte slice
177
- func (q * QuoteRequest ) DecodeNonTlv (data []byte ) error {
178
- if len (data ) != 113 {
179
- return fmt .Errorf ("invalid data length" )
180
- }
181
-
182
- var err error
183
-
184
- // Parse the request's ID.
185
- copy (q .ID [:], data [:32 ])
186
-
187
- // Parse the asset's ID.
188
- copy (q .AssetID [:], data [32 :64 ])
189
-
190
- // Parse the asset's compressed public group key.
191
- var compressedPubGroupKeyBytes []byte
192
- copy (compressedPubGroupKeyBytes [:], data [64 :97 ])
193
- q .AssetGroupKey , err = btcec .ParsePubKey (
194
- compressedPubGroupKeyBytes ,
195
- )
196
- if err != nil {
197
- return fmt .Errorf ("unable to parse compressed public group " +
198
- "key: %w" , err )
199
- }
200
-
201
- q .AssetAmount = binary .BigEndian .Uint64 (data [97 :105 ])
202
- q .SuggestedRateTick = binary .BigEndian .Uint64 (data [105 :])
203
-
204
- return nil
205
- }
0 commit comments