@@ -107,8 +107,7 @@ func NewNegotiator(cfg NegotiatorCfg) (*Negotiator, error) {
107
107
// an appropriate outgoing response message which should be sent to the peer.
108
108
func (n * Negotiator ) queryBidFromPriceOracle (peer route.Vertex ,
109
109
assetId * asset.ID , assetGroupKey * btcec.PublicKey , assetAmount uint64 ,
110
- assetRateHint fn.Option [rfqmsg.AssetRate ]) (* rfqmath.BigIntFixedPoint ,
111
- uint64 , error ) {
110
+ assetRateHint fn.Option [rfqmsg.AssetRate ]) (* rfqmsg.AssetRate , error ) {
112
111
113
112
// TODO(ffranr): Optionally accept a peer's proposed ask price as an
114
113
// arg to this func and pass it to the price oracle. The price oracle
@@ -124,28 +123,28 @@ func (n *Negotiator) queryBidFromPriceOracle(peer route.Vertex,
124
123
ctx , assetId , assetGroupKey , assetAmount , assetRateHint ,
125
124
)
126
125
if err != nil {
127
- return nil , 0 , fmt .Errorf ("failed to query price oracle for " +
126
+ return nil , fmt .Errorf ("failed to query price oracle for " +
128
127
"bid: %w" , err )
129
128
}
130
129
131
130
// Now we will check for an error in the response from the price oracle.
132
131
// If present, we will convert it to a string and return it as an error.
133
132
if oracleResponse .Err != nil {
134
- return nil , 0 , fmt .Errorf ("failed to query price oracle for " +
133
+ return nil , fmt .Errorf ("failed to query price oracle for " +
135
134
"bid price: %s" , oracleResponse .Err )
136
135
}
137
136
138
137
// By this point, the price oracle did not return an error or a bid
139
138
// price. We will therefore return an error.
140
- if oracleResponse .AssetRate .Coefficient .ToUint64 () == 0 {
141
- return nil , 0 , fmt .Errorf ("price oracle did not specify a " +
139
+ if oracleResponse .AssetRate .Rate .ToUint64 () == 0 {
140
+ return nil , fmt .Errorf ("price oracle did not specify a " +
142
141
"bid price" )
143
142
}
144
143
145
144
// TODO(ffranr): Check that the bid price is reasonable.
146
145
// TODO(ffranr): Ensure that the expiry time is valid and sufficient.
147
146
148
- return & oracleResponse .AssetRate , oracleResponse . Expiry , nil
147
+ return & oracleResponse .AssetRate , nil
149
148
}
150
149
151
150
// HandleOutgoingBuyOrder handles an outgoing buy order by constructing buy
@@ -166,7 +165,7 @@ func (n *Negotiator) HandleOutgoingBuyOrder(buyOrder BuyOrder) error {
166
165
167
166
if n .cfg .PriceOracle != nil {
168
167
// Query the price oracle for a bid price.
169
- rate , expiryUnix , err := n .queryBidFromPriceOracle (
168
+ assetRate , err := n .queryBidFromPriceOracle (
170
169
* buyOrder .Peer , buyOrder .AssetID ,
171
170
buyOrder .AssetGroupKey , buyOrder .MinAssetAmount ,
172
171
fn .None [rfqmsg.AssetRate ](),
@@ -180,10 +179,7 @@ func (n *Negotiator) HandleOutgoingBuyOrder(buyOrder BuyOrder) error {
180
179
"request: %v" , err )
181
180
}
182
181
183
- expiry := time .Unix (int64 (expiryUnix ), 0 )
184
- assetRateHint = fn.Some [rfqmsg.AssetRate ](
185
- rfqmsg .NewAssetRate (* rate , expiry ),
186
- )
182
+ assetRateHint = fn.Some [rfqmsg.AssetRate ](* assetRate )
187
183
}
188
184
189
185
request , err := rfqmsg .NewBuyRequest (
@@ -220,8 +216,7 @@ func (n *Negotiator) HandleOutgoingBuyOrder(buyOrder BuyOrder) error {
220
216
// peer.
221
217
func (n * Negotiator ) queryAskFromPriceOracle (peer * route.Vertex ,
222
218
assetId * asset.ID , assetGroupKey * btcec.PublicKey , assetAmount uint64 ,
223
- assetRateHint fn.Option [rfqmsg.AssetRate ]) (
224
- * rfqmath.BigIntFixedPoint , uint64 , error ) {
219
+ assetRateHint fn.Option [rfqmsg.AssetRate ]) (* rfqmsg.AssetRate , error ) {
225
220
226
221
// Query the price oracle for an asking price.
227
222
ctx , cancel := n .WithCtxQuitNoTimeout ()
@@ -231,28 +226,28 @@ func (n *Negotiator) queryAskFromPriceOracle(peer *route.Vertex,
231
226
ctx , assetId , assetGroupKey , assetAmount , assetRateHint ,
232
227
)
233
228
if err != nil {
234
- return nil , 0 , fmt .Errorf ("failed to query price oracle for " +
229
+ return nil , fmt .Errorf ("failed to query price oracle for " +
235
230
"ask price: %w" , err )
236
231
}
237
232
238
233
// Now we will check for an error in the response from the price oracle.
239
234
// If present, we will convert it to a string and return it as an error.
240
235
if oracleResponse .Err != nil {
241
- return nil , 0 , fmt .Errorf ("failed to query price oracle for " +
236
+ return nil , fmt .Errorf ("failed to query price oracle for " +
242
237
"ask price: %s" , oracleResponse .Err )
243
238
}
244
239
245
240
// By this point, the price oracle did not return an error or an asking
246
241
// price. We will therefore return an error.
247
- if oracleResponse .AssetRate .Coefficient .ToUint64 () == 0 {
248
- return nil , 0 , fmt .Errorf ("price oracle did not specify an " +
242
+ if oracleResponse .AssetRate .Rate . Coefficient .ToUint64 () == 0 {
243
+ return nil , fmt .Errorf ("price oracle did not specify an " +
249
244
"asset to BTC rate" )
250
245
}
251
246
252
247
// TODO(ffranr): Check that the asking price is reasonable.
253
248
// TODO(ffranr): Ensure that the expiry time is valid and sufficient.
254
249
255
- return & oracleResponse .AssetRate , oracleResponse . Expiry , nil
250
+ return & oracleResponse .AssetRate , nil
256
251
}
257
252
258
253
// HandleIncomingBuyRequest handles an incoming asset buy quote request.
@@ -315,7 +310,7 @@ func (n *Negotiator) HandleIncomingBuyRequest(
315
310
defer n .Wg .Done ()
316
311
317
312
// Query the price oracle for an asking price.
318
- assetRate , rateExpiry , err := n .queryAskFromPriceOracle (
313
+ assetRate , err := n .queryAskFromPriceOracle (
319
314
nil , request .AssetID , request .AssetGroupKey ,
320
315
request .AssetAmount , request .AssetRateHint ,
321
316
)
@@ -335,8 +330,9 @@ func (n *Negotiator) HandleIncomingBuyRequest(
335
330
}
336
331
337
332
// Construct and send a buy accept message.
333
+ expiry := uint64 (assetRate .Expiry .Unix ())
338
334
msg := rfqmsg .NewBuyAcceptFromRequest (
339
- request , * assetRate , rateExpiry ,
335
+ request , assetRate . Rate , expiry ,
340
336
)
341
337
sendOutgoingMsg (msg )
342
338
}()
@@ -410,7 +406,7 @@ func (n *Negotiator) HandleIncomingSellRequest(
410
406
// Query the price oracle for a bid price. This is the price we
411
407
// are willing to pay for the asset that our peer is trying to
412
408
// sell to us.
413
- assetRate , rateExpiry , err := n .queryBidFromPriceOracle (
409
+ assetRate , err := n .queryBidFromPriceOracle (
414
410
request .Peer , request .AssetID , request .AssetGroupKey ,
415
411
request .AssetAmount , request .AssetRateHint ,
416
412
)
@@ -430,8 +426,9 @@ func (n *Negotiator) HandleIncomingSellRequest(
430
426
}
431
427
432
428
// Construct and send a sell accept message.
429
+ expiry := uint64 (assetRate .Expiry .Unix ())
433
430
msg := rfqmsg .NewSellAcceptFromRequest (
434
- request , * assetRate , rateExpiry ,
431
+ request , assetRate . Rate , expiry ,
435
432
)
436
433
sendOutgoingMsg (msg )
437
434
}()
@@ -453,11 +450,11 @@ func (n *Negotiator) HandleOutgoingSellOrder(order SellOrder) {
453
450
// We calculate a proposed ask price for our peer's
454
451
// consideration. If a price oracle is not specified we will
455
452
// skip this step.
456
- var assetRate fn.Option [rfqmsg.AssetRate ]
453
+ var assetRateHint fn.Option [rfqmsg.AssetRate ]
457
454
458
455
if n .cfg .PriceOracle != nil {
459
456
// Query the price oracle for an asking price.
460
- rate , expiryUnix , err := n .queryAskFromPriceOracle (
457
+ assetRate , err := n .queryAskFromPriceOracle (
461
458
order .Peer , order .AssetID , order .AssetGroupKey ,
462
459
order .MaxAssetAmount ,
463
460
fn .None [rfqmsg.AssetRate ](),
@@ -469,15 +466,12 @@ func (n *Negotiator) HandleOutgoingSellOrder(order SellOrder) {
469
466
return
470
467
}
471
468
472
- expiry := time .Unix (int64 (expiryUnix ), 0 )
473
- assetRate = fn.Some [rfqmsg.AssetRate ](
474
- rfqmsg .NewAssetRate (* rate , expiry ),
475
- )
469
+ assetRateHint = fn.Some [rfqmsg.AssetRate ](* assetRate )
476
470
}
477
471
478
472
request , err := rfqmsg .NewSellRequest (
479
473
* order .Peer , order .AssetID , order .AssetGroupKey ,
480
- order .MaxAssetAmount , assetRate ,
474
+ order .MaxAssetAmount , assetRateHint ,
481
475
)
482
476
if err != nil {
483
477
err := fmt .Errorf ("unable to create sell request " +
@@ -574,7 +568,7 @@ func (n *Negotiator) HandleIncomingBuyAccept(msg rfqmsg.BuyAccept,
574
568
// We will sanity check that price by querying our price oracle
575
569
// for an ask price. We will then compare the ask price returned
576
570
// by the price oracle with the ask price provided by the peer.
577
- assetRate , _ , err := n .queryAskFromPriceOracle (
571
+ assetRate , err := n .queryAskFromPriceOracle (
578
572
& msg .Peer , msg .Request .AssetID , nil ,
579
573
msg .Request .AssetAmount , fn .None [rfqmsg.AssetRate ](),
580
574
)
@@ -608,7 +602,7 @@ func (n *Negotiator) HandleIncomingBuyAccept(msg rfqmsg.BuyAccept,
608
602
big .NewInt (0 ).SetUint64 (n .cfg .AcceptPriceDeviationPpm ),
609
603
)
610
604
acceptablePrice := msg .AssetRate .WithinTolerance (
611
- * assetRate , tolerance ,
605
+ assetRate . Rate , tolerance ,
612
606
)
613
607
if ! acceptablePrice {
614
608
// The price is not within the acceptable tolerance.
@@ -698,7 +692,7 @@ func (n *Negotiator) HandleIncomingSellAccept(msg rfqmsg.SellAccept,
698
692
// We will sanity check that price by querying our price oracle
699
693
// for a bid price. We will then compare the bid price returned
700
694
// by the price oracle with the bid price provided by the peer.
701
- assetRate , _ , err := n .queryBidFromPriceOracle (
695
+ assetRate , err := n .queryBidFromPriceOracle (
702
696
msg .Peer , msg .Request .AssetID , nil ,
703
697
msg .Request .AssetAmount , msg .Request .AssetRateHint ,
704
698
)
@@ -732,7 +726,7 @@ func (n *Negotiator) HandleIncomingSellAccept(msg rfqmsg.SellAccept,
732
726
big .NewInt (0 ).SetUint64 (n .cfg .AcceptPriceDeviationPpm ),
733
727
)
734
728
acceptablePrice := msg .AssetRate .WithinTolerance (
735
- * assetRate , tolerance ,
729
+ assetRate . Rate , tolerance ,
736
730
)
737
731
if ! acceptablePrice {
738
732
// The price is not within the acceptable bounds.
0 commit comments