Skip to content

Commit 99ab0ce

Browse files
committed
itest: extend liquidity edge cases for rfq htlc tracking
1 parent a69202f commit 99ab0ce

File tree

3 files changed

+239
-53
lines changed

3 files changed

+239
-53
lines changed

itest/assets_test.go

Lines changed: 58 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+
NoRfqIDOpt = fn.None[rfqmsg.ID]()
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](), NoRfqIDOpt,
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.ID]) (uint64,
862876
rfqmath.BigIntFixedPoint) {
863877

864878
ctxb := context.Background()
@@ -882,44 +896,61 @@ func payInvoiceWithAssets(t *testing.T, payer, rfqPeer *HarnessNode,
882896
sendReq.MaxShardSizeMsat = 80_000_000
883897
}
884898

899+
var rfqBytes []byte
900+
manualRfq.WhenSome(func(i rfqmsg.ID) {
901+
copy(rfqBytes, i[:])
902+
})
903+
885904
stream, err := payerTapd.SendPayment(ctxt, &tchrpc.SendPaymentRequest{
886905
AssetId: assetID,
887906
PeerPubkey: rfqPeer.PubKey[:],
888907
PaymentRequest: sendReq,
908+
RfqId: rfqBytes,
889909
})
890910
require.NoError(t, err)
891911

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)
912+
var (
913+
numUnits uint64
914+
rateVal rfqmath.FixedPoint[rfqmath.BigInt]
915+
)
898916

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

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

906-
t.Logf("Got quote for %v asset units per BTC", rate)
928+
rpcRate := acceptedQuote.BidAssetRate
929+
rate, err := rfqrpc.UnmarshalFixedPoint(rpcRate)
930+
require.NoError(t, err)
931+
932+
rateVal = *rate
907933

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)
934+
t.Logf("Got quote for %v asset units per BTC", rate)
935+
936+
amountMsat := lnwire.MilliSatoshi(decodedInvoice.NumMsat)
937+
milliSatsFP := rfqmath.MilliSatoshiToUnits(amountMsat, *rate)
938+
numUnits = milliSatsFP.ScaleTo(0).ToUint64()
939+
msatPerUnit := float64(decodedInvoice.NumMsat) / float64(numUnits)
940+
t.Logf("Got quote for %v asset units at %3f msat/unit from peer %s "+
941+
"with SCID %d", numUnits, msatPerUnit, peerPubKey,
942+
acceptedQuote.Scid)
943+
}
915944

916945
expectedStatus := expectedPayStatus.UnwrapOr(lnrpc.Payment_SUCCEEDED)
917946

918-
result, err := getAssetPaymentResult(stream, expectedPayStatus.IsSome())
947+
result, err := getAssetPaymentResult(
948+
stream, expectedStatus == lnrpc.Payment_IN_FLIGHT,
949+
)
919950
require.NoError(t, err)
920951
require.Equal(t, expectedStatus, result.Status)
921952

922-
return numUnits, *rate
953+
return numUnits, rateVal
923954
}
924955

925956
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+
// Ignore RFQ quote acceptance messages read from the send
455+
// payment stream, as they are not relevant.
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)