@@ -2,6 +2,7 @@ package rfqmsg
22
33import (
44 "fmt"
5+ "time"
56
67 "github.com/btcsuite/btcd/btcec/v2"
78 "github.com/lightninglabs/taproot-assets/asset"
@@ -40,34 +41,39 @@ type SellRequest struct {
4041 // peer intends to sell.
4142 AssetAmount uint64
4243
43- // SuggestedAssetRate represents a proposed conversion rate between the
44+ // AssetRateHint represents a proposed conversion rate between the
4445 // subject asset and BTC. This rate is an initial suggestion intended to
4546 // initiate the RFQ negotiation process and may differ from the final
4647 // agreed rate.
47- SuggestedAssetRate fn.Option [rfqmath.BigIntFixedPoint ]
48-
49- // TODO(ffranr): Add expiry time for suggested ask price.
48+ AssetRateHint fn.Option [AssetRate ]
5049}
5150
5251// NewSellRequest creates a new asset sell quote request.
5352func NewSellRequest (peer route.Vertex , assetID * asset.ID ,
5453 assetGroupKey * btcec.PublicKey , assetAmount uint64 ,
55- suggestedAssetRate fn.Option [rfqmath.BigIntFixedPoint ]) (* SellRequest ,
54+ rateHint fn.Option [rfqmath.BigIntFixedPoint ]) (* SellRequest ,
5655 error ) {
5756
5857 id , err := NewID ()
5958 if err != nil {
6059 return nil , fmt .Errorf ("unable to generate random id: %w" , err )
6160 }
6261
62+ // Construct a suggested asset rate if a rate hint is provided.
63+ var assetRateHint fn.Option [AssetRate ]
64+ rateHint .WhenSome (func (rate rfqmath.BigIntFixedPoint ) {
65+ expiry := time .Now ().Add (DefaultQuoteLifetime ).UTC ()
66+ assetRateHint = fn .Some (NewAssetRate (rate , expiry ))
67+ })
68+
6369 return & SellRequest {
64- Peer : peer ,
65- Version : latestSellRequestVersion ,
66- ID : id ,
67- AssetID : assetID ,
68- AssetGroupKey : assetGroupKey ,
69- AssetAmount : assetAmount ,
70- SuggestedAssetRate : suggestedAssetRate ,
70+ Peer : peer ,
71+ Version : latestSellRequestVersion ,
72+ ID : id ,
73+ AssetID : assetID ,
74+ AssetGroupKey : assetGroupKey ,
75+ AssetAmount : assetAmount ,
76+ AssetRateHint : assetRateHint ,
7177 }, nil
7278}
7379
@@ -105,24 +111,25 @@ func NewSellRequestFromWire(wireMsg WireMessage,
105111 "request" )
106112 }
107113
114+ expiry := time .Unix (int64 (msgData .Expiry .Val ), 0 )
115+
108116 // Extract the suggested asset to BTC rate if provided.
109- var suggestedAssetRate fn.Option [rfqmath. BigIntFixedPoint ]
117+ var assetRateHint fn.Option [AssetRate ]
110118 msgData .SuggestedAssetRate .WhenSome (
111119 func (rate tlv.RecordT [tlv.TlvType19 , TlvFixedPoint ]) {
112120 fp := rate .Val .IntoBigIntFixedPoint ()
113- suggestedAssetRate =
114- fn.Some [rfqmath.BigIntFixedPoint ](fp )
121+ assetRateHint = fn .Some (NewAssetRate (fp , expiry ))
115122 },
116123 )
117124
118125 req := SellRequest {
119- Peer : wireMsg .Peer ,
120- Version : msgData .Version .Val ,
121- ID : msgData .ID .Val ,
122- AssetID : assetID ,
123- AssetGroupKey : assetGroupKey ,
124- AssetAmount : msgData .AssetMaxAmount .Val ,
125- SuggestedAssetRate : suggestedAssetRate ,
126+ Peer : wireMsg .Peer ,
127+ Version : msgData .Version .Val ,
128+ ID : msgData .ID .Val ,
129+ AssetID : assetID ,
130+ AssetGroupKey : assetGroupKey ,
131+ AssetAmount : msgData .AssetMaxAmount .Val ,
132+ AssetRateHint : assetRateHint ,
126133 }
127134
128135 // Perform basic sanity checks on the quote request.
@@ -198,10 +205,19 @@ func (q *SellRequest) String() string {
198205 groupKeyBytes = q .AssetGroupKey .SerializeCompressed ()
199206 }
200207
208+ // Convert the asset rate hint to a string representation. Use empty
209+ // string if the hint is not set.
210+ assetRateHintStr := fn .MapOptionZ (
211+ q .AssetRateHint ,
212+ func (rate AssetRate ) string {
213+ return rate .String ()
214+ },
215+ )
216+
201217 return fmt .Sprintf ("SellRequest(peer=%x, id=%x, asset_id=%s, " +
202- "asset_group_key=%x, asset_amount=%d, ask_asset_rate=%v )" ,
218+ "asset_group_key=%x, asset_amount=%d, asset_rate_hint=%s )" ,
203219 q .Peer [:], q .ID [:], q .AssetID , groupKeyBytes , q .AssetAmount ,
204- q . SuggestedAssetRate )
220+ assetRateHintStr )
205221}
206222
207223// Ensure that the message type implements the OutgoingMsg interface.
0 commit comments