Summary
On signet, when no RGS URL is configured, the wallet ends up with no gossip source at all — the network-match falls through to an empty arm:
|
match config.network { |
|
Network::Bitcoin => { |
|
builder.set_gossip_source_rgs( |
|
"https://rapidsync.lightningdevkit.org/snapshot".to_string(), |
|
); |
|
}, |
|
Network::Testnet => { |
|
builder.set_gossip_source_rgs( |
|
"https://rapidsync.lightningdevkit.org/testnet/snapshot".to_string(), |
|
); |
|
}, |
|
Network::Testnet4 => {}, |
|
Network::Signet => {}, |
|
Network::Regtest => { |
|
// We don't want to run an RGS server in tests so just enable p2p gossip |
|
builder.set_gossip_source_p2p(); |
|
}, |
|
} |
|
}, |
match config.rgs_url {
Some(url) => builder.set_gossip_source_rgs(url),
None => match config.network {
Network::Bitcoin => /* RGS default */,
Network::Testnet => /* RGS default */,
Network::Testnet4 => {},
Network::Signet => {}, // ← nothing
Network::Regtest => builder.set_gossip_source_p2p(),
},
}
With an empty graph, the wallet can only pay invoices whose route hints bridge from its own LSP channels. Any invoice without an r field — e.g. from a node whose channel to the shared LSP is announced — fails instantly with RouteNotFound, before an HTLC is dispatched.
Why RGS isn't a general answer on signet
On our Mutinynet staging deployment (self-hosted LSPS2 LSP + cdk mint), the LSP/mint island doesn't peer with any public node, so its announced channels never reach the public graph — an RGS snapshot (e.g. rgs.mutinynet.com) would teach the wallet 900+ public channels and none of the ones it actually needs. Small signet deployments like this are common for LSP integration testing.
Proposed fix
Fall back to p2p gossip on signet, like regtest:
Network::Signet => builder.set_gossip_source_p2p(),
The wallet's peers are exactly its LSP (and anything the LSP talks to), so p2p gossip teaches it precisely the local topology it needs to route hint-less invoices within the deployment — and signet graphs are small enough that p2p sync cost is negligible. Configured rgs_url would keep taking precedence, so Mutinynet users who want the public graph can still opt in (a p2p fallback alongside RGS would be even better, but the one-line match-arm change already fixes the stranded-by-default case).
Repro details (timed on-device, decoded invoices confirming absent r fields): https://github.com/emergent-money/graduated-wallet/issues/285. Happy to send the PR if the direction sounds right.
Summary
On signet, when no RGS URL is configured, the wallet ends up with no gossip source at all — the network-match falls through to an empty arm:
orange-sdk/orange-sdk/src/lightning_wallet.rs
Lines 83 to 101 in 4e9d230
With an empty graph, the wallet can only pay invoices whose route hints bridge from its own LSP channels. Any invoice without an
rfield — e.g. from a node whose channel to the shared LSP is announced — fails instantly withRouteNotFound, before an HTLC is dispatched.Why RGS isn't a general answer on signet
On our Mutinynet staging deployment (self-hosted LSPS2 LSP + cdk mint), the LSP/mint island doesn't peer with any public node, so its announced channels never reach the public graph — an RGS snapshot (e.g.
rgs.mutinynet.com) would teach the wallet 900+ public channels and none of the ones it actually needs. Small signet deployments like this are common for LSP integration testing.Proposed fix
Fall back to p2p gossip on signet, like regtest:
The wallet's peers are exactly its LSP (and anything the LSP talks to), so p2p gossip teaches it precisely the local topology it needs to route hint-less invoices within the deployment — and signet graphs are small enough that p2p sync cost is negligible. Configured
rgs_urlwould keep taking precedence, so Mutinynet users who want the public graph can still opt in (a p2p fallback alongside RGS would be even better, but the one-line match-arm change already fixes the stranded-by-default case).Repro details (timed on-device, decoded invoices confirming absent
rfields): https://github.com/emergent-money/graduated-wallet/issues/285. Happy to send the PR if the direction sounds right.