Skip to content

signer: Lower the min sweep feerate to 75 sat/kw - #764

Open
cdecker wants to merge 1 commit into
mainfrom
2026m11-sweep-min-feerate
Open

cdecker wants to merge 1 commit into
mainfrom
2026m11-sweep-min-feerate

Conversation

@cdecker

@cdecker cdecker commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

Problem

Since the VLS 1.0.0-rc.1 upgrade (6eed32f5), SIGN_PENALTY_TO_US goes through validate_justice_sweep -> validate_sweep -> validate_fee, which compares the sweep tx feerate against SimplePolicy::min_feerate_per_kw — 253 sat/kw (~1 sat/vB) from make_default_simple_policy.

In Greenlight those transactions are built by CLN (lightningd/onchaind), which derives the sweep feerate from its own backend-backed estimates and applies its own floors and worth-it checks before requesting the signature. During quiet-fee periods the estimate drops below 253 sat/kw and the signer hard-fails the signature, e.g. seen in production today:

policy failure: validate_justice_sweep: validate_sweep: validate_fee: feerate below minimum: 226 < 253

The justice sweep then stays unsigned until network feerates recover — the signer's floor contradicts CLN's fee policy instead of protecting against it.

Fix

Set policy.min_feerate_per_kw = 75 (~0.3 sat/vB) in the gl-client signer setup: low enough to never second-guess a CLN-built sweep, while still rejecting zero-fee or absurdly low transactions.

Notes

  • Only affects signers built from gl-client (embedded client signer and the server-side runner); the check itself lives in VLS and is untouched.
  • The 44bfc34 (fee budgets) branch work keeps the sweep ceiling at 150k and never touches this minimum, so no conflict with it.

Test

cargo check -p gl-client passes. End-to-end: attach a local signer to a node with a pending justice sweep at low feerate and observe the sweep tx now gets signed and broadcast instead of a FailedPrecondition.

The `SimplePolicy` default `min_feerate_per_kw` of 253 sat/kw comes from
stacks where the signer builds its own sweeps. In Greenlight the
transactions gated by this check are built by CLN: lightningd and
onchaind derive the sweep feerate from their own backend-backed
estimates and apply their own floors and worth-it checks before ever
requesting a signature.

During quiet-fee periods CLN's estimates fall below 253 sat/kw, and the
signer then hard-fails `SIGN_PENALTY_TO_US` with 'policy failure:
validate_justice_sweep: validate_sweep: validate_fee: feerate below
minimum: 226 < 253', leaving justice sweeps unsigned until feerates
recover. Since CLN will not produce sweeps anywhere near this range
under normal conditions, the default floor contradicts CLN's fee policy
rather than protecting against it.

Set `min_feerate_per_kw` to 75 sat/kw (~0.3 sat/vB): low enough to never
second-guess a CLN-built sweep, yet still a sanity check that rejects
zero-fee or absurdly low transactions.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant