Skip to content

Commit 19817d9

Browse files
committed
rfqmsg: update SellRequest to use AssetRate type in AssetRateHint
Rename `SellRequest.SuggestedAssetRate` to `AssetRateHint` and change its type to the new `AssetRate`.
1 parent 57a6e8d commit 19817d9

File tree

2 files changed

+52
-36
lines changed

2 files changed

+52
-36
lines changed

rfqmsg/request.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
"github.com/btcsuite/btcd/btcec/v2"
1010
"github.com/lightninglabs/taproot-assets/asset"
11-
"github.com/lightninglabs/taproot-assets/rfqmath"
1211
"github.com/lightningnetwork/lnd/tlv"
1312
)
1413

@@ -172,22 +171,23 @@ func newRequestWireMsgDataFromSell(q SellRequest) (requestWireMsgData, error) {
172171
version := tlv.NewPrimitiveRecord[tlv.TlvType0](q.Version)
173172
id := tlv.NewRecordT[tlv.TlvType2](q.ID)
174173

175-
// Calculate the expiration unix timestamp in seconds.
176-
expiry := tlv.NewPrimitiveRecord[tlv.TlvType6](
177-
uint64(time.Now().Add(DefaultQuoteLifetime).Unix()),
178-
)
174+
// Set the expiry to the default request lifetime unless an asset rate
175+
// hint is provided.
176+
expiry := time.Now().Add(DefaultQuoteLifetime).Unix()
177+
q.AssetRateHint.WhenSome(func(assetRate AssetRate) {
178+
expiry = assetRate.Expiry.Unix()
179+
})
180+
expiryTlv := tlv.NewPrimitiveRecord[tlv.TlvType6](uint64(expiry))
179181

180182
assetMaxAmount := tlv.NewPrimitiveRecord[tlv.TlvType16](q.AssetAmount)
181183

182184
// Convert the suggested asset rate to a TLV record.
183185
var suggestedAssetRate requestSuggestedAssetRate
184-
q.SuggestedAssetRate.WhenSome(func(rate rfqmath.BigIntFixedPoint) {
185-
// Convert the BigIntFixedPoint to a Uint64FixedPoint.
186-
wireRate := NewTlvFixedPointFromBigInt(rate)
186+
q.AssetRateHint.WhenSome(func(assetRate AssetRate) {
187+
// Convert the BigIntFixedPoint to a TlvFixedPoint.
188+
wireRate := NewTlvFixedPointFromBigInt(assetRate.Rate)
187189
suggestedAssetRate = tlv.SomeRecordT[tlv.TlvType19](
188-
tlv.NewRecordT[tlv.TlvType19](
189-
wireRate,
190-
),
190+
tlv.NewRecordT[tlv.TlvType19](wireRate),
191191
)
192192
})
193193

@@ -221,7 +221,7 @@ func newRequestWireMsgDataFromSell(q SellRequest) (requestWireMsgData, error) {
221221
return requestWireMsgData{
222222
Version: version,
223223
ID: id,
224-
Expiry: expiry,
224+
Expiry: expiryTlv,
225225
AssetMaxAmount: assetMaxAmount,
226226
SuggestedAssetRate: suggestedAssetRate,
227227
InAssetID: inAssetID,

rfqmsg/sell_request.go

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package rfqmsg
22

33
import (
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.
5352
func 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

Comments
 (0)