mirror of
https://github.com/lightninglabs/loop
synced 2024-11-09 19:10:47 +00:00
Merge pull request #815 from starius/publish-errors-handler
sweepbatcher: add option WithPublishErrorHandler
This commit is contained in:
commit
9751780fae
19
go.mod
19
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
|
||||
@ -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
|
||||
|
43
go.sum
43
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=
|
||||
@ -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=
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
@ -236,7 +258,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
|
||||
|
||||
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user