Skip to content

Commit 262846f

Browse files
committed
itest: extend liquidity edge cases for rfq htlc tracking
1 parent d116bab commit 262846f

File tree

3 files changed

+234
-53
lines changed

3 files changed

+234
-53
lines changed

itest/assets_test.go

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ const (
5656
DefaultPushSat int64 = 1062
5757
)
5858

59+
var (
60+
NoScidOpt = fn.None[rfqmsg.SerialisedScid]()
61+
)
62+
5963
// createTestAssetNetwork sends asset funds from Charlie to Dave and Erin, so
6064
// they can fund asset channels with Yara and Fabia, respectively. So the asset
6165
// channels created are Charlie->Dave, Dave->Yara, Erin->Fabia. The channels
@@ -714,6 +718,9 @@ func sendAssetKeySendPayment(t *testing.T, src, dst *HarnessNode, amt uint64,
714718

715719
result, err := getAssetPaymentResult(stream, false)
716720
require.NoError(t, err)
721+
if result.Status == lnrpc.Payment_FAILED {
722+
t.Logf("Failure reason: %v", result.FailureReason)
723+
}
717724
require.Equal(t, expectedStatus, result.Status)
718725

719726
expectedReason := failReason.UnwrapOr(
@@ -772,7 +779,9 @@ func createAndPayNormalInvoiceWithBtc(t *testing.T, src, dst *HarnessNode,
772779
})
773780
require.NoError(t, err)
774781

775-
payInvoiceWithSatoshi(t, src, invoiceResp, lnrpc.Payment_SUCCEEDED)
782+
payInvoiceWithSatoshi(
783+
t, src, invoiceResp, lnrpc.Payment_SUCCEEDED, false,
784+
)
776785
}
777786

