Skip to content

Commit 82c8511

Browse files
authored
Merge pull request #906 from GeorgeTsagk/rfq-track-htlc-itests
itest: Extend custom channel liquidity itest for RFQ HTLC tracking
2 parents 868e57c + 73bbd6a commit 82c8511

File tree

5 files changed

+260
-73
lines changed

5 files changed

+260
-73
lines changed

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/lightninglabs/pool v0.6.5-beta.0.20241015105339-044cb451b5df
2424
github.com/lightninglabs/pool/auctioneerrpc v1.1.2
2525
github.com/lightninglabs/pool/poolrpc v1.0.0
26-
github.com/lightninglabs/taproot-assets v0.5.0-rc1
26+
github.com/lightninglabs/taproot-assets v0.5.0-rc1.0.20241206085244-8113fa8bb314
2727
github.com/lightningnetwork/lnd v0.18.4-beta.rc1
2828
github.com/lightningnetwork/lnd/cert v1.2.2
2929
github.com/lightningnetwork/lnd/fn v1.2.3
@@ -46,7 +46,7 @@ require (
4646
)
4747

4848
require (
49-
dario.cat/mergo v1.0.0 // indirect
49+
dario.cat/mergo v1.0.1 // indirect
5050
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
5151
github.com/Microsoft/go-winio v0.6.1 // indirect
5252
github.com/NebulousLabs/fastrand v0.0.0-20181203155948-6fb6489aac4e // indirect
@@ -89,7 +89,7 @@ require (
8989
github.com/fortytw2/leaktest v1.3.0 // indirect
9090
github.com/go-logr/logr v1.4.2 // indirect
9191
github.com/go-logr/stdr v1.2.2 // indirect
92-
github.com/go-viper/mapstructure/v2 v2.0.0 // indirect
92+
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
9393
github.com/gogo/protobuf v1.3.2 // indirect
9494
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
9595
github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
@@ -191,12 +191,12 @@ require (
191191
go.etcd.io/etcd/raft/v3 v3.5.12 // indirect
192192
go.etcd.io/etcd/server/v3 v3.5.12 // indirect
193193
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect
194-
go.opentelemetry.io/otel v1.28.0 // indirect
194+
go.opentelemetry.io/otel v1.32.0 // indirect
195195
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 // indirect
196196
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 // indirect
197-
go.opentelemetry.io/otel/metric v1.28.0 // indirect
197+
go.opentelemetry.io/otel/metric v1.32.0 // indirect
198198
go.opentelemetry.io/otel/sdk v1.21.0 // indirect
199-
go.opentelemetry.io/otel/trace v1.28.0 // indirect
199+
go.opentelemetry.io/otel/trace v1.32.0 // indirect
200200
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
201201
go.uber.org/atomic v1.10.0 // indirect
202202
go.uber.org/mock v0.4.0 // indirect

go.sum

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
596596
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
597597
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
598598
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
599-
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
600-
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
599+
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
600+
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
601601
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
602602
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
603603
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
@@ -855,8 +855,8 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO
855855
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
856856
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
857857
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
858-
github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc=
859-
github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
858+
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
859+
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
860860
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
861861
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
862862
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
@@ -1177,8 +1177,8 @@ github.com/lightninglabs/pool/poolrpc v1.0.0 h1:vvosrgNx9WXF4mcHGqLjZOW8wNM0q+BL
11771177
github.com/lightninglabs/pool/poolrpc v1.0.0/go.mod h1:ZqpEpBFRMMBAerMmilEjh27tqauSXDwLaLR0O3jvmMA=
11781178
github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display h1:w7FM5LH9Z6CpKxl13mS48idsu6F+cEZf0lkyiV+Dq9g=
11791179
github.com/lightninglabs/protobuf-go-hex-display v1.34.2-hex-display/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
1180-
github.com/lightninglabs/taproot-assets v0.5.0-rc1 h1:UuDuvOJErqvapdF5gA8gfTy7X8Dfi96fCoNhrRuB9ZA=
1181-
github.com/lightninglabs/taproot-assets v0.5.0-rc1/go.mod h1:3MxoqsBdZGju3ExSIA9kFle5nqjWeb4alK4aVlfT0tA=
1180+
github.com/lightninglabs/taproot-assets v0.5.0-rc1.0.20241206085244-8113fa8bb314 h1:ykWP63wGxW0OKW4lITz8/lWv6CLMswRRX4DCr37wAkU=
1181+
github.com/lightninglabs/taproot-assets v0.5.0-rc1.0.20241206085244-8113fa8bb314/go.mod h1:d9GdY5DVoSh6+dEQRS4UUcjpVvZlAHgP8U2DAp4YedA=
11821182
github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY=
11831183
github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI=
11841184
github.com/lightningnetwork/lnd v0.18.4-beta.rc1 h1:z6hFKvtbfo8udPrIb81GbSoKlUWd06d4LRxTkD19IMQ=
@@ -1438,20 +1438,20 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
14381438
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
14391439
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE=
14401440
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE=
1441-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
1442-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
1443-
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
1444-
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
1441+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw=
1442+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94=
1443+
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
1444+
go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
14451445
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8=
14461446
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU=
14471447
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU=
14481448
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0=
1449-
go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
1450-
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
1449+
go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
1450+
go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
14511451
go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
14521452
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
1453-
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
1454-
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
1453+
go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
1454+
go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
14551455
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
14561456
go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
14571457
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=

itest/assets_test.go

Lines changed: 59 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,62 @@ 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+
rfqBytes = make([]byte, len(i[:]))
902+
copy(rfqBytes, i[:])
903+
})
904+
885905
stream, err := payerTapd.SendPayment(ctxt, &tchrpc.SendPaymentRequest{
886906
AssetId: assetID,
887907
PeerPubkey: rfqPeer.PubKey[:],
888908
PaymentRequest: sendReq,
909+
RfqId: rfqBytes,
889910
})
890911
require.NoError(t, err)
891912

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

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

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

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

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

916946
expectedStatus := expectedPayStatus.UnwrapOr(lnrpc.Payment_SUCCEEDED)
917947

918-
result, err := getAssetPaymentResult(stream, expectedPayStatus.IsSome())
948+
result, err := getAssetPaymentResult(
949+
stream, expectedStatus == lnrpc.Payment_IN_FLIGHT,
950+
)
919951
require.NoError(t, err)
920952
require.Equal(t, expectedStatus, result.Status)
921953

922-
return numUnits, *rate
954+
return numUnits, rateVal
923955
}
924956

925957
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)