diff --git a/Boss/Mod/XMoveFunds/Main.cpp b/Boss/Mod/XMoveFunds/Main.cpp index 58a865d..32e56a7 100644 --- a/Boss/Mod/XMoveFunds/Main.cpp +++ b/Boss/Mod/XMoveFunds/Main.cpp @@ -1233,8 +1233,18 @@ private: } if (fail & 0x2000) { - /* NODE-level failure: take the whole - * forwarder out of consideration. */ + /* NODE-level failure: take the whole forwarder + * out of consideration -- but NEVER our own node. + * In a circular rebalance the destination is us, + * so a node-level failure at the closing hop is + * attributed to self; disable_node(self) would + * disable ALL our channels as the source (askrene: + * "source has disabled N of N channels, capacity + * 0msat") and lock out every future rebalance -- + * permanently, since disabled_nodes does not age. + * Mirrors FundsMover's self_id guard. */ + if (std::string(enode) == std::string(self_id)) + return; actions.push_back( Boss::Mod::AskreneLayer::disable_node( *rpc,