@@ -2971,10 +2971,11 @@ func testCustomChannelsLiquidityEdgeCasesGroup(ctx context.Context,
29712971 testCustomChannelsLiquidityEdgeCasesCore (ctx , net , t , true )
29722972}
29732973
2974- // testCustomChannelsMultiRFQReceive tests that a node creating an invoice with
2975- // multiple RFQ quotes can actually guide the payer into using multiple private
2976- // taproot asset channels to pay the invoice.
2977- func testCustomChannelsMultiRFQReceive (ctx context.Context , net * NetworkHarness ,
2974+ // testCustomChannelsMultiRFQ tests that sending and receiving payments works
2975+ // when using the multi-rfq features of tapd. This means that liquidity across
2976+ // multiple channels and peers can be used to send out a payment, or receive to
2977+ // an invoice.
2978+ func testCustomChannelsMultiRFQ (ctx context.Context , net * NetworkHarness ,
29782979 t * harnessTest ) {
29792980
29802981 lndArgs := slices .Clone (lndArgsTemplate )
@@ -3068,7 +3069,6 @@ func testCustomChannelsMultiRFQReceive(ctx context.Context, net *NetworkHarness,
30683069 t .t , charlie , & lnrpc.AddInvoiceResponse {
30693070 PaymentRequest : hodlInv .payReq ,
30703071 },
3071- withGroupKey (groupID ),
30723072 withFailure (lnrpc .Payment_IN_FLIGHT , failureNone ),
30733073 )
30743074
@@ -3100,13 +3100,88 @@ func testCustomChannelsMultiRFQReceive(ctx context.Context, net *NetworkHarness,
31003100 // Now let's create a normal invoice that will be settled once all the
31013101 // HTLCs have been received. This is only possible because the payer
31023102 // uses multiple bolt11 hop hints to reach the destination.
3103- invoiceResp := createAssetInvoice (t .t , nil , fabia , 15_000 , assetID )
3103+ invoiceResp := createAssetInvoice (
3104+ t .t , nil , fabia , 15_000 , nil , withInvGroupKey (groupID ),
3105+ )
31043106
31053107 payInvoiceWithSatoshi (
3106- t .t , charlie , invoiceResp , withGroupKey ( groupID ),
3108+ t .t , charlie , invoiceResp ,
31073109 )
31083110
31093111 logBalance (t .t , nodes , assetID , "after multi-rfq receive" )
3112+
3113+ // Now we'll test that sending with multiple rfq quotes works.
3114+
3115+ // Let's start by providing some liquidity to Charlie's peers, in order
3116+ // for them to be able to push some amount if Fabia picks them as part
3117+ // of the route.
3118+ sendKeySendPayment (t .t , charlie , erin , 800_000 )
3119+ sendKeySendPayment (t .t , charlie , dave , 800_000 )
3120+ sendKeySendPayment (t .t , charlie , yara , 800_000 )
3121+
3122+ // Let's ask for the rough equivalent of ~15k assets. Fabia, who's going
3123+ // to pay the invoice, only has parts of assets that are less than 10k
3124+ // in channels with one of the 3 intermediate peers. The only way to
3125+ // pay this invoice is by splitting the payment across multiple peers by
3126+ // using multiple RFQ quotes.
3127+ invAmt := int64 (15_000 * 17 )
3128+
3129+ iResp , err := charlie .AddHoldInvoice (
3130+ ctx , & invoicesrpc.AddHoldInvoiceRequest {
3131+ Memo : "" ,
3132+ Value : invAmt ,
3133+ Hash : payHash [:],
3134+ },
3135+ )
3136+ require .NoError (t .t , err )
3137+
3138+ payReq := iResp .PaymentRequest
3139+
3140+ payInvoiceWithAssets (
3141+ t .t , fabia , nil , payReq , assetID ,
3142+ withFailure (lnrpc .Payment_IN_FLIGHT , failureNone ),
3143+ )
3144+
3145+ assertMinNumHtlcs (t .t , charlie , 2 )
3146+ assertMinNumHtlcs (t .t , fabia , 2 )
3147+
3148+ logBalance (t .t , nodes , assetID , "multi-rfq send in-flight" )
3149+
3150+ _ , err = charlie .SettleInvoice (ctx , & invoicesrpc.SettleInvoiceMsg {
3151+ Preimage : hodlInv .preimage [:],
3152+ })
3153+ require .NoError (t .t , err )
3154+
3155+ assertNumHtlcs (t .t , charlie , 0 )
3156+ assertNumHtlcs (t .t , fabia , 0 )
3157+
3158+ logBalance (t .t , nodes , assetID , "after multi-rfq send" )
3159+
3160+ // Let's make another round-trip involving multi-rfq functionality.
3161+ // Let's have Fabia receive another large payment and send it back
3162+ // again, this time with a greater amount.
3163+ invoiceResp = createAssetInvoice (t .t , nil , fabia , 25_000 , assetID )
3164+
3165+ payInvoiceWithSatoshi (
3166+ t .t , charlie , invoiceResp ,
3167+ )
3168+
3169+ logBalance (t .t , nodes , assetID , "after multi-rfq receive (2nd)" )
3170+
3171+ // Let's bump up the invoice amount a bit, to roughly ~22k assets.
3172+ invAmt = 22_000 * 17
3173+ inv , err := charlie .AddInvoice (ctx , & lnrpc.Invoice {
3174+ Value : invAmt ,
3175+ })
3176+ require .NoError (t .t , err )
3177+
3178+ payReq = inv .PaymentRequest
3179+
3180+ payInvoiceWithAssets (
3181+ t .t , fabia , nil , payReq , nil , withGroupKey (groupID ),
3182+ )
3183+
3184+ logBalance (t .t , nodes , assetID , "after multi-rfq send (2nd)" )
31103185}
31113186
31123187// testCustomChannelsStrictForwarding is a test that tests the strict forwarding
0 commit comments