778787
func createAndPayNormalInvoice(t *testing.T, src, rfqPeer, dst *HarnessNode,
@@ -792,15 +801,15 @@ func createAndPayNormalInvoice(t *testing.T, src, rfqPeer, dst *HarnessNode,
792801

793802
numUnits, _ := payInvoiceWithAssets(
794803
t, src, rfqPeer, invoiceResp.PaymentRequest, assetID, smallShards,
795-
fn.None[lnrpc.Payment_PaymentStatus](),
804+
fn.None[lnrpc.Payment_PaymentStatus](), NoScidOpt,
796805
)
797806

798807
return numUnits
799808
}
800809

801810
func payInvoiceWithSatoshi(t *testing.T, payer *HarnessNode,
802811
invoice *lnrpc.AddInvoiceResponse,
803-
expectedStatus lnrpc.Payment_PaymentStatus) {
812+
expectedStatus lnrpc.Payment_PaymentStatus, expectTimeout bool) {
804813

805814
ctxb := context.Background()
806815
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
@@ -816,8 +825,12 @@ func payInvoiceWithSatoshi(t *testing.T, payer *HarnessNode,
816825
require.NoError(t, err)
817826

818827
result, err := getPaymentResult(stream)
819-
require.NoError(t, err)
820-
require.Equal(t, expectedStatus, result.Status)
828+
if expectTimeout {
829+
require.ErrorContains(t, err, "context deadline exceeded")
830+
} else {
831+
require.NoError(t, err)
832+
require.Equal(t, expectedStatus, result.Status)
833+
}
821834
}
822835

823836
func payInvoiceWithSatoshiLastHop(t *testing.T, payer *HarnessNode,
@@ -858,7 +871,8 @@ func payInvoiceWithSatoshiLastHop(t *testing.T, payer *HarnessNode,
858871

859872
func payInvoiceWithAssets(t *testing.T, payer, rfqPeer *HarnessNode,
860873
payReq string, assetID []byte, smallShards bool,
861-
expectedPayStatus fn.Option[lnrpc.Payment_PaymentStatus]) (uint64,
874+
expectedPayStatus fn.Option[lnrpc.Payment_PaymentStatus],
875+
manualRfq fn.Option[rfqmsg.SerialisedScid]) (uint64,
862876
rfqmath.BigIntFixedPoint) {
863877

864878
ctxb := context.Background()
@@ -886,40 +900,52 @@ func payInvoiceWithAssets(t *testing.T, payer, rfqPeer *HarnessNode,
886900
AssetId: assetID,
887901
PeerPubkey: rfqPeer.PubKey[:],
888902
PaymentRequest: sendReq,
903+
Scid: uint64(manualRfq.UnwrapOr(0)),
889904
})
890905
require.NoError(t, err)
891906

892-
// We want to receive the accepted quote message first, so we know how
893-
// many assets we're going to pay.
894-
quoteMsg, err := stream.Recv()
895-
require.NoError(t, err)
896-
acceptedQuote := quoteMsg.GetAcceptedSellOrder()
897-
require.NotNil(t, acceptedQuote)
907+
var (
908+
numUnits uint64
909+
rateVal rfqmath.FixedPoint[rfqmath.BigInt]
910+
)
898911

899-
peerPubKey := acceptedQuote.Peer
900-
require.Equal(t, peerPubKey, rfqPeer.PubKeyStr)
912+
if manualRfq.IsNone() {
913+
// We want to receive the accepted quote message first, so we know how
914+
// many assets we're going to pay.
915+
quoteMsg, err := stream.Recv()
916+
require.NoError(t, err)
917+
acceptedQuote := quoteMsg.GetAcceptedSellOrder()
918+
require.NotNil(t, acceptedQuote)
901919

902-
rpcRate := acceptedQuote.BidAssetRate
903-
rate, err := rfqrpc.UnmarshalFixedPoint(rpcRate)
904-
require.NoError(t, err)
920+
peerPubKey := acceptedQuote.Peer
921+
require.Equal(t, peerPubKey, rfqPeer.PubKeyStr)
905922

906-
t.Logf("Got quote for %v asset units per BTC", rate)
923+
rpcRate := acceptedQuote.BidAssetRate
924+
rate, err := rfqrpc.UnmarshalFixedPoint(rpcRate)
925+
require.NoError(t, err)
926+
927+
rateVal = *rate
907928

908-
amountMsat := lnwire.MilliSatoshi(decodedInvoice.NumMsat)
909-
milliSatsFP := rfqmath.MilliSatoshiToUnits(amountMsat, *rate)
910-
numUnits := milliSatsFP.ScaleTo(0).ToUint64()
911-
msatPerUnit := float64(decodedInvoice.NumMsat) / float64(numUnits)
912-
t.Logf("Got quote for %v asset units at %3f msat/unit from peer %s "+
913-
"with SCID %d", numUnits, msatPerUnit, peerPubKey,
914-
acceptedQuote.Scid)
929+
t.Logf("Got quote for %v asset units per BTC", rate)
930+
931+
amountMsat := lnwire.MilliSatoshi(decodedInvoice.NumMsat)
932+
milliSatsFP := rfqmath.MilliSatoshiToUnits(amountMsat, *rate)
933+
numUnits = milliSatsFP.ScaleTo(0).ToUint64()
934+
msatPerUnit := float64(decodedInvoice.NumMsat) / float64(numUnits)
935+
t.Logf("Got quote for %v asset units at %3f msat/unit from peer %s "+
936+
"with SCID %d", numUnits, msatPerUnit, peerPubKey,
937+
acceptedQuote.Scid)
938+
}
915939

916940
expectedStatus := expectedPayStatus.UnwrapOr(lnrpc.Payment_SUCCEEDED)
917941

918-
result, err := getAssetPaymentResult(stream, expectedPayStatus.IsSome())
942+
result, err := getAssetPaymentResult(
943+
stream, expectedStatus == lnrpc.Payment_IN_FLIGHT,
944+
)
919945
require.NoError(t, err)
920946
require.Equal(t, expectedStatus, result.Status)
921947

922-
return numUnits, *rate
948+
return numUnits, rateVal
923949
}
924950

925951
func createAssetInvoice(t *testing.T, dstRfqPeer, dst *HarnessNode,

itest/litd_accounts_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,13 @@ func getAssetPaymentResult(
451451
return nil, err
452452
}
453453

454+
// If we get an update on the quote being used, skip the message
455+
// as we don't need it, and continue reading the next message.
456+
quote := msg.GetAcceptedSellOrder()
457+
if quote != nil {
458+
continue
459+
}
460+
454461
payment := msg.GetPaymentResult()
455462
if payment == nil {
456463
return nil, fmt.Errorf("unexpected message: %v", msg)

0 commit comments

Comments
 (0)