From 898efbf2ae841993d1d6043b6a30ae4ebf0e5c57 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Aug 2024 10:57:41 -0300 Subject: [PATCH 1/4] sweepbatcher: fix godoc --- sweepbatcher/sweep_batcher.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sweepbatcher/sweep_batcher.go b/sweepbatcher/sweep_batcher.go index 6165b509..8572e8f3 100644 --- a/sweepbatcher/sweep_batcher.go +++ b/sweepbatcher/sweep_batcher.go @@ -236,7 +236,7 @@ type Batcher struct { // sweep funds. musig2ServerSign MuSig2SignSweep - // verifySchnorrSig is a function that can be used to verify a schnorr + // VerifySchnorrSig is a function that can be used to verify a schnorr // signature. VerifySchnorrSig VerifySchnorrSig From 54bf02294efcd75febf72d27cbaa1a2e5af22ce8 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Aug 2024 19:25:30 -0300 Subject: [PATCH 2/4] go.mod: update lnd to v0.18.3-beta.rc1 This is needed to update btcwallet dependency. --- go.mod | 15 ++++++++------- go.sum | 35 ++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index bea5e41d..8c9283aa 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/lightninglabs/lndclient v0.18.0-1 github.com/lightninglabs/loop/looprpc v1.0.0 github.com/lightninglabs/loop/swapserverrpc v1.0.8 - github.com/lightningnetwork/lnd v0.18.0-beta.1 + github.com/lightningnetwork/lnd v0.18.3-beta.rc1 github.com/lightningnetwork/lnd/cert v1.2.2 github.com/lightningnetwork/lnd/clock v1.1.1 github.com/lightningnetwork/lnd/queue v1.1.1 @@ -37,7 +37,7 @@ require ( google.golang.org/protobuf v1.34.2 gopkg.in/macaroon-bakery.v2 v2.1.0 gopkg.in/macaroon.v2 v2.1.0 - modernc.org/sqlite v1.29.8 + modernc.org/sqlite v1.29.10 ) require ( @@ -99,6 +99,7 @@ require ( github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/pgx/v4 v4.18.2 // indirect + github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jackpal/gateway v1.0.5 // indirect github.com/jackpal/go-nat-pmp v0.0.0-20170405195558-28a68d0c24ad // indirect github.com/jonboulle/clockwork v0.2.2 // indirect @@ -109,11 +110,11 @@ require ( github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect github.com/lightninglabs/neutrino v0.16.1-0.20240425105051-602843d34ffd // indirect github.com/lightninglabs/neutrino/cache v1.1.2 // indirect - github.com/lightningnetwork/lightning-onion v1.2.1-0.20230823005744-06182b1d7d2f // indirect - github.com/lightningnetwork/lnd/fn v1.0.5 // indirect - github.com/lightningnetwork/lnd/healthcheck v1.2.4 // indirect - github.com/lightningnetwork/lnd/kvdb v1.4.8 // indirect - github.com/lightningnetwork/lnd/sqldb v1.0.2 // indirect + github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb // indirect + github.com/lightningnetwork/lnd/fn v1.2.0 // indirect + github.com/lightningnetwork/lnd/healthcheck v1.2.5 // indirect + github.com/lightningnetwork/lnd/kvdb v1.4.10 // indirect + github.com/lightningnetwork/lnd/sqldb v1.0.3 // indirect github.com/lightningnetwork/lnd/tlv v1.2.3 // indirect github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/go.sum b/go.sum index bdbc196a..281e8b12 100644 --- a/go.sum +++ b/go.sum @@ -1035,6 +1035,8 @@ github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQ github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -1122,24 +1124,24 @@ github.com/lightninglabs/neutrino/cache v1.1.2 h1:C9DY/DAPaPxbFC+xNNEI/z1SJY9GS3 github.com/lightninglabs/neutrino/cache v1.1.2/go.mod h1:XJNcgdOw1LQnanGjw8Vj44CvguYA25IMKjWFZczwZuo= github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display h1:Y2WiPkBS/00EiEg0qp0FhehxnQfk3vv8U6Xt3nN+rTY= github.com/lightninglabs/protobuf-go-hex-display v1.33.0-hex-display/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20230823005744-06182b1d7d2f h1:Pua7+5TcFEJXIIZ1I2YAUapmbcttmLj4TTi786bIi3s= -github.com/lightningnetwork/lightning-onion v1.2.1-0.20230823005744-06182b1d7d2f/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI= -github.com/lightningnetwork/lnd v0.18.0-beta.1 h1:7DpRre4rtUmLim4JC5oPd3KEd1Q3QpWTH6jQgSOGNYM= -github.com/lightningnetwork/lnd v0.18.0-beta.1/go.mod h1:1SA9iv9rZddNAcfP38SN9lNSVT1zf5aqmukLUoomjDU= +github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb h1:yfM05S8DXKhuCBp5qSMZdtSwvJ+GFzl94KbXMNB1JDY= +github.com/lightningnetwork/lightning-onion v1.2.1-0.20240712235311-98bd56499dfb/go.mod h1:c0kvRShutpj3l6B9WtTsNTBUtjSmjZXbJd9ZBRQOSKI= +github.com/lightningnetwork/lnd v0.18.3-beta.rc1 h1:ch6sQtld4NeSPDq359coDe/MW8gNTJjkuCmlb0xlrAw= +github.com/lightningnetwork/lnd v0.18.3-beta.rc1/go.mod h1:TbYgzDPPkyyWCk0Go2REoWh6zNR69BOq2eM+RKoCUvQ= github.com/lightningnetwork/lnd/cert v1.2.2 h1:71YK6hogeJtxSxw2teq3eGeuy4rHGKcFf0d0Uy4qBjI= github.com/lightningnetwork/lnd/cert v1.2.2/go.mod h1:jQmFn/Ez4zhDgq2hnYSw8r35bqGVxViXhX6Cd7HXM6U= github.com/lightningnetwork/lnd/clock v1.1.1 h1:OfR3/zcJd2RhH0RU+zX/77c0ZiOnIMsDIBjgjWdZgA0= github.com/lightningnetwork/lnd/clock v1.1.1/go.mod h1:mGnAhPyjYZQJmebS7aevElXKTFDuO+uNFFfMXK1W8xQ= -github.com/lightningnetwork/lnd/fn v1.0.5 h1:ffDgMSn83avw6rNzxhbt6w5/2oIrwQKTPGfyaLupZtE= -github.com/lightningnetwork/lnd/fn v1.0.5/go.mod h1:P027+0CyELd92H9gnReUkGGAqbFA1HwjHWdfaDFD51U= -github.com/lightningnetwork/lnd/healthcheck v1.2.4 h1:lLPLac+p/TllByxGSlkCwkJlkddqMP5UCoawCj3mgFQ= -github.com/lightningnetwork/lnd/healthcheck v1.2.4/go.mod h1:G7Tst2tVvWo7cx6mSBEToQC5L1XOGxzZTPB29g9Rv2I= -github.com/lightningnetwork/lnd/kvdb v1.4.8 h1:xH0a5Vi1yrcZ5BEeF2ba3vlKBRxrL9uYXlWTjOjbNTY= -github.com/lightningnetwork/lnd/kvdb v1.4.8/go.mod h1:J2diNABOoII9UrMnxXS5w7vZwP7CA1CStrl8MnIrb3A= +github.com/lightningnetwork/lnd/fn v1.2.0 h1:YTb2m8NN5ZiJAskHeBZAmR1AiPY8SXziIYPAX1VI/ZM= +github.com/lightningnetwork/lnd/fn v1.2.0/go.mod h1:SyFohpVrARPKH3XVAJZlXdVe+IwMYc4OMAvrDY32kw0= +github.com/lightningnetwork/lnd/healthcheck v1.2.5 h1:aTJy5xeBpcWgRtW/PGBDe+LMQEmNm/HQewlQx2jt7OA= +github.com/lightningnetwork/lnd/healthcheck v1.2.5/go.mod h1:G7Tst2tVvWo7cx6mSBEToQC5L1XOGxzZTPB29g9Rv2I= +github.com/lightningnetwork/lnd/kvdb v1.4.10 h1:vK89IVv1oVH9ubQWU+EmoCQFeVRaC8kfmOrqHbY5zoY= +github.com/lightningnetwork/lnd/kvdb v1.4.10/go.mod h1:J2diNABOoII9UrMnxXS5w7vZwP7CA1CStrl8MnIrb3A= github.com/lightningnetwork/lnd/queue v1.1.1 h1:99ovBlpM9B0FRCGYJo6RSFDlt8/vOkQQZznVb18iNMI= github.com/lightningnetwork/lnd/queue v1.1.1/go.mod h1:7A6nC1Qrm32FHuhx/mi1cieAiBZo5O6l8IBIoQxvkz4= -github.com/lightningnetwork/lnd/sqldb v1.0.2 h1:PfuYzScYMD9/QonKo/QvgsbXfTnH5DfldIimkfdW4Bk= -github.com/lightningnetwork/lnd/sqldb v1.0.2/go.mod h1:V2Xl6JNWLTKE97WJnwfs0d0TYJdIQTqK8/3aAwkd3qI= +github.com/lightningnetwork/lnd/sqldb v1.0.3 h1:zLfAwOvM+6+3+hahYO9Q3h8pVV0TghAR7iJ5YMLCd3I= +github.com/lightningnetwork/lnd/sqldb v1.0.3/go.mod h1:4cQOkdymlZ1znnjuRNvMoatQGJkRneTj2CoPSPaQhWo= github.com/lightningnetwork/lnd/ticker v1.1.1 h1:J/b6N2hibFtC7JLV77ULQp++QLtCwT6ijJlbdiZFbSM= github.com/lightningnetwork/lnd/ticker v1.1.1/go.mod h1:waPTRAAcwtu7Ji3+3k+u/xH5GHovTsCoSVpho0KDvdA= github.com/lightningnetwork/lnd/tlv v1.2.3 h1:If5ibokA/UoCBGuCKaY6Vn2SJU0l9uAbehCnhTZjEP8= @@ -1164,8 +1166,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -1257,8 +1257,9 @@ github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -2167,8 +2168,8 @@ modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.29.8 h1:nGKglNx9K5v0As+zF0/Gcl1kMkmaU1XynYyq92PbsC8= -modernc.org/sqlite v1.29.8/go.mod h1:lQPm27iqa4UNZpmr4Aor0MH0HkCLbt1huYDfWylLZFk= +modernc.org/sqlite v1.29.10 h1:3u93dz83myFnMilBGCOLbr+HjklS6+5rJLx4q86RDAg= +modernc.org/sqlite v1.29.10/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= From 6b852c1c0bc580e8f3b61aa44e937712aab09710 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Aug 2024 13:48:20 -0300 Subject: [PATCH 3/4] go.mod: update btcwallet Update it to the version having symbol chain.ErrInsufficientFee. --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8c9283aa..4a319e46 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,13 @@ module github.com/lightninglabs/loop require ( - github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240403021926-ae5533602c46 + github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240625142744-cc26860b4026 github.com/btcsuite/btcd/btcec/v2 v2.3.3 github.com/btcsuite/btcd/btcutil v1.1.5 github.com/btcsuite/btcd/btcutil/psbt v1.1.8 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f - github.com/btcsuite/btcwallet v0.16.10-0.20240404104514-b2f31f9045fb + github.com/btcsuite/btcwallet v0.16.10-0.20240718224643-db3a4a2543bd github.com/btcsuite/btcwallet/wtxmgr v1.5.3 github.com/coreos/bbolt v1.3.3 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 281e8b12..c4a7961f 100644 --- a/go.sum +++ b/go.sum @@ -648,8 +648,8 @@ github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240403021926-ae5533602c46 h1:tjpNTdZNQqE14menwDGAxWfzN0DFHVTXFEyEL8yvA/4= -github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240403021926-ae5533602c46/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240625142744-cc26860b4026 h1:s8/96vQSj05bqLl9RyM/eMX8gLtiayEj520TVE4YGy0= +github.com/btcsuite/btcd v0.24.2-beta.rc1.0.20240625142744-cc26860b4026/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.3 h1:6+iXlDKE8RMtKsvK0gshlXIuPbyWM/h84Ensb7o3sC0= @@ -667,8 +667,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcwallet v0.16.10-0.20240404104514-b2f31f9045fb h1:qoIOlBPRZWtfpcbQlNFf67Wz8ZlXo+mxQc9Pnbm/iqU= -github.com/btcsuite/btcwallet v0.16.10-0.20240404104514-b2f31f9045fb/go.mod h1:2C3Q/MhYAKmk7F+Tey6LfKtKRTdQsrCf8AAAzzDPmH4= +github.com/btcsuite/btcwallet v0.16.10-0.20240718224643-db3a4a2543bd h1:QDb8foTCRoXrfoZVEzSYgSde16MJh4gCtCin8OCS0kI= +github.com/btcsuite/btcwallet v0.16.10-0.20240718224643-db3a4a2543bd/go.mod h1:X2xDre+j1QphTRo54y2TikUzeSvreL1t1aMXrD8Kc5A= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4 h1:poyHFf7+5+RdxNp5r2T6IBRD7RyraUsYARYbp/7t4D8= github.com/btcsuite/btcwallet/wallet/txauthor v1.3.4/go.mod h1:GETGDQuyq+VFfH1S/+/7slLM/9aNa4l7P4ejX6dJfb0= github.com/btcsuite/btcwallet/wallet/txrules v1.2.1 h1:UZo7YRzdHbwhK7Rhv3PO9bXgTxiOH45edK5qdsdiatk= From 7c93dff830de9e4ee1dd30e08c6ce0bbf6614277 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Tue, 27 Aug 2024 11:44:28 -0300 Subject: [PATCH 4/4] sweepbatcher: add option WithPublishErrorHandler WithPublishErrorHandler sets the callback used to handle publish errors. It can be used to filter out noisy messages. --- sweepbatcher/sweep_batch.go | 152 ++++++++++++++++------------- sweepbatcher/sweep_batcher.go | 105 ++++++++++++++------ sweepbatcher/sweep_batcher_test.go | 121 +++++++++++++++++++++++ 3 files changed, 281 insertions(+), 97 deletions(-) diff --git a/sweepbatcher/sweep_batch.go b/sweepbatcher/sweep_batch.go index d2b2c0e4..337b40a0 100644 --- a/sweepbatcher/sweep_batch.go +++ b/sweepbatcher/sweep_batch.go @@ -282,6 +282,11 @@ type batch struct { // verifySchnorrSig is a function that verifies a schnorr signature. verifySchnorrSig VerifySchnorrSig + // publishErrorHandler is a function that handles transaction publishing + // error. By default, it logs all errors as warnings, but "insufficient + // fee" as Info. + publishErrorHandler PublishErrorHandler + // purger is a function that can take a sweep which is being purged and // hand it over to the batcher for further processing. purger Purger @@ -308,23 +313,24 @@ type Purger func(sweepReq *SweepRequest) error // struct is only used as a wrapper for the arguments that are required to // create a new batch. type batchKit struct { - id int32 - batchTxid *chainhash.Hash - batchPkScript []byte - state batchState - primaryID lntypes.Hash - sweeps map[lntypes.Hash]sweep - rbfCache rbfCache - returnChan chan SweepRequest - wallet lndclient.WalletKitClient - chainNotifier lndclient.ChainNotifierClient - signerClient lndclient.SignerClient - musig2SignSweep MuSig2SignSweep - verifySchnorrSig VerifySchnorrSig - purger Purger - store BatcherStore - log btclog.Logger - quit chan struct{} + id int32 + batchTxid *chainhash.Hash + batchPkScript []byte + state batchState + primaryID lntypes.Hash + sweeps map[lntypes.Hash]sweep + rbfCache rbfCache + returnChan chan SweepRequest + wallet lndclient.WalletKitClient + chainNotifier lndclient.ChainNotifierClient + signerClient lndclient.SignerClient + musig2SignSweep MuSig2SignSweep + verifySchnorrSig VerifySchnorrSig + publishErrorHandler PublishErrorHandler + purger Purger + store BatcherStore + log btclog.Logger + quit chan struct{} } // scheduleNextCall schedules the next call to the batch handler's main event @@ -353,28 +359,29 @@ func NewBatch(cfg batchConfig, bk batchKit) *batch { return &batch{ // We set the ID to a negative value to flag that this batch has // never been persisted, so it needs to be assigned a new ID. - id: -1, - state: Open, - sweeps: make(map[lntypes.Hash]sweep), - blockEpochChan: make(chan int32), - spendChan: make(chan *chainntnfs.SpendDetail), - confChan: make(chan *chainntnfs.TxConfirmation, 1), - reorgChan: make(chan struct{}, 1), - errChan: make(chan error, 1), - callEnter: make(chan struct{}), - callLeave: make(chan struct{}), - stopping: make(chan struct{}), - finished: make(chan struct{}), - quit: bk.quit, - batchTxid: bk.batchTxid, - wallet: bk.wallet, - chainNotifier: bk.chainNotifier, - signerClient: bk.signerClient, - muSig2SignSweep: bk.musig2SignSweep, - verifySchnorrSig: bk.verifySchnorrSig, - purger: bk.purger, - store: bk.store, - cfg: &cfg, + id: -1, + state: Open, + sweeps: make(map[lntypes.Hash]sweep), + blockEpochChan: make(chan int32), + spendChan: make(chan *chainntnfs.SpendDetail), + confChan: make(chan *chainntnfs.TxConfirmation, 1), + reorgChan: make(chan struct{}, 1), + errChan: make(chan error, 1), + callEnter: make(chan struct{}), + callLeave: make(chan struct{}), + stopping: make(chan struct{}), + finished: make(chan struct{}), + quit: bk.quit, + batchTxid: bk.batchTxid, + wallet: bk.wallet, + chainNotifier: bk.chainNotifier, + signerClient: bk.signerClient, + muSig2SignSweep: bk.musig2SignSweep, + verifySchnorrSig: bk.verifySchnorrSig, + publishErrorHandler: bk.publishErrorHandler, + purger: bk.purger, + store: bk.store, + cfg: &cfg, } } @@ -396,32 +403,33 @@ func NewBatchFromDB(cfg batchConfig, bk batchKit) (*batch, error) { } return &batch{ - id: bk.id, - state: bk.state, - primarySweepID: bk.primaryID, - sweeps: bk.sweeps, - blockEpochChan: make(chan int32), - spendChan: make(chan *chainntnfs.SpendDetail), - confChan: make(chan *chainntnfs.TxConfirmation, 1), - reorgChan: make(chan struct{}, 1), - errChan: make(chan error, 1), - callEnter: make(chan struct{}), - callLeave: make(chan struct{}), - stopping: make(chan struct{}), - finished: make(chan struct{}), - quit: bk.quit, - batchTxid: bk.batchTxid, - batchPkScript: bk.batchPkScript, - rbfCache: bk.rbfCache, - wallet: bk.wallet, - chainNotifier: bk.chainNotifier, - signerClient: bk.signerClient, - muSig2SignSweep: bk.musig2SignSweep, - verifySchnorrSig: bk.verifySchnorrSig, - purger: bk.purger, - store: bk.store, - log: bk.log, - cfg: &cfg, + id: bk.id, + state: bk.state, + primarySweepID: bk.primaryID, + sweeps: bk.sweeps, + blockEpochChan: make(chan int32), + spendChan: make(chan *chainntnfs.SpendDetail), + confChan: make(chan *chainntnfs.TxConfirmation, 1), + reorgChan: make(chan struct{}, 1), + errChan: make(chan error, 1), + callEnter: make(chan struct{}), + callLeave: make(chan struct{}), + stopping: make(chan struct{}), + finished: make(chan struct{}), + quit: bk.quit, + batchTxid: bk.batchTxid, + batchPkScript: bk.batchPkScript, + rbfCache: bk.rbfCache, + wallet: bk.wallet, + chainNotifier: bk.chainNotifier, + signerClient: bk.signerClient, + muSig2SignSweep: bk.musig2SignSweep, + verifySchnorrSig: bk.verifySchnorrSig, + publishErrorHandler: bk.publishErrorHandler, + purger: bk.purger, + store: bk.store, + log: bk.log, + cfg: &cfg, }, nil } @@ -795,23 +803,31 @@ func (b *batch) publish(ctx context.Context) error { return err } + // logPublishError is a function which logs publish errors. + logPublishError := func(errMsg string, err error) { + b.publishErrorHandler(err, errMsg, b.log) + } + if b.cfg.mixedBatch { fee, err, signSuccess = b.publishMixedBatch(ctx) if err != nil { - b.log.Warnf("Mixed batch publish error: %v", err) + logPublishError("mixed batch publish error", err) } } else { fee, err, signSuccess = b.publishBatchCoop(ctx) if err != nil { - b.log.Warnf("co-op publish error: %v", err) + logPublishError("co-op publish error", err) } } if !signSuccess { fee, err = b.publishBatch(ctx) + if err != nil { + logPublishError("non-coop publish error", err) + } } + if err != nil { - b.log.Warnf("publish error: %v", err) return nil } diff --git a/sweepbatcher/sweep_batcher.go b/sweepbatcher/sweep_batcher.go index 8572e8f3..6b819e43 100644 --- a/sweepbatcher/sweep_batcher.go +++ b/sweepbatcher/sweep_batcher.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "strings" "sync" "time" @@ -12,6 +13,8 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btclog" + "github.com/btcsuite/btcwallet/chain" "github.com/lightninglabs/lndclient" "github.com/lightninglabs/loop/labels" "github.com/lightninglabs/loop/loopdb" @@ -159,6 +162,25 @@ type VerifySchnorrSig func(pubKey *btcec.PublicKey, hash, sig []byte) error type FeeRateProvider func(ctx context.Context, swapHash lntypes.Hash) (chainfee.SatPerKWeight, error) +// PublishErrorHandler is a function that handles transaction publishing error. +type PublishErrorHandler func(err error, errMsg string, log btclog.Logger) + +// defaultPublishErrorLogger is an instance of PublishErrorHandler which logs +// all errors as warnings, but "insufficient fee" as info (since they are +// expected, if RBF fails). +func defaultPublishErrorLogger(err error, errMsg string, log btclog.Logger) { + // Check if the error is "insufficient fee" error. + if strings.Contains(err.Error(), chain.ErrInsufficientFee.Error()) { + // Log "insufficient fee" with level Info. + log.Infof("%s: %v", errMsg, err) + + return + } + + // Log any other error as a warning. + log.Warnf("%s: %v", errMsg, err) +} + // SweepRequest is a request to sweep a specific outpoint. type SweepRequest struct { // SwapHash is the hash of the swap that is being swept. @@ -296,6 +318,11 @@ type Batcher struct { // expensive) way. If the whole procedure fails for whatever reason, the // batch is signed non-cooperatively (the fallback). mixedBatch bool + + // publishErrorHandler is a function that handles transaction publishing + // error. By default, it logs all errors as warnings, but "insufficient + // fee" as Info. + publishErrorHandler PublishErrorHandler } // BatcherConfig holds batcher configuration. @@ -341,6 +368,11 @@ type BatcherConfig struct { // expensive) way. If the whole procedure fails for whatever reason, the // batch is signed non-cooperatively (the fallback). mixedBatch bool + + // publishErrorHandler is a function that handles transaction publishing + // error. By default, it logs all errors as warnings, but "insufficient + // fee" as Info. + publishErrorHandler PublishErrorHandler } // BatcherOption configures batcher behaviour. @@ -420,6 +452,14 @@ func WithMixedBatch() BatcherOption { } } +// WithPublishErrorHandler sets the callback used to handle publish errors. +// It can be used to filter out noisy messages. +func WithPublishErrorHandler(handler PublishErrorHandler) BatcherOption { + return func(cfg *BatcherConfig) { + cfg.publishErrorHandler = handler + } +} + // NewBatcher creates a new Batcher instance. func NewBatcher(wallet lndclient.WalletKitClient, chainNotifier lndclient.ChainNotifierClient, @@ -432,6 +472,11 @@ func NewBatcher(wallet lndclient.WalletKitClient, // By default, loop/labels.LoopOutBatchSweepSuccess is used // to label sweep transactions. txLabeler: labels.LoopOutBatchSweepSuccess, + + // publishErrorHandler is a function that handles transaction + // publishing error. By default, it logs all errors as warnings, + // but "insufficient fee" as Info. + publishErrorHandler: defaultPublishErrorLogger, } for _, opt := range opts { opt(&cfg) @@ -448,26 +493,27 @@ func NewBatcher(wallet lndclient.WalletKitClient, } return &Batcher{ - batches: make(map[int32]*batch), - sweepReqs: make(chan SweepRequest), - errChan: make(chan error, 1), - quit: make(chan struct{}), - initDone: make(chan struct{}), - wallet: wallet, - chainNotifier: chainNotifier, - signerClient: signerClient, - musig2ServerSign: musig2ServerSigner, - VerifySchnorrSig: verifySchnorrSig, - chainParams: chainparams, - store: store, - sweepStore: sweepStore, - clock: cfg.clock, - initialDelay: cfg.initialDelay, - publishDelay: cfg.publishDelay, - customFeeRate: cfg.customFeeRate, - txLabeler: cfg.txLabeler, - customMuSig2Signer: cfg.customMuSig2Signer, - mixedBatch: cfg.mixedBatch, + batches: make(map[int32]*batch), + sweepReqs: make(chan SweepRequest), + errChan: make(chan error, 1), + quit: make(chan struct{}), + initDone: make(chan struct{}), + wallet: wallet, + chainNotifier: chainNotifier, + signerClient: signerClient, + musig2ServerSign: musig2ServerSigner, + VerifySchnorrSig: verifySchnorrSig, + chainParams: chainparams, + store: store, + sweepStore: sweepStore, + clock: cfg.clock, + initialDelay: cfg.initialDelay, + publishDelay: cfg.publishDelay, + customFeeRate: cfg.customFeeRate, + txLabeler: cfg.txLabeler, + customMuSig2Signer: cfg.customMuSig2Signer, + mixedBatch: cfg.mixedBatch, + publishErrorHandler: cfg.publishErrorHandler, } } @@ -1092,14 +1138,15 @@ func (b *Batcher) newBatchConfig(maxTimeoutDistance int32) batchConfig { // newBatchKit creates new batch kit. func (b *Batcher) newBatchKit() batchKit { return batchKit{ - returnChan: b.sweepReqs, - wallet: b.wallet, - chainNotifier: b.chainNotifier, - signerClient: b.signerClient, - musig2SignSweep: b.musig2ServerSign, - verifySchnorrSig: b.VerifySchnorrSig, - purger: b.AddSweep, - store: b.store, - quit: b.quit, + returnChan: b.sweepReqs, + wallet: b.wallet, + chainNotifier: b.chainNotifier, + signerClient: b.signerClient, + musig2SignSweep: b.musig2ServerSign, + verifySchnorrSig: b.VerifySchnorrSig, + publishErrorHandler: b.publishErrorHandler, + purger: b.AddSweep, + store: b.store, + quit: b.quit, } } diff --git a/sweepbatcher/sweep_batcher_test.go b/sweepbatcher/sweep_batcher_test.go index ae3c98e6..11c56143 100644 --- a/sweepbatcher/sweep_batcher_test.go +++ b/sweepbatcher/sweep_batcher_test.go @@ -541,6 +541,122 @@ func testTxLabeler(t *testing.T, store testStore, checkBatcherError(t, runErr) } +// testTransactionPublisher wraps a wallet kit and returns publish error on +// the first publish attempt. Further attempts succeed. +type testTransactionPublisher struct { + lndclient.WalletKitClient + + attempts int +} + +var testPublishError = errors.New("test publish error") + +// PublishTransaction publishes the transaction or fails it's the first attempt. +func (p *testTransactionPublisher) PublishTransaction(ctx context.Context, + tx *wire.MsgTx, label string) error { + + p.attempts++ + if p.attempts == 1 { + return testPublishError + } + + return p.WalletKitClient.PublishTransaction(ctx, tx, label) +} + +// testPublishErrorHandler tests that publish error handler installed with +// WithPublishErrorHandler, works as expected. +func testPublishErrorHandler(t *testing.T, store testStore, + batcherStore testBatcherStore) { + + defer test.Guard(t)() + + lnd := test.NewMockLnd() + ctx, cancel := context.WithCancel(context.Background()) + + sweepStore, err := NewSweepFetcherFromSwapStore(store, lnd.ChainParams) + require.NoError(t, err) + + walletKit := &testTransactionPublisher{WalletKitClient: lnd.WalletKit} + + // Catch all publish errors and send them to a channel. + publishErrorChan := make(chan error) + errorHandler := func(err error, errMsg string, log btclog.Logger) { + log.Warnf("%s: %v", errMsg, err) + + publishErrorChan <- err + } + + batcher := NewBatcher(walletKit, lnd.ChainNotifier, lnd.Signer, + testMuSig2SignSweep, testVerifySchnorrSig, lnd.ChainParams, + batcherStore, sweepStore, WithPublishErrorHandler(errorHandler)) + + var ( + runErr error + wg sync.WaitGroup + ) + + wg.Add(1) + go func() { + defer wg.Done() + runErr = batcher.Run(ctx) + }() + + // Create a sweep request. + sweepReq1 := SweepRequest{ + SwapHash: lntypes.Hash{1, 1, 1}, + Value: 111, + Outpoint: wire.OutPoint{ + Hash: chainhash.Hash{1, 1}, + Index: 1, + }, + Notifier: &dummyNotifier, + } + + swap1 := &loopdb.LoopOutContract{ + SwapContract: loopdb.SwapContract{ + CltvExpiry: 111, + AmountRequested: 111, + ProtocolVersion: loopdb.ProtocolVersionMuSig2, + HtlcKeys: htlcKeys, + }, + + DestAddr: destAddr, + SwapInvoice: swapInvoice, + SweepConfTarget: 111, + } + + err = store.CreateLoopOut(ctx, sweepReq1.SwapHash, swap1) + require.NoError(t, err) + store.AssertLoopOutStored() + + // Deliver sweep request to batcher. + require.NoError(t, batcher.AddSweep(&sweepReq1)) + + // Eventually request will be consumed and a new batch will spin up. + require.Eventually(t, func() bool { + return len(batcher.batches) == 1 + }, test.Timeout, eventuallyCheckFrequency) + + // When batch is successfully created it will execute it's first step, + // which leads to a spend monitor of the primary sweep. + <-lnd.RegisterSpendChannel + + // The first attempt to publish the batch tx is expected to fail. + require.ErrorIs(t, <-publishErrorChan, testPublishError) + + // Mine a block to trigger another publishing attempt. + err = lnd.NotifyHeight(601) + require.NoError(t, err) + + // Now publishing should succeed for tx to be published. + <-lnd.TxPublishChannel + + // Now make the batcher quit by canceling the context. + cancel() + wg.Wait() + checkBatcherError(t, runErr) +} + // testSweepBatcherSimpleLifecycle tests the simple lifecycle of the batches // that are created and run by the batcher. func testSweepBatcherSimpleLifecycle(t *testing.T, store testStore, @@ -3613,6 +3729,11 @@ func TestTxLabeler(t *testing.T) { runTests(t, testTxLabeler) } +// TestPublishErrorHandler tests transaction labels. +func TestPublishErrorHandler(t *testing.T) { + runTests(t, testPublishErrorHandler) +} + // TestSweepBatcherSimpleLifecycle tests the simple lifecycle of the batches // that are created and run by the batcher. func TestSweepBatcherSimpleLifecycle(t *testing.T) {